mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-19 14:29:29 +02:00
New options file for package AnchorDockingDsgn. Refactored out from earlier commit.
git-svn-id: trunk@49786 -
This commit is contained in:
parent
8ecda32ee4
commit
78a3ce2949
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -606,6 +606,7 @@ components/anchordocking/anchordockpkg.pas svneol=native#text/plain
|
||||
components/anchordocking/anchordockstorage.pas svneol=native#text/plain
|
||||
components/anchordocking/anchordockstr.pas svneol=native#text/plain
|
||||
components/anchordocking/design/ADLayoutDefault.xml svneol=native#text/plain
|
||||
components/anchordocking/design/anchordesktopoptions.pas svneol=native#text/pascal
|
||||
components/anchordocking/design/anchordockingdsgn.lpk svneol=native#text/plain
|
||||
components/anchordocking/design/anchordockingdsgn.pas svneol=native#text/plain
|
||||
components/anchordocking/design/registeranchordocking.lfm svneol=native#text/plain
|
||||
|
231
components/anchordocking/design/anchordesktopoptions.pas
Normal file
231
components/anchordocking/design/anchordesktopoptions.pas
Normal file
@ -0,0 +1,231 @@
|
||||
unit AnchorDesktopOptions;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils,
|
||||
LCLProc, Forms, Controls,
|
||||
LazFileUtils, LazConfigStorage, Laz2_XMLCfg,
|
||||
IDEOptionsIntf, MacroIntf, LazIDEIntf,
|
||||
AnchorDocking, AnchorDockStorage;
|
||||
|
||||
type
|
||||
|
||||
TAnchorDesktopOpt = class(TAbstractDesktopDockingOpt)
|
||||
private
|
||||
FTree: TAnchorDockLayoutTree;
|
||||
FRestoreLayouts: TAnchorDockRestoreLayouts;
|
||||
public
|
||||
procedure LoadDefaultLayout;
|
||||
procedure LoadLayoutFromConfig(Path: string; aXMLCfg: TRttiXMLConfig);
|
||||
procedure LoadLayoutFromFile(FileName: string);
|
||||
|
||||
procedure SaveMainLayoutToTree;
|
||||
procedure SaveLayoutToConfig(Path: string; aXMLCfg: TRttiXMLConfig);
|
||||
public
|
||||
constructor Create(aUseIDELayouts: Boolean); override;
|
||||
destructor Destroy; override;
|
||||
procedure Load(Path: String; aXMLCfg: TRttiXMLConfig); override;
|
||||
procedure Save(Path: String; aXMLCfg: TRttiXMLConfig); override;
|
||||
procedure Assign(Source: TAbstractDesktopDockingOpt); override;
|
||||
procedure StoreWindowPositions; override;
|
||||
function RestoreDesktop: Boolean; override;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{ TAnchorDesktopOpt }
|
||||
|
||||
procedure TAnchorDesktopOpt.Assign(Source: TAbstractDesktopDockingOpt);
|
||||
var
|
||||
xSource: TAnchorDesktopOpt;
|
||||
begin
|
||||
if Source is TAnchorDesktopOpt then
|
||||
begin
|
||||
xSource := TAnchorDesktopOpt(Source);
|
||||
FTree.Assign(xSource.FTree);
|
||||
FRestoreLayouts.Assign(xSource.FRestoreLayouts);
|
||||
end;
|
||||
end;
|
||||
|
||||
constructor TAnchorDesktopOpt.Create(aUseIDELayouts: Boolean);
|
||||
begin
|
||||
inherited;
|
||||
|
||||
FTree := TAnchorDockLayoutTree.Create;
|
||||
FRestoreLayouts := TAnchorDockRestoreLayouts.Create;
|
||||
if aUseIDELayouts then
|
||||
DockMaster.RestoreLayouts := Self.FRestoreLayouts;
|
||||
end;
|
||||
|
||||
destructor TAnchorDesktopOpt.Destroy;
|
||||
begin
|
||||
FTree.Free;
|
||||
FRestoreLayouts.Free;
|
||||
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TAnchorDesktopOpt.Load(Path: String; aXMLCfg: TRttiXMLConfig);
|
||||
var
|
||||
Config: TConfigStorage;
|
||||
begin
|
||||
//new version of old "TIDEAnchorDockMaster.LoadUserLayout"
|
||||
|
||||
Path := Path + 'AnchorDocking/';
|
||||
try
|
||||
{$IFDEF VerboseAnchorDocking}
|
||||
debugln(['TIDEAnchorDockMaster.LoadUserLayout ',Filename]);
|
||||
{$ENDIF}
|
||||
if aXMLCfg.GetValue(Path+'MainConfig/Nodes/ChildCount',0) > 0 then//config is not empty
|
||||
begin
|
||||
// loading last layout
|
||||
{$IF defined(VerboseAnchorDocking) or defined(VerboseAnchorDockRestore)}
|
||||
debugln(['TIDEAnchorDockMaster.LoadUserLayout restoring ...']);
|
||||
{$ENDIF}
|
||||
LoadLayoutFromConfig(Path,aXMLCfg);
|
||||
end else begin
|
||||
// loading defaults
|
||||
{$IF defined(VerboseAnchorDocking) or defined(VerboseAnchorDockRestore)}
|
||||
debugln(['TIDEAnchorDockMaster.LoadUserLayout loading default layout ...']);
|
||||
{$ENDIF}
|
||||
LoadDefaultLayout;
|
||||
end;
|
||||
except
|
||||
on E: Exception do begin
|
||||
DebugLn(['TIDEAnchorDockMaster.LoadUserLayout loading ',aXMLCfg.GetValue(Path+'Name', ''),' failed: ',E.Message]);
|
||||
Raise;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAnchorDesktopOpt.LoadDefaultLayout;
|
||||
var
|
||||
BaseDir: String;
|
||||
Filename: String;
|
||||
begin
|
||||
Filename := AppendPathDelim(LazarusIDE.GetPrimaryConfigPath)+'anchordocklayout.xml';
|
||||
if FileExistsUTF8(Filename) then//first load from anchordocklayout.xml -- backwards compatibility
|
||||
LoadLayoutFromFile(Filename)
|
||||
else
|
||||
begin
|
||||
BaseDir := '$PkgDir(AnchorDockingDsgn)';
|
||||
IDEMacros.SubstituteMacros(BaseDir);
|
||||
if (BaseDir<>'') and DirectoryExistsUTF8(BaseDir) then begin
|
||||
Filename:=AppendPathDelim(BaseDir)+'ADLayoutDefault.xml';
|
||||
if FileExistsUTF8(Filename) then
|
||||
LoadLayoutFromFile(Filename);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAnchorDesktopOpt.LoadLayoutFromConfig(Path: string; aXMLCfg: TRttiXMLConfig);
|
||||
begin
|
||||
FTree.LoadFromConfig(Path+'MainConfig/', aXMLCfg);
|
||||
FRestoreLayouts.LoadFromConfig(Path+'Restores/', aXMLCfg);
|
||||
end;
|
||||
|
||||
procedure TAnchorDesktopOpt.LoadLayoutFromFile(FileName: string);
|
||||
var
|
||||
Config: TRttiXMLConfig;
|
||||
begin
|
||||
Config := TRttiXMLConfig.Create(FileName);
|
||||
try
|
||||
LoadLayoutFromConfig('',Config);
|
||||
finally
|
||||
Config.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAnchorDesktopOpt.Save(Path: String; aXMLCfg: TRttiXMLConfig);
|
||||
begin
|
||||
Path := Path + 'AnchorDocking/';
|
||||
try
|
||||
{$IF defined(VerboseAnchorDocking) or defined(VerboseAnchorDockRestore)}
|
||||
debugln(['TIDEAnchorDockMaster.SaveDefaultLayout ',Filename]);
|
||||
{$ENDIF}
|
||||
SaveLayoutToConfig(Path, aXMLCfg);
|
||||
except
|
||||
on E: Exception do begin
|
||||
DebugLn(['TIDEAnchorDockMaster.SaveDefaultLayout saving ',aXMLCfg.GetValue(Path+'Name', ''),' failed: ',E.Message]);
|
||||
Raise;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAnchorDesktopOpt.SaveLayoutToConfig(Path: string; aXMLCfg: TRttiXMLConfig);
|
||||
begin
|
||||
FTree.SaveToConfig(Path+'MainConfig/', aXMLCfg);
|
||||
FRestoreLayouts.SaveToConfig(Path+'Restores/', aXMLCfg);
|
||||
WriteDebugLayout('TAnchorDesktopOpt.SaveLayoutToConfig ',FTree.Root);
|
||||
end;
|
||||
|
||||
procedure TAnchorDesktopOpt.SaveMainLayoutToTree;
|
||||
var
|
||||
i: Integer;
|
||||
AControl: TControl;
|
||||
Site: TAnchorDockHostSite;
|
||||
SavedSites: TFPList;
|
||||
LayoutNode: TAnchorDockLayoutTreeNode;
|
||||
AForm: TCustomForm;
|
||||
VisibleControls: TStringList;
|
||||
begin
|
||||
FTree.Clear;
|
||||
SavedSites:=TFPList.Create;
|
||||
VisibleControls:=TStringList.Create;
|
||||
with DockMaster do
|
||||
try
|
||||
for i:=0 to ControlCount-1 do begin
|
||||
AControl:=Controls[i];
|
||||
if not DockedControlIsVisible(AControl) then continue;
|
||||
VisibleControls.Add(AControl.Name);
|
||||
AForm:=GetParentForm(AControl);
|
||||
if AForm=nil then continue;
|
||||
if SavedSites.IndexOf(AForm)>=0 then continue;
|
||||
SavedSites.Add(AForm);
|
||||
debugln(['TAnchorDesktopOpt.SaveMainLayoutToTree AForm=',DbgSName(AForm)]);
|
||||
DebugWriteChildAnchors(AForm,true,true);
|
||||
if (AForm is TAnchorDockHostSite) then begin
|
||||
Site:=TAnchorDockHostSite(AForm);
|
||||
LayoutNode:=FTree.NewNode(FTree.Root);
|
||||
Site.SaveLayout(FTree,LayoutNode);
|
||||
end else if IsCustomSite(AForm) then begin
|
||||
// custom dock site
|
||||
LayoutNode:=FTree.NewNode(FTree.Root);
|
||||
LayoutNode.NodeType:=adltnCustomSite;
|
||||
LayoutNode.Assign(AForm);
|
||||
// can have one normal dock site
|
||||
Site:=TAnchorDockManager(AForm.DockManager).GetChildSite;
|
||||
if Site<>nil then begin
|
||||
LayoutNode:=FTree.NewNode(LayoutNode);
|
||||
Site.SaveLayout(FTree,LayoutNode);
|
||||
{if Site.BoundSplitter<>nil then begin
|
||||
LayoutNode:=FTree.NewNode(LayoutNode);
|
||||
Site.BoundSplitter.SaveLayout(LayoutNode);
|
||||
end;}
|
||||
end;
|
||||
end else
|
||||
raise EAnchorDockLayoutError.Create('invalid root control for save: '+DbgSName(AControl));
|
||||
end;
|
||||
// remove invisible controls
|
||||
FTree.Root.Simplify(VisibleControls);
|
||||
finally
|
||||
VisibleControls.Free;
|
||||
SavedSites.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAnchorDesktopOpt.StoreWindowPositions;
|
||||
begin
|
||||
SaveMainLayoutToTree;
|
||||
end;
|
||||
|
||||
function TAnchorDesktopOpt.RestoreDesktop: Boolean;
|
||||
begin
|
||||
Result := DockMaster.FullRestoreLayout(FTree,True);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user