anchordocking: manualdock to custom dock site

git-svn-id: trunk@26143 -
This commit is contained in:
mattias 2010-06-16 07:26:01 +00:00
parent 8e419f5d92
commit 0dafa843e3
5 changed files with 68 additions and 30 deletions

View File

@ -262,7 +262,7 @@ type
function IsOneSiteLayout(out Site: TAnchorDockHostSite): boolean;
function IsTwoSiteLayout(out Site1, Site2: TAnchorDockHostSite): boolean;
function GetUniqueSplitterName: string;
function GetSite(AControl: TControl): TAnchorDockHostSite;
function MakeSite(AControl: TControl): TAnchorDockHostSite;
procedure MoveAllControls(dx, dy: integer);
procedure AlignControls(AControl: TControl; var ARect: TRect); override;
procedure DoDock(NewDockSite: TWinControl; var ARect: TRect); override;
@ -466,7 +466,7 @@ type
// manual docking
procedure ManualFloat(AControl: TControl);
procedure ManualDock(SrcSite, TargetSite: TAnchorDockHostSite;
procedure ManualDock(SrcSite: TAnchorDockHostSite; TargetSite: TCustomForm;
Align: TAlign; TargetControl: TControl = nil);
function ManualEnlarge(Site: TAnchorDockHostSite; Side: TAnchorKind;
OnlyCheckIfPossible: boolean): boolean;
@ -1262,7 +1262,7 @@ function TAnchorDockMaster.RestoreLayout(Tree: TAnchorDockLayoutTree): boolean;
// restore layout
Site:=TAnchorDockHostSite(fTreeNameToDocker[Node.Name]);
if Site=nil then begin
Site:=CreateSite('',true);
Site:=CreateSite;
fDisabledAutosizing.Add(Site);
fTreeNameToDocker[Node.Name]:=Site;
end;
@ -1304,7 +1304,7 @@ function TAnchorDockMaster.RestoreLayout(Tree: TAnchorDockLayoutTree): boolean;
// restore pages
Site:=TAnchorDockHostSite(fTreeNameToDocker[Node.Name]);
if Site=nil then begin
Site:=CreateSite('',true);
Site:=CreateSite;
fDisabledAutosizing.Add(Site);
fTreeNameToDocker[Node.Name]:=Site;
end;
@ -1688,6 +1688,9 @@ begin
then
raise Exception.Create('TAnchorDockMaster.MakeDockable '+
adrsModalFormsCanNotBeMadeDockable);
if IsCustomSite(AControl) then
raise Exception.Create('TAnchorDockMaster.MakeDockable '+
adrsControlIsAlreadyADocksite);
Site:=nil;
AControl.DisableAutoSizing;
try
@ -2011,19 +2014,53 @@ begin
Site.Undock;
end;
procedure TAnchorDockMaster.ManualDock(SrcSite,
TargetSite: TAnchorDockHostSite; Align: TAlign; TargetControl: TControl);
procedure TAnchorDockMaster.ManualDock(SrcSite: TAnchorDockHostSite;
TargetSite: TCustomForm; Align: TAlign; TargetControl: TControl);
var
Site: TAnchorDockHostSite;
aManager: TAnchorDockManager;
DockObject: TDragDockObject;
begin
debugln(['TAnchorDockMaster.ManualDock SrcSite=',DbgSName(SrcSite),' TargetSite=',DbgSName(TargetSite),' Align=',dbgs(Align),' TargetControl=',DbgSName(TargetControl)]);
if SrcSite=TargetSite then exit;
if SrcSite.IsParentOf(TargetSite) then
raise Exception.Create('TAnchorDockMaster.ManualDock SrcSite.IsParentOf(TargetSite)');
if TargetSite.IsParentOf(SrcSite) then
raise Exception.Create('TAnchorDockMaster.ManualDock TargetSite.IsParentOf(SrcSite)');
if AutoFreedIfControlIsRemoved(TargetSite,SrcSite) then
if IsCustomSite(TargetSite) then begin
aManager:=TAnchorDockManager(TargetSite.DockManager);
Site:=aManager.GetChildSite;
if Site=nil then begin
// dock as first site into custom dock site
debugln(['TAnchorDockMaster.ManualDock dock as first site into custom dock site: SrcSite=',DbgSName(SrcSite),' TargetSite=',DbgSName(TargetSite),' Align=',dbgs(Align)]);
BeginUpdate;
try
DockObject := TDragDockObject.Create(SrcSite);
try
DockObject.DropAlign:=Align;
DockObject.DockRect:=SrcSite.BoundsRect;
aManager.InsertControl(DockObject);
finally
DockObject.Free;
end;
finally
EndUpdate;
end;
exit;
end;
// else: dock into child site of custom dock site
end else begin
// dock to or into TargetSite
if not (TargetSite is TAnchorDockHostSite) then
raise Exception.Create('TAnchorDockMaster.ManualDock invalid TargetSite');
Site:=TAnchorDockHostSite(TargetSite);
end;
if AutoFreedIfControlIsRemoved(Site,SrcSite) then
raise Exception.Create('TAnchorDockMaster.ManualDock TargetSite depends on SrcSite');
BeginUpdate;
try
TargetSite.ExecuteDock(SrcSite,TargetControl,Align);
Site.ExecuteDock(SrcSite,TargetControl,Align);
finally
EndUpdate;
end;
@ -2382,7 +2419,7 @@ begin
// put the OldControl into a site of its own (OldSite) and dock OldSite
OldControl:=GetOneControl;
OldSite:=GetSite(OldControl);
OldSite:=MakeSite(OldControl);
AddCleanControl(OldSite);
OldSite.AnchorClient(0);
// the LCL will compute the bounds later after EnableAutoSizing
@ -2427,7 +2464,7 @@ begin
Splitter.Parent:=Self;
// dock the NewControl
NewSite:=GetSite(NewControl);
NewSite:=MakeSite(NewControl);
AddCleanControl(NewSite);
BoundsIncreased:=false;
@ -2682,7 +2719,7 @@ begin
// put the OldControl into a page of its own
debugln(['TAnchorDockHostSite.DockSecondPage Self="',Caption,'" move oldcontrol to site of its own ...']);
OldControl:=GetOneControl;
OldSite:=GetSite(OldControl);
OldSite:=MakeSite(OldControl);
OldSite.HostDockSite:=nil;
debugln(['TAnchorDockHostSite.DockSecondPage Self="',Caption,'" adding oldcontrol site ...']);
FPages.Pages.Add(OldSite.Caption);
@ -2703,7 +2740,7 @@ begin
if SiteType<>adhstPages then
RaiseGDBException('TAnchorDockHostSite.DockAnotherPage inconsistency');
NewSite:=GetSite(NewControl);
NewSite:=MakeSite(NewControl);
//debugln(['TAnchorDockHostSite.DockAnotherPage Self="',Caption,'" adding newcontrol site ...']);
NewIndex:=FPages.PageCount;
if (InFrontOf is TAnchorDockPage)
@ -3163,7 +3200,7 @@ begin
until FindComponent(Result)=nil;
end;
function TAnchorDockHostSite.GetSite(AControl: TControl): TAnchorDockHostSite;
function TAnchorDockHostSite.MakeSite(AControl: TControl): TAnchorDockHostSite;
begin
if AControl is TAnchorDockHostSite then
Result:=TAnchorDockHostSite(AControl)

View File

@ -57,6 +57,7 @@ resourcestring
adrsDragAndDockC = 'Drag and dock %c';
adrsMissingControlName = 'missing control name';
adrsModalFormsCanNotBeMadeDockable = 'modal forms can not be made dockable';
adrsControlIsAlreadyADocksite = 'control is already a docksite';
adrsNotSupportedHasParent = 'Not supported: %s has parent %s';
adrsAnchorNotFoundNodeAnchors = 'Anchor not found: Node=%s%s%s Anchors[%s]=%'
+'s%s%s';

View File

@ -189,6 +189,7 @@ var
DockAlign: TAlign;
DockSibling: TCustomForm;
NewDockSite: TWinControl;
Site: TAnchorDockHostSite;
begin
debugln(['TIDEAnchorDockMaster.ShowForm ',DbgSName(AForm),' BringToFront=',BringToFront]);
try
@ -197,6 +198,7 @@ begin
// already docked
end else begin
// this form was not yet docked
// place it at a default position and make it dockable
GetDefaultBounds(AForm,Creator,NewBounds,DockSiblingName,DockAlign);
if Creator<>nil then
@ -206,35 +208,29 @@ begin
NewBounds.Top:=Min(10000,Max(-10000,NewBounds.Top));
NewBounds.Right:=Max(NewBounds.Left+100,NewBounds.Right);
NewBounds.Bottom:=Max(NewBounds.Top+100,NewBounds.Bottom);
AForm.BoundsRect:=NewBounds;
AForm.UndockWidth:=NewBounds.Right-NewBounds.Left;
AForm.UndockHeight:=NewBounds.Bottom-NewBounds.Top;
debugln(['TIDEAnchorDockMaster.ShowForm creator for ',DbgSName(AForm),' found: Left=',Creator.Left,' Top=',Creator.Top,' Width=',Creator.Width,' Height=',Creator.Height,' DockSiblingName=',DockSiblingName,' DockAlign=',dbgs(DockAlign)]);
DockMaster.MakeDockable(AForm,false);
Site:=DockMaster.GetSite(AForm);
if DockSiblingName<>'' then
begin
DockSibling:=Screen.FindForm(DockSiblingName);
debugln(['TIDEAnchorDockMaster.ShowForm DockSiblingName="',DockSiblingName,'" DockSibling=',DbgSName(DockSibling)]);
if DockSibling<>nil then
begin
NewDockSite:=DockSibling.HostDockSite;
debugln(['TIDEAnchorDockMaster.ShowForm NewDockSite=',DbgSName(NewDockSite)]);
{if NewDockSite<>nil then
AForm.ManualDock(NewDockSite,nil,DockAlign)
else
AForm.ManualDock(nil,DockSibling,DockAlign);}
NewDockSite:=DockMaster.GetSite(DockSibling);
debugln(['TIDEAnchorDockMaster.ShowForm NewDockSite=',DbgSName(NewDockSite),'="',NewDockSite.Caption,'"']);
DockMaster.ManualDock(Site,NewDockSite,DockAlign);
end;
end;
if AForm.Parent=nil then begin
debugln(['TIDEAnchorDockMaster.ShowForm ',DbgSName(AForm),' make dockable NewBounds=',dbgs(NewBounds)]);
AForm.BoundsRect:=NewBounds;
// make form dockable
MakeIDEWindowDockable(AForm);
end;
end;
end;
finally
if DockMaster.IsCustomSite(AForm) then
AForm.Show
AForm.Visible:=true
else
DockMaster.MakeDockable(AForm,true,false);
AForm.EnableAlign;

View File

@ -37,6 +37,10 @@ msgstr ""
msgid "Close"
msgstr ""
#: anchordockstr.adrscontrolisalreadyadocksite
msgid "control is already a docksite"
msgstr ""
#: anchordockstr.adrscustomdocksitecanhaveonlyonesite
msgid "Custom dock site %s%s%s can have only one site."
msgstr ""

View File

@ -367,7 +367,7 @@ type
property AlwaysShowDragImages: Boolean read FAlwaysShowDragImages write FAlwaysShowDragImages;
property AutoCreated: Boolean read FAutoCreated;
property AutoFree: Boolean read FAutoFree;
property Control: TControl read FControl write FControl;
property Control: TControl read FControl write FControl; // the dragged control
property DragPos: TPoint read FDragPos write FDragPos;
property DragTarget: TControl read FDragTarget write FDragTarget;
property DragTargetPos: TPoint read FDragTargetPos write FDragTargetPos;
@ -442,9 +442,9 @@ type
procedure MoveDockImage; virtual;
public
property DockOffset: TPoint read FDockOffset write FDockOffset;
property DockRect: TRect read FDockRect write FDockRect;
property DropAlign: TAlign read FDropAlign write FDropAlign;
property DropOnControl: TControl read FDropOnControl write FDropOnControl;
property DockRect: TRect read FDockRect write FDockRect; // where to drop Control, screen coordinates
property DropAlign: TAlign read FDropAlign write FDropAlign; // how to align Control
property DropOnControl: TControl read FDropOnControl write FDropOnControl; // drop on child control of Target (Target is a parameter, not a property)
property Floating: Boolean read FFloating write FFloating;
property IncreaseDockArea: Boolean read FIncreaseDockArea;
property EraseDockRect: TRect read FEraseDockRect write FEraseDockRect;