dockmanager example: restructure package

git-svn-id: trunk@22697 -
This commit is contained in:
dodi 2009-11-21 13:08:42 +00:00
parent 0e11723b4c
commit 91ccba3b91
6 changed files with 354 additions and 256 deletions

View File

@ -8,7 +8,7 @@
<TargetFileExt Value=".exe"/>
<Icon Value="0"/>
<UseXPManifest Value="True"/>
<ActiveEditorIndexAtStart Value="5"/>
<ActiveEditorIndexAtStart Value="2"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
@ -40,7 +40,7 @@
<UnitName Value="MakeSite"/>
<CursorPos X="51" Y="18"/>
<TopLine Value="1"/>
<UsageCount Value="65"/>
<UsageCount Value="74"/>
</Unit0>
<Unit1>
<Filename Value="fmastersite.pas"/>
@ -48,29 +48,31 @@
<ComponentName Value="MasterSite"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="fMasterSite"/>
<CursorPos X="1" Y="43"/>
<TopLine Value="1"/>
<CursorPos X="17" Y="35"/>
<TopLine Value="8"/>
<EditorIndex Value="0"/>
<UsageCount Value="65"/>
<UsageCount Value="74"/>
<Loaded Value="True"/>
</Unit1>
<Unit2>
<Filename Value="..\package\umakesite.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="uMakeSite"/>
<CursorPos X="32" Y="225"/>
<TopLine Value="195"/>
<CursorPos X="10" Y="47"/>
<TopLine Value="31"/>
<EditorIndex Value="2"/>
<UsageCount Value="65"/>
<UsageCount Value="71"/>
<Bookmarks Count="1">
<Item0 X="7" Y="173" ID="1"/>
</Bookmarks>
<Loaded Value="True"/>
</Unit2>
<Unit3>
<Filename Value="..\..\..\lcl\controls.pp"/>
<UnitName Value="Controls"/>
<CursorPos X="15" Y="1773"/>
<TopLine Value="1750"/>
<CursorPos X="15" Y="1783"/>
<TopLine Value="1760"/>
<EditorIndex Value="9"/>
<UsageCount Value="32"/>
<UsageCount Value="36"/>
<Loaded Value="True"/>
</Unit3>
<Unit4>
@ -78,7 +80,7 @@
<UnitName Value="ExtCtrls"/>
<CursorPos X="24" Y="1109"/>
<TopLine Value="1086"/>
<UsageCount Value="10"/>
<UsageCount Value="9"/>
</Unit4>
<Unit5>
<Filename Value="..\package\felasticsite.pas"/>
@ -88,13 +90,15 @@
<UnitName Value="fElasticSite"/>
<CursorPos X="1" Y="82"/>
<TopLine Value="63"/>
<UsageCount Value="24"/>
<UsageCount Value="23"/>
</Unit5>
<Unit6>
<Filename Value="..\..\..\..\..\lazarus\fpc\2.2.4\source\rtl\objpas\classes\classesh.inc"/>
<CursorPos X="15" Y="1515"/>
<TopLine Value="1492"/>
<UsageCount Value="10"/>
<CursorPos X="14" Y="1556"/>
<TopLine Value="1533"/>
<EditorIndex Value="11"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit6>
<Unit7>
<Filename Value="fclientform.pas"/>
@ -106,34 +110,34 @@
<CursorPos X="10" Y="38"/>
<TopLine Value="12"/>
<EditorIndex Value="8"/>
<UsageCount Value="65"/>
<UsageCount Value="74"/>
<Loaded Value="True"/>
</Unit7>
<Unit8>
<Filename Value="..\..\..\lcl\include\winapih.inc"/>
<CursorPos X="10" Y="287"/>
<TopLine Value="263"/>
<UsageCount Value="16"/>
<UsageCount Value="15"/>
</Unit8>
<Unit9>
<Filename Value="..\..\..\lcl\include\intfbaselcl.inc"/>
<CursorPos X="3" Y="32"/>
<TopLine Value="29"/>
<UsageCount Value="16"/>
<UsageCount Value="15"/>
</Unit9>
<Unit10>
<Filename Value="..\..\..\lcl\include\lclintfh.inc"/>
<CursorPos X="10" Y="40"/>
<TopLine Value="16"/>
<UsageCount Value="16"/>
<UsageCount Value="15"/>
</Unit10>
<Unit11>
<Filename Value="..\package\easydocksite.pas"/>
<UnitName Value="EasyDockSite"/>
<CursorPos X="21" Y="288"/>
<CursorPos X="19" Y="288"/>
<TopLine Value="265"/>
<EditorIndex Value="4"/>
<UsageCount Value="31"/>
<UsageCount Value="35"/>
<Bookmarks Count="1">
<Item0 X="1" Y="1537" ID="2"/>
</Bookmarks>
@ -145,41 +149,41 @@
<CursorPos X="15" Y="577"/>
<TopLine Value="553"/>
<EditorIndex Value="3"/>
<UsageCount Value="29"/>
<UsageCount Value="33"/>
<Loaded Value="True"/>
</Unit12>
<Unit13>
<Filename Value="..\..\..\lcl\include\customform.inc"/>
<CursorPos X="16" Y="2424"/>
<TopLine Value="2422"/>
<EditorIndex Value="13"/>
<UsageCount Value="12"/>
<EditorIndex Value="15"/>
<UsageCount Value="16"/>
<Loaded Value="True"/>
</Unit13>
<Unit14>
<Filename Value="..\..\..\..\..\lazarus\fpc\2.2.4\source\rtl\inc\objpash.inc"/>
<CursorPos X="23" Y="151"/>
<TopLine Value="128"/>
<UsageCount Value="7"/>
<UsageCount Value="6"/>
</Unit14>
<Unit15>
<Filename Value="..\..\..\..\..\lazarus\fpc\2.2.4\source\rtl\objpas\classes\cregist.inc"/>
<CursorPos X="3" Y="92"/>
<TopLine Value="88"/>
<UsageCount Value="7"/>
<UsageCount Value="6"/>
</Unit15>
<Unit16>
<Filename Value="..\package\dockhandle.pas"/>
<UnitName Value="DockHandle"/>
<CursorPos X="20" Y="22"/>
<TopLine Value="1"/>
<UsageCount Value="20"/>
<UsageCount Value="19"/>
</Unit16>
<Unit17>
<Filename Value="..\..\..\lcl\include\customimage.inc"/>
<CursorPos X="1" Y="1"/>
<TopLine Value="213"/>
<UsageCount Value="8"/>
<UsageCount Value="7"/>
</Unit17>
<Unit18>
<Filename Value="..\package\ffloatingsite.pas"/>
@ -187,10 +191,10 @@
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="fFloatingSite"/>
<CursorPos X="9" Y="24"/>
<TopLine Value="4"/>
<CursorPos X="3" Y="22"/>
<TopLine Value="1"/>
<EditorIndex Value="1"/>
<UsageCount Value="29"/>
<UsageCount Value="33"/>
<Loaded Value="True"/>
</Unit18>
<Unit19>
@ -202,10 +206,7 @@
<CursorPos X="5" Y="96"/>
<TopLine Value="73"/>
<EditorIndex Value="5"/>
<UsageCount Value="27"/>
<Bookmarks Count="1">
<Item0 X="1" Y="203" ID="1"/>
</Bookmarks>
<UsageCount Value="31"/>
<Loaded Value="True"/>
</Unit19>
<Unit20>
@ -214,7 +215,7 @@
<CursorPos X="7" Y="10"/>
<TopLine Value="1"/>
<EditorIndex Value="7"/>
<UsageCount Value="27"/>
<UsageCount Value="31"/>
<Loaded Value="True"/>
</Unit20>
<Unit21>
@ -224,7 +225,7 @@
<UnitName Value="fPageFrame"/>
<CursorPos X="1" Y="311"/>
<TopLine Value="271"/>
<UsageCount Value="16"/>
<UsageCount Value="15"/>
<Bookmarks Count="1">
<Item0 X="1" Y="128" ID="1"/>
</Bookmarks>
@ -233,66 +234,68 @@
<Filename Value="..\..\..\lcl\include\customframe.inc"/>
<CursorPos X="3" Y="177"/>
<TopLine Value="135"/>
<UsageCount Value="16"/>
<UsageCount Value="15"/>
</Unit22>
<Unit23>
<Filename Value="..\..\..\lcl\lcltype.pp"/>
<UnitName Value="LCLType"/>
<CursorPos X="3" Y="118"/>
<TopLine Value="95"/>
<UsageCount Value="10"/>
<UsageCount Value="9"/>
</Unit23>
<Unit24>
<Filename Value="..\..\..\lcl\lmessages.pp"/>
<UnitName Value="LMessages"/>
<CursorPos X="3" Y="769"/>
<TopLine Value="746"/>
<UsageCount Value="10"/>
<UsageCount Value="9"/>
</Unit24>
<Unit25>
<Filename Value="..\..\..\..\..\lazarus\fpc\2.2.4\source\rtl\objpas\classes\compon.inc"/>
<CursorPos X="3" Y="538"/>
<TopLine Value="535"/>
<UsageCount Value="10"/>
<CursorPos X="3" Y="161"/>
<TopLine Value="158"/>
<EditorIndex Value="12"/>
<UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit25>
<Unit26>
<Filename Value="..\..\..\lcl\include\control.inc"/>
<CursorPos X="48" Y="3878"/>
<TopLine Value="3844"/>
<EditorIndex Value="12"/>
<UsageCount Value="17"/>
<CursorPos X="3" Y="540"/>
<TopLine Value="525"/>
<EditorIndex Value="14"/>
<UsageCount Value="21"/>
<Loaded Value="True"/>
</Unit26>
<Unit27>
<Filename Value="..\..\..\lcl\include\wincontrol.inc"/>
<CursorPos X="3" Y="5101"/>
<TopLine Value="5096"/>
<CursorPos X="28" Y="5215"/>
<TopLine Value="5208"/>
<EditorIndex Value="10"/>
<UsageCount Value="17"/>
<UsageCount Value="21"/>
<Loaded Value="True"/>
</Unit27>
<Unit28>
<Filename Value="..\..\..\lcl\include\dragdock.inc"/>
<CursorPos X="10" Y="21"/>
<TopLine Value="1"/>
<EditorIndex Value="15"/>
<UsageCount Value="17"/>
<EditorIndex Value="17"/>
<UsageCount Value="21"/>
<Loaded Value="True"/>
</Unit28>
<Unit29>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<CursorPos X="1" Y="730"/>
<TopLine Value="687"/>
<EditorIndex Value="11"/>
<UsageCount Value="12"/>
<EditorIndex Value="13"/>
<UsageCount Value="16"/>
<Loaded Value="True"/>
</Unit29>
<Unit30>
<Filename Value="..\..\..\lcl\include\application.inc"/>
<CursorPos X="1" Y="2074"/>
<TopLine Value="2051"/>
<EditorIndex Value="14"/>
<UsageCount Value="12"/>
<EditorIndex Value="16"/>
<UsageCount Value="16"/>
<Loaded Value="True"/>
</Unit30>
<Unit31>
@ -300,130 +303,130 @@
<CursorPos X="1" Y="700"/>
<TopLine Value="677"/>
<EditorIndex Value="6"/>
<UsageCount Value="12"/>
<UsageCount Value="16"/>
<Loaded Value="True"/>
</Unit31>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<JumpHistory Count="30" HistoryIndex="28">
<Position1>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="518" Column="1" TopLine="495"/>
</Position1>
<Position2>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="527" Column="1" TopLine="504"/>
</Position2>
<Position3>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="528" Column="1" TopLine="505"/>
</Position3>
<Position4>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="117" Column="1" TopLine="94"/>
</Position4>
<Position5>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="118" Column="1" TopLine="95"/>
</Position5>
<Position6>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="119" Column="1" TopLine="96"/>
</Position6>
<Position7>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="120" Column="1" TopLine="97"/>
</Position7>
<Position8>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="121" Column="1" TopLine="98"/>
</Position8>
<Position9>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="531" Column="1" TopLine="508"/>
</Position9>
<Position10>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="533" Column="1" TopLine="510"/>
</Position10>
<Position11>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="535" Column="1" TopLine="512"/>
</Position11>
<Position12>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="536" Column="1" TopLine="513"/>
</Position12>
<Position13>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="538" Column="1" TopLine="467"/>
</Position13>
<Position14>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="619" Column="1" TopLine="596"/>
</Position14>
<Position15>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="620" Column="1" TopLine="597"/>
</Position15>
<Position16>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="623" Column="1" TopLine="600"/>
</Position16>
<Position17>
<Filename Value="..\..\..\lcl\include\dragmanager.inc"/>
<Caret Line="730" Column="1" TopLine="687"/>
</Position17>
<Position18>
<Filename Value="..\..\..\lcl\include\control.inc"/>
<Caret Line="3652" Column="1" TopLine="3629"/>
</Position18>
<Position19>
<Filename Value="..\..\..\lcl\include\control.inc"/>
<Caret Line="667" Column="1" TopLine="644"/>
</Position19>
<Position20>
<Filename Value="..\..\..\lcl\include\control.inc"/>
<Caret Line="658" Column="1" TopLine="635"/>
</Position20>
<Position21>
<Filename Value="..\..\..\lcl\include\control.inc"/>
<Caret Line="1644" Column="1" TopLine="1621"/>
</Position21>
<Position22>
<Filename Value="..\..\..\lcl\include\wincontrol.inc"/>
<Caret Line="5086" Column="1" TopLine="5063"/>
</Position22>
<Position23>
<Filename Value="..\..\..\lcl\include\customform.inc"/>
<Caret Line="1087" Column="1" TopLine="1064"/>
</Position23>
<Position24>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="204" Column="1" TopLine="180"/>
</Position24>
<Position25>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="205" Column="9" TopLine="180"/>
</Position25>
<Position26>
<Filename Value="..\..\..\lcl\include\customform.inc"/>
<Caret Line="2424" Column="16" TopLine="2422"/>
</Position26>
<Position27>
<Filename Value="..\..\..\lcl\include\control.inc"/>
<Caret Line="3879" Column="57" TopLine="3844"/>
</Position27>
<Position28>
<Filename Value="..\..\..\lcl\include\control.inc"/>
<Caret Line="3878" Column="48" TopLine="3844"/>
</Position28>
<Position29>
</Position1>
<Position2>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="209" Column="1" TopLine="180"/>
</Position29>
<Position30>
</Position2>
<Position3>
<Filename Value="..\package\fdockbook.pas"/>
<Caret Line="208" Column="16" TopLine="184"/>
</Position3>
<Position4>
<Filename Value="fmastersite.pas"/>
<Caret Line="35" Column="17" TopLine="8"/>
</Position4>
<Position5>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="263" Column="1" TopLine="221"/>
</Position5>
<Position6>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="151" Column="19" TopLine="121"/>
</Position6>
<Position7>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="177" Column="19" TopLine="139"/>
</Position7>
<Position8>
<Filename Value="..\..\..\lcl\include\control.inc"/>
<Caret Line="3989" Column="27" TopLine="3957"/>
</Position8>
<Position9>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="177" Column="19" TopLine="139"/>
</Position9>
<Position10>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="86" Column="15" TopLine="80"/>
</Position10>
<Position11>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="163" Column="31" TopLine="155"/>
</Position11>
<Position12>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="73" Column="1" TopLine="60"/>
</Position12>
<Position13>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="49" Column="1" TopLine="28"/>
</Position13>
<Position14>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="150" Column="16" TopLine="133"/>
</Position14>
<Position15>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="153" Column="14" TopLine="130"/>
</Position15>
<Position16>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="154" Column="20" TopLine="131"/>
</Position16>
<Position17>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="65" Column="6" TopLine="41"/>
</Position17>
<Position18>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="155" Column="43" TopLine="132"/>
</Position18>
<Position19>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="190" Column="1" TopLine="144"/>
</Position19>
<Position20>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="155" Column="25" TopLine="132"/>
</Position20>
<Position21>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="156" Column="1" TopLine="111"/>
</Position21>
<Position22>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="177" Column="21" TopLine="148"/>
</Position22>
<Position23>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="50" Column="60" TopLine="19"/>
</Position23>
<Position24>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="68" Column="23" TopLine="53"/>
</Position24>
<Position25>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="76" Column="69" TopLine="53"/>
</Position25>
<Position26>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="87" Column="38" TopLine="64"/>
</Position26>
<Position27>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="178" Column="24" TopLine="138"/>
</Position27>
<Position28>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="52" Column="17" TopLine="30"/>
</Position28>
<Position29>
<Filename Value="..\package\umakesite.pas"/>
<Caret Line="181" Column="8" TopLine="144"/>
</Position29>
<Position30>
<Filename Value="..\..\..\..\..\lazarus\fpc\2.2.4\source\rtl\objpas\classes\classesh.inc"/>
<Caret Line="1556" Column="14" TopLine="1533"/>
</Position30>
</JumpHistory>
</ProjectOptions>

View File

@ -7,8 +7,7 @@ uses
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, fMasterSite, fclientform, EasyDockMgr, LResources, uMakeSite
{ you can add units after this };
Forms, fMasterSite, fclientform, EasyDockMgr, LResources;
{$IFDEF WINDOWS}{$R MakeSite.rc}{$ENDIF}

View File

@ -17,7 +17,7 @@
<Description Value="EasyDocking Manager and Notebook"/>
<License Value="LGPL"/>
<Version Major="1"/>
<Files Count="9">
<Files Count="13">
<Item1>
<Filename Value="easydocksite.pas"/>
<UnitName Value="EasyDockSite"/>
@ -55,6 +55,22 @@
<Filename Value="uminirestore.pas"/>
<UnitName Value="uMiniRestore"/>
</Item9>
<Item10>
<Filename Value="fpageframe.lfm"/>
<Type Value="LFM"/>
</Item10>
<Item11>
<Filename Value="fpageframe.lrs"/>
<Type Value="LRS"/>
</Item11>
<Item12>
<Filename Value="fpageframe.pas"/>
<UnitName Value="fPageFrame"/>
</Item12>
<Item13>
<Filename Value="umakesite.pas"/>
<UnitName Value="uMakeSite"/>
</Item13>
</Files>
<Type Value="RunAndDesignTime"/>
<RequiredPkgs Count="2">

View File

@ -8,7 +8,7 @@ interface
uses
EasyDockSite, fDockBook, fFloatingSite, fElasticSite, uMiniRestore,
LazarusPackageIntf;
fPageFrame, uMakeSite, LazarusPackageIntf;
implementation

View File

@ -58,7 +58,7 @@ LCL TODO:
//depending on widgetset or patched LCL
{.$DEFINE NoDrop} //applied DoDiPatch1?
{.$DEFINE PageFrame} //problem: notebook frame cannot Release itself
{$DEFINE PageFrame} //problem: notebook frame cannot Release itself
{$DEFINE replace} //using ReplaceDockedControl?
interface

View File

@ -1,11 +1,27 @@
unit uMakeSite;
(* Create elastic dock sites within a form, make forms dockable.
Problems:
Forms are not (easily) dockable on all platforms,
we add a grabber icon to each dockable form,
and wrap them in a managed floating form.
Default floating sites are owned by Application,
we have to create the floating sites in the form.OnEndDock event.
Owning panels is dangerous, they are not destroyed with their parent form!
*)
{$mode objfpc}{$H+}
{$DEFINE ownSites} //floating sites owned by TDockMaster?
interface
uses
Classes, SysUtils, Controls, Forms, ExtCtrls, EasyDockSite;
Classes, SysUtils, Controls, Forms, ExtCtrls, EasyDockSite,
fFloatingSite;
type
sDockSides = TAlignSet;
@ -25,13 +41,15 @@ type
public
end;
//the owner of all docksites
//the owner of all docksites (if ownSites is defined)
TDockMaster = class(TComponent)
protected //event handlers
procedure DockHandleMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
procedure FormEndDock(Sender, Target: TObject; X, Y: Integer);
function WrapDockable(Client: TControl): TFloatingSite;
public
Factory: TComponent; //generic owner
procedure AddElasticSites(AForm: TCustomForm; Sides: sDockSides);
function CreateDockable(const AName: string; fMultiInst: boolean): TForm;
procedure DumpSites;
@ -40,9 +58,19 @@ type
implementation
uses
LCLIntf, LCLProc,
LCLIntf, LCLProc;
//fMasterSite,
fFloatingSite;
type
TWinControlAccess = class(TWinControl)
end;
const
PanelNames: array[TAlign] of string = (
'', '', //alNone, alTop,
'pnlBottom', 'pnlLeft', 'pnlRight',
'', '' //alClient, alCustom
);
{ TDockMaster }
@ -57,30 +85,41 @@ const
begin
for side := low(side) to high(side) do begin
if (side in AllowedSides) and (side in Sides) then begin
//create the components
pnl := TDockPanel.Create(self); //owned by?
pnl.Parent := AForm;
pnl.Align := side;
pnl.BorderWidth := 1;
pnl.BorderStyle := bsSingle; // does not properly handle the size
dm := TEasyTree.Create(pnl);
dm.SetStyle(hsForm);
pnl.DockSite := True;
pnl.UseDockManager := True;
pnl.Visible := True;
spl := TSplitter.Create(AForm);
spl.Parent := AForm;
spl.Align := side;
//size components
pnl.Splitter := spl;
if side in [alLeft,alRight] then
pnl.Width := 0
else
pnl.Height := 0;
pnl.OnDockDrop := @pnl.pnlDockDrop;
pnl.OnDockOver := @pnl.pnlDockOver;
pnl.OnUnDock := @pnl.pnlUnDock;
pnl.OnGetSiteInfo := @pnl.pnlGetSiteInfo;
//TWinControlAccess(AForm).ReloadDockedControl(PanelNames[side], pnl);
TComponent(pnl) := AForm.FindComponent(PanelNames[side]);
if pnl = nil then begin
//create the components
{$IFDEF ownSites}
pnl := TDockPanel.Create(self); //owned by?
{$ELSE}
pnl := TDockPanel.Create(AForm); //owned by?
{$ENDIF}
pnl.Name := PanelNames[side];
pnl.Parent := AForm;
pnl.Align := side;
pnl.BorderWidth := 1;
pnl.BorderStyle := bsSingle; // does not properly handle the size
dm := TEasyTree.Create(pnl);
dm.SetStyle(hsForm);
pnl.DockSite := True;
pnl.UseDockManager := True;
pnl.Visible := True;
spl := TSplitter.Create(AForm);
spl.Parent := AForm;
spl.Align := side;
spl.BorderStyle := bsSingle;
//size components
pnl.Splitter := spl;
if side in [alLeft,alRight] then
pnl.Width := 0
else
pnl.Height := 0;
//handlers required for elastic sites
pnl.OnDockDrop := @pnl.pnlDockDrop;
pnl.OnDockOver := @pnl.pnlDockOver;
pnl.OnUnDock := @pnl.pnlUnDock;
pnl.OnGetSiteInfo := @pnl.pnlGetSiteInfo;
end;
end;
end;
end;
@ -94,6 +133,7 @@ var
img: TImage;
r: TRect;
Site: TFloatingSite;
ctl: TControl;
const
digits = ['0'..'9'];
begin
@ -128,12 +168,20 @@ begin
instno := 1; //default instance number for forms
//lookup existing instance
instname := basename + IntToStr(instno);
{$IFDEF old}
if false then
TWinControlAccess(Site).ReloadDockedControl(instname, ctl);
//Result := nil;
for i := 0 to ComponentCount - 1 do begin
Result := TForm(Components[i]);
if Result.Name = instname then
exit; //found it
end;
{$ELSE}
//Factory.ReloadDockedControl
{$ENDIF}
if FindComponent(instname) <> nil then
exit;
//create new instance
basename := 'T' + basename;
fc := TFormClass(GetClass(basename)); //must be registered class name!
@ -148,20 +196,7 @@ begin
Result.DragKind := dkDock;
Result.OnEndDock := @FormEndDock; //float into default host site
//wrap into dock site
Site := TFloatingSite.Create(self);
Site.BoundsRect := Result.BoundsRect;
Result.Align := alClient;
Result.Visible := True; //otherwise docking may be rejected
Result.ManualDock(Site);
{
//Result.ManualDock(nil);
//Result.ManualFloat(Result.BoundsRect, False);
//TObject(Site) := Result.HostDockSite;
if Site = nil then begin
DebugLn('View not docked --------------');
exit;
end;
}
Site := WrapDockable(Result);
//create a docking handle - should become a component?
img := TImage.Create(Result);
img.Parent := Result;
@ -179,6 +214,41 @@ begin
//Result.OnEndDock();
end;
procedure TDockMaster.FormEndDock(Sender, Target: TObject; X, Y: Integer);
var
ctl: TControl;
Site: TFloatingSite;
begin
(* Handler for Form.OnEndDock.
When a form becomes floating, dock immediately into a new floating host docksite.
*)
if Target <> nil then
exit; //docked, not floating
ctl := Sender as TControl;
if ctl.HostDockSite = nil then begin
//DebugLn('--- floating');
WrapDockable(ctl);
end else begin
//DebugLn('--- in ' + HostDockSite.Name);
end;
end;
function TDockMaster.WrapDockable(Client: TControl): TFloatingSite;
var
Site: TForm absolute Result;
begin
{$IFDEF ownSites}
Site := TFloatingSite.Create(Self); //the new site
{$ELSE}
Site := TFloatingSite.Create(Application); //the new site
{$ENDIF}
Site.BoundsRect := Client.BoundsRect; //the new position and extension
Client.Align := alClient;
Client.Visible := True; //otherwise docking may be rejected
Client.ManualDock(Site);
//Site.DockManager.ResetBounds(True); //does not work on first attempt?
end;
procedure TDockMaster.DockHandleMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
@ -200,6 +270,7 @@ var
ctl: TControl;
cmp: TComponent;
n, s: string;
hds: boolean;
const
OrientString: array[TDockOrientation] of char = (
'N','H','V' {$IFDEF FPC} ,'P' {$ENDIF}
@ -208,6 +279,16 @@ const
//(alNone, alTop, alBottom, alLeft, alRight, alClient, alCustom);
'n', 't', 'B', 'L', 'R', 'C', 'c'
);
function SiteName(ph: TControl): string;
begin
if ph = nil then
exit('<nil>');
Result := ph.Name;
if Result = '' then
Result := '<' + ph.ClassName + '>';
end;
begin
(* Dump registered docking sites.
Elastic panels have no name.
@ -219,53 +300,52 @@ begin
dock sites[] and clients[]
contents[]
*)
DebugLn('--- dump sites ---');
for i := 0 to ComponentCount - 1 do begin
cmp := Components[i];
if cmp is TWinControl then begin
//path
Site := TWinControl(cmp);
if Site.Parent <> nil then begin
s := Site.Parent.Name;
if s = '' then
s := Site.Parent.ClassName;
s := ' in ' + s + '@';
s := s + AlignString[Site.Align];
end else
s := '';
DebugLn('Site=%s (%d,%d)[%d,%d] %s', [Site.Name,
site.Top, site.Left, site.Width, site.Height, s]);
for j := 0 to site.DockClientCount - 1 do begin
ctl := site.DockClients[j];
s := OrientString[ctl.DockOrientation];
DebugLn(' Client=%s@%s (%d,%d)[%d,%d]', [ctl.Name, s,
ctl.Top, ctl.Left, ctl.Width, ctl.Height]);
if Site.DockSite then begin
//reached only when ownSites is defined!
ctl := Site;
s := Format('Site=%s (%d,%d)[%d,%d]', [SiteName(ctl),
ctl.Left, ctl.Top, ctl.Width, ctl.Height]);
while ctl <> nil do begin
hds := ctl.HostDockSite <> nil;
if hds then begin
Site := ctl.HostDockSite;
if Site <> nil then
n := ' in ' + SiteName(Site) + '@' + OrientString[ctl.DockOrientation];
end else begin
Site := ctl.Parent;
if Site <> nil then
n := ' at ' + SiteName(Site) + '@' + AlignString[ctl.Align];
end;
if Site = nil then
break;
s := s + n;
ctl := Site;
end;
DebugLn(s);
//clients
Site := TWinControl(cmp);
for j := 0 to site.DockClientCount - 1 do begin
ctl := site.DockClients[j];
s := OrientString[ctl.DockOrientation];
DebugLn(' Client=%s@%s (%d,%d)[%d,%d]', [SiteName(ctl), s,
ctl.Left, ctl.Top, ctl.Width, ctl.Height]);
end;
end else begin
ctl := Site;
DebugLn('Client=%s in %s (%d,%d)[%d,%d]', [SiteName(ctl), SiteName(ctl.HostDockSite),
ctl.Left, ctl.Top, ctl.Width, ctl.Height]);
end;
end;
end;
DebugLn('--- end dump ---');
end;
procedure TDockMaster.FormEndDock(Sender, Target: TObject; X, Y: Integer);
var
ctl: TControl;
Site: TFloatingSite;
begin
(* Handler for Form.OnEndDock.
When a form becomes floating, dock immediately into a new floating host docksite.
*)
if Target <> nil then
exit; //docked, not floating
ctl := Sender as TControl;
if ctl.HostDockSite = nil then begin
//DebugLn('--- floating');
Site := TFloatingSite.Create(Application); //the new site
Site.BoundsRect := ctl.BoundsRect; //the new position and extension
ctl.ManualDock(Site);
//Site.DockManager.ResetBounds(True); //does not work on first attempt?
end else begin
//DebugLn('--- in ' + HostDockSite.Name);
end;
end;
{ TDockPanel }