{%MainUnit ../extctrls.pp} {****************************************************************************** TNBPages ****************************************************************************** ***************************************************************************** * * * This file is part of the Lazarus Component Library (LCL) * * * * See the file COPYING.modifiedLGPL.txt, included in this distribution, * * for details about the copyright. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * * ***************************************************************************** } {off $DEFINE NOTEBOOK_DEBUG} {------------------------------------------------------------------------------ TNBPages Constructor ------------------------------------------------------------------------------} constructor TNBPages.Create(thePageList: TListWithEvent; theNotebook: TCustomNotebook); begin inherited Create; fPageList := thePageList; fPageList.OnChange:=@PageListChange; fNotebook := theNotebook; end; {------------------------------------------------------------------------------ procedure TNBPages.PageListChange(Ptr: Pointer; AnAction: TListNotification); ------------------------------------------------------------------------------} procedure TNBPages.PageListChange(Ptr: Pointer; AnAction: TListNotification); var APage: TCustomPage; begin if (AnAction=lnAdded) then begin APage:=TObject(Ptr) as TCustomPage; if not (pfInserting in APage.FFlags) then APage.Parent:=fNotebook; end; end; {------------------------------------------------------------------------------ TNBPages Get ------------------------------------------------------------------------------} function TNBPages.Get(Index: Integer): String; begin //DebugLn('TNBPages.Get Index=',Index); if (Index<0) or (Index>=fPageList.Count) then RaiseGDBException('TNBPages.Get Index out of bounds'); Result := TCustomPage(fPageList[Index]).Caption; end; {------------------------------------------------------------------------------ TNBPages GetCount ------------------------------------------------------------------------------} function TNBPages.GetCount: Integer; begin Result := fPageList.Count; end; {------------------------------------------------------------------------------ TNBPages GetObject ------------------------------------------------------------------------------} function TNBPages.GetObject(Index: Integer): TObject; begin if (Index<0) or (Index>=fPageList.Count) then RaiseGDBException('TNBPages.GetObject Index out of bounds'); Result := TCustomPage(fPageList[Index]); end; {------------------------------------------------------------------------------ TNBPages Put ------------------------------------------------------------------------------} procedure TNBPages.Put(Index: Integer; const S: String); begin if (Index<0) or (Index>=fPageList.Count) then RaiseGDBException('TNBPages.Put Index out of bounds'); TCustomPage(fPageList[Index]).Caption := S; end; {------------------------------------------------------------------------------ TNBPages Clear ------------------------------------------------------------------------------} procedure TNBPages.Clear; begin while fPageList.Count>0 do Delete(fPageList.Count-1); end; {------------------------------------------------------------------------------ TNBPages Delete ------------------------------------------------------------------------------} procedure TNBPages.Delete(Index: Integer); var APage: TCustomPage; begin // Make sure Index is in the range of valid pages to delete {$IFDEF NOTEBOOK_DEBUG} //DebugLn('TNBPages.Delete A Index=',Index); DebugLn(['TNBPages.Delete B ',fNoteBook.Name,' Index=',Index,' fPageList.Count=',fPageList.Count,' fNoteBook.PageIndex=',fNoteBook.PageIndex]); {$ENDIF} if (Index >= 0) and (Index < fPageList.Count) then begin APage:=TCustomPage(fPageList[Index]); // delete handle APage.Parent:=nil; // free the page APage.Free; end; {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TNBPages.Delete END ',fNoteBook.Name,' Index=',Index,' fPageList.Count=',fPageList.Count,' fNoteBook.PageIndex=',fNoteBook.PageIndex]); {$ENDIF} end; {------------------------------------------------------------------------------ TNBPages Insert ------------------------------------------------------------------------------} procedure TNBPages.Insert(Index: Integer; const S: String); var NewPage: TCustomPage; NewOwner: TComponent; begin {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TNBPages.Insert A ',FNoteBook.Name,' Index=',Index,' S="',S,'"']); {$ENDIF} NewOwner:=FNotebook.Owner; if NewOwner=nil then NewOwner:=FNotebook; NewPage := FNotebook.PageClass.Create(NewOwner); with NewPage do Caption := S; {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TNBPages.Insert B ',FNotebook.Name,' Index=',Index,' S="',S,'"']); {$ENDIF} FNoteBook.InsertPage(NewPage,Index); {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TNBPages.Insert END ',FNotebook.Name,' Index=',Index,' S="',S,'"']); {$ENDIF} end; {------------------------------------------------------------------------------ TNBPages Move ------------------------------------------------------------------------------} procedure TNBPages.Move(CurIndex, NewIndex: Integer); var APage: TCustomPage; NewControlIndex, NewPageIndex: integer; begin if CurIndex=NewIndex then exit; NewPageIndex:=NewIndex; APage:=TCustomPage(fPageList[CurIndex]); // calculate new control index (i.e. ZOrderPosition) if NewIndex>=fPageList.Count-1 then NewControlIndex:=fNoteBook.ControlCount-1 else NewControlIndex:=fNoteBook.GetControlIndex(TCustomPage(fPageList[NewIndex])); // calculate new PageIndex if fNoteBook.PageIndex=CurIndex then NewPageIndex:=NewIndex else if fNoteBook.PageIndex>CurIndex then begin if fNoteBook.PageIndex<=NewIndex then NewPageIndex:=fNoteBook.PageIndex-1; end else begin if fNoteBook.PageIndex>=NewIndex then NewPageIndex:=fNoteBook.PageIndex+1; end; // move Page in notebook handle FNotebook.WSMovePage(APage, NewIndex); // move Page in fPageList fPageList.Move(CurIndex, NewIndex); // move in wincontrol list fNoteBook.SetControlIndex(APage,NewControlIndex); // update PageIndex fNoteBook.PageIndex:=NewPageIndex; end; {****************************************************************************** TCustomNotebook ******************************************************************************} {------------------------------------------------------------------------------ TCustomNotebook Constructor ------------------------------------------------------------------------------} constructor TCustomNotebook.Create(TheOwner: TComponent); begin if PageClass=nil then RaiseGDBException(''); inherited Create(TheOwner); fCompStyle := csNoteBook; fPageList := TListWithEvent.Create; fAccess := TNBPages.Create(TListWithEvent(fPageList), Self); fPageIndex := -1; FLoadedPageIndex:=-1; FPageIndexOnLastShow:=-1; ControlStyle := [csAcceptsControls]; TabPosition := tpTop; TabStop := true; ShowTabs := True; SetInitialBounds(0,0,GetControlClassDefaultSize.X,GetControlClassDefaultSize.Y); end; {------------------------------------------------------------------------------ Method: TCustomNotebook.CreateWnd Params: None Returns: Nothing Creates the interface object. ------------------------------------------------------------------------------} procedure TCustomNotebook.CreateWnd; begin {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TCustomNotebook.CreateWnd ',dbgsName(Self),' HandleAllocated=',HandleAllocated]); {$ENDIF} inherited CreateWnd; DoCreateWnd; end; {------------------------------------------------------------------------------ procedure TCustomNotebook.DoCreateWnd; Creates the handles for the pages and updates the notebook handle. ------------------------------------------------------------------------------} procedure TCustomNotebook.DoCreateWnd; var i: Integer; lPage: TCustomPage; begin {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TCustomNotebook.DoCreateWnd ',dbgsName(Self),' HandleAllocated=',HandleAllocated]); {$ENDIF} DisableAlign; try fAddingPages:=true; for i := 0 to FPageList.Count -1 do begin {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TCustomNotebook.DoCreateWnd ',dbgsName(Self),' Page.Caption=',Page[i].Caption,' pfAdded=',pfAdded in Page[i].Flags]); {$ENDIF} lPage := Page[i]; AddRemovePageHandle(lPage); end; fAddingPages:=false; DoSendShowTabs; DoSendPageIndex; ReAlign; finally EnableAlign; end; end; {------------------------------------------------------------------------------ Method: TCustomNotebook.Destroy Params: None Returns: Nothing Destructor for the class. ------------------------------------------------------------------------------} destructor TCustomNotebook.Destroy; begin Pages.Clear; FreeAndNil(FAccess); FreeAndNil(FPageList); inherited Destroy; end; {------------------------------------------------------------------------------ function TCustomNotebook.TabIndexAtClientPos(ClientPos: TPoint): integer; Returns the index of the page of the tab at the client position. For example: Index:=NoteBook1.PageIndexAtClientPos( NoteBook1.ScreenToClient(Mouse.CursorPos)); ------------------------------------------------------------------------------} function TCustomNotebook.TabIndexAtClientPos(ClientPos: TPoint): integer; begin if HandleAllocated then Result:=TWSCustomNotebookClass(WidgetSetClass).GetTabIndexAtPos(Self, ClientPos) else Result:=-1; end; function TCustomNotebook.CanTab: boolean; begin Result:=false; end; function TCustomNotebook.GetImageIndex(ThePageIndex: Integer): Integer; var APage: TCustomPage; begin APage:=Page[ThePageIndex]; if APage<>nil then Result:=APage.ImageIndex else Result:=-1; if Assigned(OnGetImageIndex) then OnGetImageIndex(Self,ThePageIndex,Result); end; function TCustomNotebook.IndexOf(APage: TCustomPage): integer; begin Result:=FPageList.IndexOf(APage); end; function TCustomNotebook.CustomPage(Index: integer): TCustomPage; begin Result:=GetPage(Index); end; function TCustomNotebook.CanChangePageIndex: boolean; begin Result := True; if ([csDesigning, csDestroying] * ComponentState = []) and Assigned(OnChanging) then OnChanging(Self, Result); end; function TCustomNotebook.GetMinimumTabWidth: integer; begin Result := TWSCustomNotebookClass(WidgetSetClass).GetNotebookMinTabWidth(Self); //debugln('TCustomNotebook.GetMinimumTabWidth A ',dbgs(Result)); end; function TCustomNotebook.GetMinimumTabHeight: integer; begin Result := TWSCustomNotebookClass(WidgetSetClass).GetNotebookMinTabHeight(Self); //debugln('TCustomNotebook.GetMinimumTabHeight A ',dbgs(Result)); end; function TCustomNotebook.GetCapabilities: TNoteBookCapabilities; begin Result:=TWSCustomNotebookClass(WidgetSetClass).GetCapabilities; end; {------------------------------------------------------------------------------ method TCustomNotebook DoCloseTabClicked Params: APage: TCustomPage Result: none Called whenever the user closes the tab. ------------------------------------------------------------------------------} procedure TCustomNotebook.DoCloseTabClicked(APage: TCustomPage); begin if Assigned(OnCloseTabClicked) then OnCloseTabClicked(APage); end; {------------------------------------------------------------------------------ TCustomNotebook GetActivePage ------------------------------------------------------------------------------} function TCustomNotebook.GetActivePage: String; begin if (FPageIndex >= 0) and (FPageIndex < PageCount) then Result := TCustomPage(FPageList[FPageIndex]).Caption else Result := ''; end; {------------------------------------------------------------------------------ function TCustomNotebook.GetActivePageComponent: TCustomPage; ------------------------------------------------------------------------------} function TCustomNotebook.GetActivePageComponent: TCustomPage; begin if (FPageIndex >= 0) and (FPageIndex < PageCount) then Result:=Page[FPageIndex] else Result:=nil; end; {------------------------------------------------------------------------------ TCustomNotebook SetActivePage ------------------------------------------------------------------------------} procedure TCustomNotebook.SetActivePage(const Value: String); var i: Integer; begin for i := 0 to fPageList.Count - 1 do begin if TCustomPage(fPageList[i]).Caption = Value then begin SetPageIndex(i); Break; end; end; end; procedure TCustomNotebook.SetActivePageComponent(const AValue: TCustomPage); begin PageIndex:=fPageList.IndexOf(AValue); end; procedure TCustomNotebook.SetImages(const AValue: TImageList); begin if FImages=AValue then exit; FImages:=AValue; if HandleAllocated then TWSCustomNotebookClass(WidgetSetClass).SetImageList(Self, AValue); UpdateTabProperties; end; procedure TCustomNotebook.SetOptions(const AValue: TNoteBookOptions); var ChangedOptions: TNoteBookOptions; begin if FOptions=AValue then exit; ChangedOptions:=(FOptions-AValue)+(AValue-FOptions); FOptions:=AValue; if nboShowCloseButtons in ChangedOptions then UpdateTabProperties; if nboMultiLine in ChangedOptions then TWSCustomNotebookClass(WidgetSetClass).GetCapabilities; end; {------------------------------------------------------------------------------ TCustomNotebook SetPageIndex ------------------------------------------------------------------------------} procedure TCustomNotebook.SetPageIndex(AValue: Integer); begin if (csLoading in ComponentState) then FLoadedPageIndex:=AValue; //debugln('TCustomNotebook.SetPageIndex A ',dbgsName(Self),' AValue=',dbgs(AValue),' fPageIndex=',dbgs(fPageIndex),' PageCount=',dbgs(PageCount),' HandleAllocated=',dbgs(HandleAllocated),' ',dbgs(ComponentState)); if (AValue < 0) or (AValue >= PageCount) then exit; if fPageIndex = AValue then exit; if not CanChangePageIndex then exit; //debugln('TCustomNotebook.SetPageIndex B ',dbgsName(Self),' AValue=',dbgs(AValue),' fPageIndex=',dbgs(fPageIndex),' PageCount=',dbgs(PageCount),' HandleAllocated=',dbgs(HandleAllocated)); fPageIndex := AValue; UpdateAllDesignerFlags; DoSendPageIndex; if ([csDesigning, csLoading, csDestroying] * ComponentState = []) and Assigned(OnPageChanged) then OnPageChanged(Self); end; {------------------------------------------------------------------------------ TCustomNotebook GetPageIndex ------------------------------------------------------------------------------} function TCustomNotebook.GetPageIndex: Integer; begin Result := fPageIndex; end; procedure TCustomNotebook.InsertPage(APage: TCustomPage; Index: Integer); var NewZPosition: integer; begin if FPageList.IndexOf(APage)>=0 then exit; {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TCustomNotebook.InsertPage A ',dbgsName(Self),' Index=',Index,' Name=', APage.Name,' Caption=',APage.Caption]); {$ENDIF} APage.DisableAlign; try if Index=0 then SetControlIndex(APage,NewZPosition); if PageIndex = -1 then FPageIndex := Index; UpdateDesignerFlags(Index); if HandleAllocated and (not (csLoading in ComponentState)) then begin AddRemovePageHandle(APage); if PageIndex = Index then DoSendPageIndex; end; finally APage.EnableAlign; end; {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TCustomNotebook.InsertPage END ',dbgsName(Self),' Index=', Index,' Name=',APage.Name,' Caption=',APage.Caption]); {$ENDIF} end; {------------------------------------------------------------------------------ TCustomNotebook MoveTab ------------------------------------------------------------------------------} procedure TCustomNoteBook.MoveTab(Sender: TObject; NewIndex: Integer); begin if (Sender <> nil) and (NewIndex < PageCount) then begin TNBPages(fAccess).Move(TCustomPage(Sender).PageIndex,NewIndex); end else ; //raise exception? Change; end; {------------------------------------------------------------------------------ function TCustomNotebook.FindVisiblePage(Index: Integer): Integer; It tries to find the next (at right) visible page. If no one is found, it tries to to find the previous (at left) visible page. Returns -1 if there's no visible pages. ------------------------------------------------------------------------------} function TCustomNotebook.FindVisiblePage(Index: Integer): Integer; begin for Result := Index to FPageList.Count - 1 do if TCustomPage(FPageList[Result]).TabVisible then exit; // if arrived here no visible forward page was found, search backwards for Result := Index - 1 downto 0 do if TCustomPage(FPageList[Result]).TabVisible then exit; Result := -1; end; procedure TCustomNotebook.PageRemoved(Index: Integer); var NewPageIndex: Integer; begin if not (csLoading in ComponentState) then begin // if this page is showing, then show the next page before deleting it if Index = FPageIndex then begin NewPageIndex := FindVisiblePage(Index); if NewPageIndex >= 0 then PageIndex := NewPageIndex else FPageIndex := NewPageIndex; end; end; end; procedure TCustomNotebook.WSMovePage(APage: TCustomPage; NewIndex: Integer); var RealIndex: Integer; i: Integer; begin //DebugLn(['TCustomNotebook.WSMovePage APage=',DbgSName(APage),' NewIndex=',NewIndex,' pfAdded=',pfAdded in APage.FFlags]); if HandleAllocated and (pfAdded in APage.FFlags) then begin RealIndex:=0; i:=0; repeat if (i=NewIndex) or (i=PageCount) then break; if pfAdded in Page[i].FFlags then inc(RealIndex); inc(i); until false; //DebugLn(['TCustomNotebook.WSMovePage APage=',DbgSName(APage),' NewIndex=',NewIndex,' RealIndex=',RealIndex]); TWSCustomNotebookClass(WidgetSetClass).MovePage(Self, APage, RealIndex); end; end; procedure TCustomNoteBook.AddRemovePageHandle(APage: TCustomPage); begin if (not (csDestroying in APage.ComponentState)) and (APage.TabVisible or (csDesigning in ComponentState)) then begin {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TCustomNoteBook.AddRemovePageHandle ADD ',DbgSName(APage),' pfAdded=',pfAdded in APage.FFlags]); {$ENDIF} if (pfAdded in APage.FFlags) then exit; Include(APage.FFlags,pfAdding); TWSCustomNotebookClass(WidgetSetClass).AddPage(Self, APage, APage.VisibleIndex); APage.FFlags:=APage.FFlags+[pfAdded]-[pfAdding]; APage.ResizeDelayedAutoSizeChildren end else begin {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TCustomNoteBook.AddRemovePageHandle REMOVE ',DbgSName(APage),' pfAdded=',pfAdded in APage.FFlags]); {$ENDIF} if not (pfAdded in APage.FFlags) or (pfRemoving in APage.FFlags) then exit; APage.FFlags := APage.FFlags - [pfAdded] + [pfRemoving]; TWSCustomNotebookClass(WidgetSetClass).RemovePage(Self, APage.VisibleIndex); if APage.HandleAllocated then APage.DestroyHandle; Exclude(APage.FFlags, pfRemoving); end; end; procedure TCustomNotebook.RemovePage(Index: Integer); var APage: TCustomPage; begin // Make sure Index is in the range of valid pages to delete {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TCustomNotebook.RemovePage A ',dbgsName(Self),' Index=',Index, ' FPageList.Count=',FPageList.Count,' PageIndex=',PageIndex]); {$ENDIF} if (Index >= 0) and (Index < FPageList.Count) then begin APage:=TCustomPage(fPageList[Index]); APage.FTabVisible:=false; if HandleAllocated then AddRemovePageHandle(APage); PageRemoved(Index); FPageList.Delete(Index); APage.Parent:=nil; if FPageIndex >= Index then Dec(FPageIndex); end; {$IFDEF NOTEBOOK_DEBUG} DebugLn(['TCustomNotebook.RemovePage END ',dbgsName(Self),' Index=',Index,' fPageList.Count=',fPageList.Count,' PageIndex=',PageIndex]); {$ENDIF} end; {------------------------------------------------------------------------------ function TCustomNotebook.IsStoredActivePage: boolean; ------------------------------------------------------------------------------} function TCustomNotebook.IsStoredActivePage: boolean; begin Result:=false; end; {------------------------------------------------------------------------------ TCustomNotebook GetPageCount ------------------------------------------------------------------------------} function TCustomNotebook.GetPageCount: Integer; begin Result := fPageList.Count; end; {------------------------------------------------------------------------------ TCustomNotebook SetPages ------------------------------------------------------------------------------} procedure TCustomNotebook.SetPages(AValue: TStrings); begin FAccess.Assign(AValue); end; {------------------------------------------------------------------------------ TCustomNotebook GetPage ------------------------------------------------------------------------------} function TCustomNotebook.GetPage(aIndex: Integer): TCustomPage; begin if (aIndex<0) or (aIndex>=fPageList.Count) then RaiseGDBException('TCustomNotebook.GetCustomPage Index out of bounds'); Result := TCustomPage(fPageList.Items[aIndex]); end; {------------------------------------------------------------------------------ TCustomNotebook SetShowTabs ------------------------------------------------------------------------------} procedure TCustomNotebook.SetShowTabs(AValue: Boolean); begin if fShowTabs=AValue then exit; fShowTabs := AValue; DoSendShowTabs; end; {------------------------------------------------------------------------------ TCustomNotebook SetTabPosition ------------------------------------------------------------------------------} procedure TCustomNotebook.SetTabPosition(tabPos: TTabPosition); begin if fTabPosition = tabPos then exit; fTabPosition := tabPos; DoSendTabPosition; end; {------------------------------------------------------------------------------ procedure TCustomNotebook.UpdateAllDesignerFlags; ------------------------------------------------------------------------------} procedure TCustomNotebook.UpdateAllDesignerFlags; var i: integer; begin for i:=0 to PageCount-1 do UpdateDesignerFlags(i); end; {------------------------------------------------------------------------------ procedure TCustomNotebook.UpdateDesignerFlags(APageIndex: integer); ------------------------------------------------------------------------------} procedure TCustomNotebook.UpdateDesignerFlags(APageIndex: integer); begin if APageIndex<>fPageIndex then Page[APageIndex].ControlStyle:= Page[APageIndex].ControlStyle+[csNoDesignVisible] else Page[APageIndex].ControlStyle:= Page[APageIndex].ControlStyle-[csNoDesignVisible]; end; {------------------------------------------------------------------------------ TCustomNotebook ReadState ------------------------------------------------------------------------------} procedure TCustomNotebook.ReadState(Reader: TReader); begin // do not clear. Think about loading ancestor + loading descendant stream. // fAccess.Clear; inherited ReadState(Reader); end; {------------------------------------------------------------------------------ TCustomNotebook ShowControl ------------------------------------------------------------------------------} procedure TCustomNotebook.ShowControl(APage: TControl); var i: LongInt; begin //inherited ShowControl(AControl); { Find a child control that matches the one passed in and display the page that contains that control. This method is necessary for compatibility with Delphi } for i := 0 to fPageList.Count - 1 do begin if TControl(fPageList[i]) = APage then begin PageIndex := i; Exit; end; end; end; {------------------------------------------------------------------------------ method TCustomNotebook UpdateTabProperties Params: none Result: none Tells the interface to update all tabs. ------------------------------------------------------------------------------} procedure TCustomNotebook.UpdateTabProperties; var i: integer; begin if not HandleAllocated or (csLoading in ComponentState) then exit; for i := 0 to PageCount - 1 do TWSCustomPageClass(Page[i].WidgetSetClass).UpdateProperties(Page[i]); end; function TCustomNotebook.ChildClassAllowed(ChildClass: TClass): boolean; begin Result:=(ChildClass<>nil) and (ChildClass.InheritsFrom(PageClass)); end; class function TCustomNotebook.GetControlClassDefaultSize: TPoint; begin Result.X:=200; Result.Y:=200; end; {------------------------------------------------------------------------------ TCustomNotebook Change ------------------------------------------------------------------------------} procedure TCustomNotebook.Change; Begin //DebugLn(['TCustomNotebook.Change ',DbgSName(Self),' fPageIndex=',fPageIndex]); ShowCurrentPage; fPageIndexOnLastChange := fPageIndex; if ([csLoading,csDestroying]*ComponentState=[]) and (not fAddingPages) then begin if Assigned(fOnPageChanged) then fOnPageChanged(Self); end; end; procedure TCustomNotebook.Loaded; begin inherited Loaded; if FLoadedPageIndex>=0 then PageIndex:=FLoadedPageIndex; FLoadedPageIndex:=-1; //DebugLn(['TCustomNotebook.Loaded ',DbgSName(Self),' fPageIndex=',fPageIndex]); fPageIndexOnLastChange:=PageIndex; FPageIndexOnLastShow:=fPageIndexOnLastChange; if HandleAllocated then DoCreateWnd; end; function TCustomNotebook.DialogChar(var Message: TLMKey): boolean; var destPage: TCustomPage; begin // broadcast only to active page Result := false; destPage := GetActivePageComponent; if destPage <> nil then Result := destPage.DialogChar(Message); end; {------------------------------------------------------------------------------ TCustomNotebook CNNotify ------------------------------------------------------------------------------} procedure TCustomNotebook.CNNotify(var Message: TLMNotify); var OldPageIndex: LongInt; begin with Message do case NMHdr^.code of TCN_SELCHANGE: begin // set the page from the NMHDR^.idfrom if (not fAddingPages) then begin OldPageIndex:=FPageIndex; FPageIndex := NMHDR^.idfrom; if FPageIndex>=PageCount then FPageIndex:=-1; //debugln(['TCustomNotebook.CNNotify ',DbgSName(Self),' A Old=',OldPageIndex,' fPageIndex=',fPageIndex,' FLoadedPageIndex=',FLoadedPageIndex]); //if PageIndex>=0 then DebugLn(['TCustomNotebook.CNNotify Page=',DbgSName(Page[PageIndex]),' Visible=',Page[PageIndex].Visible]); UpdateAllDesignerFlags; if ([csLoading,csDestroying]*ComponentState=[]) then begin if OldPageIndex<>fPageIndex then begin if csDesigning in ComponentState then OwnerFormDesignerModified(Self); //DebugLn(['TCustomNotebook.CNNotify ',DbgSName(Page[PageIndex]),' ',Page[PageIndex].Visible]); Change; end; end; end; end; TCN_SELCHANGING: begin if CanChangePageIndex then Result := 0 else Result := 1; //debugln('TCustomNotebook.CNNotify TCN_SELCHANGING Result=',dbgs(Result)); end; else begin {$IFDEF NOTEBOOK_DEBUG} DebugLn(['[TCustomNotebook.CNNotify] unhandled NMHdr code:', NMHdr^.code]); {$ENDIF} end; end; end; {------------------------------------------------------------------------------ procedure TCustomNotebook.DoSendPageIndex Makes sure Visible = true for page which has index FPageIndex ------------------------------------------------------------------------------} procedure TCustomNotebook.ShowCurrentPage; var CurPage: TCustomPage; begin if (FPageIndex >= 0) and (FPageIndex < PageCount) then begin CurPage:=Page[FPageIndex]; // first make the new page visible //DebugLn(['TCustomNotebook.ShowCurrentPage ',DbgSName(CurPage),' CurPage.Visible=',CurPage.Visible]); if CurPage.Visible then begin if FPageIndexOnLastShow<>fPageIndex then begin // some widgetsets like win32/64 do not send WM_SIZE messages for // hidden pages. Force resizing page (it is alClient). //DebugLn(['TCustomNotebook.ShowCurrentPage ',dbgsName(Self),' ',DbgSName(CurPage),' CurPage.Visible=',CurPage.Visible,' BoundsRect=',dbgs(BoundsRect),' ClientRect=',dbgs(ClientRect),' CurPage.BoundsRect=',dbgs(CurPage.BoundsRect),' CurPage.ClientRect=',dbgs(CurPage.ClientRect)]); ReAlign; // TCustomPage.IsControlVisible is overriden // therefore AutoSizing of childs was skipped => do it now CurPage.ReAlign; end; end else begin CurPage.Visible := true; //DebugLn(['TCustomNotebook.ShowCurrentPage CurPage.AutoSizeDelayed=',CurPage.AutoSizeDelayed,' ',dbgs(CurPage.ComponentState),' ',CurPage.HandleAllocated]); end; FPageIndexOnLastShow:=fPageIndex; CurPage.DoShow; if (FPageIndexOnLastChange >= 0) and (FPageIndexOnLastChange < PageCount) and (FPageIndexOnLastChange <> FPageIndex) then begin // Page[FPageIndexOnLastChange].Visible := False; <-- this will be better, // but this does not work on gtk (tab hides too) Page[FPageIndexOnLastChange].DoHide; end; end; end; {------------------------------------------------------------------------------ procedure TCustomNotebook.DoSendPageIndex; ------------------------------------------------------------------------------} procedure TCustomNotebook.DoSendPageIndex; begin //DebugLn('[TCustomNotebook.DoSendPageIndex] A ',dbgsName(Self),' PageIndex=',dbgs(fPageIndex),' ',dbgs(csLoading in ComponentState),' ',dbgs(HandleAllocated)); if not HandleAllocated or (csLoading in ComponentState) then exit; {$IFDEF NOTEBOOK_DEBUG} //DebugLn('[TCustomNotebook.DoSendPageIndex] B ',dbgsName(Self),' PageIndex=',dbgs(fPageIndex)); {$ENDIF} ShowCurrentPage; TWSCustomNotebookClass(WidgetSetClass).SetPageIndex(Self, FPageIndex); {$IFDEF NOTEBOOK_DEBUG} //DebugLn('[TCustomNotebook.DoSendPageIndex] END ',dbgs(FPageIndex)); {$ENDIF} end; {------------------------------------------------------------------------------ procedure TCustomNotebook.DoSendShowTabs; ------------------------------------------------------------------------------} procedure TCustomNotebook.DoSendShowTabs; begin if not HandleAllocated or (csLoading in ComponentState) then exit; {$IFDEF NOTEBOOK_DEBUG} DebugLn('[TCustomNotebook.DoSendShowTabs] A ',dbgsName(Self)); {$ENDIF} TWSCustomNotebookClass(WidgetSetClass).ShowTabs(Self, FShowTabs); {$IFDEF NOTEBOOK_DEBUG} DebugLn('[TCustomNotebook.DoSendShowTabs] B ',dbgsName(Self)); {$ENDIF} end; {------------------------------------------------------------------------------ procedure TCustomNotebook.DoSendTabPosition; ------------------------------------------------------------------------------} procedure TCustomNotebook.DoSendTabPosition; begin if not HandleAllocated or (csLoading in ComponentState) then exit; TWSCustomNotebookClass(WidgetSetClass).SetTabPosition(Self, FTabPosition); end;