From 273c00afd181336d151f32853cf3f78079f0fe8f Mon Sep 17 00:00:00 2001 From: mattias Date: Sat, 12 Jun 2010 11:04:13 +0000 Subject: [PATCH] anchordocking: popup menu for pages: close git-svn-id: trunk@26054 - --- examples/anchordocking/anchordocking.pas | 155 +++++++++++++++++------ 1 file changed, 113 insertions(+), 42 deletions(-) diff --git a/examples/anchordocking/anchordocking.pas b/examples/anchordocking/anchordocking.pas index fdb99ea0d3..77237499e3 100644 --- a/examples/anchordocking/anchordocking.pas +++ b/examples/anchordocking/anchordocking.pas @@ -132,10 +132,6 @@ type procedure SetAlign(Value: TAlign); override; procedure DoOnShowHint(HintInfo: PHintInfo); override; procedure PopupMenuPopup(Sender: TObject); virtual; - function AddPopupMenuItem(AName, ACaption: string; - const OnClickEvent: TNotifyEvent; AParent: TMenuItem = nil): TMenuItem; - function AddRemovePopupMenuItem(Add: boolean; AName, ACaption: string; - const OnClickEvent: TNotifyEvent; AParent: TMenuItem = nil): TMenuItem; public constructor Create(TheOwner: TComponent); override; property CloseButton: TSpeedButton read FCloseButton; @@ -179,11 +175,15 @@ type function GetDockPages(Index: integer): TAnchorDockPage; protected procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); override; + procedure PopupMenuPopup(Sender: TObject); virtual; + procedure CloseButtonClick(Sender: TObject); virtual; + procedure ChangeLockButtonClick(Sender: TObject); virtual; public constructor Create(TheOwner: TComponent); override; procedure UpdateDockCaption(Exclude: TControl = nil); override; property DockPages[Index: integer]: TAnchorDockPage read GetDockPages; procedure RemoveControl(AControl: TControl); override; + function GetActiveSite: TAnchorDockHostSite; end; { TAnchorDockHostSite @@ -374,6 +374,10 @@ type function IsSite(AControl: TControl): boolean; function IsCustomSite(AControl: TControl): boolean; function GetPopupMenu: TPopupMenu; + function AddPopupMenuItem(AName, ACaption: string; + const OnClickEvent: TNotifyEvent; AParent: TMenuItem = nil): TMenuItem; virtual; + function AddRemovePopupMenuItem(Add: boolean; AName, ACaption: string; + const OnClickEvent: TNotifyEvent; AParent: TMenuItem = nil): TMenuItem; virtual; // show / make a control dockable procedure MakeDockable(AControl: TControl; Show: boolean = true; @@ -980,7 +984,9 @@ begin if not (Sender is TPopupMenu) then exit; Popup:=TPopupMenu(Sender); if Popup.PopupComponent is TAnchorDockHeader then - TAnchorDockHeader(Popup.PopupComponent).PopupMenuPopup(Sender); + TAnchorDockHeader(Popup.PopupComponent).PopupMenuPopup(Sender) + else if Popup.PopupComponent is TAnchorDockPageControl then + TAnchorDockPageControl(Popup.PopupComponent).PopupMenuPopup(Sender); end; procedure TAnchorDockMaster.PopupMenuCloseUp(Sender: TObject); @@ -1093,6 +1099,35 @@ begin Result:=fPopupMenu; end; +function TAnchorDockMaster.AddPopupMenuItem(AName, ACaption: string; + const OnClickEvent: TNotifyEvent; AParent: TMenuItem): TMenuItem; +begin + Result:=TMenuItem(fPopupMenu.FindComponent(AName)); + if Result=nil then begin + Result:=TMenuItem.Create(fPopupMenu); + Result.Name:=AName; + if AParent=nil then + fPopupMenu.Items.Add(Result) + else + AParent.Add(Result); + end; + Result.Caption:=ACaption; + Result.OnClick:=OnClickEvent; +end; + +function TAnchorDockMaster.AddRemovePopupMenuItem(Add: boolean; AName, + ACaption: string; const OnClickEvent: TNotifyEvent; AParent: TMenuItem + ): TMenuItem; +begin + if Add then + Result:=AddPopupMenuItem(AName,ACaption,OnClickEvent,AParent) + else begin + Result:=TMenuItem(fPopupMenu.FindComponent(AName)); + if Result<>nil then + FreeAndNil(Result); + end; +end; + procedure TAnchorDockMaster.MakeDockable(AControl: TControl; Show: boolean; BringToFront: boolean; AddDockHeader: boolean); var @@ -3122,21 +3157,25 @@ begin // top popup menu item can be clicked by accident, so use something simple: // lock/unlock - ChangeLockItem:=AddPopupMenuItem('ChangeLockMenuItem', adrsLocked,@ChangeLockButtonClick); + ChangeLockItem:= DockMaster.AddPopupMenuItem('ChangeLockMenuItem', adrsLocked, + @ChangeLockButtonClick); ChangeLockItem.Checked:=not DockMaster.AllowDragging; ChangeLockItem.ShowAlwaysCheckable:=true; // undock, merge - AddRemovePopupMenuItem(ParentSite.CanUndock,'UndockMenuItem',adrsUndock,@UndockButtonClick); - AddRemovePopupMenuItem(ParentSite.CanMerge,'MergeMenuItem', adrsMerge, @MergeButtonClick); + DockMaster.AddRemovePopupMenuItem(ParentSite.CanUndock,'UndockMenuItem', + adrsUndock,@UndockButtonClick); + DockMaster.AddRemovePopupMenuItem(ParentSite.CanMerge,'MergeMenuItem', + adrsMerge, @MergeButtonClick); // header position - HeaderPosItem:=AddPopupMenuItem('HeaderPosMenuItem', adrsHeaderPosition, nil); - Item:=AddPopupMenuItem('HeaderPosAutoMenuItem', adrsAutomatically, + HeaderPosItem:=DockMaster.AddPopupMenuItem('HeaderPosMenuItem', + adrsHeaderPosition, nil); + Item:=DockMaster.AddPopupMenuItem('HeaderPosAutoMenuItem', adrsAutomatically, @HeaderPositionItemClick, HeaderPosItem); if Item<>nil then Item.Tag:=ord(adlhpAuto); for Side:=Low(TAnchorKind) to High(TAnchorKind) do begin - Item:=AddPopupMenuItem('HeaderPos'+AnchorNames[Side]+'MenuItem', + Item:=DockMaster.AddPopupMenuItem('HeaderPos'+AnchorNames[Side]+'MenuItem', SideCaptions[Side], @HeaderPositionItemClick, HeaderPosItem); if Item<>nil then Item.Tag:=ord(Side)+1; @@ -3144,7 +3183,7 @@ begin // enlarge for Side:=Low(TAnchorKind) to High(TAnchorKind) do begin - Item:=AddRemovePopupMenuItem(ParentSite.EnlargeSide(Side,true), + Item:=DockMaster.AddRemovePopupMenuItem(ParentSite.EnlargeSide(Side,true), 'Enlarge'+AnchorNames[Side]+'MenuItem', Format(adrsEnlargeSide, [ SideCaptions[Side]]),@EnlargeSideClick); if Item<>nil then Item.Tag:=ord(Side); @@ -3156,36 +3195,8 @@ begin s:=Format(adrsQuit, [Application.Title]) else s:=adrsClose; - AddRemovePopupMenuItem(CloseButton.Visible,'CloseMenuItem',s,@CloseButtonClick); -end; - -function TAnchorDockHeader.AddPopupMenuItem(AName, ACaption: string; - const OnClickEvent: TNotifyEvent; AParent: TMenuItem): TMenuItem; -begin - Result:=TMenuItem(FindComponent(AName)); - if Result=nil then begin - Result:=TMenuItem.Create(Self); - Result.Name:=AName; - if AParent=nil then - PopupMenu.Items.Add(Result) - else - AParent.Add(Result); - end; - Result.Caption:=ACaption; - Result.OnClick:=OnClickEvent; -end; - -function TAnchorDockHeader.AddRemovePopupMenuItem(Add: boolean; AName, - ACaption: string; const OnClickEvent: TNotifyEvent; AParent: TMenuItem - ): TMenuItem; -begin - if Add then - Result:=AddPopupMenuItem(AName,ACaption,OnClickEvent,AParent) - else begin - Result:=TMenuItem(FindComponent(AName)); - if Result<>nil then - FreeAndNil(Result); - end; + DockMaster.AddRemovePopupMenuItem(CloseButton.Visible,'CloseMenuItem',s, + @CloseButtonClick); end; procedure TAnchorDockHeader.CloseButtonClick(Sender: TObject); @@ -3830,6 +3841,53 @@ begin end; end; +procedure TAnchorDockPageControl.PopupMenuPopup(Sender: TObject); +var + ChangeLockItem: TMenuItem; + ParentSite: TAnchorDockHostSite; + Side: TAnchorKind; + SideCaptions: array[TAnchorKind] of string; + ContainsMainForm: Boolean; + s: String; +begin + ParentSite:=TAnchorDockHostSite(Parent); + SideCaptions[akLeft]:=adrsLeft; + SideCaptions[akTop]:=adrsTop; + SideCaptions[akRight]:=adrsRight; + SideCaptions[akBottom]:=adrsBottom; + PopupMenu.Items.Clear; + + // top popup menu item can be clicked by accident, so use something simple: + // lock/unlock + ChangeLockItem:=DockMaster.AddPopupMenuItem('ChangeLockMenuItem', adrsLocked, + @ChangeLockButtonClick); + ChangeLockItem.Checked:=not DockMaster.AllowDragging; + ChangeLockItem.ShowAlwaysCheckable:=true; + + // close + ContainsMainForm:=IsParentOf(Application.MainForm); + if ContainsMainForm then + s:=Format(adrsQuit, [Application.Title]) + else + s:=adrsClose; + DockMaster.AddPopupMenuItem('CloseMenuItem',s,@CloseButtonClick); +end; + +procedure TAnchorDockPageControl.CloseButtonClick(Sender: TObject); +var + Site: TAnchorDockHostSite; +begin + Site:=GetActiveSite; + if Site=nil then exit; + Site.CloseSite; + DockMaster.SimplifyPendingLayouts; +end; + +procedure TAnchorDockPageControl.ChangeLockButtonClick(Sender: TObject); +begin + DockMaster.AllowDragging:=not DockMaster.AllowDragging; +end; + procedure TAnchorDockPageControl.UpdateDockCaption(Exclude: TControl); begin if Exclude=nil then ; @@ -3844,10 +3902,23 @@ begin end; end; +function TAnchorDockPageControl.GetActiveSite: TAnchorDockHostSite; +var + CurPage: TCustomPage; + CurDockPage: TAnchorDockPage; +begin + Result:=nil; + CurPage:=ActivePageComponent; + if not (CurPage is TAnchorDockPage) then exit; + CurDockPage:=TAnchorDockPage(CurPage); + Result:=CurDockPage.GetSite; +end; + constructor TAnchorDockPageControl.Create(TheOwner: TComponent); begin PageClass:=TAnchorDockPage; inherited Create(TheOwner); + PopupMenu:=DockMaster.GetPopupMenu; end; { TAnchorDockPage }