diff --git a/components/anchordocking/restoredebugger/ADRestoreDebugger.lpi b/components/anchordocking/restoredebugger/ADRestoreDebugger.lpi index 4eabba0a02..6e09e32107 100644 --- a/components/anchordocking/restoredebugger/ADRestoreDebugger.lpi +++ b/components/anchordocking/restoredebugger/ADRestoreDebugger.lpi @@ -28,13 +28,16 @@ - + - + - + + + + diff --git a/components/anchordocking/restoredebugger/adlayoutviewer.pas b/components/anchordocking/restoredebugger/adlayoutviewer.pas index 118847cb59..a0c711b35a 100644 --- a/components/anchordocking/restoredebugger/adlayoutviewer.pas +++ b/components/anchordocking/restoredebugger/adlayoutviewer.pas @@ -5,8 +5,8 @@ unit ADLayoutViewer; interface uses - Classes, SysUtils, types, math, Controls, Graphics, AnchorDockStorage, - LazLogger; + Classes, SysUtils, types, math, Controls, Graphics, ComCtrls, + AnchorDockStorage, LazLogger; type TADLTVMonitor = class @@ -17,16 +17,21 @@ type X, Y: integer; end; - { TADLayoutTreeView } + { TADCustomLayoutTreeView } - TADLayoutTreeView = class(TCustomControl) + TADCustomLayoutTreeView = class(TCustomControl) private FLayout: TAnchorDockLayoutTree; + FScaleMax: double; + FScaleMin: double; FScale: double; FBounds: TRect; FScaledBounds: TRect; FScaledScroll: TPoint; FMonitors: array of TADLTVMonitor; + FZoomTrackbar: TCustomTrackBar; + FOldZoombarOnChange: TNotifyEvent; + FIgnoreZoomTrackbarChange: boolean; function GetLayoutMaxX: integer; function GetLayoutMaxY: integer; function GetLayoutMinX: integer; @@ -38,12 +43,20 @@ type function GetScaledMinY: integer; function GetScaledOffsetX: integer; function GetScaledOffsetY: integer; + procedure SetScaleMax(AValue: double); + procedure SetScaleMin(AValue: double); procedure SetScale(AValue: double); procedure SetScaledOffsetX(AValue: integer); procedure SetScaledOffsetY(AValue: integer); procedure ComputeLayout; procedure ClearMonitors; function FindMonitor(Monitor: integer): TADLTVMonitor; + procedure SetZoomTrackbar(AValue: TCustomTrackBar); + procedure UpdateZoomTrackBar; + procedure ZoomTrackbarChange(Sender: TObject); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); + override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; @@ -64,90 +77,135 @@ type property ScaledMaxY: integer read GetScaledMaxY; function MonitorCount: integer; property Monitors[Index: integer]: TADLTVMonitor read GetMonitors; + property ZoomTrackbar: TCustomTrackBar read FZoomTrackbar write SetZoomTrackbar; + function ScaleToZoomTrackBarPos(aScale: double): integer; + function ZoomTrackBarPosToScale(p: integer): double; + property ScaleMin: double read FScaleMin write SetScaleMin; + property ScaleMax: double read FScaleMax write SetScaleMax; + end; + + TADLayoutTreeView = class(TADCustomLayoutTreeView) + published + property Scale: double read FScale write SetScale; + property ScaledOffsetX: integer read GetScaledOffsetX write SetScaledOffsetX; + property ScaledOffsetY: integer read GetScaledOffsetY write SetScaledOffsetY; + property ZoomTrackbar: TCustomTrackBar read FZoomTrackbar write SetZoomTrackbar; + property ScaleMin: double read FScaleMin write SetScaleMin; + property ScaleMax: double read FScaleMax write SetScaleMax; end; implementation -{ TADLayoutTreeView } +{ TADCustomLayoutTreeView } -procedure TADLayoutTreeView.SetScale(AValue: double); +procedure TADCustomLayoutTreeView.SetScale(AValue: double); begin + AValue:=Min(ScaleMax,Max(AValue,ScaleMin)); if FScale=AValue then Exit; FScale:=AValue; FScaledBounds:=ScaleRect(FBounds); + UpdateZoomTrackBar; Invalidate; end; -function TADLayoutTreeView.GetLayoutMaxX: integer; +procedure TADCustomLayoutTreeView.ZoomTrackbarChange(Sender: TObject); +begin + if not FIgnoreZoomTrackbarChange then + Scale:=ZoomTrackBarPosToScale(ZoomTrackbar.Position); + if Assigned(FOldZoombarOnChange) then + FOldZoombarOnChange(Sender); +end; + +function TADCustomLayoutTreeView.GetLayoutMaxX: integer; begin Result:=FBounds.Right; end; -function TADLayoutTreeView.GetLayoutMaxY: integer; +function TADCustomLayoutTreeView.GetLayoutMaxY: integer; begin Result:=FBounds.Bottom; end; -function TADLayoutTreeView.GetLayoutMinX: integer; +function TADCustomLayoutTreeView.GetLayoutMinX: integer; begin Result:=FBounds.Left; end; -function TADLayoutTreeView.GetLayoutMinY: integer; +function TADCustomLayoutTreeView.GetLayoutMinY: integer; begin Result:=FBounds.Top; end; -function TADLayoutTreeView.GetMonitors(Index: integer): TADLTVMonitor; +function TADCustomLayoutTreeView.GetMonitors(Index: integer): TADLTVMonitor; begin Result:=FMonitors[Index]; end; -function TADLayoutTreeView.GetScaledMaxX: integer; +function TADCustomLayoutTreeView.GetScaledMaxX: integer; begin Result:=FScaledBounds.Right; end; -function TADLayoutTreeView.GetScaledMaxY: integer; +function TADCustomLayoutTreeView.GetScaledMaxY: integer; begin Result:=FScaledBounds.Bottom; end; -function TADLayoutTreeView.GetScaledMinX: integer; +function TADCustomLayoutTreeView.GetScaledMinX: integer; begin Result:=FScaledBounds.Left; end; -function TADLayoutTreeView.GetScaledMinY: integer; +function TADCustomLayoutTreeView.GetScaledMinY: integer; begin Result:=FScaledBounds.Top; end; -function TADLayoutTreeView.GetScaledOffsetX: integer; +function TADCustomLayoutTreeView.GetScaledOffsetX: integer; begin Result:=FScaledScroll.X; end; -function TADLayoutTreeView.GetScaledOffsetY: integer; +function TADCustomLayoutTreeView.GetScaledOffsetY: integer; begin Result:=FScaledScroll.Y; end; -procedure TADLayoutTreeView.SetScaledOffsetX(AValue: integer); +procedure TADCustomLayoutTreeView.SetScaleMax(AValue: double); +// must be >=1.0 +begin + AValue:=Max(AValue,1.0); + if FScaleMax=AValue then Exit; + FScaleMax:=AValue; + Scale:=Min(ScaleMax,Max(Scale,ScaleMin)); + UpdateZoomTrackBar; +end; + +procedure TADCustomLayoutTreeView.SetScaleMin(AValue: double); +// must be between 0.00001 and 1.0 +begin + AValue:=Min(1.0,Max(AValue,0.00001)); + if FScaleMin=AValue then Exit; + FScaleMin:=AValue; + Scale:=Min(ScaleMax,Max(Scale,ScaleMin)); + UpdateZoomTrackBar; +end; + +procedure TADCustomLayoutTreeView.SetScaledOffsetX(AValue: integer); begin if FScaledScroll.X=AValue then Exit; FScaledScroll.X:=AValue; Invalidate; end; -procedure TADLayoutTreeView.SetScaledOffsetY(AValue: integer); +procedure TADCustomLayoutTreeView.SetScaledOffsetY(AValue: integer); begin if FScaledScroll.Y=AValue then Exit; FScaledScroll.Y:=AValue; Invalidate; end; -procedure TADLayoutTreeView.ComputeLayout; +procedure TADCustomLayoutTreeView.ComputeLayout; procedure ComputeMonitors(Node: TAnchorDockLayoutTreeNode); var @@ -242,7 +300,7 @@ begin FScaledBounds:=ScaleRect(FBounds); end; -procedure TADLayoutTreeView.ClearMonitors; +procedure TADCustomLayoutTreeView.ClearMonitors; var i: Integer; begin @@ -250,7 +308,7 @@ begin SetLength(FMonitors,0); end; -function TADLayoutTreeView.FindMonitor(Monitor: integer): TADLTVMonitor; +function TADCustomLayoutTreeView.FindMonitor(Monitor: integer): TADLTVMonitor; var i: Integer; begin @@ -261,21 +319,63 @@ begin Result:=nil; end; -constructor TADLayoutTreeView.Create(AOwner: TComponent); +procedure TADCustomLayoutTreeView.SetZoomTrackbar(AValue: TCustomTrackBar); +begin + if FZoomTrackbar=AValue then Exit; + if ZoomTrackbar<>nil then begin + ZoomTrackbar.OnChange:=FOldZoombarOnChange; + end; + FZoomTrackbar:=AValue; + if ZoomTrackbar<>nil then begin + FreeNotification(ZoomTrackbar); + fOldZoombarOnChange:=ZoomTrackbar.OnChange; + ZoomTrackbar.OnChange:=@ZoomTrackbarChange; + UpdateZoomTrackBar; + end; +end; + +procedure TADCustomLayoutTreeView.UpdateZoomTrackBar; +var + OldChange: Boolean; +begin + OldChange:=FIgnoreZoomTrackbarChange; + try + FIgnoreZoomTrackbarChange:=true; + //debugln(['TADCustomLayoutTreeView.UpdateZoomTrackBar Scale=',Scale,' Zoom=',ScaleToZoomTrackBarPos(Scale)]); + ZoomTrackbar.Position:=ScaleToZoomTrackBarPos(Scale); + finally + FIgnoreZoomTrackbarChange:=OldChange; + end; + ZoomTrackbar.Caption:=''; +end; + +procedure TADCustomLayoutTreeView.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited Notification(AComponent, Operation); + if Operation=opRemove then begin + if AComponent=ZoomTrackbar then + ZoomTrackbar:=nil; + end; +end; + +constructor TADCustomLayoutTreeView.Create(AOwner: TComponent); begin inherited Create(AOwner); FLayout:=TAnchorDockLayoutTree.Create; FScale:=0.25; + FScaleMin:=1/20; + FScaleMax:=5; end; -destructor TADLayoutTreeView.Destroy; +destructor TADCustomLayoutTreeView.Destroy; begin FreeAndNil(FLayout); ClearMonitors; inherited Destroy; end; -procedure TADLayoutTreeView.Paint; +procedure TADCustomLayoutTreeView.Paint; procedure DrawContent(Node: TAnchorDockLayoutTreeNode; OriginX, OriginY: integer); @@ -367,7 +467,7 @@ begin inherited Paint; end; -function TADLayoutTreeView.ScaleRect(const r: TRect): TRect; +function TADCustomLayoutTreeView.ScaleRect(const r: TRect): TRect; begin Result.Left:=floor(r.Left*Scale)+FScaledScroll.X; Result.Top:=floor(r.Top*Scale)+FScaledScroll.Y; @@ -375,15 +475,47 @@ begin Result.Bottom:=ceil(r.Bottom*Scale)+FScaledScroll.Y; end; -procedure TADLayoutTreeView.LayoutChanged; +procedure TADCustomLayoutTreeView.LayoutChanged; begin ComputeLayout; end; -function TADLayoutTreeView.MonitorCount: integer; +function TADCustomLayoutTreeView.MonitorCount: integer; begin Result:=length(FMonitors); end; +function TADCustomLayoutTreeView.ScaleToZoomTrackBarPos(aScale: double + ): integer; +var + lnMinPos, lnMaxPos, lnPos, Percent: Double; +begin + // ZoomTrackbar.Min corresponds to ln(ScaleMin) + // ZoomTrackbar.Max corresponds to ln(ScaleMax) + lnMinPos:=ln(ScaleMin); + lnMaxPos:=ln(ScaleMax); + lnPos:=ln(aScale); + Percent:=(lnPos-lnMinPos)/(lnMaxPos-lnMinPos); + Result:=ZoomTrackbar.Min+round(Percent*(ZoomTrackbar.Max-ZoomTrackbar.Min)); + //debugln(['TADCustomLayoutTreeView.ScaleToZoomTrackBarPos ScaleMin=',ScaleMin,' ScaleMax=',ScaleMax,' lnMinPos=',lnMinPos,' lnMaxPos=',lnMaxPos,' lnPos=',lnPos,' Percent=',Percent,' TrackBar=Min=',ZoomTrackbar.Min,',Max=',ZoomTrackbar.Max,' Result=',Result]); + // avoid out of bounds due to rounding errors + Result:=Min(ZoomTrackbar.Max,Max(ZoomTrackbar.Min,Result)); +end; + +function TADCustomLayoutTreeView.ZoomTrackBarPosToScale(p: integer): double; +var + lnMinPos, lnMaxPos, lnPos, Percent: Double; +begin + // ZoomTrackbar.Min corresponds to ln(ScaleMin) + // ZoomTrackbar.Max corresponds to ln(ScaleMax) + lnMinPos:=ln(ScaleMin); + lnMaxPos:=ln(ScaleMax); + Percent:=(p-ZoomTrackbar.Min)/(ZoomTrackbar.Max-ZoomTrackbar.Min); + lnPos:=lnMinPos+Percent*(lnMaxPos-lnMinPos); + Result:=exp(lnPos); + // avoid out of bounds due to rounding errors + Result:=Max(lnMinPos,Min(lnMaxPos,Result)); +end; + end. diff --git a/components/anchordocking/restoredebugger/mainunit.lfm b/components/anchordocking/restoredebugger/mainunit.lfm index 81fccf655f..618f83b3d9 100644 --- a/components/anchordocking/restoredebugger/mainunit.lfm +++ b/components/anchordocking/restoredebugger/mainunit.lfm @@ -1103,46 +1103,6 @@ object ADRestDbg: TADRestDbg Anchors = [akTop, akLeft, akRight] ResizeAnchor = akTop end - object OriginalLayoutToolBar: TToolBar - AnchorSideLeft.Control = SplitterXMLLayout - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = MainToolBar - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 336 - Height = 26 - Top = 32 - Width = 373 - Align = alNone - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Left = 6 - BorderSpacing.Top = 6 - BorderSpacing.Right = 6 - Caption = 'OriginalLayoutToolBar' - Flat = False - TabOrder = 6 - end - object RestoredLayoutToolBar: TToolBar - AnchorSideLeft.Control = SplitterXMLLayout - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = SplitterBetweenLayouts - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 336 - Height = 26 - Top = 296 - Width = 373 - Align = alNone - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Left = 6 - BorderSpacing.Top = 6 - BorderSpacing.Right = 6 - Caption = 'RestoredLayoutToolBar' - Flat = False - TabOrder = 7 - end object OriginalLayoutPanel: TPanel AnchorSideLeft.Control = SplitterXMLLayout AnchorSideLeft.Side = asrBottom @@ -1152,15 +1112,15 @@ object ADRestDbg: TADRestDbg AnchorSideRight.Side = asrBottom AnchorSideBottom.Control = SplitterBetweenLayouts Left = 336 - Height = 221 - Top = 58 + Height = 201 + Top = 78 Width = 373 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 Caption = 'OriginalLayoutPanel' - TabOrder = 8 + TabOrder = 6 end object RestoredLayoutPanel: TPanel AnchorSideLeft.Control = SplitterXMLLayout @@ -1172,15 +1132,102 @@ object ADRestDbg: TADRestDbg AnchorSideBottom.Control = Owner AnchorSideBottom.Side = asrBottom Left = 336 - Height = 239 - Top = 322 + Height = 219 + Top = 342 Width = 373 Anchors = [akTop, akLeft, akRight, akBottom] BorderSpacing.Left = 6 BorderSpacing.Right = 6 BorderSpacing.Bottom = 6 Caption = 'RestoredLayoutPanel' + TabOrder = 7 + end + object OriginalLayoutToolBar: TPanel + AnchorSideLeft.Control = SplitterXMLLayout + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = MainToolBar + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 336 + Height = 46 + Top = 32 + Width = 373 + Anchors = [akTop, akLeft, akRight] + AutoSize = True + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + BorderSpacing.Right = 6 + ClientHeight = 46 + ClientWidth = 373 + TabOrder = 8 + object OriginalZoomTrackBar: TTrackBar + Left = 1 + Height = 44 + Top = 1 + Width = 100 + Max = 30 + OnChange = OriginalZoomTrackBarChange + Position = 0 + ScalePos = trLeft + ShowSelRange = False + TabOrder = 0 + end + object OriginalZoomLabel: TLabel + AnchorSideLeft.Control = OriginalZoomTrackBar + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = OriginalZoomTrackBar + AnchorSideTop.Side = asrCenter + Left = 101 + Height = 15 + Top = 16 + Width = 103 + Caption = 'OriginalZoomLabel' + ParentColor = False + end + end + object RestoredLayoutToolBar: TPanel + AnchorSideLeft.Control = SplitterXMLLayout + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = SplitterBetweenLayouts + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = Owner + AnchorSideRight.Side = asrBottom + Left = 336 + Height = 46 + Top = 296 + Width = 373 + Anchors = [akTop, akLeft, akRight] + AutoSize = True + BorderSpacing.Left = 6 + BorderSpacing.Top = 6 + BorderSpacing.Right = 6 + ClientHeight = 46 + ClientWidth = 373 TabOrder = 9 + object RestoredZoomTrackBar: TTrackBar + Left = 1 + Height = 44 + Top = 1 + Width = 100 + Max = 30 + OnChange = RestoredZoomTrackBarChange + Position = 0 + ScalePos = trLeft + TabOrder = 0 + end + object RestoredZoomLabel: TLabel + AnchorSideLeft.Control = RestoredZoomTrackBar + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = RestoredZoomTrackBar + AnchorSideTop.Side = asrCenter + Left = 101 + Height = 15 + Top = 16 + Width = 111 + Caption = 'RestoredZoomLabel' + ParentColor = False + end end object SynXMLSyn1: TSynXMLSyn DefaultFilter = 'XML Document (*.xml,*.xsd,*.xsl,*.xslt,*.dtd)|*.xml;*.xsd;*.xsl;*.xslt;*.dtd' diff --git a/components/anchordocking/restoredebugger/mainunit.pas b/components/anchordocking/restoredebugger/mainunit.pas index 1322256abc..ca5d290d67 100644 --- a/components/anchordocking/restoredebugger/mainunit.pas +++ b/components/anchordocking/restoredebugger/mainunit.pas @@ -46,9 +46,13 @@ type TADRestDbg = class(TForm) OriginalFileLabel: TLabel; OriginalLayoutPanel: TPanel; + OriginalLayoutToolBar: TPanel; + OriginalZoomTrackBar: TTrackBar; RestoredFileLabel: TLabel; RestoredLayoutPanel: TPanel; - RestoredLayoutToolBar: TToolBar; + RestoredLayoutToolBar: TPanel; + RestoredZoomLabel: TLabel; + RestoredZoomTrackBar: TTrackBar; SplitterXMLLayout: TSplitter; SplitterBetweenXML: TSplitter; OriginalSynEdit: TSynEdit; @@ -58,12 +62,14 @@ type MainToolBar: TToolBar; OpenToolButton: TToolButton; OpenRecentToolButton: TToolButton; - OriginalLayoutToolBar: TToolBar; + OriginalZoomLabel: TLabel; procedure FormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure OpenRecentToolButtonClick(Sender: TObject); procedure OpenToolButtonClick(Sender: TObject); + procedure OriginalZoomTrackBarChange(Sender: TObject); + procedure RestoredZoomTrackBarChange(Sender: TObject); private FConfigFilename: string; FOriginalFilename: string; @@ -113,6 +119,7 @@ begin Name:='OriginalView'; Parent:=OriginalLayoutPanel; Align:=alClient; + ZoomTrackbar:=OriginalZoomTrackBar; end; RestoredView:=TADLayoutTreeView.Create(Self); @@ -120,6 +127,7 @@ begin Name:='RestoredView'; Parent:=RestoredLayoutPanel; Align:=alClient; + ZoomTrackbar:=RestoredZoomTrackBar; end; LoadConfig; @@ -148,6 +156,16 @@ begin ShowMessage('not implemented yet'); end; +procedure TADRestDbg.OriginalZoomTrackBarChange(Sender: TObject); +begin + OriginalZoomLabel.Caption:=FloatToStrF(OriginalView.Scale,ffGeneral,6,3); +end; + +procedure TADRestDbg.RestoredZoomTrackBarChange(Sender: TObject); +begin + RestoredZoomLabel.Caption:=FloatToStrF(RestoredView.Scale,ffGeneral,6,3); +end; + function TADRestDbg.GetOriginalLayout: TAnchorDockLayoutTree; begin Result:=OriginalView.Layout;