|
|
@@ -28,17 +28,356 @@
|
|
|
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
}
|
|
|
|
|
|
+{******************************* CONTRIBUTOR(S) ******************************
|
|
|
+- Edivando S. Santos Brasil | [email protected]
|
|
|
+ (Compatibility with delphi VCL 11/2018)
|
|
|
+
|
|
|
+***************************** END CONTRIBUTOR(S) *****************************}
|
|
|
+
|
|
|
unit BCBaseCtrls;
|
|
|
|
|
|
-{$mode objfpc}{$H+}
|
|
|
+{$I bgracontrols.inc}
|
|
|
|
|
|
interface
|
|
|
|
|
|
uses
|
|
|
- Classes, SysUtils, Controls, BGRABitmap, BGRABitmapTypes;
|
|
|
+ Classes, SysUtils, Types, Controls, ExtCtrls, Graphics,
|
|
|
+ {$IFNDEF FPC}Windows, Messages, BGRAGraphics, GraphType, FPImage, {$ELSE} LCLType,{$ENDIF}
|
|
|
+ BGRABitmap, BGRABitmapTypes;
|
|
|
|
|
|
type
|
|
|
|
|
|
+{$IFNDEF FPC}
|
|
|
+ TSpacingSize = Integer;
|
|
|
+ TControlCellAlign = (
|
|
|
+ ccaFill,
|
|
|
+ ccaLeftTop,
|
|
|
+ ccaRightBottom,
|
|
|
+ ccaCenter
|
|
|
+ );
|
|
|
+ TControlCellAligns = set of TControlCellAlign;
|
|
|
+
|
|
|
+ TControlBorderSpacingDefault = record
|
|
|
+ Left: TSpacingSize;
|
|
|
+ Top: TSpacingSize;
|
|
|
+ Right: TSpacingSize;
|
|
|
+ Bottom: TSpacingSize;
|
|
|
+ Around: TSpacingSize;
|
|
|
+ end;
|
|
|
+ PControlBorderSpacingDefault = ^TControlBorderSpacingDefault;
|
|
|
+
|
|
|
+
|
|
|
+ TBGRAGraphicCtrl = class;
|
|
|
+ TBGRACustomCtrl = class;
|
|
|
+ TControlBorderSpacing = class;
|
|
|
+
|
|
|
+ ILCLControl = interface
|
|
|
+ ['{97A3D274-C4BD-4095-9B23-8E50D6E0EA24}']
|
|
|
+ procedure DoOnResize;
|
|
|
+ procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;{%H-}WithThemeSpace: boolean);
|
|
|
+ procedure MouseEnter;
|
|
|
+ procedure MouseLeave;
|
|
|
+ procedure TextChanged;
|
|
|
+ procedure FontChanged(Sender: TObject);
|
|
|
+ procedure RealSetText(const Value: TCaption);
|
|
|
+ procedure Resize;
|
|
|
+ procedure SetColor(Value: TColor);
|
|
|
+ function GetColor : TColor;
|
|
|
+ function ColorIsStored: boolean;
|
|
|
+ function RealGetText: TCaption;
|
|
|
+ function CreateControlBorderSpacing: TControlBorderSpacing;
|
|
|
+ procedure SetBorderSpacing(const AValue: TControlBorderSpacing);
|
|
|
+ procedure SetInitialBounds(aLeft, aTop, aWidth, aHeight: integer);
|
|
|
+ procedure InvalidatePreferredSize;
|
|
|
+ procedure EnableAutoSizing;
|
|
|
+ procedure DoBorderSpacingChange(Sender: TObject; InnerSpaceChanged: Boolean);
|
|
|
+ function GetInstance : TObject;
|
|
|
+ function IsInnerBorderStored: boolean;
|
|
|
+ end;
|
|
|
+
|
|
|
+ TControlBorderSpacing = class(TPersistent)
|
|
|
+ private
|
|
|
+ FAround: TSpacingSize;
|
|
|
+ FBottom: TSpacingSize;
|
|
|
+ FCellAlignHorizontal: TControlCellAlign;
|
|
|
+ FCellAlignVertical: TControlCellAlign;
|
|
|
+ FControl: ILCLControl;
|
|
|
+ FInnerBorder: Integer;
|
|
|
+ FLeft: TSpacingSize;
|
|
|
+ FOnChange: TNotifyEvent;
|
|
|
+ FRight: TSpacingSize;
|
|
|
+ FTop: TSpacingSize;
|
|
|
+ FDefault: PControlBorderSpacingDefault;
|
|
|
+ function GetAroundBottom: Integer;
|
|
|
+ function GetAroundLeft: Integer;
|
|
|
+ function GetAroundRight: Integer;
|
|
|
+ function GetAroundTop: Integer;
|
|
|
+ function GetControlBottom: Integer;
|
|
|
+ function GetControlHeight: Integer;
|
|
|
+ function GetControlLeft: Integer;
|
|
|
+ function GetControlRight: Integer;
|
|
|
+ function GetControlTop: Integer;
|
|
|
+ function GetControlWidth: Integer;
|
|
|
+ function IsAroundStored: boolean;
|
|
|
+ function IsBottomStored: boolean;
|
|
|
+ function IsInnerBorderStored: boolean;
|
|
|
+ function IsLeftStored: boolean;
|
|
|
+ function IsRightStored: boolean;
|
|
|
+ function IsTopStored: boolean;
|
|
|
+ procedure SetAround(const AValue: TSpacingSize);
|
|
|
+ procedure SetBottom(const AValue: TSpacingSize);
|
|
|
+ procedure SetCellAlignHorizontal(const AValue: TControlCellAlign);
|
|
|
+ procedure SetCellAlignVertical(const AValue: TControlCellAlign);
|
|
|
+ procedure SetInnerBorder(const AValue: Integer);
|
|
|
+ procedure SetLeft(const AValue: TSpacingSize);
|
|
|
+ procedure SetRight(const AValue: TSpacingSize);
|
|
|
+ procedure SetSpace(Kind: TAnchorKind; const AValue: integer);
|
|
|
+ procedure SetTop(const AValue: TSpacingSize);
|
|
|
+ protected
|
|
|
+ procedure Change(InnerSpaceChanged: Boolean); virtual;
|
|
|
+ public
|
|
|
+ constructor Create(OwnerControl: ILCLControl; ADefault: PControlBorderSpacingDefault = nil);
|
|
|
+ procedure Assign(Source: TPersistent); override;
|
|
|
+ procedure AssignTo(Dest: TPersistent); override;
|
|
|
+ function IsEqual(Spacing: TControlBorderSpacing): boolean;
|
|
|
+ procedure GetSpaceAround(var SpaceAround: TRect); virtual;
|
|
|
+ function GetSideSpace(Kind: TAnchorKind): Integer; // Around+GetSpace
|
|
|
+ function GetSpace(Kind: TAnchorKind): Integer; virtual;
|
|
|
+ procedure AutoAdjustLayout(const AXProportion, AYProportion: Double);
|
|
|
+ public
|
|
|
+ property Control: ILCLControl read FControl;
|
|
|
+ property Space[Kind: TAnchorKind]: integer read GetSpace write SetSpace;
|
|
|
+ property AroundLeft: Integer read GetAroundLeft;
|
|
|
+ property AroundTop: Integer read GetAroundTop;
|
|
|
+ property AroundRight: Integer read GetAroundRight;
|
|
|
+ property AroundBottom: Integer read GetAroundBottom;
|
|
|
+ property ControlLeft: Integer read GetControlLeft;
|
|
|
+ property ControlTop: Integer read GetControlTop;
|
|
|
+ property ControlWidth: Integer read GetControlWidth;
|
|
|
+ property ControlHeight: Integer read GetControlHeight;
|
|
|
+ property ControlRight: Integer read GetControlRight;
|
|
|
+ property ControlBottom: Integer read GetControlBottom;
|
|
|
+ published
|
|
|
+ property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
|
|
+ property Left: TSpacingSize read FLeft write SetLeft stored IsLeftStored;
|
|
|
+ property Top: TSpacingSize read FTop write SetTop stored IsTopStored;
|
|
|
+ property Right: TSpacingSize read FRight write SetRight stored IsRightStored;
|
|
|
+ property Bottom: TSpacingSize read FBottom write SetBottom stored IsBottomStored;
|
|
|
+ property Around: TSpacingSize read FAround write SetAround stored IsAroundStored;
|
|
|
+ property InnerBorder: Integer read FInnerBorder write SetInnerBorder stored IsInnerBorderStored default 0;
|
|
|
+ property CellAlignHorizontal: TControlCellAlign read FCellAlignHorizontal write SetCellAlignHorizontal default ccaFill;
|
|
|
+ property CellAlignVertical: TControlCellAlign read FCellAlignVertical write SetCellAlignVertical default ccaFill;
|
|
|
+ end;
|
|
|
+
|
|
|
+ TChildControlResizeStyle = (
|
|
|
+ crsAnchorAligning, // (like Delphi)
|
|
|
+ crsScaleChilds, // scale children equally, keep space between children fixed
|
|
|
+ crsHomogenousChildResize, // enlarge children equally (i.e. by the same amount of pixel)
|
|
|
+ crsHomogenousSpaceResize // enlarge space between children equally
|
|
|
+ {$IFDEF EnablecrsSameSize}
|
|
|
+ ,crsSameSize // each child gets the same size (maybe one pixel difference)
|
|
|
+ {$ENDIF}
|
|
|
+ );
|
|
|
+
|
|
|
+ TControlChildrenLayout = (
|
|
|
+ cclNone,
|
|
|
+ cclLeftToRightThenTopToBottom, // if BiDiMode <> bdLeftToRight then it becomes RightToLeft
|
|
|
+ cclTopToBottomThenLeftToRight
|
|
|
+ );
|
|
|
+
|
|
|
+ TControlChildSizing = class(TPersistent)
|
|
|
+ private
|
|
|
+ FControl: ILCLControl;
|
|
|
+ FControlsPerLine: integer;
|
|
|
+ FEnlargeHorizontal: TChildControlResizeStyle;
|
|
|
+ FEnlargeVertical: TChildControlResizeStyle;
|
|
|
+ FHorizontalSpacing: integer;
|
|
|
+ FLayout: TControlChildrenLayout;
|
|
|
+ FLeftRightSpacing: integer;
|
|
|
+ FOnChange: TNotifyEvent;
|
|
|
+ FShrinkHorizontal: TChildControlResizeStyle;
|
|
|
+ FShrinkVertical: TChildControlResizeStyle;
|
|
|
+ FTopBottomSpacing: integer;
|
|
|
+ FVerticalSpacing: integer;
|
|
|
+ procedure SetControlsPerLine(const AValue: integer);
|
|
|
+ procedure SetEnlargeHorizontal(const AValue: TChildControlResizeStyle);
|
|
|
+ procedure SetEnlargeVertical(const AValue: TChildControlResizeStyle);
|
|
|
+ procedure SetHorizontalSpacing(const AValue: integer);
|
|
|
+ procedure SetLayout(const AValue: TControlChildrenLayout);
|
|
|
+ procedure SetLeftRightSpacing(const AValue: integer);
|
|
|
+ procedure SetShrinkHorizontal(const AValue: TChildControlResizeStyle);
|
|
|
+ procedure SetShrinkVertical(const AValue: TChildControlResizeStyle);
|
|
|
+ procedure SetTopBottomSpacing(const AValue: integer);
|
|
|
+ procedure SetVerticalSpacing(const AValue: integer);
|
|
|
+ protected
|
|
|
+ procedure Change; virtual;
|
|
|
+ public
|
|
|
+ constructor Create(OwnerControl: ILCLControl);
|
|
|
+ procedure Assign(Source: TPersistent); override;
|
|
|
+ procedure AssignTo(Dest: TPersistent); override;
|
|
|
+ function IsEqual(Sizing: TControlChildSizing): boolean;
|
|
|
+ procedure SetGridSpacing(Spacing: integer);
|
|
|
+ public
|
|
|
+ property Control: ILCLControl read FControl;
|
|
|
+ property OnChange: TNotifyEvent read FOnChange write FOnChange;
|
|
|
+ published
|
|
|
+ property LeftRightSpacing: integer read FLeftRightSpacing write SetLeftRightSpacing default 0;
|
|
|
+ property TopBottomSpacing: integer read FTopBottomSpacing write SetTopBottomSpacing default 0;
|
|
|
+ property HorizontalSpacing: integer read FHorizontalSpacing write SetHorizontalSpacing default 0;
|
|
|
+ property VerticalSpacing: integer read FVerticalSpacing write SetVerticalSpacing default 0;
|
|
|
+ property EnlargeHorizontal: TChildControlResizeStyle read FEnlargeHorizontal
|
|
|
+ write SetEnlargeHorizontal default crsAnchorAligning;
|
|
|
+ property EnlargeVertical: TChildControlResizeStyle read FEnlargeVertical
|
|
|
+ write SetEnlargeVertical default crsAnchorAligning;
|
|
|
+ property ShrinkHorizontal: TChildControlResizeStyle read FShrinkHorizontal
|
|
|
+ write SetShrinkHorizontal default crsAnchorAligning;
|
|
|
+ property ShrinkVertical: TChildControlResizeStyle read FShrinkVertical
|
|
|
+ write SetShrinkVertical default crsAnchorAligning;
|
|
|
+ property Layout: TControlChildrenLayout read FLayout write SetLayout default cclNone;
|
|
|
+ property ControlsPerLine: integer read FControlsPerLine write SetControlsPerLine default 0;
|
|
|
+ end;
|
|
|
+{$ENDIF}
|
|
|
+
|
|
|
+{$IFDEF FPC}
|
|
|
+ TBGRAGraphicCtrl = class(TGraphicControl)
|
|
|
+{$ELSE}
|
|
|
+ TBGRAGraphicCtrl = class(TGraphicControl, ILCLControl)
|
|
|
+ protected
|
|
|
+ FBorderSpacing: TControlBorderSpacing;
|
|
|
+ FOnChange: TNotifyEvent;
|
|
|
+ FMouseInClient: boolean;
|
|
|
+ procedure DoOnResize; virtual;
|
|
|
+ procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;{%H-}WithThemeSpace: boolean); virtual;
|
|
|
+ procedure MouseEnter; virtual;
|
|
|
+ procedure MouseLeave; virtual;
|
|
|
+ procedure TextChanged; virtual;
|
|
|
+ procedure FontChanged(Sender: TObject); virtual;
|
|
|
+ procedure RealSetText(const Value: TCaption); virtual;
|
|
|
+ procedure Resize; override;
|
|
|
+ class function GetControlClassDefaultSize: TSize; virtual;
|
|
|
+ procedure SetColor(Value: TColor); virtual;
|
|
|
+ function GetColor : TColor;
|
|
|
+ procedure CMMouseEnter(var Message :TMessage); message CM_MOUSEENTER;
|
|
|
+ procedure CMMouseLeave(var Message :TMessage); message CM_MOUSELEAVE;
|
|
|
+ procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
|
|
|
+ function ColorIsStored: boolean; virtual;
|
|
|
+ function RealGetText: TCaption; virtual;
|
|
|
+ function CreateControlBorderSpacing: TControlBorderSpacing; virtual;
|
|
|
+ procedure SetBorderSpacing(const AValue: TControlBorderSpacing);
|
|
|
+ procedure DoBorderSpacingChange(Sender: TObject; InnerSpaceChanged: Boolean); virtual;
|
|
|
+ function GetInstance : TObject;
|
|
|
+ function IsInnerBorderStored: boolean;
|
|
|
+ public
|
|
|
+ constructor Create(TheOwner: TComponent);override;
|
|
|
+ destructor Destroy;override;
|
|
|
+ procedure SetInitialBounds(aLeft, aTop, aWidth, aHeight: integer); virtual;
|
|
|
+ procedure InvalidatePreferredSize; virtual;
|
|
|
+ procedure EnableAutoSizing;
|
|
|
+ property Color: TColor read GetColor write SetColor stored ColorIsStored default clWindow;
|
|
|
+ property BorderSpacing: TControlBorderSpacing read FBorderSpacing write SetBorderSpacing;
|
|
|
+ property Caption;
|
|
|
+ property Canvas;
|
|
|
+{$ENDIF}
|
|
|
+ end;
|
|
|
+
|
|
|
+{$IFDEF FPC}
|
|
|
+ TBGRACustomCtrl = class(TCustomControl)
|
|
|
+{$ELSE}
|
|
|
+ TBGRACustomCtrl = class(TCustomControl, ILCLControl)
|
|
|
+ protected
|
|
|
+ FBorderSpacing: TControlBorderSpacing;
|
|
|
+ FChildSizing: TControlChildSizing;
|
|
|
+ FOnChange: TNotifyEvent;
|
|
|
+ FMouseInClient: boolean;
|
|
|
+ procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;{%H-}WithThemeSpace: boolean); {$IFDEF FPC}override;{$ELSE}virtual;{$ENDIF}
|
|
|
+ procedure DoOnResize; virtual;
|
|
|
+ procedure MouseEnter; virtual;
|
|
|
+ procedure MouseLeave; virtual;
|
|
|
+ procedure TextChanged; virtual;
|
|
|
+ procedure FontChanged(Sender: TObject); virtual;
|
|
|
+ function GetDefaultDockCaption: String; virtual;
|
|
|
+ procedure RealSetText(const Value: TCaption); virtual;
|
|
|
+ procedure EnabledChanged; virtual;
|
|
|
+ procedure Resize; override;
|
|
|
+ class function GetControlClassDefaultSize: TSize; virtual;
|
|
|
+ procedure SetColor(Value: TColor); virtual;
|
|
|
+ function GetColor : TColor;
|
|
|
+ procedure UTF8KeyPress(var UTF8Key: {$IFDEF FPC}TUTF8Char{$ELSE}String{$ENDIF}); virtual;
|
|
|
+ procedure CMMouseEnter(var Message :TMessage); message CM_MOUSEENTER;
|
|
|
+ procedure CMMouseLeave(var Message :TMessage); message CM_MOUSELEAVE;
|
|
|
+ procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
|
|
|
+ function ColorIsStored: boolean; virtual;
|
|
|
+ function RealGetText: TCaption; virtual;
|
|
|
+ function CreateControlBorderSpacing: TControlBorderSpacing; virtual;
|
|
|
+ procedure SetBorderSpacing(const AValue: TControlBorderSpacing);
|
|
|
+ procedure DoBorderSpacingChange(Sender: TObject; InnerSpaceChanged: Boolean); virtual;
|
|
|
+ function GetInstance : TObject;
|
|
|
+ function IsInnerBorderStored: boolean;
|
|
|
+ procedure SetChildSizing(const AValue: TControlChildSizing);
|
|
|
+ procedure DoChildSizingChange(Sender: TObject); virtual;
|
|
|
+ public
|
|
|
+ constructor Create(TheOwner: TComponent);override;
|
|
|
+ destructor Destroy;override;
|
|
|
+ procedure SetInitialBounds(aLeft, aTop, aWidth, aHeight: integer); virtual;
|
|
|
+ procedure InvalidatePreferredSize; virtual;
|
|
|
+ procedure EnableAutoSizing;
|
|
|
+ property Color: TColor read GetColor write SetColor stored ColorIsStored default clWindow;
|
|
|
+ property BorderSpacing: TControlBorderSpacing read FBorderSpacing write SetBorderSpacing;
|
|
|
+ property ChildSizing: TControlChildSizing read FChildSizing write SetChildSizing;
|
|
|
+ property Caption;
|
|
|
+ property Canvas;
|
|
|
+{$ENDIF}
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+{$IFDEF FPC}
|
|
|
+ TBGRACustomPanel = class(TCustomPanel)
|
|
|
+{$ELSE}
|
|
|
+ TBGRACustomPanel = class(TCustomPanel, ILCLControl)
|
|
|
+ protected
|
|
|
+ FBorderSpacing: TControlBorderSpacing;
|
|
|
+ FChildSizing: TControlChildSizing;
|
|
|
+ FOnChange: TNotifyEvent;
|
|
|
+ FMouseInClient: boolean;
|
|
|
+ procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;{%H-}WithThemeSpace: boolean); {$IFDEF FPC}override;{$ELSE}virtual;{$ENDIF}
|
|
|
+ procedure DoOnResize; virtual;
|
|
|
+ procedure MouseEnter; virtual;
|
|
|
+ procedure MouseLeave; virtual;
|
|
|
+ procedure TextChanged; virtual;
|
|
|
+ procedure FontChanged(Sender: TObject); virtual;
|
|
|
+ function GetDefaultDockCaption: String; virtual;
|
|
|
+ procedure RealSetText(const Value: TCaption); virtual;
|
|
|
+ procedure EnabledChanged; virtual;
|
|
|
+ procedure Resize; override;
|
|
|
+ class function GetControlClassDefaultSize: TSize; virtual;
|
|
|
+ procedure SetColor(Value: TColor); virtual;
|
|
|
+ function GetColor : TColor;
|
|
|
+ procedure UTF8KeyPress(var UTF8Key: {$IFDEF FPC}TUTF8Char{$ELSE}String{$ENDIF}); virtual;
|
|
|
+ procedure CMMouseEnter(var Message :TMessage); message CM_MOUSEENTER;
|
|
|
+ procedure CMMouseLeave(var Message :TMessage); message CM_MOUSELEAVE;
|
|
|
+ procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
|
|
|
+ function ColorIsStored: boolean; virtual;
|
|
|
+ function RealGetText: TCaption; virtual;
|
|
|
+ function CreateControlBorderSpacing: TControlBorderSpacing; virtual;
|
|
|
+ procedure SetBorderSpacing(const AValue: TControlBorderSpacing);
|
|
|
+ procedure DoBorderSpacingChange(Sender: TObject; InnerSpaceChanged: Boolean); virtual;
|
|
|
+ function GetInstance : TObject;
|
|
|
+ function IsInnerBorderStored: boolean;
|
|
|
+ procedure SetChildSizing(const AValue: TControlChildSizing);
|
|
|
+ procedure DoChildSizingChange(Sender: TObject); virtual;
|
|
|
+ public
|
|
|
+ constructor Create(TheOwner: TComponent);override;
|
|
|
+ destructor Destroy;override;
|
|
|
+ procedure SetInitialBounds(aLeft, aTop, aWidth, aHeight: integer); virtual;
|
|
|
+ procedure InvalidatePreferredSize; virtual;
|
|
|
+ procedure EnableAutoSizing;
|
|
|
+ property Color: TColor read GetColor write SetColor stored ColorIsStored default clWindow;
|
|
|
+ property BorderSpacing: TControlBorderSpacing read FBorderSpacing write SetBorderSpacing;
|
|
|
+ property ChildSizing: TControlChildSizing read FChildSizing write SetChildSizing;
|
|
|
+ property Canvas;
|
|
|
+{$ENDIF}
|
|
|
+ end;
|
|
|
+
|
|
|
TOnBCPropertyChange = procedure(ASender: TObject; AData: PtrInt) of object;
|
|
|
|
|
|
{ TBCProperty
|
|
|
@@ -79,16 +418,16 @@ type
|
|
|
debug functions
|
|
|
}
|
|
|
|
|
|
- TBCGraphicControl = class(TGraphicControl)
|
|
|
+ TBCGraphicControl = class(TBGRAGraphicCtrl)
|
|
|
private
|
|
|
- {$IFDEF DEBUG}
|
|
|
+ {$IFDEF INDEBUG}
|
|
|
FPaintCount: Integer;
|
|
|
{$ENDIF}
|
|
|
FUpdateCount: Integer;
|
|
|
protected
|
|
|
procedure DoOnResize; override;
|
|
|
protected
|
|
|
- {$IFDEF DEBUG}
|
|
|
+ {$IFDEF INDEBUG}
|
|
|
function GetDebugText: String; virtual;
|
|
|
{$ENDIF}
|
|
|
procedure Paint; override; // do not override in descendants!
|
|
|
@@ -99,6 +438,15 @@ type
|
|
|
// general action occur which change "body" e.g. resize)
|
|
|
procedure RenderControl; virtual;
|
|
|
public
|
|
|
+ {$IFDEF FPC}
|
|
|
+ { Save all published settings to file }
|
|
|
+ procedure SaveToFile(AFileName: string); virtual; abstract;
|
|
|
+ { Load and assign all published settings from file }
|
|
|
+ procedure LoadFromFile(AFileName: string); virtual; abstract;
|
|
|
+ { Assign the properties from AFileName to this instance }
|
|
|
+ procedure AssignFromFile(AFileName: string); virtual; abstract;
|
|
|
+ { Used by SaveToFile/LoadFromFile }
|
|
|
+ {$ENDIF}
|
|
|
constructor Create(AOwner: TComponent); override;
|
|
|
// This disable DrawControl method
|
|
|
procedure BeginUpdate; virtual;
|
|
|
@@ -142,16 +490,16 @@ type
|
|
|
debug functions
|
|
|
}
|
|
|
|
|
|
- TBCCustomControl = class(TCustomControl)
|
|
|
+ TBCCustomControl = class(TBGRACustomCtrl)
|
|
|
private
|
|
|
- {$IFDEF DEBUG}
|
|
|
+ {$IFDEF INDEBUG}
|
|
|
FPaintCount: Integer;
|
|
|
{$ENDIF}
|
|
|
FUpdateCount: Integer;
|
|
|
protected
|
|
|
procedure DoOnResize; override;
|
|
|
protected
|
|
|
- {$IFDEF DEBUG}
|
|
|
+ {$IFDEF INDEBUG}
|
|
|
function GetDebugText: String; virtual;
|
|
|
{$ENDIF}
|
|
|
procedure Paint; override; // do not override in descendants!
|
|
|
@@ -191,16 +539,18 @@ type
|
|
|
property StyleExtension: String read GetStyleExtension;
|
|
|
end;
|
|
|
|
|
|
-procedure Register;
|
|
|
+{$IFDEF FPC}procedure Register;{$ENDIF}
|
|
|
|
|
|
implementation
|
|
|
|
|
|
-{$IFDEF DEBUG} uses Graphics; {$ENDIF}
|
|
|
+//{$IFDEF INDEBUG} uses Graphics; {$ENDIF}
|
|
|
|
|
|
+{$IFDEF FPC}
|
|
|
procedure Register;
|
|
|
begin
|
|
|
RegisterNoIcon([TBCCustomControl]);
|
|
|
end;
|
|
|
+{$ENDIF}
|
|
|
|
|
|
{ TBCStyleCustomControl }
|
|
|
|
|
|
@@ -240,7 +590,7 @@ begin
|
|
|
RenderControl;
|
|
|
end;
|
|
|
|
|
|
-{$IFDEF DEBUG}
|
|
|
+{$IFDEF INDEBUG}
|
|
|
function TBCCustomControl.GetDebugText: String;
|
|
|
begin
|
|
|
Result := EmptyStr;
|
|
|
@@ -249,12 +599,12 @@ end;
|
|
|
|
|
|
procedure TBCCustomControl.Paint;
|
|
|
begin
|
|
|
- if (csCreating in FControlState) or IsUpdating then
|
|
|
+ if (csCreating in ControlState) or IsUpdating then
|
|
|
Exit;
|
|
|
|
|
|
DrawControl;
|
|
|
- {$IFDEF DEBUG}
|
|
|
- FPaintCount += 1;
|
|
|
+ {$IFDEF INDEBUG}
|
|
|
+ FPaintCount := FPaintCount +1;
|
|
|
Canvas.Brush.Style := bsSolid;
|
|
|
Canvas.Brush.Color := clBlack;
|
|
|
Canvas.Font.Color := clWhite;
|
|
|
@@ -276,21 +626,21 @@ end;
|
|
|
constructor TBCCustomControl.Create(AOwner: TComponent);
|
|
|
begin
|
|
|
inherited Create(AOwner);
|
|
|
- {$IFDEF DEBUG}
|
|
|
+ {$IFDEF INDEBUG}
|
|
|
FPaintCount := 0;
|
|
|
{$ENDIF}
|
|
|
end;
|
|
|
|
|
|
procedure TBCCustomControl.BeginUpdate;
|
|
|
begin
|
|
|
- FUpdateCount += 1;
|
|
|
+ FUpdateCount := FUpdateCount +1;
|
|
|
end;
|
|
|
|
|
|
procedure TBCCustomControl.EndUpdate;
|
|
|
begin
|
|
|
if FUpdateCount > 0 then
|
|
|
begin
|
|
|
- FUpdateCount -= 1;
|
|
|
+ FUpdateCount := FUpdateCount -1;
|
|
|
if FUpdateCount=0 then
|
|
|
UpdateControl;
|
|
|
end;
|
|
|
@@ -329,7 +679,7 @@ begin
|
|
|
RenderControl;
|
|
|
end;
|
|
|
|
|
|
-{$IFDEF DEBUG}
|
|
|
+{$IFDEF INDEBUG}
|
|
|
function TBCGraphicControl.GetDebugText: String;
|
|
|
begin
|
|
|
Result := EmptyStr;
|
|
|
@@ -339,11 +689,11 @@ end;
|
|
|
procedure TBCGraphicControl.Paint;
|
|
|
begin
|
|
|
//inherited Paint;
|
|
|
- if (csCreating in FControlState) or IsUpdating then
|
|
|
+ if (csCreating in ControlState) or IsUpdating then
|
|
|
Exit;
|
|
|
DrawControl;
|
|
|
- {$IFDEF DEBUG}
|
|
|
- FPaintCount += 1;
|
|
|
+ {$IFDEF INDEBUG}
|
|
|
+ FPaintCount := FPaintCount +1;
|
|
|
Canvas.Brush.Style := bsSolid;
|
|
|
Canvas.Brush.Color := clBlack;
|
|
|
Canvas.Font.Color := clWhite;
|
|
|
@@ -364,21 +714,21 @@ end;
|
|
|
constructor TBCGraphicControl.Create(AOwner: TComponent);
|
|
|
begin
|
|
|
inherited Create(AOwner);
|
|
|
- {$IFDEF DEBUG}
|
|
|
+ {$IFDEF INDEBUG}
|
|
|
FPaintCount := 0;
|
|
|
{$ENDIF}
|
|
|
end;
|
|
|
|
|
|
procedure TBCGraphicControl.BeginUpdate;
|
|
|
begin
|
|
|
- FUpdateCount += 1;
|
|
|
+ FUpdateCount := FUpdateCount +1;
|
|
|
end;
|
|
|
|
|
|
procedure TBCGraphicControl.EndUpdate;
|
|
|
begin
|
|
|
if FUpdateCount > 0 then
|
|
|
begin
|
|
|
- FUpdateCount -= 1;
|
|
|
+ FUpdateCount := FUpdateCount -1;
|
|
|
if FUpdateCount=0 then
|
|
|
UpdateControl;
|
|
|
end;
|
|
|
@@ -409,5 +759,1104 @@ begin
|
|
|
SetSize(0,0);
|
|
|
end;
|
|
|
|
|
|
+{$IFNDEF FPC}
|
|
|
+constructor TBGRAGraphicCtrl.Create(TheOwner: TComponent);
|
|
|
+begin
|
|
|
+ inherited Create(TheOwner);
|
|
|
+ FBorderSpacing := CreateControlBorderSpacing;
|
|
|
+ FOnChange := Font.OnChange;
|
|
|
+ Font.OnChange := FontChanged;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRAGraphicCtrl.CreateControlBorderSpacing: TControlBorderSpacing;
|
|
|
+begin
|
|
|
+ Result := TControlBorderSpacing.Create(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+destructor TBGRAGraphicCtrl.Destroy;
|
|
|
+begin
|
|
|
+ FreeAndNil(FBorderSpacing);
|
|
|
+ inherited;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.DoBorderSpacingChange(Sender: TObject; InnerSpaceChanged: Boolean);
|
|
|
+var
|
|
|
+ IParent : ILCLControl;
|
|
|
+begin
|
|
|
+ if Parent <> nil then
|
|
|
+ if Supports(Parent, ILCLControl, IParent) then
|
|
|
+ IParent.InvalidatePreferredSize;
|
|
|
+ AdjustSize;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.DoOnResize;
|
|
|
+begin
|
|
|
+ if Assigned(OnResize) then
|
|
|
+ OnResize(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.SetBorderSpacing(const AValue: TControlBorderSpacing);
|
|
|
+begin
|
|
|
+ if FBorderSpacing=AValue then exit;
|
|
|
+ FBorderSpacing.Assign(AValue);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.SetColor(Value: TColor);
|
|
|
+begin
|
|
|
+ if inherited Color <> Value then
|
|
|
+ begin
|
|
|
+ inherited Color := Value;
|
|
|
+ ParentColor := False;
|
|
|
+ Perform(CM_COLORCHANGED, 0, 0);
|
|
|
+ Invalidate;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRAGraphicCtrl.GetColor: TColor;
|
|
|
+begin
|
|
|
+ Result := inherited Color;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.EnableAutoSizing;
|
|
|
+begin
|
|
|
+end;
|
|
|
+
|
|
|
+class function TBGRAGraphicCtrl.GetControlClassDefaultSize: TSize;
|
|
|
+begin
|
|
|
+ Result.CX := 75;
|
|
|
+ Result.CY := 50;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRAGraphicCtrl.GetInstance: TObject;
|
|
|
+begin
|
|
|
+ result := Self;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;{%H-}WithThemeSpace: boolean);
|
|
|
+begin
|
|
|
+ PreferredWidth:=0;
|
|
|
+ PreferredHeight:=0;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.MouseEnter;
|
|
|
+begin
|
|
|
+ if Assigned(OnMouseEnter) then
|
|
|
+ OnMouseEnter(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.MouseLeave;
|
|
|
+begin
|
|
|
+ if Assigned(OnMouseLeave) then
|
|
|
+ OnMouseLeave(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.TextChanged;
|
|
|
+begin
|
|
|
+ // overrided;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.FontChanged(Sender: TObject);
|
|
|
+begin
|
|
|
+ ParentFont := False;
|
|
|
+ DesktopFont := False;
|
|
|
+ Invalidate;
|
|
|
+ Perform(CM_FONTCHANGED, 0, 0);
|
|
|
+ if AutoSize then
|
|
|
+ begin
|
|
|
+ InvalidatePreferredSize;
|
|
|
+ AdjustSize;
|
|
|
+ end;
|
|
|
+ if Assigned(FOnChange) then
|
|
|
+ FOnChange(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRAGraphicCtrl.RealGetText: TCaption;
|
|
|
+begin
|
|
|
+ Result := Caption;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.RealSetText(const Value: TCaption);
|
|
|
+begin
|
|
|
+ if RealGetText = Value then Exit;
|
|
|
+ Caption := Value;
|
|
|
+ Perform(CM_TEXTCHANGED, 0, 0);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.InvalidatePreferredSize;
|
|
|
+begin
|
|
|
+// Invalidate;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRAGraphicCtrl.IsInnerBorderStored: boolean;
|
|
|
+begin
|
|
|
+ Result:=BorderSpacing.InnerBorder<>0;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.Resize;
|
|
|
+begin
|
|
|
+ inherited;
|
|
|
+ Invalidate;
|
|
|
+ DoOnResize;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRAGraphicCtrl.ColorIsStored: boolean;
|
|
|
+begin
|
|
|
+ Result := not ParentColor;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.SetInitialBounds(aLeft, aTop, aWidth, aHeight: integer);
|
|
|
+begin
|
|
|
+ {if (csLoading in ComponentState)
|
|
|
+ or ((Owner<>nil) and (csLoading in Owner.ComponentState)) then
|
|
|
+ exit;}
|
|
|
+ SetBounds(aLeft,aTop,aWidth,aHeight);
|
|
|
+// DoOnResize;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.CMTextChanged(var Message: TMessage);
|
|
|
+begin
|
|
|
+ inherited;
|
|
|
+ TextChanged;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.CMMouseEnter(var Message: TMessage);
|
|
|
+begin
|
|
|
+ if FMouseInClient then
|
|
|
+ Exit;
|
|
|
+
|
|
|
+ FMouseInClient := True;
|
|
|
+
|
|
|
+ // broadcast to parents first
|
|
|
+ if Assigned(Parent) then
|
|
|
+ Parent.Perform(CM_MOUSEENTER, 0, LParam(Self));
|
|
|
+
|
|
|
+ // if it is not a child message then perform an event
|
|
|
+ if (Message.LParam = 0) then
|
|
|
+ MouseEnter;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRAGraphicCtrl.CMMouseLeave(var Message: TMessage);
|
|
|
+begin
|
|
|
+ if not FMouseInClient then
|
|
|
+ Exit;
|
|
|
+
|
|
|
+ FMouseInClient := False;
|
|
|
+
|
|
|
+ // broadcast to parents first
|
|
|
+ if Assigned(Parent) then
|
|
|
+ Parent.Perform(CM_MOUSELEAVE, 0, LParam(Self));
|
|
|
+
|
|
|
+ // if it is not a child message then perform an event
|
|
|
+ if (Message.LParam = 0) then
|
|
|
+ MouseLeave;
|
|
|
+end;
|
|
|
+
|
|
|
+{TBGRACustomCtrl}
|
|
|
+
|
|
|
+constructor TBGRACustomCtrl.Create(TheOwner: TComponent);
|
|
|
+begin
|
|
|
+ inherited Create(TheOwner);
|
|
|
+ FBorderSpacing := CreateControlBorderSpacing;
|
|
|
+ FChildSizing:=TControlChildSizing.Create(Self);
|
|
|
+ FChildSizing.OnChange := DoChildSizingChange;
|
|
|
+ FOnChange := Font.OnChange;
|
|
|
+ Font.OnChange := FontChanged;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomCtrl.CreateControlBorderSpacing: TControlBorderSpacing;
|
|
|
+begin
|
|
|
+ Result := TControlBorderSpacing.Create(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+destructor TBGRACustomCtrl.Destroy;
|
|
|
+begin
|
|
|
+ FreeAndNil(FBorderSpacing);
|
|
|
+ FreeAndNil(FChildSizing);
|
|
|
+ inherited;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.DoBorderSpacingChange(Sender: TObject; InnerSpaceChanged: Boolean);
|
|
|
+var
|
|
|
+ IParent : ILCLControl;
|
|
|
+begin
|
|
|
+ if Parent <> nil then
|
|
|
+ if Supports(Parent, ILCLControl, IParent) then
|
|
|
+ IParent.InvalidatePreferredSize;
|
|
|
+ AdjustSize;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.DoChildSizingChange(Sender: TObject);
|
|
|
+begin
|
|
|
+ //debugln('TWinControl.DoChildSizingChange ',DbgSName(Self));
|
|
|
+ if ControlCount=0 then exit;
|
|
|
+ InvalidatePreferredSize;
|
|
|
+ ReAlign;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.DoOnResize;
|
|
|
+begin
|
|
|
+ if Assigned(OnResize) then
|
|
|
+ OnResize(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;{%H-}WithThemeSpace: boolean);
|
|
|
+begin
|
|
|
+ PreferredWidth:=0;
|
|
|
+ PreferredHeight:=0;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.MouseEnter;
|
|
|
+begin
|
|
|
+ if Assigned(OnMouseEnter) then
|
|
|
+ OnMouseEnter(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.MouseLeave;
|
|
|
+begin
|
|
|
+ if Assigned(OnMouseLeave) then
|
|
|
+ OnMouseLeave(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.TextChanged;
|
|
|
+begin
|
|
|
+ // overrided;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.FontChanged(Sender: TObject);
|
|
|
+begin
|
|
|
+ ParentFont := False;
|
|
|
+ DesktopFont := False;
|
|
|
+ Invalidate;
|
|
|
+ Perform(CM_FONTCHANGED, 0, 0);
|
|
|
+ if AutoSize then
|
|
|
+ begin
|
|
|
+ InvalidatePreferredSize;
|
|
|
+ AdjustSize;
|
|
|
+ end;
|
|
|
+ if Assigned(FOnChange) then
|
|
|
+ FOnChange(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomCtrl.GetDefaultDockCaption: String;
|
|
|
+begin
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomCtrl.GetInstance: TObject;
|
|
|
+begin
|
|
|
+ result := Self;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomCtrl.RealGetText: TCaption;
|
|
|
+begin
|
|
|
+ Result := Caption;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.RealSetText(const Value: TCaption);
|
|
|
+begin
|
|
|
+ if RealGetText = Value then Exit;
|
|
|
+ Caption := Value;
|
|
|
+ Perform(CM_TEXTCHANGED, 0, 0);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.EnabledChanged;
|
|
|
+begin
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.InvalidatePreferredSize;
|
|
|
+begin
|
|
|
+// Invalidate;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomCtrl.IsInnerBorderStored: boolean;
|
|
|
+begin
|
|
|
+ Result:=BorderSpacing.InnerBorder<>0;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.Resize;
|
|
|
+begin
|
|
|
+ inherited;
|
|
|
+ Invalidate;
|
|
|
+ DoOnResize;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.SetBorderSpacing(const AValue: TControlBorderSpacing);
|
|
|
+begin
|
|
|
+ if FBorderSpacing=AValue then exit;
|
|
|
+ FBorderSpacing.Assign(AValue);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.SetChildSizing(const AValue: TControlChildSizing);
|
|
|
+begin
|
|
|
+ if (FChildSizing=AValue) then exit;
|
|
|
+ FChildSizing.Assign(AValue);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.SetColor(Value: TColor);
|
|
|
+begin
|
|
|
+ if inherited Color <> Value then
|
|
|
+ begin
|
|
|
+ inherited Color := Value;
|
|
|
+ ParentColor := False;
|
|
|
+ Perform(CM_COLORCHANGED, 0, 0);
|
|
|
+ Invalidate;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomCtrl.GetColor : TColor;
|
|
|
+begin
|
|
|
+ Result := inherited Color;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.UTF8KeyPress(var UTF8Key: {$IFDEF FPC}TUTF8Char{$ELSE}String{$ENDIF});
|
|
|
+begin
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.EnableAutoSizing;
|
|
|
+begin
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomCtrl.ColorIsStored: boolean;
|
|
|
+begin
|
|
|
+ Result := not ParentColor;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.SetInitialBounds(aLeft, aTop, aWidth, aHeight: integer);
|
|
|
+begin
|
|
|
+ {if (csLoading in ComponentState)
|
|
|
+ or ((Owner<>nil) and (csLoading in Owner.ComponentState)) then
|
|
|
+ exit;}
|
|
|
+ SetBounds(aLeft,aTop,aWidth,aHeight);
|
|
|
+// DoOnResize;
|
|
|
+end;
|
|
|
+
|
|
|
+class function TBGRACustomCtrl.GetControlClassDefaultSize: TSize;
|
|
|
+begin
|
|
|
+ Result.CX := 75;
|
|
|
+ Result.CY := 50;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.CMTextChanged(var Message: TMessage);
|
|
|
+begin
|
|
|
+ TextChanged;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.CMMouseEnter(var Message: TMessage);
|
|
|
+begin
|
|
|
+ if FMouseInClient then
|
|
|
+ Exit;
|
|
|
+
|
|
|
+ FMouseInClient := True;
|
|
|
+
|
|
|
+ // broadcast to parents first
|
|
|
+ if Assigned(Parent) then
|
|
|
+ Parent.Perform(CM_MOUSEENTER, 0, LParam(Self));
|
|
|
+
|
|
|
+ // if it is not a child message then perform an event
|
|
|
+ if (Message.LParam = 0) then
|
|
|
+ MouseEnter;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomCtrl.CMMouseLeave(var Message: TMessage);
|
|
|
+begin
|
|
|
+ if not FMouseInClient then
|
|
|
+ Exit;
|
|
|
+
|
|
|
+ FMouseInClient := False;
|
|
|
+
|
|
|
+ // broadcast to parents first
|
|
|
+ if Assigned(Parent) then
|
|
|
+ Parent.Perform(CM_MOUSELEAVE, 0, LParam(Self));
|
|
|
+
|
|
|
+ // if it is not a child message then perform an event
|
|
|
+ if (Message.LParam = 0) then
|
|
|
+ MouseLeave;
|
|
|
+end;
|
|
|
+
|
|
|
+{TBGRACustomPanel}
|
|
|
+
|
|
|
+constructor TBGRACustomPanel.Create(TheOwner: TComponent);
|
|
|
+begin
|
|
|
+ inherited Create(TheOwner);
|
|
|
+ FBorderSpacing := CreateControlBorderSpacing;
|
|
|
+ FChildSizing:=TControlChildSizing.Create(Self);
|
|
|
+ FChildSizing.OnChange := DoChildSizingChange;
|
|
|
+ FOnChange := Font.OnChange;
|
|
|
+ Font.OnChange := FontChanged;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomPanel.CreateControlBorderSpacing: TControlBorderSpacing;
|
|
|
+begin
|
|
|
+ Result := TControlBorderSpacing.Create(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+destructor TBGRACustomPanel.Destroy;
|
|
|
+begin
|
|
|
+ FreeAndNil(FBorderSpacing);
|
|
|
+ FreeAndNil(FChildSizing);
|
|
|
+ inherited;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.DoBorderSpacingChange(Sender: TObject; InnerSpaceChanged: Boolean);
|
|
|
+var
|
|
|
+ IParent : ILCLControl;
|
|
|
+begin
|
|
|
+ if Parent <> nil then
|
|
|
+ if Supports(Parent, ILCLControl, IParent) then
|
|
|
+ IParent.InvalidatePreferredSize;
|
|
|
+ AdjustSize;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.DoChildSizingChange(Sender: TObject);
|
|
|
+begin
|
|
|
+ //debugln('TWinControl.DoChildSizingChange ',DbgSName(Self));
|
|
|
+ if ControlCount=0 then exit;
|
|
|
+ InvalidatePreferredSize;
|
|
|
+ ReAlign;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.DoOnResize;
|
|
|
+begin
|
|
|
+ if Assigned(OnResize) then
|
|
|
+ OnResize(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;{%H-}WithThemeSpace: boolean);
|
|
|
+begin
|
|
|
+ PreferredWidth:=0;
|
|
|
+ PreferredHeight:=0;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.MouseEnter;
|
|
|
+begin
|
|
|
+ if Assigned(OnMouseEnter) then
|
|
|
+ OnMouseEnter(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.MouseLeave;
|
|
|
+begin
|
|
|
+ if Assigned(OnMouseLeave) then
|
|
|
+ OnMouseLeave(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.TextChanged;
|
|
|
+begin
|
|
|
+ // overrided;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.FontChanged(Sender: TObject);
|
|
|
+begin
|
|
|
+ ParentFont := False;
|
|
|
+ DesktopFont := False;
|
|
|
+ Invalidate;
|
|
|
+ Perform(CM_FONTCHANGED, 0, 0);
|
|
|
+ if AutoSize then
|
|
|
+ begin
|
|
|
+ InvalidatePreferredSize;
|
|
|
+ AdjustSize;
|
|
|
+ end;
|
|
|
+ if Assigned(FOnChange) then
|
|
|
+ FOnChange(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomPanel.GetDefaultDockCaption: String;
|
|
|
+begin
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomPanel.GetInstance: TObject;
|
|
|
+begin
|
|
|
+ result := Self;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomPanel.RealGetText: TCaption;
|
|
|
+begin
|
|
|
+ Result := Caption;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.RealSetText(const Value: TCaption);
|
|
|
+begin
|
|
|
+ if RealGetText = Value then Exit;
|
|
|
+ Caption := Value;
|
|
|
+ Perform(CM_TEXTCHANGED, 0, 0);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.EnabledChanged;
|
|
|
+begin
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.InvalidatePreferredSize;
|
|
|
+begin
|
|
|
+// Invalidate;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomPanel.IsInnerBorderStored: boolean;
|
|
|
+begin
|
|
|
+ Result:=BorderSpacing.InnerBorder<>0;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.Resize;
|
|
|
+begin
|
|
|
+ inherited;
|
|
|
+ Invalidate;
|
|
|
+ DoOnResize;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.SetBorderSpacing(const AValue: TControlBorderSpacing);
|
|
|
+begin
|
|
|
+ if FBorderSpacing=AValue then exit;
|
|
|
+ FBorderSpacing.Assign(AValue);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.SetChildSizing(const AValue: TControlChildSizing);
|
|
|
+begin
|
|
|
+ if (FChildSizing=AValue) then exit;
|
|
|
+ FChildSizing.Assign(AValue);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.SetColor(Value: TColor);
|
|
|
+begin
|
|
|
+ if inherited Color <> Value then
|
|
|
+ begin
|
|
|
+ inherited Color := Value;
|
|
|
+ ParentColor := False;
|
|
|
+ Perform(CM_COLORCHANGED, 0, 0);
|
|
|
+ Invalidate;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomPanel.GetColor : TColor;
|
|
|
+begin
|
|
|
+ Result := inherited Color;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.UTF8KeyPress(var UTF8Key: {$IFDEF FPC}TUTF8Char{$ELSE}String{$ENDIF});
|
|
|
+begin
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.EnableAutoSizing;
|
|
|
+begin
|
|
|
+end;
|
|
|
+
|
|
|
+function TBGRACustomPanel.ColorIsStored: boolean;
|
|
|
+begin
|
|
|
+ Result := not ParentColor;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.SetInitialBounds(aLeft, aTop, aWidth, aHeight: integer);
|
|
|
+begin
|
|
|
+ {if (csLoading in ComponentState)
|
|
|
+ or ((Owner<>nil) and (csLoading in Owner.ComponentState)) then
|
|
|
+ exit;}
|
|
|
+ SetBounds(aLeft,aTop,aWidth,aHeight);
|
|
|
+// DoOnResize;
|
|
|
+end;
|
|
|
+
|
|
|
+class function TBGRACustomPanel.GetControlClassDefaultSize: TSize;
|
|
|
+begin
|
|
|
+ Result.CX := 75;
|
|
|
+ Result.CY := 50;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.CMTextChanged(var Message: TMessage);
|
|
|
+begin
|
|
|
+ TextChanged;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.CMMouseEnter(var Message: TMessage);
|
|
|
+begin
|
|
|
+ if FMouseInClient then
|
|
|
+ Exit;
|
|
|
+
|
|
|
+ FMouseInClient := True;
|
|
|
+
|
|
|
+ // broadcast to parents first
|
|
|
+ if Assigned(Parent) then
|
|
|
+ Parent.Perform(CM_MOUSEENTER, 0, LParam(Self));
|
|
|
+
|
|
|
+ // if it is not a child message then perform an event
|
|
|
+ if (Message.LParam = 0) then
|
|
|
+ MouseEnter;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TBGRACustomPanel.CMMouseLeave(var Message: TMessage);
|
|
|
+begin
|
|
|
+ if not FMouseInClient then
|
|
|
+ Exit;
|
|
|
+
|
|
|
+ FMouseInClient := False;
|
|
|
+
|
|
|
+ // broadcast to parents first
|
|
|
+ if Assigned(Parent) then
|
|
|
+ Parent.Perform(CM_MOUSELEAVE, 0, LParam(Self));
|
|
|
+
|
|
|
+ // if it is not a child message then perform an event
|
|
|
+ if (Message.LParam = 0) then
|
|
|
+ MouseLeave;
|
|
|
+end;
|
|
|
+
|
|
|
+{$ENDIF}
|
|
|
+
|
|
|
+{$IFNDEF FPC}
|
|
|
+
|
|
|
+{ TControlBorderSpacing }
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.SetAround(const AValue: TSpacingSize);
|
|
|
+begin
|
|
|
+ if FAround=AValue then exit;
|
|
|
+ FAround:=AValue;
|
|
|
+ Change(false);
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.IsAroundStored: boolean;
|
|
|
+begin
|
|
|
+ if FDefault = nil
|
|
|
+ then Result := FAround <> 0
|
|
|
+ else Result := FAround <> FDefault^.Around;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.IsBottomStored: boolean;
|
|
|
+begin
|
|
|
+ if FDefault = nil
|
|
|
+ then Result := FBottom <> 0
|
|
|
+ else Result := FBottom <> FDefault^.Bottom;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.IsInnerBorderStored: boolean;
|
|
|
+begin
|
|
|
+ if Control <> nil then
|
|
|
+ Result:=Control.IsInnerBorderStored
|
|
|
+ else
|
|
|
+ Result:=True;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.IsLeftStored: boolean;
|
|
|
+begin
|
|
|
+ if FDefault = nil
|
|
|
+ then Result := FLeft <> 0
|
|
|
+ else Result := FLeft <> FDefault^.Left;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.IsRightStored: boolean;
|
|
|
+begin
|
|
|
+ if FDefault = nil
|
|
|
+ then Result := FRight <> 0
|
|
|
+ else Result := FRight <> FDefault^.Right;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.IsTopStored: boolean;
|
|
|
+begin
|
|
|
+ if FDefault = nil
|
|
|
+ then Result := FTop <> 0
|
|
|
+ else Result := FTop <> FDefault^.Top;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.SetBottom(const AValue: TSpacingSize);
|
|
|
+begin
|
|
|
+ if FBottom=AValue then exit;
|
|
|
+ FBottom:=AValue;
|
|
|
+ Change(false);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.SetCellAlignHorizontal(
|
|
|
+ const AValue: TControlCellAlign);
|
|
|
+begin
|
|
|
+ if FCellAlignHorizontal=AValue then exit;
|
|
|
+ FCellAlignHorizontal:=AValue;
|
|
|
+ Change(false);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.SetCellAlignVertical(
|
|
|
+ const AValue: TControlCellAlign);
|
|
|
+begin
|
|
|
+ if FCellAlignVertical=AValue then exit;
|
|
|
+ FCellAlignVertical:=AValue;
|
|
|
+ Change(false);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.SetInnerBorder(const AValue: Integer);
|
|
|
+begin
|
|
|
+ if FInnerBorder=AValue then exit;
|
|
|
+ FInnerBorder:=AValue;
|
|
|
+ if Control<>nil then Control.InvalidatePreferredSize;
|
|
|
+ Change(true);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.SetLeft(const AValue: TSpacingSize);
|
|
|
+begin
|
|
|
+ if FLeft=AValue then exit;
|
|
|
+ FLeft:=AValue;
|
|
|
+ Change(false);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.SetRight(const AValue: TSpacingSize);
|
|
|
+begin
|
|
|
+ if FRight=AValue then exit;
|
|
|
+ FRight:=AValue;
|
|
|
+ Change(false);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.SetSpace(Kind: TAnchorKind;
|
|
|
+ const AValue: integer);
|
|
|
+begin
|
|
|
+ case Kind of
|
|
|
+ akLeft: Left:=AValue;
|
|
|
+ akTop: Top:=AValue;
|
|
|
+ akBottom: Bottom:=AValue;
|
|
|
+ akRight: Right:=AValue;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.SetTop(const AValue: TSpacingSize);
|
|
|
+begin
|
|
|
+ if FTop=AValue then exit;
|
|
|
+ FTop:=AValue;
|
|
|
+ Change(false);
|
|
|
+end;
|
|
|
+
|
|
|
+constructor TControlBorderSpacing.Create(OwnerControl: ILCLControl; ADefault: PControlBorderSpacingDefault);
|
|
|
+begin
|
|
|
+ FControl := OwnerControl;
|
|
|
+ FDefault := ADefault;
|
|
|
+ if ADefault <> nil then
|
|
|
+ begin
|
|
|
+ FLeft := ADefault^.Left;
|
|
|
+ FRight := ADefault^.Right;
|
|
|
+ FTop := ADefault^.Top;
|
|
|
+ FBottom := ADefault^.Bottom;
|
|
|
+ FAround := ADefault^.Around;
|
|
|
+ end;
|
|
|
+ FCellAlignHorizontal := ccaFill;
|
|
|
+ FCellAlignVertical := ccaFill;
|
|
|
+ inherited Create;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.Assign(Source: TPersistent);
|
|
|
+var
|
|
|
+ SrcSpacing: TControlBorderSpacing;
|
|
|
+begin
|
|
|
+ if Source is TControlBorderSpacing then begin
|
|
|
+ SrcSpacing:=TControlBorderSpacing(Source);
|
|
|
+ if IsEqual(SrcSpacing) then exit;
|
|
|
+
|
|
|
+ FAround:=SrcSpacing.Around;
|
|
|
+ FBottom:=SrcSpacing.Bottom;
|
|
|
+ FLeft:=SrcSpacing.Left;
|
|
|
+ FRight:=SrcSpacing.Right;
|
|
|
+ FTop:=SrcSpacing.Top;
|
|
|
+ FInnerBorder:=SrcSpacing.InnerBorder;
|
|
|
+ FCellAlignHorizontal:=SrcSpacing.CellAlignHorizontal;
|
|
|
+ FCellAlignVertical:=SrcSpacing.CellAlignVertical;
|
|
|
+
|
|
|
+ Change(false);
|
|
|
+ end else
|
|
|
+ inherited Assign(Source);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.AssignTo(Dest: TPersistent);
|
|
|
+begin
|
|
|
+ Dest.Assign(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.AutoAdjustLayout(const AXProportion,
|
|
|
+ AYProportion: Double);
|
|
|
+
|
|
|
+ procedure Scale(var Value: Integer; const Proportion: Double; var Changed: Boolean);
|
|
|
+ begin
|
|
|
+ if Value<>0 then
|
|
|
+ begin
|
|
|
+ Value := Round(Value * Proportion);
|
|
|
+ Changed := True;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+var
|
|
|
+ InnerChanged, OuterChanged: Boolean;
|
|
|
+begin
|
|
|
+ InnerChanged := False;
|
|
|
+ OuterChanged := False;
|
|
|
+
|
|
|
+ Scale(FAround, AXProportion, OuterChanged);
|
|
|
+ Scale(FInnerBorder, AXProportion, InnerChanged);
|
|
|
+ Scale(FLeft, AXProportion, OuterChanged);
|
|
|
+ Scale(FTop, AYProportion, OuterChanged);
|
|
|
+ Scale(FRight, AXProportion, OuterChanged);
|
|
|
+ Scale(FBottom, AYProportion, OuterChanged);
|
|
|
+
|
|
|
+ if OuterChanged or InnerChanged then
|
|
|
+ begin
|
|
|
+ if Control<>nil then Control.InvalidatePreferredSize;
|
|
|
+ Change(InnerChanged);
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.IsEqual(Spacing: TControlBorderSpacing
|
|
|
+ ): boolean;
|
|
|
+begin
|
|
|
+ Result:=(FAround=Spacing.Around)
|
|
|
+ and (FBottom=Spacing.Bottom)
|
|
|
+ and (FLeft=Spacing.Left)
|
|
|
+ and (FRight=Spacing.Right)
|
|
|
+ and (FTop=Spacing.Top);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.GetSpaceAround(var SpaceAround: TRect);
|
|
|
+begin
|
|
|
+ SpaceAround.Left:=Left+Around;
|
|
|
+ SpaceAround.Top:=Top+Around;
|
|
|
+ SpaceAround.Right:=Right+Around;
|
|
|
+ SpaceAround.Bottom:=Bottom+Around;
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetSideSpace(Kind: TAnchorKind): Integer;
|
|
|
+begin
|
|
|
+ Result:=Around+GetSpace(Kind);
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetSpace(Kind: TAnchorKind): Integer;
|
|
|
+begin
|
|
|
+ case Kind of
|
|
|
+ akLeft: Result:=Left;
|
|
|
+ akTop: Result:=Top;
|
|
|
+ akRight: Result:=Right;
|
|
|
+ akBottom: Result:=Bottom;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlBorderSpacing.Change(InnerSpaceChanged: Boolean);
|
|
|
+begin
|
|
|
+ if FControl <> nil then
|
|
|
+ FControl.DoBorderSpacingChange(Self,InnerSpaceChanged);
|
|
|
+ if Assigned(OnChange) then OnChange(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetAroundBottom: Integer;
|
|
|
+begin
|
|
|
+ Result := Around+Bottom;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetAroundLeft: Integer;
|
|
|
+begin
|
|
|
+ Result := Around+Left;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetAroundRight: Integer;
|
|
|
+begin
|
|
|
+ Result := Around+Right;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetAroundTop: Integer;
|
|
|
+begin
|
|
|
+ Result := Around+Top;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetControlBottom: Integer;
|
|
|
+begin
|
|
|
+ if (FControl<>nil) and (FControl.GetInstance<>nil) and FControl.GetInstance.InheritsFrom(TControl) then
|
|
|
+ Result := TControl(FControl.GetInstance).Top +TControl(FControl.GetInstance).Height +Around+Bottom
|
|
|
+ else
|
|
|
+ Result := 0;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetControlHeight: Integer;
|
|
|
+begin
|
|
|
+ if (FControl<>nil) and (FControl.GetInstance<>nil) and FControl.GetInstance.InheritsFrom(TControl) then
|
|
|
+ Result := TControl(FControl.GetInstance).Height+Around*2+Top+Bottom
|
|
|
+ else
|
|
|
+ Result := 0;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetControlLeft: Integer;
|
|
|
+begin
|
|
|
+ if (FControl<>nil) and (FControl.GetInstance<>nil) and FControl.GetInstance.InheritsFrom(TControl) then
|
|
|
+ Result := TControl(FControl.GetInstance).Left-Around-Left
|
|
|
+ else
|
|
|
+ Result := 0;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetControlRight: Integer;
|
|
|
+begin
|
|
|
+ if (FControl<>nil) and (FControl.GetInstance<>nil) and FControl.GetInstance.InheritsFrom(TControl) then
|
|
|
+ Result := TControl(FControl.GetInstance).Left+TControl(FControl.GetInstance).Width+Around+Right
|
|
|
+ else
|
|
|
+ Result := 0;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetControlTop: Integer;
|
|
|
+begin
|
|
|
+ if (FControl<>nil) and (FControl.GetInstance<>nil) and FControl.GetInstance.InheritsFrom(TControl) then
|
|
|
+ Result := TControl(FControl.GetInstance).Top-Around-Top
|
|
|
+ else
|
|
|
+ Result := 0;
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlBorderSpacing.GetControlWidth: Integer;
|
|
|
+begin
|
|
|
+ if (FControl<>nil) and (FControl.GetInstance<>nil) and FControl.GetInstance.InheritsFrom(TControl) then
|
|
|
+ Result := TControl(FControl.GetInstance).Width+Around*2+Left+Right
|
|
|
+ else
|
|
|
+ Result := 0;
|
|
|
+end;
|
|
|
+
|
|
|
+{ TControlChildSizing }
|
|
|
+
|
|
|
+procedure TControlChildSizing.SetEnlargeHorizontal(
|
|
|
+ const AValue: TChildControlResizeStyle);
|
|
|
+begin
|
|
|
+ if FEnlargeHorizontal=AValue then exit;
|
|
|
+ FEnlargeHorizontal:=AValue;
|
|
|
+ Change;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.SetControlsPerLine(const AValue: integer);
|
|
|
+begin
|
|
|
+ if FControlsPerLine=AValue then exit;
|
|
|
+ FControlsPerLine:=AValue;
|
|
|
+ Change;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.SetEnlargeVertical(
|
|
|
+ const AValue: TChildControlResizeStyle);
|
|
|
+begin
|
|
|
+ if FEnlargeVertical=AValue then exit;
|
|
|
+ FEnlargeVertical:=AValue;
|
|
|
+ Change;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.SetHorizontalSpacing(const AValue: integer);
|
|
|
+begin
|
|
|
+ if FHorizontalSpacing=AValue then exit;
|
|
|
+ FHorizontalSpacing:=AValue;
|
|
|
+ Change;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.SetLayout(const AValue: TControlChildrenLayout);
|
|
|
+begin
|
|
|
+ if FLayout=AValue then exit;
|
|
|
+ FLayout:=AValue;
|
|
|
+ //debugln('TControlChildSizing.SetLayout ',DbgSName(Control));
|
|
|
+ Change;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.SetLeftRightSpacing(const AValue: integer);
|
|
|
+begin
|
|
|
+ if FLeftRightSpacing=AValue then exit;
|
|
|
+ FLeftRightSpacing:=AValue;
|
|
|
+ Change;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.SetShrinkHorizontal(
|
|
|
+ const AValue: TChildControlResizeStyle);
|
|
|
+begin
|
|
|
+ if FShrinkHorizontal=AValue then exit;
|
|
|
+ FShrinkHorizontal:=AValue;
|
|
|
+ Change;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.SetShrinkVertical(
|
|
|
+ const AValue: TChildControlResizeStyle);
|
|
|
+begin
|
|
|
+ if FShrinkVertical=AValue then exit;
|
|
|
+ FShrinkVertical:=AValue;
|
|
|
+ Change;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.SetTopBottomSpacing(const AValue: integer);
|
|
|
+begin
|
|
|
+ if FTopBottomSpacing=AValue then exit;
|
|
|
+ FTopBottomSpacing:=AValue;
|
|
|
+ Change;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.SetVerticalSpacing(const AValue: integer);
|
|
|
+begin
|
|
|
+ if FVerticalSpacing=AValue then exit;
|
|
|
+ FVerticalSpacing:=AValue;
|
|
|
+ Change;
|
|
|
+end;
|
|
|
+
|
|
|
+constructor TControlChildSizing.Create(OwnerControl: ILCLControl);
|
|
|
+begin
|
|
|
+ inherited Create;
|
|
|
+ FControl := OwnerControl;
|
|
|
+ FLayout := cclNone;
|
|
|
+ FEnlargeHorizontal :=crsAnchorAligning;
|
|
|
+ FEnlargeVertical := crsAnchorAligning;
|
|
|
+ FShrinkHorizontal := crsAnchorAligning;
|
|
|
+ FShrinkVertical := crsAnchorAligning;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.Assign(Source: TPersistent);
|
|
|
+var
|
|
|
+ SrcSizing: TControlChildSizing;
|
|
|
+begin
|
|
|
+ if Source is TControlChildSizing then begin
|
|
|
+ SrcSizing:=TControlChildSizing(Source);
|
|
|
+ if IsEqual(SrcSizing) then exit;
|
|
|
+
|
|
|
+ FEnlargeHorizontal:=SrcSizing.EnlargeHorizontal;
|
|
|
+ FEnlargeVertical:=SrcSizing.EnlargeVertical;
|
|
|
+ FShrinkHorizontal:=SrcSizing.ShrinkHorizontal;
|
|
|
+ FShrinkVertical:=SrcSizing.ShrinkVertical;
|
|
|
+ FEnlargeHorizontal:=SrcSizing.EnlargeHorizontal;
|
|
|
+ FEnlargeVertical:=SrcSizing.EnlargeVertical;
|
|
|
+ FShrinkHorizontal:=SrcSizing.ShrinkHorizontal;
|
|
|
+ FShrinkVertical:=SrcSizing.ShrinkVertical;
|
|
|
+ FControlsPerLine:=SrcSizing.ControlsPerLine;
|
|
|
+ FLayout:=SrcSizing.Layout;
|
|
|
+ FLeftRightSpacing:=SrcSizing.LeftRightSpacing;
|
|
|
+ FTopBottomSpacing:=SrcSizing.TopBottomSpacing;
|
|
|
+ FHorizontalSpacing:=SrcSizing.HorizontalSpacing;
|
|
|
+ FVerticalSpacing:=SrcSizing.VerticalSpacing;
|
|
|
+
|
|
|
+ Change;
|
|
|
+ end else
|
|
|
+ inherited Assign(Source);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.AssignTo(Dest: TPersistent);
|
|
|
+begin
|
|
|
+ Dest.Assign(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+function TControlChildSizing.IsEqual(Sizing: TControlChildSizing): boolean;
|
|
|
+begin
|
|
|
+ Result:=(FEnlargeHorizontal=Sizing.EnlargeHorizontal)
|
|
|
+ and (FEnlargeVertical=Sizing.EnlargeVertical)
|
|
|
+ and (FShrinkHorizontal=Sizing.ShrinkHorizontal)
|
|
|
+ and (FShrinkVertical=Sizing.ShrinkVertical)
|
|
|
+ and (FEnlargeHorizontal=Sizing.EnlargeHorizontal)
|
|
|
+ and (FEnlargeVertical=Sizing.EnlargeVertical)
|
|
|
+ and (FShrinkHorizontal=Sizing.ShrinkHorizontal)
|
|
|
+ and (FShrinkVertical=Sizing.ShrinkVertical)
|
|
|
+ and (FControlsPerLine=Sizing.ControlsPerLine)
|
|
|
+ and (FLayout=Sizing.Layout)
|
|
|
+ and (FLeftRightSpacing=Sizing.LeftRightSpacing)
|
|
|
+ and (FTopBottomSpacing=Sizing.TopBottomSpacing)
|
|
|
+ and (FHorizontalSpacing=Sizing.HorizontalSpacing)
|
|
|
+ and (FVerticalSpacing=Sizing.VerticalSpacing);
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.SetGridSpacing(Spacing: integer);
|
|
|
+begin
|
|
|
+ if (LeftRightSpacing=Spacing)
|
|
|
+ and (TopBottomSpacing=Spacing)
|
|
|
+ and (HorizontalSpacing=Spacing)
|
|
|
+ and (VerticalSpacing=Spacing) then exit;
|
|
|
+ fLeftRightSpacing:=Spacing;
|
|
|
+ fTopBottomSpacing:=Spacing;
|
|
|
+ fHorizontalSpacing:=Spacing;
|
|
|
+ fVerticalSpacing:=Spacing;
|
|
|
+ Change;
|
|
|
+end;
|
|
|
+
|
|
|
+procedure TControlChildSizing.Change;
|
|
|
+begin
|
|
|
+ if (FControl<>nil) and (FControl.GetInstance<>nil) and FControl.GetInstance.InheritsFrom(TBGRACustomCtrl) then
|
|
|
+ TBGRACustomCtrl(FControl.GetInstance).DoChildSizingChange(Self);
|
|
|
+ if Assigned(FOnChange) then
|
|
|
+ FOnChange(Self);
|
|
|
+end;
|
|
|
+
|
|
|
+{$ENDIF}
|
|
|
+
|
|
|
end.
|
|
|
|