From 57873bfd7d1925a3b0795b740522985f2f1eec6a Mon Sep 17 00:00:00 2001 From: micha Date: Tue, 29 Jun 2004 08:03:08 +0000 Subject: [PATCH] fix showtabs for win32 interface git-svn-id: trunk@5615 - --- lcl/include/customnotebook.inc | 5 +- lcl/interfaces/win32/win32int.pp | 8 +- lcl/interfaces/win32/win32object.inc | 119 ++++++++++++++++++++++----- 3 files changed, 109 insertions(+), 23 deletions(-) diff --git a/lcl/include/customnotebook.inc b/lcl/include/customnotebook.inc index 3c97499cf9..f3080c0c46 100644 --- a/lcl/include/customnotebook.inc +++ b/lcl/include/customnotebook.inc @@ -752,7 +752,7 @@ begin if not HandleAllocated or (csLoading in ComponentState) then exit; Msg.Parent := Self; Msg.fCompStyle := fCompStyle; - Msg.ShowTabs := fShowTabs or (csDesigning in ComponentState); + Msg.ShowTabs := fShowTabs; {$IFDEF NOTEBOOK_DEBUG} DebugLn('[TCustomNotebook.DoSendShowTabs] A ',Name); {$ENDIF} @@ -804,6 +804,9 @@ end;} { ============================================================================= $Log$ + Revision 1.52 2004/06/29 08:03:08 micha + fix showtabs for win32 interface + Revision 1.51 2004/06/24 17:45:33 mattias fixed TMenuItem.GetIconSize diff --git a/lcl/interfaces/win32/win32int.pp b/lcl/interfaces/win32/win32int.pp index 7fea2caf40..a9964c260f 100644 --- a/lcl/interfaces/win32/win32int.pp +++ b/lcl/interfaces/win32/win32int.pp @@ -131,8 +131,11 @@ Type Procedure SetLimitText(Window: HWND; Limit: Word); Procedure ShowHide(Sender: TObject); + procedure ChangeActivePage(const Data: TLMNotebookEvent); + procedure AddAllNBPages(Notebook: TCustomNotebook); + procedure RemoveAllNBPages(Notebook: TCustomNotebook); Procedure AddNBPage(Notebook: TCustomNotebook; NewPage: TCustomPage; Index: Integer); - Procedure RemoveNBPage(Parent: TObject; Index: Integer); + procedure RemoveNBPage(Notebook: TCustomNotebook; Index: Integer); Procedure SetText(Window: HWND; Data: Pointer); Procedure SetColor(Sender : TObject); Procedure SetPixel(Sender: TObject; Data: Pointer); @@ -272,6 +275,9 @@ End. { ============================================================================= $Log$ + Revision 1.88 2004/06/29 08:03:08 micha + fix showtabs for win32 interface + Revision 1.87 2004/06/20 20:36:55 micha remove old obsolete/commented toolbutton code rename lazarusform classname to window, because we use it for panels, notebookpages, etc too diff --git a/lcl/interfaces/win32/win32object.inc b/lcl/interfaces/win32/win32object.inc index 25f8561c0b..3e62136cd8 100644 --- a/lcl/interfaces/win32/win32object.inc +++ b/lcl/interfaces/win32/win32object.inc @@ -411,7 +411,6 @@ Var S: String; TBB: TBBUTTON; WindowStyle: Integer; //used by LM_SETTABPOSITION - OldPageIndex: Integer; //used by LM_SETITEMINDEX of a csNotebook AMenu: TMenu; TheWinControl: TWinControl; @@ -743,13 +742,17 @@ activate_time : the time at which the activation event occurred. End; LM_REMOVEPAGE: Begin - RemoveNBPage(TControl(Sender), TLMNotebookEvent(Data^).Page); + RemoveNBPage(Sender as TCustomNotebook, TLMNotebookEvent(Data^).Page); End; LM_SHOWTABS: Begin Result := Ord(True); - (Sender As TWinControl).Visible := TLMNotebookEvent(Data^).ShowTabs; - ShowHide(Sender); + if TLMNotebookEvent(Data^).ShowTabs then + begin + AddAllNBPages(Sender as TCustomNotebook); + end else begin + RemoveAllNBPages(Sender as TCustomNotebook); + end; End; LM_SETTABPOSITION : Begin @@ -885,21 +888,7 @@ activate_time : the time at which the activation event occurred. csNotebook: Begin Assert(False, 'Trace:Setting Page to ' + IntToStr(TLMNotebookEvent(Data^).Page)); - with TLMNotebookEvent(Data^) do - begin - OldPageIndex := SendMessage(Handle,TCM_GETCURSEL,0,0); - Windows.SendMessage(Handle,TCM_SETCURSEL, Windows.WPARAM(Page),0); - if not (csDestroying in (Parent as TCustomNotebook).ComponentState) then - begin - // create handle if not already done, need to show! - if (Page>=0) and (Page < TCustomNotebook(Parent).PageCount) then - ShowWindow(TCustomNotebook(Parent).CustomPage(Page).Handle, SW_SHOW); - if (OldPageIndex>=0) and (OldPageIndex<>Page) - and (OldPageIndex < TCustomNotebook(Parent).PageList.Count) - and (TCustomNotebook(Parent).CustomPage(OldPageIndex).HandleAllocated) - then ShowWindow(TCustomNotebook(Parent).CustomPage(OldPageIndex).Handle, SW_HIDE); - end; - end; + ChangeActivePage(TLMNotebookEvent(Data^)); End; End; End; @@ -2670,6 +2659,91 @@ Begin End; End; +{ ----------------------------------------------------------------------------- + Method: TWin32WidgetSet.AddAllNBPages + Params: Notebook - A notebook control + Returns: Nothing + + Adds all pages to notebook (showtabs becomes true) + ------------------------------------------------------------------------------} +procedure TWin32WidgetSet.AddAllNBPages(Notebook: TCustomNotebook); +var + TCI: TC_ITEM; + I, Res: Integer; + lPage: TCustomPage; +begin + for I := 0 to Notebook.PageCount - 1 do + begin + lPage := Notebook.Page[I]; + // check if already shown + TCI.Mask := TCIF_PARAM; + Res := Windows.SendMessage(Notebook.Handle, TCM_GETITEM, I, LPARAM(@TCI)); + if (Res = 0) or (dword(TCI.lParam) <> lPage.Handle) then + begin + TCI.Mask := TCIF_TEXT or TCIF_PARAM; + TCI.pszText := PChar(lPage.Caption); + TCI.lParam := lPage.Handle; + Windows.SendMessage(Notebook.Handle, TCM_INSERTITEM, I, LPARAM(@TCI)); + end; + end; +end; + +{------------------------------------------------------------------------------ + Method: TWin32WidgetSet.RemoveAllNBPages + Params: Notebook - The notebook control + Returns: Nothing + + Removes all pages from a notebook control (showtabs becomes false) + ------------------------------------------------------------------------------} +procedure TWin32WidgetSet.RemoveAllNBPages(Notebook: TCustomNotebook); +var + I: Integer; + R: TRect; +begin + for I := Notebook.PageCount - 1 downto 0 do + RemoveNBPage(Notebook, I); + // Adjust page size to fit in tabcontrol, need bounds of notebook in client of parent + Self.GetClientRect(Notebook.Handle, R); + R.Right := R.Right - R.Left; + R.Bottom := R.Bottom - R.Top; + for I := 0 to Notebook.PageCount - 1 do + ResizeChild(Notebook.Page[I], R.Left, R.Top, R.Right, R.Bottom); +end; + +{------------------------------------------------------------------------------ + Method: TWin32WidgetSet.ChangeActivePage + Params: Data - The notebook setitemindex message + Returns: Nothing + + Changes the active page to one specified in data + ------------------------------------------------------------------------------} +procedure TWin32WidgetSet.ChangeActivePage(const Data: TLMNotebookEvent); +var + OldPageIndex: Integer; + PageHandle: HWND; + Handle: HWND; +begin + with Data do + begin + Handle := TWinControl(Parent).Handle; + OldPageIndex := SendMessage(Handle, TCM_GETCURSEL, 0, 0); + Windows.SendMessage(Handle, TCM_SETCURSEL, Windows.WPARAM(Page), 0); + if not (csDestroying in (Parent as TCustomNotebook).ComponentState) then + begin + // create handle if not already done, need to show! + if (Page>=0) and (Page < TCustomNotebook(Parent).PageCount) then + begin + PageHandle := TCustomNotebook(Parent).CustomPage(Page).Handle; + SetWindowPos(PageHandle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW); + end; + if (OldPageIndex>=0) and (OldPageIndex<>Page) + and (OldPageIndex < TCustomNotebook(Parent).PageList.Count) + and (TCustomNotebook(Parent).CustomPage(OldPageIndex).HandleAllocated) + then ShowWindow(TCustomNotebook(Parent).CustomPage(OldPageIndex).Handle, SW_HIDE); + end; + end; +end; + { ----------------------------------------------------------------------------- Method: TWin32WidgetSet.AddNBPage Params: Notebook - A notebook control @@ -2714,10 +2788,10 @@ End; Removes a page from a notebook control ------------------------------------------------------------------------------} -Procedure TWin32WidgetSet.RemoveNBPage(Parent: TObject; Index: Integer); +procedure TWin32WidgetSet.RemoveNBPage(Notebook: TCustomNotebook; Index: Integer); Begin Assert(false, 'Trace:Removing a notebook page'); - Windows.SendMessage((Parent As TCustomNotebook).Handle, TCM_DELETEITEM, Windows.WPARAM(Index), 0); + Windows.SendMessage(Notebook.Handle, TCM_DELETEITEM, Windows.WPARAM(Index), 0); End; {------------------------------------------------------------------------------ @@ -3237,6 +3311,9 @@ End; { $Log$ + Revision 1.215 2004/06/29 08:03:08 micha + fix showtabs for win32 interface + Revision 1.214 2004/06/20 21:21:49 micha fix GetVisible to return this control's visibility, instead introduce IsVisible to check for recursive visibility