AnchorDocking: More refactoring. Rename "Parent" parameter to avoid confusion.

git-svn-id: trunk@55657 -
This commit is contained in:
juha 2017-08-13 17:04:58 +00:00
parent 701a919a24
commit f7a2a00330

View File

@ -551,8 +551,8 @@ type
procedure SetHeaderFilled(AValue: boolean); procedure SetHeaderFilled(AValue: boolean);
procedure SetShowMenuItemShowHeader(AValue: boolean); procedure SetShowMenuItemShowHeader(AValue: boolean);
procedure SetupSite(Site: TWinControl; Node: TAnchorDockLayoutTreeNode; procedure SetupSite(Site: TWinControl; ANode: TAnchorDockLayoutTreeNode;
Parent: TWinControl); AParent: TWinControl);
procedure ShowHeadersButtonClick(Sender: TObject); procedure ShowHeadersButtonClick(Sender: TObject);
procedure OptionsClick(Sender: TObject); procedure OptionsClick(Sender: TObject);
procedure SetIdleConnected(const AValue: Boolean); procedure SetIdleConnected(const AValue: Boolean);
@ -564,8 +564,7 @@ type
procedure AutoSizeAllHeaders(EnableAutoSizing: boolean); procedure AutoSizeAllHeaders(EnableAutoSizing: boolean);
procedure DisableControlAutoSizing(AControl: TControl); procedure DisableControlAutoSizing(AControl: TControl);
procedure InvalidateHeaders; procedure InvalidateHeaders;
procedure Notification(AComponent: TComponent; Operation: TOperation); procedure Notification(AComponent: TComponent; Operation: TOperation); override;
override;
procedure SetHeaderAlignLeft(const AValue: integer); procedure SetHeaderAlignLeft(const AValue: integer);
procedure SetHeaderAlignTop(const AValue: integer); procedure SetHeaderAlignTop(const AValue: integer);
procedure SetShowHeader(AValue: boolean); procedure SetShowHeader(AValue: boolean);
@ -1764,7 +1763,7 @@ begin
end; end;
procedure TAnchorDockMaster.SetupSite(Site: TWinControl; procedure TAnchorDockMaster.SetupSite(Site: TWinControl;
Node: TAnchorDockLayoutTreeNode; Parent: TWinControl); ANode: TAnchorDockLayoutTreeNode; AParent: TWinControl);
var var
aManager: TAnchorDockManager; aManager: TAnchorDockManager;
NewBounds: TRect; NewBounds: TRect;
@ -1772,11 +1771,11 @@ var
aHostSite: TAnchorDockHostSite; aHostSite: TAnchorDockHostSite;
begin begin
if Site is TAnchorDockPanel then if Site is TAnchorDockPanel then
GetParentForm(Site).BoundsRect:=Node.BoundsRect GetParentForm(Site).BoundsRect:=ANode.BoundsRect
else begin else begin
if Parent=nil then begin if AParent=nil then begin
if (Node.Monitor>=0) and (Node.Monitor<Screen.MonitorCount) then if (ANode.Monitor>=0) and (ANode.Monitor<Screen.MonitorCount) then
aMonitor:=Screen.Monitors[Node.Monitor] aMonitor:=Screen.Monitors[ANode.Monitor]
else begin else begin
if Site is TCustomForm then if Site is TCustomForm then
aMonitor:=TCustomForm(Site).Monitor aMonitor:=TCustomForm(Site).Monitor
@ -1791,21 +1790,21 @@ begin
end; end;
if IsCustomSite(Site) then begin if IsCustomSite(Site) then begin
aManager:=TAnchorDockManager(Site.DockManager); aManager:=TAnchorDockManager(Site.DockManager);
if Node.Count>0 then begin if ANode.Count>0 then begin
// this custom dock site gets a child => store and clear constraints // this custom dock site gets a child => store and clear constraints
aManager.StoreConstraints; aManager.StoreConstraints;
end; end;
end; end;
Site.Constraints.MaxWidth:=0; Site.Constraints.MaxWidth:=0;
Site.Constraints.MaxHeight:=0; Site.Constraints.MaxHeight:=0;
NewBounds:=Node.BoundsRect; NewBounds:=ANode.BoundsRect;
if Parent=nil then begin if AParent=nil then begin
NewBounds:=Rect(ScaleTopLvlX(NewBounds.Left),ScaleTopLvlY(NewBounds.Top), NewBounds:=Rect(ScaleTopLvlX(NewBounds.Left),ScaleTopLvlY(NewBounds.Top),
ScaleTopLvlX(NewBounds.Right),ScaleTopLvlY(NewBounds.Bottom)); ScaleTopLvlX(NewBounds.Right),ScaleTopLvlY(NewBounds.Bottom));
end else begin end else begin
if Parent is TAnchorDockPanel then if AParent is TAnchorDockPanel then
begin begin
NewBounds:=Rect(0,0,Parent.ClientWidth,Parent.ClientHeight); NewBounds:=Rect(0,0,AParent.ClientWidth,AParent.ClientHeight);
Site.Align:=alClient; Site.Align:=alClient;
end end
else else
@ -1819,26 +1818,26 @@ begin
Site.BoundsRect:=NewBounds; Site.BoundsRect:=NewBounds;
Site.Visible:=true; Site.Visible:=true;
if not (Site is TAnchorDockPanel) then if not (Site is TAnchorDockPanel) then
Site.Parent:=Parent; Site.Parent:=AParent;
if IsCustomSite(Parent) then begin if IsCustomSite(AParent) then begin
aManager:=TAnchorDockManager(Parent.DockManager); aManager:=TAnchorDockManager(AParent.DockManager);
Site.Align:=Node.Align; Site.Align:=ANode.Align;
{$IFDEF VerboseAnchorDockRestore} {$IFDEF VerboseAnchorDockRestore}
debugln(['TAnchorDockMaster.RestoreLayout.SetupSite custom Site=',DbgSName(Site),' Site.Bounds=',dbgs(Site.BoundsRect),' BoundSplitterPos=',Node.BoundSplitterPos]); debugln(['TAnchorDockMaster.RestoreLayout.SetupSite custom Site=',DbgSName(Site),' Site.Bounds=',dbgs(Site.BoundsRect),' BoundSplitterPos=',Node.BoundSplitterPos]);
{$ENDIF} {$ENDIF}
aManager.RestoreSite(Node.BoundSplitterPos); aManager.RestoreSite(ANode.BoundSplitterPos);
Site.HostDockSite:=Parent; Site.HostDockSite:=AParent;
end; end;
if Site is TAnchorDockHostSite then begin if Site is TAnchorDockHostSite then begin
aHostSite:=TAnchorDockHostSite(Site); aHostSite:=TAnchorDockHostSite(Site);
aHostSite.Header.HeaderPosition:=Node.HeaderPosition; aHostSite.Header.HeaderPosition:=ANode.HeaderPosition;
aHostSite.DockRestoreBounds:=NewBounds; aHostSite.DockRestoreBounds:=NewBounds;
if (Node.NodeType<>adltnPages) and (aHostSite.Pages<>nil) then if (ANode.NodeType<>adltnPages) and (aHostSite.Pages<>nil) then
aHostSite.FreePages; aHostSite.FreePages;
end; end;
if Site is TCustomForm then if Site is TCustomForm then
if Parent=nil then if AParent=nil then
TCustomForm(Site).WindowState:=Node.WindowState TCustomForm(Site).WindowState:=ANode.WindowState
else else
TCustomForm(Site).WindowState:=wsNormal; TCustomForm(Site).WindowState:=wsNormal;
end; end;
@ -1860,7 +1859,7 @@ end;
function TAnchorDockMaster.RestoreLayout(Tree: TAnchorDockLayoutTree; function TAnchorDockMaster.RestoreLayout(Tree: TAnchorDockLayoutTree;
Scale: boolean): boolean; Scale: boolean): boolean;
function Restore(Node: TAnchorDockLayoutTreeNode; Parent: TWinControl): TControl; function Restore(ANode: TAnchorDockLayoutTreeNode; AParent: TWinControl): TControl;
var var
AControl: TControl; AControl: TControl;
Site: TAnchorDockHostSite; Site: TAnchorDockHostSite;
@ -1874,20 +1873,24 @@ function TAnchorDockMaster.RestoreLayout(Tree: TAnchorDockLayoutTree;
aPage: TCustomPage; aPage: TCustomPage;
begin begin
Result:=nil; Result:=nil;
if Scale and SrcRectValid(Node.WorkAreaRect) then if Scale and SrcRectValid(ANode.WorkAreaRect) then
SrcWorkArea:=Node.WorkAreaRect; SrcWorkArea:=ANode.WorkAreaRect;
{$IFDEF VerboseAnchorDockRestore} {$IFDEF VerboseAnchorDockRestore}
debugln(['TAnchorDockMaster.RestoreLayout.Restore Node="',Node.Name,'" ',dbgs(Node.NodeType),' Bounds=',dbgs(Node.BoundsRect),' Parent=',DbgSName(Parent),' ']); debugln(['TAnchorDockMaster.RestoreLayout.Restore Node="',Node.Name,'" ',dbgs(Node.NodeType),' Bounds=',dbgs(Node.BoundsRect),' Parent=',DbgSName(Parent),' ']);
{$ENDIF} {$ENDIF}
if Node.NodeType=adltnControl then begin AControl:=nil;
// restore control if ANode.NodeType in [adltnControl, adltnCustomSite] then
// the control was already created begin
// => dock it AControl:=FindControl(ANode.Name);
AControl:=FindControl(Node.Name);
if AControl=nil then begin if AControl=nil then begin
debugln(['TAnchorDockMaster.RestoreLayout.Restore can not find control ',Node.Name]); debugln(['TAnchorDockMaster.RestoreLayout.Restore WARNING: can not find control ',ANode.Name,
', NodeType=', ANode.NodeType]);
exit; exit;
end; end;
end;
if ANode.NodeType=adltnControl then begin
// restore control
// the control was already created => dock it
DisableControlAutoSizing(AControl); DisableControlAutoSizing(AControl);
if AControl.HostDockSite=nil then if AControl.HostDockSite=nil then
MakeDockable(AControl,false) MakeDockable(AControl,false)
@ -1898,47 +1901,41 @@ function TAnchorDockMaster.RestoreLayout(Tree: TAnchorDockLayoutTree;
' Control=',DbgSName(AControl),' Site=',DbgSName(AControl.HostDockSite)]); ' Control=',DbgSName(AControl),' Site=',DbgSName(AControl.HostDockSite)]);
{$ENDIF} {$ENDIF}
AControl.Visible:=true; AControl.Visible:=true;
SetupSite(AControl.HostDockSite,Node,Parent); SetupSite(AControl.HostDockSite,ANode,AParent);
Result:=AControl.HostDockSite; Result:=AControl.HostDockSite;
end end
else if Node.NodeType=adltnCustomSite then begin else if ANode.NodeType=adltnCustomSite then begin
// restore custom dock site // restore custom dock site
// the control was already created // the control was already created => position it
// => position it
AControl:=FindControl(Node.Name);
if AControl=nil then begin
debugln(['TAnchorDockMaster.RestoreLayout.Restore WARNING: can not find control ',Node.Name]);
exit;
end;
if not (IsCustomSite(AControl) or (AControl is TAnchorDockPanel)) then begin if not (IsCustomSite(AControl) or (AControl is TAnchorDockPanel)) then begin
debugln(['TAnchorDockMaster.RestoreLayout.Restore WARNING: ',Node.Name,' is not a custom dock site ',DbgSName(AControl)]); debugln(['TAnchorDockMaster.RestoreLayout.Restore WARNING: ',ANode.Name,' is not a custom dock site ',DbgSName(AControl)]);
exit; exit;
end; end;
DisableControlAutoSizing(AControl); DisableControlAutoSizing(AControl);
SetupSite(TCustomForm(AControl),Node,nil); SetupSite(TCustomForm(AControl),ANode,nil);
Result:=AControl; Result:=AControl;
// restore docked site // restore docked site
if Node.Count>0 then if ANode.Count>0 then
Restore(Node[0],TCustomForm(AControl)); Restore(ANode[0],TCustomForm(AControl));
end end
else if Node.IsSplitter then begin else if ANode.IsSplitter then begin
// restore splitter // restore splitter
Splitter:=TAnchorDockSplitter(fTreeNameToDocker[Node.Name]); Splitter:=TAnchorDockSplitter(fTreeNameToDocker[ANode.Name]);
if Splitter=nil then begin if Splitter=nil then begin
Splitter:=CreateSplitter; Splitter:=CreateSplitter;
fTreeNameToDocker[Node.Name]:=Splitter; fTreeNameToDocker[ANode.Name]:=Splitter;
end; end;
{$IFDEF VerboseAnchorDockRestore} {$IFDEF VerboseAnchorDockRestore}
debugln(['TAnchorDockMaster.RestoreLayout.Restore Splitter Node.Name=',Node.Name,' ',dbgs(Node.NodeType),' Splitter=',DbgSName(Splitter)]); debugln(['TAnchorDockMaster.RestoreLayout.Restore Splitter Node.Name=',Node.Name,' ',dbgs(Node.NodeType),' Splitter=',DbgSName(Splitter)]);
{$ENDIF} {$ENDIF}
Splitter.Parent:=Parent; Splitter.Parent:=AParent;
NewBounds:=Node.BoundsRect; NewBounds:=ANode.BoundsRect;
if SrcRectValid(SrcWorkArea) then if SrcRectValid(SrcWorkArea) then
NewBounds:=Rect(ScaleChildX(NewBounds.Left),ScaleChildY(NewBounds.Top), NewBounds:=Rect(ScaleChildX(NewBounds.Left),ScaleChildY(NewBounds.Top),
ScaleChildX(NewBounds.Right),ScaleChildY(NewBounds.Bottom)); ScaleChildX(NewBounds.Right),ScaleChildY(NewBounds.Bottom));
Splitter.DockRestoreBounds:=NewBounds; Splitter.DockRestoreBounds:=NewBounds;
Splitter.BoundsRect:=NewBounds; Splitter.BoundsRect:=NewBounds;
if Node.NodeType=adltnSplitterVertical then begin if ANode.NodeType=adltnSplitterVertical then begin
Splitter.ResizeAnchor:=akLeft; Splitter.ResizeAnchor:=akLeft;
Splitter.AnchorSide[akLeft].Control:=nil; Splitter.AnchorSide[akLeft].Control:=nil;
Splitter.AnchorSide[akRight].Control:=nil; Splitter.AnchorSide[akRight].Control:=nil;
@ -1948,23 +1945,23 @@ function TAnchorDockMaster.RestoreLayout(Tree: TAnchorDockLayoutTree;
Splitter.AnchorSide[akBottom].Control:=nil; Splitter.AnchorSide[akBottom].Control:=nil;
end; end;
Result:=Splitter; Result:=Splitter;
end else if Node.NodeType=adltnLayout then begin end else if ANode.NodeType=adltnLayout then begin
// restore layout // restore layout
Site:=GetNodeSite(Node); Site:=GetNodeSite(ANode);
{$IFDEF VerboseAnchorDockRestore} {$IFDEF VerboseAnchorDockRestore}
debugln(['TAnchorDockMaster.RestoreLayout.Restore Layout Node.Name=',Node.Name,' ChildCount=',Node.Count]); debugln(['TAnchorDockMaster.RestoreLayout.Restore Layout Node.Name=',Node.Name,' ChildCount=',Node.Count]);
{$ENDIF} {$ENDIF}
Site.BeginUpdateLayout; Site.BeginUpdateLayout;
try try
SetupSite(Site,Node,Parent); SetupSite(Site,ANode,AParent);
Site.FSiteType:=adhstLayout; Site.FSiteType:=adhstLayout;
Site.Header.Parent:=nil; Site.Header.Parent:=nil;
// create children // create children
for i:=0 to Node.Count-1 do for i:=0 to ANode.Count-1 do
Restore(Node[i],Site); Restore(ANode[i],Site);
// anchor children // anchor children
for i:=0 to Node.Count-1 do begin for i:=0 to ANode.Count-1 do begin
ChildNode:=Node[i]; ChildNode:=ANode[i];
AControl:=fTreeNameToDocker[ChildNode.Name]; AControl:=fTreeNameToDocker[ChildNode.Name];
{$IFDEF VerboseAnchorDockRestore} {$IFDEF VerboseAnchorDockRestore}
debugln([' Restore layout child anchors Site=',DbgSName(Site),' ChildNode.Name=',ChildNode.Name,' Control=',DbgSName(AControl)]); debugln([' Restore layout child anchors Site=',DbgSName(Site),' ChildNode.Name=',ChildNode.Name,' Control=',DbgSName(AControl)]);
@ -2000,27 +1997,27 @@ function TAnchorDockMaster.RestoreLayout(Tree: TAnchorDockLayoutTree;
Site.EndUpdateLayout; Site.EndUpdateLayout;
end; end;
Result:=Site; Result:=Site;
end else if Node.NodeType=adltnPages then begin end else if ANode.NodeType=adltnPages then begin
// restore pages // restore pages
Site:=GetNodeSite(Node); Site:=GetNodeSite(ANode);
{$IFDEF VerboseAnchorDockRestore} {$IFDEF VerboseAnchorDockRestore}
debugln(['TAnchorDockMaster.RestoreLayout.Restore Pages Node.Name=',Node.Name,' ChildCount=',Node.Count]); debugln(['TAnchorDockMaster.RestoreLayout.Restore Pages Node.Name=',Node.Name,' ChildCount=',Node.Count]);
{$ENDIF} {$ENDIF}
Site.BeginUpdateLayout; Site.BeginUpdateLayout;
j:=0; j:=0;
try try
SetupSite(Site,Node,Parent); SetupSite(Site,ANode,AParent);
Site.FSiteType:=adhstPages; Site.FSiteType:=adhstPages;
Site.Header.Parent:=nil; Site.Header.Parent:=nil;
if Site.Pages=nil then if Site.Pages=nil then
Site.CreatePages; Site.CreatePages;
for i:=0 to Node.Count-1 do begin for i:=0 to ANode.Count-1 do begin
aPageName:=Node[i].Name; aPageName:=ANode[i].Name;
if j>=Site.Pages.PageCount then if j>=Site.Pages.PageCount then
Site.Pages.Pages.Add(aPageName); Site.Pages.Pages.Add(aPageName);
aPage:=Site.Pages.Page[j]; aPage:=Site.Pages.Page[j];
inc(j); inc(j);
AControl:=Restore(Node[i],aPage); AControl:=Restore(ANode[i],aPage);
if AControl=nil then continue; if AControl=nil then continue;
AControl.Align:=alClient; AControl.Align:=alClient;
for Side:=Low(TAnchorKind) to high(TAnchorKind) do for Side:=Low(TAnchorKind) to high(TAnchorKind) do
@ -2035,8 +2032,8 @@ function TAnchorDockMaster.RestoreLayout(Tree: TAnchorDockLayoutTree;
Result:=Site; Result:=Site;
end else begin end else begin
// create children // create children
for i:=0 to Node.Count-1 do for i:=0 to ANode.Count-1 do
Restore(Node[i],Parent); Restore(ANode[i],AParent);
end; end;
end; end;