From 5fd97861f341c6a0ab6bae2692681b782146759d Mon Sep 17 00:00:00 2001 From: mattias Date: Tue, 1 Jan 2013 21:59:37 +0000 Subject: [PATCH] anchordocking: restoretest: compute bounds git-svn-id: trunk@39717 - --- .../restoredebugger/adlayoutviewer.pas | 204 +++++++++++++++--- .../restoredebugger/mainunit.pas | 25 ++- 2 files changed, 195 insertions(+), 34 deletions(-) diff --git a/components/anchordocking/restoredebugger/adlayoutviewer.pas b/components/anchordocking/restoredebugger/adlayoutviewer.pas index c03e220981..f6fcd7af73 100644 --- a/components/anchordocking/restoredebugger/adlayoutviewer.pas +++ b/components/anchordocking/restoredebugger/adlayoutviewer.pas @@ -5,30 +5,43 @@ unit ADLayoutViewer; interface uses - Classes, SysUtils, Controls, Graphics, AnchorDockStorage; + Classes, SysUtils, types, math, Controls, Graphics, AnchorDockStorage; type + TADLTVMonitor = class + public + Monitor: integer; + WorkArea: TRect; + Bounds: TRect; // hull of all windows on this monitor + X, Y: integer; + end; { TADLayoutTreeView } TADLayoutTreeView = class(TCustomControl) private FLayout: TAnchorDockLayoutTree; - FLayoutMaxX: integer; - FLayoutMaxY: integer; - FLayoutMinX: integer; - FLayoutMinY: integer; FScale: double; - FScaledMaxX: integer; - FScaledMaxY: integer; - FScaledMinX: integer; - FScaledMinY: integer; - FScaledOffsetX: integer; - FScaledOffsetY: integer; + FBounds: TRect; + FScaledBounds: TRect; + FScaledScroll: TPoint; + FMonitors: array of TADLTVMonitor; + function GetLayoutMaxX: integer; + function GetLayoutMaxY: integer; + function GetLayoutMinX: integer; + function GetLayoutMinY: integer; + function GetScaledMaxX: integer; + function GetScaledMaxY: integer; + function GetScaledMinX: integer; + function GetScaledMinY: integer; + function GetScaledOffsetX: integer; + function GetScaledOffsetY: integer; procedure SetScale(AValue: double); procedure SetScaledOffsetX(AValue: integer); procedure SetScaledOffsetY(AValue: integer); procedure ComputeLayout; + procedure ClearMonitors; + function FindMonitor(Monitor: integer): TADLTVMonitor; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -36,16 +49,16 @@ type procedure LayoutChanged; virtual; property Layout: TAnchorDockLayoutTree read FLayout; property Scale: double read FScale write SetScale; - property ScaledOffsetX: integer read FScaledOffsetX write SetScaledOffsetX; - property ScaledOffsetY: integer read FScaledOffsetY write SetScaledOffsetY; - property LayoutMinX: integer read FLayoutMinX; - property LayoutMinY: integer read FLayoutMinY; - property LayoutMaxX: integer read FLayoutMaxX; - property LayoutMaxY: integer read FLayoutMaxY; - property ScaledMinX: integer read FScaledMinX; - property ScaledMinY: integer read FScaledMinY; - property ScaledMaxX: integer read FScaledMaxX; - property ScaledMaxY: integer read FScaledMaxY; + property ScaledOffsetX: integer read GetScaledOffsetX write SetScaledOffsetX; + property ScaledOffsetY: integer read GetScaledOffsetY write SetScaledOffsetY; + property LayoutMinX: integer read GetLayoutMinX; + property LayoutMinY: integer read GetLayoutMinY; + property LayoutMaxX: integer read GetLayoutMaxX; + property LayoutMaxY: integer read GetLayoutMaxY; + property ScaledMinX: integer read GetScaledMinX; + property ScaledMinY: integer read GetScaledMinY; + property ScaledMaxX: integer read GetScaledMaxX; + property ScaledMaxY: integer read GetScaledMaxY; end; implementation @@ -58,22 +71,162 @@ begin FScale:=AValue; end; +function TADLayoutTreeView.GetLayoutMaxX: integer; +begin + Result:=FBounds.Right; +end; + +function TADLayoutTreeView.GetLayoutMaxY: integer; +begin + Result:=FBounds.Bottom; +end; + +function TADLayoutTreeView.GetLayoutMinX: integer; +begin + Result:=FBounds.Left; +end; + +function TADLayoutTreeView.GetLayoutMinY: integer; +begin + Result:=FBounds.Top; +end; + +function TADLayoutTreeView.GetScaledMaxX: integer; +begin + Result:=FScaledBounds.Right; +end; + +function TADLayoutTreeView.GetScaledMaxY: integer; +begin + Result:=FScaledBounds.Bottom; +end; + +function TADLayoutTreeView.GetScaledMinX: integer; +begin + Result:=FScaledBounds.Left; +end; + +function TADLayoutTreeView.GetScaledMinY: integer; +begin + Result:=FScaledBounds.Top; +end; + +function TADLayoutTreeView.GetScaledOffsetX: integer; +begin + Result:=FScaledScroll.X; +end; + +function TADLayoutTreeView.GetScaledOffsetY: integer; +begin + Result:=FScaledScroll.Y; +end; + procedure TADLayoutTreeView.SetScaledOffsetX(AValue: integer); begin - if FScaledOffsetX=AValue then Exit; - FScaledOffsetX:=AValue; + if FScaledScroll.X=AValue then Exit; + FScaledScroll.X:=AValue; end; procedure TADLayoutTreeView.SetScaledOffsetY(AValue: integer); begin - if FScaledOffsetY=AValue then Exit; - FScaledOffsetY:=AValue; + if FScaledScroll.Y=AValue then Exit; + FScaledScroll.Y:=AValue; end; procedure TADLayoutTreeView.ComputeLayout; + + procedure ComputeMonitors(Node: TAnchorDockLayoutTreeNode); + var + i: Integer; + Monitor: TADLTVMonitor; + r: TRect; + begin + if Node=nil then exit; + if Node.NodeType in [adltnLayout,adltnCustomSite] then begin + // top level window + Monitor:=FindMonitor(Node.Monitor); + if Monitor=nil then begin + // first window on this monitor + Monitor:=TADLTVMonitor.Create; + Monitor.Monitor:=Node.Monitor; + Monitor.WorkArea:=Node.WorkAreaRect; + Monitor.Bounds:=Node.BoundsRect; + end else begin + // another window on this monitor + r:=Rect(0,0,0,0); + UnionRect(r,Monitor.Bounds,Node.BoundsRect); + Monitor.Bounds:=r; + end; + end else begin + for i:=0 to Node.Count-1 do + ComputeMonitors(Node[i]); + end; + end; + +var + i: Integer; + Monitor: TADLTVMonitor; + TileSize: TPoint; + TileCols: Integer; + LeftMost: Integer; + TopMost: Integer; + TileCol: Integer; + TileRow: Integer; + TileLeft: Integer; + TileTop: Integer; begin if FLayout=nil then exit; + // clear computed values + FBounds:=Rect(0,0,0,0); + FScaledBounds:=Rect(0,0,0,0); + ClearMonitors; + // collect all monitor bounds + ComputeMonitors(FLayout.Root); + if length(FMonitors)=0 then exit; + // get biggest monitor + TileSize:=Point(0,0); + for i:=0 to length(FMonitors)-1 do begin + Monitor:=FMonitors[i]; + Monitor.Bounds.Right:=Max(Monitor.Bounds.Left,Monitor.Bounds.Right); + Monitor.Bounds.Bottom:=Max(Monitor.Bounds.Top,Monitor.Bounds.Bottom); + TileSize.X:=Max(TileSize.X,Monitor.Bounds.Right-Monitor.Bounds.Left); + TileSize.X:=Max(TileSize.X,Monitor.WorkArea.Right-Monitor.WorkArea.Left); + TileSize.Y:=Max(TileSize.Y,Monitor.Bounds.Bottom-Monitor.Bounds.Top); + TileSize.Y:=Max(TileSize.Y,Monitor.WorkArea.Bottom-Monitor.WorkArea.Top); + end; + // put monitors into tiles of same size in a quadratic layout + TileCols:=ceil(SQRT(length(FMonitors))); + for i:=0 to length(FMonitors)-1 do begin + Monitor:=FMonitors[i]; + LeftMost:=Min(Monitor.WorkArea.Left,Monitor.Bounds.Left); + TopMost:=Min(Monitor.WorkArea.Top,Monitor.Bounds.Top); + TileCol:=i mod TileCols; + TileRow:=i div TileCols; + TileLeft:=TileCol*TileSize.X; + TileTop:=TileRow*TileSize.Y; + // move left/topmost to left,top of tile + Monitor.X:=TileLeft-LeftMost; + Monitor.Y:=TileTop-TopMost; + end; +end; +procedure TADLayoutTreeView.ClearMonitors; +var + i: Integer; +begin + for i:=0 to length(FMonitors)-1 do FreeAndNil(FMonitors[i]); + SetLength(FMonitors,0); +end; + +function TADLayoutTreeView.FindMonitor(Monitor: integer): TADLTVMonitor; +var + i: Integer; +begin + for i:=0 to length(FMonitors)-1 do begin + Result:=FMonitors[i]; + if Result.Monitor=Monitor then exit; + end; + Result:=nil; end; constructor TADLayoutTreeView.Create(AOwner: TComponent); @@ -85,6 +238,7 @@ end; destructor TADLayoutTreeView.Destroy; begin FreeAndNil(FLayout); + ClearMonitors; inherited Destroy; end; diff --git a/components/anchordocking/restoredebugger/mainunit.pas b/components/anchordocking/restoredebugger/mainunit.pas index 7dd86c5f9a..112e41561e 100644 --- a/components/anchordocking/restoredebugger/mainunit.pas +++ b/components/anchordocking/restoredebugger/mainunit.pas @@ -61,19 +61,19 @@ type procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private - FRestoredLayout: TAnchorDockLayoutTree; FOriginalFilename: string; - FOriginalLayout: TAnchorDockLayoutTree; FSettings: TAnchorDockSettings; + function GetOriginalLayout: TAnchorDockLayoutTree; + function GetRestoredLayout: TAnchorDockLayoutTree; public OriginalView: TADLayoutTreeView; RestoredView: TADLayoutTreeView; procedure OpenLayout(Filename: string); procedure LoadSettingsFromOriginalSynedit; property Settings: TAnchorDockSettings read FSettings; - property OriginalLayout: TAnchorDockLayoutTree read FOriginalLayout; + property OriginalLayout: TAnchorDockLayoutTree read GetOriginalLayout; property OriginalFilename: string read FOriginalFilename; - property RestoredLayout: TAnchorDockLayoutTree read FRestoredLayout; + property RestoredLayout: TAnchorDockLayoutTree read GetRestoredLayout; end; var @@ -89,8 +89,6 @@ procedure TADRestDbg.FormCreate(Sender: TObject); begin Caption:='Anchordocking Restore Debugger'; FSettings:=TAnchorDockSettings.Create; - FOriginalLayout:=TAnchorDockLayoutTree.Create; - FRestoredLayout:=TAnchorDockLayoutTree.Create; OriginalFileLabel.Caption:='Original: '+OriginalFilename; RestoredFileLabel.Caption:='Restored XML:'; @@ -118,8 +116,16 @@ end; procedure TADRestDbg.FormDestroy(Sender: TObject); begin FreeAndNil(FSettings); - FreeAndNil(FOriginalLayout); - FreeAndNil(FRestoredLayout); +end; + +function TADRestDbg.GetOriginalLayout: TAnchorDockLayoutTree; +begin + Result:=OriginalView.Layout; +end; + +function TADRestDbg.GetRestoredLayout: TAnchorDockLayoutTree; +begin + Result:=RestoredView.Layout; end; procedure TADRestDbg.OpenLayout(Filename: string); @@ -158,11 +164,12 @@ begin Config:=TXMLConfigStorage.Create(ms); FSettings.LoadFromConfig(Config); Config.AppendBasePath('MainConfig/'); - FOriginalLayout.LoadFromConfig(Config); + OriginalLayout.LoadFromConfig(Config); Config.UndoAppendBasePath; finally Config.Free; ms.Free; + OriginalView.LayoutChanged; end; end;