mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-15 23:40:34 +01:00
anchordocking: manualdock to custom dock site
git-svn-id: trunk@26143 -
This commit is contained in:
parent
8e419f5d92
commit
0dafa843e3
@ -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)
|
||||
|
||||
@ -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';
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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 ""
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user