IDE: using IDEDockmaster.CloseAll

git-svn-id: trunk@26010 -
This commit is contained in:
mattias 2010-06-09 22:19:38 +00:00
parent d35da02263
commit f0e6138cdc
3 changed files with 74 additions and 72 deletions

View File

@ -280,6 +280,7 @@ type
TAnchorDockManager = class(TDockManager) TAnchorDockManager = class(TDockManager)
private private
FDockSite: TAnchorDockHostSite; FDockSite: TAnchorDockHostSite;
FSite: TWinControl;
public public
constructor Create(ADockSite: TWinControl); override; constructor Create(ADockSite: TWinControl); override;
procedure GetControlBounds(Control: TControl; out AControlBounds: TRect); procedure GetControlBounds(Control: TControl; out AControlBounds: TRect);
@ -294,6 +295,7 @@ type
procedure SaveToStream(Stream: TStream); override; procedure SaveToStream(Stream: TStream); override;
function GetDockEdge(ADockObject: TDragDockObject): boolean; override; function GetDockEdge(ADockObject: TDragDockObject): boolean; override;
property DockSite: TAnchorDockHostSite read FDockSite; property DockSite: TAnchorDockHostSite read FDockSite;
property Site: TWinControl read FSite;
end; end;
{ TAnchorDockMaster } { TAnchorDockMaster }
@ -349,6 +351,7 @@ type
procedure MakeDockable(AControl: TControl; Show: boolean = true; procedure MakeDockable(AControl: TControl; Show: boolean = true;
BringToFront: boolean = false; BringToFront: boolean = false;
AddDockHeader: boolean = true); AddDockHeader: boolean = true);
procedure MakeVisible(AControl: TControl; SwitchPages: boolean);
function ShowControl(ControlName: string; BringToFront: boolean = false function ShowControl(ControlName: string; BringToFront: boolean = false
): TControl; ): TControl;
procedure CloseAll; procedure CloseAll;
@ -956,21 +959,6 @@ end;
procedure TAnchorDockMaster.MakeDockable(AControl: TControl; Show: boolean; procedure TAnchorDockMaster.MakeDockable(AControl: TControl; Show: boolean;
BringToFront: boolean; AddDockHeader: boolean); BringToFront: boolean; AddDockHeader: boolean);
procedure ShowSite(Site: TAnchorDockHostSite);
var
CurControl: TControl;
begin
CurControl:=Site;
while CurControl<>nil do begin
CurControl.Visible:=true;
if BringToFront and (CurControl is TAnchorDockPage) then
TAnchorDockPageControl(CurControl.Parent).PageIndex:=
TAnchorDockPage(CurControl).PageIndex;
CurControl:=CurControl.Parent;
end;
end;
var var
Site: TAnchorDockHostSite; Site: TAnchorDockHostSite;
begin begin
@ -1017,7 +1005,7 @@ begin
adrsNotSupportedHasParent, [DbgSName(AControl), DbgSName(AControl)])); adrsNotSupportedHasParent, [DbgSName(AControl), DbgSName(AControl)]));
end; end;
if (Site<>nil) and Show then if (Site<>nil) and Show then
ShowSite(Site); MakeVisible(Site,BringToFront);
finally finally
AControl.EnableAutoSizing; AControl.EnableAutoSizing;
end; end;
@ -1026,6 +1014,18 @@ begin
GetParentForm(Site).BringToFront; GetParentForm(Site).BringToFront;
end; end;
procedure TAnchorDockMaster.MakeVisible(AControl: TControl; SwitchPages: boolean
);
begin
while AControl<>nil do begin
AControl.Visible:=true;
if SwitchPages and (AControl is TAnchorDockPage) then
TAnchorDockPageControl(AControl.Parent).PageIndex:=
TAnchorDockPage(AControl).PageIndex;
AControl:=AControl.Parent;
end;
end;
function TAnchorDockMaster.ShowControl(ControlName: string; function TAnchorDockMaster.ShowControl(ControlName: string;
BringToFront: boolean): TControl; BringToFront: boolean): TControl;
begin begin
@ -3107,8 +3107,8 @@ end;
constructor TAnchorDockManager.Create(ADockSite: TWinControl); constructor TAnchorDockManager.Create(ADockSite: TWinControl);
begin begin
inherited Create(ADockSite); inherited Create(ADockSite);
if not (ADockSite is TAnchorDockHostSite) then FSite:=ADockSite;
raise Exception.Create('TAnchorDockManager.Create not supported: '+DbgSName(ADockSite)); if (ADockSite is TAnchorDockHostSite) then
FDockSite:=TAnchorDockHostSite(ADockSite); FDockSite:=TAnchorDockHostSite(ADockSite);
end; end;
@ -3122,12 +3122,15 @@ end;
procedure TAnchorDockManager.InsertControl(Control: TControl; InsertAt: TAlign; procedure TAnchorDockManager.InsertControl(Control: TControl; InsertAt: TAlign;
DropCtl: TControl); DropCtl: TControl);
begin begin
debugln(['TAnchorDockManager.InsertControl DockSite="',DockSite.Caption,'" Control=',Control,' InsertAt=',dbgs(InsertAt),' DropCtl=',DbgSName(DropCtl)]); if DockSite<>nil then
debugln(['TAnchorDockManager.InsertControl DockSite="',DockSite.Caption,'" Control=',DbgSName(Control),' InsertAt=',dbgs(InsertAt),' DropCtl=',DbgSName(DropCtl)])
else
debugln(['TAnchorDockManager.InsertControl DockSite=nil Site="',DbgSName(Site),'" Control=',DbgSName(Control),' InsertAt=',dbgs(InsertAt),' DropCtl=',DbgSName(DropCtl)])
end; end;
procedure TAnchorDockManager.LoadFromStream(Stream: TStream); procedure TAnchorDockManager.LoadFromStream(Stream: TStream);
begin begin
debugln(['TAnchorDockManager.LoadFromStream TODO DockSite="',DockSite.Caption,'"']); debugln(['TAnchorDockManager.LoadFromStream TODO Site="',DbgSName(Site),'"']);
if Stream=nil then ; if Stream=nil then ;
end; end;
@ -3142,33 +3145,34 @@ var
Offset: TPoint; Offset: TPoint;
Inside: Boolean; Inside: Boolean;
begin begin
Inside:=(DropCtl=DockSite) or (DockSite.Parent<>nil); Inside:=(DropCtl=Site) or (Site.Parent<>nil);
case DropAlign of case DropAlign of
alLeft: alLeft:
if Inside then if Inside then
DockRect:=Rect(0,0,Min(Client.Width,DockSite.ClientWidth div 2),DockSite.ClientHeight) DockRect:=Rect(0,0,Min(Client.Width,Site.ClientWidth div 2),Site.ClientHeight)
else else
DockRect:=Rect(-Client.Width,0,0,DockSite.ClientHeight); DockRect:=Rect(-Client.Width,0,0,Site.ClientHeight);
alRight: alRight:
if Inside then begin if Inside then begin
DockRect:=Rect(0,0,Min(Client.Width,DockSite.Width div 2),DockSite.ClientHeight); DockRect:=Rect(0,0,Min(Client.Width,Site.Width div 2),Site.ClientHeight);
OffsetRect(DockRect,DockSite.ClientWidth-DockRect.Right,0); OffsetRect(DockRect,Site.ClientWidth-DockRect.Right,0);
end else end else
DockRect:=Bounds(DockSite.ClientWidth,0,Client.Width,DockSite.ClientHeight); DockRect:=Bounds(Site.ClientWidth,0,Client.Width,Site.ClientHeight);
alTop: alTop:
if Inside then if Inside then
DockRect:=Rect(0,0,DockSite.ClientWidth,Min(Client.Height,DockSite.ClientHeight div 2)) DockRect:=Rect(0,0,Site.ClientWidth,Min(Client.Height,Site.ClientHeight div 2))
else else
DockRect:=Rect(0,-Client.Height,DockSite.ClientWidth,0); DockRect:=Rect(0,-Client.Height,Site.ClientWidth,0);
alBottom: alBottom:
if Inside then begin if Inside then begin
DockRect:=Rect(0,0,DockSite.ClientWidth,Min(Client.Height,DockSite.ClientHeight div 2)); DockRect:=Rect(0,0,Site.ClientWidth,Min(Client.Height,Site.ClientHeight div 2));
OffsetRect(DockRect,0,DockSite.ClientHeight-DockRect.Bottom); OffsetRect(DockRect,0,Site.ClientHeight-DockRect.Bottom);
end else end else
DockRect:=Bounds(0,DockSite.ClientHeight,DockSite.ClientWidth,Client.Height); DockRect:=Bounds(0,Site.ClientHeight,Site.ClientWidth,Client.Height);
alClient: alClient:
begin begin
// paged docking => show this as center // paged docking => show center
if DockSite<>nil then
DockRect:=DockSite.GetPageArea; DockRect:=DockSite.GetPageArea;
end; end;
else else
@ -3180,18 +3184,22 @@ end;
procedure TAnchorDockManager.RemoveControl(Control: TControl); procedure TAnchorDockManager.RemoveControl(Control: TControl);
begin begin
debugln(['TAnchorDockManager.RemoveControl DockSite="',DockSite.Caption,'" Control=',DbgSName(Control)]); if DockSite<>nil then
debugln(['TAnchorDockManager.RemoveControl DockSite="',DockSite.Caption,'" Control=',DbgSName(Control)])
else
debugln(['TAnchorDockManager.RemoveControl Site="',DbgSName(Site),'" Control=',DbgSName(Control)])
end; end;
procedure TAnchorDockManager.ResetBounds(Force: Boolean); procedure TAnchorDockManager.ResetBounds(Force: Boolean);
begin begin
debugln(['TAnchorDockManager.ResetBounds DockSite="',DockSite.Caption,'" Force=',Force]); if DockSite=nil then
debugln(['TAnchorDockManager.ResetBounds Site="',Site.Caption,'" Force=',Force,' ',dbgs(Site.ClientRect)]);
end; end;
procedure TAnchorDockManager.SaveToStream(Stream: TStream); procedure TAnchorDockManager.SaveToStream(Stream: TStream);
begin begin
if STream=nil then ; if Stream=nil then ;
debugln(['TAnchorDockManager.SaveToStream TODO DockSite="',DockSite.Caption,'"']); debugln(['TAnchorDockManager.SaveToStream TODO Site="',DbgSName(Site),'"']);
end; end;
function TAnchorDockManager.GetDockEdge(ADockObject: TDragDockObject): boolean; function TAnchorDockManager.GetDockEdge(ADockObject: TDragDockObject): boolean;
@ -3210,8 +3218,8 @@ var
var var
p: TPoint; p: TPoint;
begin begin
p:=DockSite.ScreenToClient(ADockObject.DragPos); p:=Site.ScreenToClient(ADockObject.DragPos);
if PtInRect(DockSite.GetPageArea,p) then begin if (DockSite<>nil) and PtInRect(DockSite.GetPageArea,p) then begin
// page docking // page docking
ADockObject.DropAlign:=alClient; ADockObject.DropAlign:=alClient;
end else begin end else begin
@ -3219,17 +3227,17 @@ begin
// check side // check side
BestDistance:=High(Integer); BestDistance:=High(Integer);
FindMinDistance(alLeft,p.X); FindMinDistance(alLeft,p.X);
FindMinDistance(alRight,DockSite.ClientWidth-p.X); FindMinDistance(alRight,Site.ClientWidth-p.X);
FindMinDistance(alTop,p.Y); FindMinDistance(alTop,p.Y);
FindMinDistance(alBottom,DockSite.ClientHeight-p.Y); FindMinDistance(alBottom,Site.ClientHeight-p.Y);
// check inside // check inside
if ((ADockObject.DropAlign=alLeft) and (p.X>=0)) if ((ADockObject.DropAlign=alLeft) and (p.X>=0))
or ((ADockObject.DropAlign=alTop) and (p.Y>=0)) or ((ADockObject.DropAlign=alTop) and (p.Y>=0))
or ((ADockObject.DropAlign=alRight) and (p.X<DockSite.ClientWidth)) or ((ADockObject.DropAlign=alRight) and (p.X<Site.ClientWidth))
or ((ADockObject.DropAlign=alBottom) and (p.Y<DockSite.ClientHeight)) or ((ADockObject.DropAlign=alBottom) and (p.Y<Site.ClientHeight))
then then
ADockObject.DropOnControl:=DockSite ADockObject.DropOnControl:=Site
else else
ADockObject.DropOnControl:=nil; ADockObject.DropOnControl:=nil;
end; end;

View File

@ -640,7 +640,6 @@ type
procedure SetupRemoteControl; procedure SetupRemoteControl;
procedure SetupIDEWindowsLayout; procedure SetupIDEWindowsLayout;
procedure RestoreIDEWindows; procedure RestoreIDEWindows;
procedure CloseIDEWindows;
procedure FreeIDEWindows; procedure FreeIDEWindows;
function CloseQueryIDEWindows: boolean; function CloseQueryIDEWindows: boolean;
@ -1702,7 +1701,10 @@ procedure TMainIDE.MainIDEFormClose(Sender: TObject;
begin begin
DoCallNotifyHandler(lihtIDEClose); DoCallNotifyHandler(lihtIDEClose);
SaveEnvironment; SaveEnvironment;
CloseIDEWindows; if IDEDockMaster<>nil then
IDEDockMaster.CloseAll
else
CloseAllForms;
SaveIncludeLinks; SaveIncludeLinks;
InputHistories.Save; InputHistories.Save;
PkgBoss.SaveSettings; PkgBoss.SaveSettings;
@ -2242,20 +2244,6 @@ begin
end; end;
end; end;
procedure TMainIDE.CloseIDEWindows;
var
i: Integer;
AForm: TCustomForm;
begin
i:=Screen.CustomFormCount-1;
while i>=0 do begin
AForm:=Screen.CustomForms[i];
if AForm<>MainIDEBar then
AForm.Close;
i:=Math.Min(i,Screen.CustomFormCount)-1;
end;
end;
procedure TMainIDE.FreeIDEWindows; procedure TMainIDE.FreeIDEWindows;
var var
i: Integer; i: Integer;

View File

@ -217,6 +217,7 @@ var
procedure MakeIDEWindowDockable(AControl: TWinControl); procedure MakeIDEWindowDockable(AControl: TWinControl);
procedure MakeIDEWindowDockSite(AForm: TCustomForm); procedure MakeIDEWindowDockSite(AForm: TCustomForm);
procedure CloseAllForms;
procedure Register; procedure Register;
@ -234,6 +235,21 @@ begin
IDEDockMaster.MakeIDEWindowDockSite(AForm); IDEDockMaster.MakeIDEWindowDockSite(AForm);
end; end;
procedure CloseAllForms;
var
i: Integer;
AForm: TCustomForm;
begin
i:=Screen.CustomFormCount-1;
while i>=0 do begin
AForm:=Screen.CustomForms[i];
if AForm<>Application.MainForm then
AForm.Close;
dec(i);
if i>=Screen.CustomFormCount then i:=Screen.CustomFormCount-1;
end;
end;
procedure Register; procedure Register;
begin begin
RegisterComponents('Misc',[TIDEDialogLayoutStorage]); RegisterComponents('Misc',[TIDEDialogLayoutStorage]);
@ -727,18 +743,8 @@ end;
{ TIDEDockMaster } { TIDEDockMaster }
procedure TIDEDockMaster.CloseAll; procedure TIDEDockMaster.CloseAll;
var
i: Integer;
AForm: TCustomForm;
begin begin
i:=Screen.CustomFormCount-1; CloseAllForms;
while i>=0 do begin
AForm:=Screen.CustomForms[i];
if AForm<>Application.MainForm then
AForm.Close;
dec(i);
if i>=Screen.CustomFormCount then i:=Screen.CustomFormCount-1;
end;
end; end;
initialization initialization