dockmanager example: made floathostsite work for dockbooks

git-svn-id: trunk@25006 -
This commit is contained in:
dodi 2010-04-27 14:13:20 +00:00
parent 5567182a53
commit 45ecdbc420
4 changed files with 52 additions and 40 deletions

View File

@ -289,6 +289,7 @@ type
FOnSave: TOnSaveControl; FOnSave: TOnSaveControl;
FOnRestore: TOnReloadControl; FOnRestore: TOnReloadControl;
public //become class functions? public //become class functions?
function MakeDockable(AForm: TWinControl; fWrap: boolean = True; fVisible: boolean = False): TForm; virtual;
function SaveControl(Control: TControl; Site: TWinControl): string; virtual; function SaveControl(Control: TControl; Site: TWinControl): string; virtual;
function ReloadControl(const AName: string; Site: TWinControl): TControl; virtual; function ReloadControl(const AName: string; Site: TWinControl): TControl; virtual;
property OnSave: TOnSaveControl read FOnSave write FOnSave; property OnSave: TOnSaveControl read FOnSave write FOnSave;
@ -327,7 +328,7 @@ var
function ScreenRect(ACtrl: TControl): TRect; function ScreenRect(ACtrl: TControl): TRect;
//primarily for DockManager internal use //primarily for DockManager internal use
function NoteBookCreate(AOwner: TWinControl): TCustomDockSite; function NoteBookCreate: TCustomDockSite;
procedure NoteBookAdd(ABook: TCustomDockSite; AItem: TControl); //to be removed procedure NoteBookAdd(ABook: TCustomDockSite; AItem: TControl); //to be removed
function TryRename(AComp: TComponent; const NewName: string): boolean; function TryRename(AComp: TComponent; const NewName: string): boolean;
function CreateUniqueComponentName(const AClassName: string; OwnerComponent: TComponent): string; function CreateUniqueComponentName(const AClassName: string; OwnerComponent: TComponent): string;
@ -378,7 +379,7 @@ const
HeaderButtons = [zpCloseButton]; HeaderButtons = [zpCloseButton];
{$ENDIF} {$ENDIF}
function NoteBookCreate(AOwner: TWinControl): TCustomDockSite; function NoteBookCreate: TCustomDockSite;
begin begin
(* Create default dockbook type. (* Create default dockbook type.
Dockable notebooks must not have an specific owner. Dockable notebooks must not have an specific owner.
@ -390,8 +391,9 @@ begin
} }
//Result := TEasyDockBook.Create(AOwner); //Result := TEasyDockBook.Create(AOwner);
Result := TEasyDockBook.Create(Application); Result := TEasyDockBook.Create(Application);
DockLoader.MakeDockable(Result, False, False); //do not make visible here!
{ TODO : form style should become bsNone when docked - workaround here } { TODO : form style should become bsNone when docked - workaround here }
Result.BorderStyle := bsNone; //Result.BorderStyle := bsNone;
end; end;
procedure NoteBookAdd(ABook: TCustomDockSite; AItem: TControl); procedure NoteBookAdd(ABook: TCustomDockSite; AItem: TControl);
@ -676,7 +678,7 @@ begin
NoteBook := TCustomDockSite(DropCtl); NoteBook := TCustomDockSite(DropCtl);
end else begin end else begin
//create new book //create new book
NoteBook := NoteBookCreate(FDockSite); NoteBook := NoteBookCreate;
{$IFDEF replace} {$IFDEF replace}
NoteBook.ReplaceDockedControl(DropZone.ChildControl, NoteBook, nil, alCustom); NoteBook.ReplaceDockedControl(DropZone.ChildControl, NoteBook, nil, alCustom);
{$ELSE} {$ELSE}
@ -690,6 +692,7 @@ begin
NoteBookAdd(NoteBook, DropCtl); //put the original control into the notebook NoteBookAdd(NoteBook, DropCtl); //put the original control into the notebook
NoteBook.BoundsRect := r; NoteBook.BoundsRect := r;
{$ENDIF} {$ENDIF}
NoteBook.Show;
end; //else use existing control end; //else use existing control
NoteBookAdd(NoteBook, Control); NoteBookAdd(NoteBook, Control);
FDockSite.Invalidate; //update notebook caption FDockSite.Invalidate; //update notebook caption
@ -697,9 +700,10 @@ begin
{$IFDEF singleTab} {$IFDEF singleTab}
end else if SingleTab and not (DropCtl is TEasyBook) then begin end else if SingleTab and not (DropCtl is TEasyBook) then begin
//empty root zone, create new notebook //empty root zone, create new notebook
NoteBook := NoteBookCreate(FDockSite); NoteBook := NoteBookCreate;
NoteBook.ManualDock(FDockSite, nil, alClient); NoteBook.ManualDock(FDockSite, nil, alClient);
NoteBookAdd(NoteBook, Control); NoteBookAdd(NoteBook, Control);
NoteBook.Show;
FDockSite.Invalidate; //update notebook caption FDockSite.Invalidate; //update notebook caption
exit; exit;
{$ELSE} {$ELSE}
@ -711,8 +715,6 @@ begin
NewZone := TEasyZone.Create(self); NewZone := TEasyZone.Create(self);
NewZone.ChildControl := Control as TControl; NewZone.ChildControl := Control as TControl;
Control.Align := alNone; Control.Align := alNone;
//is this still required?
//if Control is TCustomForm then TCustomForm(Control).BorderStyle := bsNone;
//special case: in root zone (empty dock site) //special case: in root zone (empty dock site)
@ -2152,6 +2154,25 @@ begin
Result := Control.Name; //definitely child.Name Result := Control.Name; //definitely child.Name
end; end;
function TCustomDockMaster.MakeDockable(AForm: TWinControl; fWrap: boolean;
fVisible: boolean): TForm;
var
wctl: TWinControlAccess absolute AForm;
begin
(* Result is the floating site, if created (fWrap).
fWrap here is ignored.
To be overridden by final TDockMaster, for
- wrapping
- visibility
*)
//make it dockable
wctl.DragKind := dkDock;
wctl.DragMode := dmAutomatic;
if fVisible then
AForm.Show;
Result := nil; //not wrapped
end;
function TCustomDockMaster.ReloadControl(const AName: string; function TCustomDockMaster.ReloadControl(const AName: string;
Site: TWinControl): TControl; Site: TWinControl): TControl;
var var

View File

@ -12,7 +12,6 @@ inherited EasyDockBook: TEasyDockBook
OnCreate = FormCreate OnCreate = FormCreate
OnDockDrop = FormDockDrop OnDockDrop = FormDockDrop
OnDockOver = FormDockOver OnDockOver = FormDockOver
OnEndDock = FormEndDock
OnGetSiteInfo = FormGetSiteInfo OnGetSiteInfo = FormGetSiteInfo
OnUnDock = FormUnDock OnUnDock = FormUnDock
object pnlDock: TPanel[0] object pnlDock: TPanel[0]

View File

@ -54,7 +54,7 @@ HostDockSite.UpdateDockCaption (provide composed dock caption)
{.$DEFINE undockFix} {.$DEFINE undockFix}
{$DEFINE closeFix} {$DEFINE closeFix}
{$DEFINE autoWrap} //request FloatingDockSiteClass {.$DEFINE autoWrap} //request FloatingDockSiteClass
interface interface
@ -89,7 +89,6 @@ type
X, Y: Integer); X, Y: Integer);
procedure FormDockOver(Sender: TObject; Source: TDragDockObject; procedure FormDockOver(Sender: TObject; Source: TDragDockObject;
X, Y: Integer; State: TDragState; var Accept: Boolean); X, Y: Integer; State: TDragState; var Accept: Boolean);
procedure FormEndDock(Sender, Target: TObject; X, Y: Integer);
procedure FormGetSiteInfo(Sender: TObject; DockClient: TControl; procedure FormGetSiteInfo(Sender: TObject; DockClient: TControl;
var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
procedure FormUnDock(Sender: TObject; Client: TControl; procedure FormUnDock(Sender: TObject; Client: TControl;
@ -237,12 +236,6 @@ begin
Source.DockRect := ScreenRect(pnlDock); Source.DockRect := ScreenRect(pnlDock);
end; end;
procedure TEasyDockBook.FormEndDock(Sender, Target: TObject; X, Y: Integer);
begin
(* wrap into an FloatHost
*)
end;
procedure TEasyDockBook.FormGetSiteInfo(Sender: TObject; DockClient: TControl; procedure TEasyDockBook.FormGetSiteInfo(Sender: TObject; DockClient: TControl;
var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
begin begin
@ -378,13 +371,12 @@ end;
function TEasyDockBook.GetFloatingDockSiteClass: TWinControlClass; function TEasyDockBook.GetFloatingDockSiteClass: TWinControlClass;
begin begin
(* Try: request a floating site (* Try: request a floating site, if no OnEndDock handler is installed
*) *)
{$IFDEF autoWrap} if assigned(OnEndDock) then
Result := inherited GetFloatingDockSiteClass
else
Result:= TFloatingSite; Result:= TFloatingSite;
{$ELSE}
Result := inherited GetFloatingDockSiteClass;
{$ENDIF}
end; end;
{$IFDEF new} {$IFDEF new}
@ -482,7 +474,6 @@ begin
Try prevent undocking of NOT docked form. Try prevent undocking of NOT docked form.
*) *)
inherited MouseMove(Shift, X, Y); inherited MouseMove(Shift, X, Y);
//if ssLeft in Shift then
if (ssLeft in Shift) and (Parent.HostDockSite <> nil) then if (ssLeft in Shift) and (Parent.HostDockSite <> nil) then
Parent.BeginDrag(False); //delayed docking of the container form Parent.BeginDrag(False); //delayed docking of the container form
end; end;
@ -490,7 +481,6 @@ end;
{$R *.lfm} {$R *.lfm}
initialization initialization
{.$I fdockbook.lrs}
RegisterClass(TEasyDockBook); RegisterClass(TEasyDockBook);
end. end.

View File

@ -89,7 +89,7 @@ type
procedure AddElasticSites(AForm: TCustomForm; Sides: sDockSides); procedure AddElasticSites(AForm: TCustomForm; Sides: sDockSides);
function CreateDockable(const AName: string; function CreateDockable(const AName: string;
fMultiInst: boolean; fWrap: boolean = True; fVisible: boolean = False): TWinControl; fMultiInst: boolean; fWrap: boolean = True; fVisible: boolean = False): TWinControl;
function MakeDockable(AForm: TWinControl; fWrap: boolean = True; fVisible: boolean = False): TForm; function MakeDockable(AForm: TWinControl; fWrap: boolean = True; fVisible: boolean = False): TForm; override;
procedure DumpSites; procedure DumpSites;
//persistence //persistence
procedure LoadFromStream(Stream: TStream); procedure LoadFromStream(Stream: TStream);
@ -244,23 +244,23 @@ var
Res: TWinControlAccess absolute AForm; Res: TWinControlAccess absolute AForm;
begin begin
Result := nil; Result := nil;
//Result := inherited MakeDockable(AForm, fWrap, fVisible); - premature Visbile?
//check already dockable //check already dockable
{ TODO -cdocking : problems with IDE windows: { TODO -cdocking : problems with IDE windows:
wrapping results in exceptions - conflicts with OnEndDock? } wrapping results in exceptions - conflicts with OnEndDock? }
//make it dockable //make it dockable
Res.DragKind := dkDock; Res.DragKind := dkDock;
Res.DragMode := dmAutomatic; Res.DragMode := dmAutomatic;
//wrap into floating site, if requested (not on restore Layout) //always force FloatingDockSite
if fWrap then begin {$IFDEF NeedHost}
{$IFDEF NeedHost}
Res.FloatingDockSiteClass := TFloatingSite; Res.FloatingDockSiteClass := TFloatingSite;
{$ELSE} {$ELSE}
//if not ForIDE then //problems with the IDE? //if not ForIDE then //problems with the IDE?
Res.OnEndDock := @FormEndDock; //float into default host site Res.OnEndDock := @FormEndDock; //float into default host site
{$ENDIF} {$ENDIF}
AForm.DisableAlign; //wrap into floating site, if requested (not on restore Layout)
if fWrap then begin
Site := WrapDockable(AForm, fVisible); Site := WrapDockable(AForm, fVisible);
AForm.EnableAlign;
end; end;
//IDE? //IDE?
if ForIDE and fWrap and assigned(Site) and assigned(Site.DockManager) then begin if ForIDE and fWrap and assigned(Site) and assigned(Site.DockManager) then begin
@ -480,6 +480,7 @@ Notebooks?
if site.DockManager = nil then if site.DockManager = nil then
TAppDockManager.Create(site); TAppDockManager.Create(site);
site.DockManager.LoadFromStream(Stream); site.DockManager.LoadFromStream(Stream);
site.Show;
{$ENDIF} {$ENDIF}
end; end;
end; end;
@ -705,6 +706,7 @@ function TDockMaster.WrapDockable(Client: TControl; fVisible: boolean): TFloatin
var var
Site: TFloatingSite absolute Result; Site: TFloatingSite absolute Result;
ctl: TControlAccess absolute Client; ctl: TControlAccess absolute Client;
wctl: TWinControlAccess absolute Client;
r: TRect; r: TRect;
begin begin
(* Wrap a control into a floating site. (* Wrap a control into a floating site.
@ -729,11 +731,15 @@ begin
Site.BoundsRect := r; Site.BoundsRect := r;
//DebugLn('Before Wrap: ', DbgS(Site.BoundsRect)); //DebugLn('Before Wrap: ', DbgS(Site.BoundsRect));
Client.Align := alNone; Client.Align := alNone;
//retry make client auto-dockable {//retry make client auto-dockable?
ctl.DragKind := dkDock; ctl.DragKind := dkDock;
ctl.DragMode := dmAutomatic; ctl.DragMode := dmAutomatic;}
if Client is TWinControl then
wctl.DisableAlign;
Client.ManualDock(Site); Client.ManualDock(Site);
Client.Visible := True; //shown only if Site is visible Client.Visible := True; //shown only when Site becomes visible
if Client is TWinControl then
wctl.EnableAlign;
//DebugLn('After Wrap: ', DbgS(Site.BoundsRect)); //DebugLn('After Wrap: ', DbgS(Site.BoundsRect));
if ForIDE then begin if ForIDE then begin
@ -750,10 +756,6 @@ begin
Site.Release; Site.Release;
raise; raise;
end; end;
{//retry make client auto-dockable
ctl.DragKind := dkDock;
ctl.DragMode := dmAutomatic;
}
end; end;
procedure TDockMaster.DumpSites; procedure TDockMaster.DumpSites;