mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-13 18:29:12 +02:00
IdeIntf: Improve identification of designer forms. r49352,r49367,r49371,r49510 from free-sparta branch by Maciej Izak.
git-svn-id: trunk@49528 -
This commit is contained in:
parent
41ca5227fd
commit
2ca8f21e64
@ -24,6 +24,11 @@ const
|
|||||||
ComponentPaletteImageHeight = 24;
|
ComponentPaletteImageHeight = 24;
|
||||||
ComponentPaletteBtnWidth = ComponentPaletteImageWidth + 3;
|
ComponentPaletteBtnWidth = ComponentPaletteImageWidth + 3;
|
||||||
ComponentPaletteBtnHeight = ComponentPaletteImageHeight + 3;
|
ComponentPaletteBtnHeight = ComponentPaletteImageHeight + 3;
|
||||||
|
DesignerBaseClassId_TForm = 0;
|
||||||
|
DesignerBaseClassId_TDataModule = 1;
|
||||||
|
DesignerBaseClassId_TFrame = 2;
|
||||||
|
NonControlProxyDesignerFormId = 0;
|
||||||
|
FrameProxyDesignerFormId = 1;
|
||||||
|
|
||||||
type
|
type
|
||||||
TDMCompAtPosFlag = (
|
TDMCompAtPosFlag = (
|
||||||
@ -32,6 +37,93 @@ type
|
|||||||
);
|
);
|
||||||
TDMCompAtPosFlags = set of TDMCompAtPosFlag;
|
TDMCompAtPosFlags = set of TDMCompAtPosFlag;
|
||||||
|
|
||||||
|
TDesignerMediator = class;
|
||||||
|
|
||||||
|
INonFormDesigner = interface
|
||||||
|
['{244DEC6B-80FB-4B28-85EF-FE613D1E2DD3}']
|
||||||
|
procedure Create;
|
||||||
|
|
||||||
|
function GetLookupRoot: TComponent;
|
||||||
|
procedure SetLookupRoot(const AValue: TComponent);
|
||||||
|
property LookupRoot: TComponent read GetLookupRoot write SetLookupRoot;
|
||||||
|
|
||||||
|
procedure SetBounds(ALeft, ATop, AWidth, AHeight: integer);
|
||||||
|
procedure Notification(AComponent: TComponent; AOperation: TOperation);
|
||||||
|
procedure Paint;
|
||||||
|
|
||||||
|
procedure DoSaveBounds;
|
||||||
|
procedure DoLoadBounds;
|
||||||
|
end;
|
||||||
|
|
||||||
|
IFrameDesigner = interface(INonFormDesigner)
|
||||||
|
['{2B9442B0-6359-450A-88A1-BB6744F84918}']
|
||||||
|
end;
|
||||||
|
|
||||||
|
INonControlDesigner = interface(INonFormDesigner)
|
||||||
|
['{5943A33C-F812-4052-BFE8-77AEA73199A9}']
|
||||||
|
function GetMediator: TDesignerMediator;
|
||||||
|
procedure SetMediator(AValue: TDesignerMediator);
|
||||||
|
property Mediator: TDesignerMediator read GetMediator write SetMediator;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TNonFormProxyDesignerForm }
|
||||||
|
|
||||||
|
TNonFormProxyDesignerForm = class(TForm, INonFormDesigner)
|
||||||
|
private
|
||||||
|
FNonFormDesigner: INonFormDesigner;
|
||||||
|
FLookupRoot: TComponent;
|
||||||
|
protected
|
||||||
|
procedure Notification(AComponent: TComponent; AOperation: TOperation); override;
|
||||||
|
|
||||||
|
procedure SetLookupRoot(AValue: TComponent); virtual;
|
||||||
|
function GetPublishedBounds(AIndex: Integer): Integer; virtual;
|
||||||
|
procedure SetPublishedBounds(AIndex: Integer; AValue: Integer); virtual;
|
||||||
|
public
|
||||||
|
constructor Create(AOwner: TComponent; ANonFormDesigner: INonFormDesigner); virtual; reintroduce;
|
||||||
|
procedure Paint; override;
|
||||||
|
|
||||||
|
procedure SetBounds(ALeft, ATop, AWidth, AHeight: integer); override;
|
||||||
|
procedure SetDesignerFormBounds(ALeft, ATop, AWidth, AHeight: integer);
|
||||||
|
procedure SetPublishedBounds(ALeft, ATop, AWidth, AHeight: integer);
|
||||||
|
procedure SetLookupRootBounds(ALeft, ATop, AWidth, AHeight: integer); virtual;
|
||||||
|
|
||||||
|
function DockedDesigner: boolean; virtual;
|
||||||
|
|
||||||
|
property NonFormDesigner: INonFormDesigner read FNonFormDesigner implements INonFormDesigner;
|
||||||
|
property LookupRoot: TComponent read FLookupRoot write SetLookupRoot;
|
||||||
|
published
|
||||||
|
property Left: Integer index 0 read GetPublishedBounds write SetPublishedBounds;
|
||||||
|
property Top: Integer index 1 read GetPublishedBounds write SetPublishedBounds;
|
||||||
|
property Width: Integer index 2 read GetPublishedBounds write SetPublishedBounds;
|
||||||
|
property Height: Integer index 3 read GetPublishedBounds write SetPublishedBounds;
|
||||||
|
property ClientWidth: Integer index 2 read GetPublishedBounds write SetPublishedBounds;
|
||||||
|
property ClientHeight: Integer index 3 read GetPublishedBounds write SetPublishedBounds;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TFrameProxyDesignerForm }
|
||||||
|
|
||||||
|
TFrameProxyDesignerForm = class(TNonFormProxyDesignerForm, IFrameDesigner)
|
||||||
|
private
|
||||||
|
function GetFrameDesigner: IFrameDesigner;
|
||||||
|
public
|
||||||
|
property FrameDesigner: IFrameDesigner read GetFrameDesigner implements IFrameDesigner;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TNonControlProxyDesignerForm }
|
||||||
|
|
||||||
|
TNonControlProxyDesignerForm = class(TNonFormProxyDesignerForm, INonControlDesigner)
|
||||||
|
private
|
||||||
|
FMediator: TDesignerMediator;
|
||||||
|
function GetNonControlDesigner: INonControlDesigner;
|
||||||
|
protected
|
||||||
|
procedure SetMediator(AValue: TDesignerMediator); virtual;
|
||||||
|
public
|
||||||
|
property NonControlDesigner: INonControlDesigner read GetNonControlDesigner implements INonControlDesigner;
|
||||||
|
property Mediator: TDesignerMediator read FMediator write SetMediator;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TNonFormProxyDesignerFormClass = class of TNonFormProxyDesignerForm;
|
||||||
|
|
||||||
{ TDesignerMediator
|
{ TDesignerMediator
|
||||||
To edit designer forms which do not use the LCL, register a TDesignerMediator,
|
To edit designer forms which do not use the LCL, register a TDesignerMediator,
|
||||||
which will emulate the painting, handle the mouse and editing bounds. }
|
which will emulate the painting, handle the mouse and editing bounds. }
|
||||||
@ -89,11 +181,18 @@ type
|
|||||||
{ TAbstractFormEditor }
|
{ TAbstractFormEditor }
|
||||||
|
|
||||||
TAbstractFormEditor = class
|
TAbstractFormEditor = class
|
||||||
|
private
|
||||||
|
FNonFormProxyDesignerFormClass: array[0..1] of TNonFormProxyDesignerFormClass;
|
||||||
protected
|
protected
|
||||||
function GetDesignerBaseClasses(Index: integer): TComponentClass; virtual; abstract;
|
function GetDesignerBaseClasses(Index: integer): TComponentClass; virtual; abstract;
|
||||||
|
function GetStandardDesignerBaseClasses(Index: integer): TComponentClass; virtual; abstract;
|
||||||
|
procedure SetStandardDesignerBaseClasses(Index: integer; AValue: TComponentClass); virtual; abstract;
|
||||||
function GetDesigner(Index: integer): TIDesigner; virtual; abstract;
|
function GetDesigner(Index: integer): TIDesigner; virtual; abstract;
|
||||||
function GetDesignerMediators(Index: integer): TDesignerMediatorClass; virtual; abstract;
|
function GetDesignerMediators(Index: integer): TDesignerMediatorClass; virtual; abstract;
|
||||||
|
function GetNonFormProxyDesignerForm(Index: Integer): TNonFormProxyDesignerFormClass; virtual;
|
||||||
|
procedure SetNonFormProxyDesignerForm(Index: Integer; AValue: TNonFormProxyDesignerFormClass); virtual;
|
||||||
public
|
public
|
||||||
|
constructor Create;
|
||||||
// persistent
|
// persistent
|
||||||
procedure RegisterDefineProperty(const APersistentClassName,
|
procedure RegisterDefineProperty(const APersistentClassName,
|
||||||
Identifier: string); virtual; abstract;
|
Identifier: string); virtual; abstract;
|
||||||
@ -138,13 +237,18 @@ type
|
|||||||
function DescendFromDesignerBaseClass(AClass: TComponentClass): integer; virtual; abstract;
|
function DescendFromDesignerBaseClass(AClass: TComponentClass): integer; virtual; abstract;
|
||||||
function FindDesignerBaseClassByName(const AClassName: shortstring; WithDefaults: boolean): TComponentClass; virtual; abstract;
|
function FindDesignerBaseClassByName(const AClassName: shortstring; WithDefaults: boolean): TComponentClass; virtual; abstract;
|
||||||
|
|
||||||
|
property StandardDesignerBaseClasses[Index: integer]: TComponentClass read GetStandardDesignerBaseClasses
|
||||||
|
write SetStandardDesignerBaseClasses;
|
||||||
|
function StandardDesignerBaseClassesCount: Integer; virtual; abstract;
|
||||||
// designers
|
// designers
|
||||||
function DesignerCount: integer; virtual; abstract;
|
function DesignerCount: integer; virtual; abstract;
|
||||||
property Designer[Index: integer]: TIDesigner read GetDesigner;
|
property Designer[Index: integer]: TIDesigner read GetDesigner;
|
||||||
function GetCurrentDesigner: TIDesigner; virtual; abstract;
|
function GetCurrentDesigner: TIDesigner; virtual; abstract;
|
||||||
function GetDesignerForm(APersistent: TPersistent): TCustomForm; virtual; abstract;
|
function GetDesignerForm(APersistent: TPersistent): TCustomForm; virtual; abstract;
|
||||||
function GetDesignerByComponent(AComponent: TComponent
|
function GetDesignerByComponent(AComponent: TComponent): TIDesigner; virtual; abstract;
|
||||||
): TIDesigner; virtual; abstract;
|
function NonFormProxyDesignerFormCount: integer; virtual;
|
||||||
|
property NonFormProxyDesignerForm[Index: integer]: TNonFormProxyDesignerFormClass read GetNonFormProxyDesignerForm
|
||||||
|
write SetNonFormProxyDesignerForm;
|
||||||
|
|
||||||
// mediators for non LCL forms
|
// mediators for non LCL forms
|
||||||
procedure RegisterDesignerMediator(MediatorClass: TDesignerMediatorClass); virtual; abstract; // auto calls RegisterDesignerBaseClass
|
procedure RegisterDesignerMediator(MediatorClass: TDesignerMediatorClass); virtual; abstract; // auto calls RegisterDesignerBaseClass
|
||||||
@ -188,6 +292,8 @@ procedure SetDesignInfoLeft(AComponent: TComponent; const aLeft: SmallInt); inli
|
|||||||
procedure SetDesignInfoTop(AComponent: TComponent; const aTop: SmallInt); inline;
|
procedure SetDesignInfoTop(AComponent: TComponent; const aTop: SmallInt); inline;
|
||||||
function LeftTopToDesignInfo(const ALeft, ATop: SmallInt): LongInt; inline;
|
function LeftTopToDesignInfo(const ALeft, ATop: SmallInt): LongInt; inline;
|
||||||
procedure DesignInfoToLeftTop(ADesignInfo: LongInt; out ALeft, ATop: SmallInt); inline;
|
procedure DesignInfoToLeftTop(ADesignInfo: LongInt; out ALeft, ATop: SmallInt); inline;
|
||||||
|
function IsFormDesign(AForm: TCustomForm): boolean;
|
||||||
|
function LookupRoot(AForm: TCustomForm): TComponent;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -280,6 +386,151 @@ begin
|
|||||||
ATop := LazLongRec(ADesignInfo).Hi;
|
ATop := LazLongRec(ADesignInfo).Hi;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function IsFormDesign(AForm: TCustomForm): boolean;
|
||||||
|
begin
|
||||||
|
if AForm = nil then
|
||||||
|
Exit(False);
|
||||||
|
Result := (csDesignInstance in AForm.ComponentState)
|
||||||
|
or ((csDesigning in AForm.ComponentState) and (AForm.Designer <> nil))
|
||||||
|
or (AForm is TNonFormProxyDesignerForm);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function LookupRoot(AForm: TCustomForm): TComponent;
|
||||||
|
begin
|
||||||
|
if AForm is TNonFormProxyDesignerForm then
|
||||||
|
Result := TNonFormProxyDesignerForm(AForm).LookupRoot
|
||||||
|
else if csDesignInstance in AForm.ComponentState then
|
||||||
|
Result := AForm
|
||||||
|
else
|
||||||
|
Result := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TAbstractFormEditor }
|
||||||
|
|
||||||
|
function TAbstractFormEditor.GetNonFormProxyDesignerForm(Index: Integer
|
||||||
|
): TNonFormProxyDesignerFormClass;
|
||||||
|
begin
|
||||||
|
Result := FNonFormProxyDesignerFormClass[Index];
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TAbstractFormEditor.SetNonFormProxyDesignerForm(Index: Integer;
|
||||||
|
AValue: TNonFormProxyDesignerFormClass);
|
||||||
|
begin
|
||||||
|
FNonFormProxyDesignerFormClass[Index] := AValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TAbstractFormEditor.Create;
|
||||||
|
begin
|
||||||
|
FNonFormProxyDesignerFormClass[NonControlProxyDesignerFormId] := TNonControlProxyDesignerForm;
|
||||||
|
FNonFormProxyDesignerFormClass[FrameProxyDesignerFormId] := TFrameProxyDesignerForm;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TAbstractFormEditor.NonFormProxyDesignerFormCount: integer;
|
||||||
|
begin
|
||||||
|
Result := Length(FNonFormProxyDesignerFormClass);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TNonControlProxyDesignerForm }
|
||||||
|
|
||||||
|
function TNonControlProxyDesignerForm.GetNonControlDesigner: INonControlDesigner;
|
||||||
|
begin
|
||||||
|
Result := FNonFormDesigner as INonControlDesigner;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TNonControlProxyDesignerForm.SetMediator(AValue: TDesignerMediator);
|
||||||
|
begin
|
||||||
|
FMediator := AValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TFrameProxyDesignerForm }
|
||||||
|
|
||||||
|
function TFrameProxyDesignerForm.GetFrameDesigner: IFrameDesigner;
|
||||||
|
begin
|
||||||
|
Result := FNonFormDesigner as IFrameDesigner;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TNonFormProxyDesignerForm }
|
||||||
|
|
||||||
|
procedure TNonFormProxyDesignerForm.Notification(AComponent: TComponent;
|
||||||
|
AOperation: TOperation);
|
||||||
|
begin
|
||||||
|
inherited Notification(AComponent, AOperation);
|
||||||
|
if Assigned(FNonFormDesigner) then
|
||||||
|
FNonFormDesigner.Notification(AComponent, AOperation);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TNonFormProxyDesignerForm.SetLookupRoot(AValue: TComponent);
|
||||||
|
begin
|
||||||
|
FLookupRoot := AValue;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TNonFormProxyDesignerForm.GetPublishedBounds(AIndex: Integer): Integer;
|
||||||
|
begin
|
||||||
|
case AIndex of
|
||||||
|
0: Result := inherited Left;
|
||||||
|
1: Result := inherited Top;
|
||||||
|
2: Result := inherited Width;
|
||||||
|
3: Result := inherited Height;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TNonFormProxyDesignerForm.SetPublishedBounds(AIndex: Integer;
|
||||||
|
AValue: Integer);
|
||||||
|
begin
|
||||||
|
case AIndex of
|
||||||
|
0: inherited Left := AValue;
|
||||||
|
1: inherited Top := AValue;
|
||||||
|
2: inherited Width := AValue;
|
||||||
|
3: inherited Height := AValue;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TNonFormProxyDesignerForm.Create(AOwner: TComponent;
|
||||||
|
ANonFormDesigner: INonFormDesigner);
|
||||||
|
begin
|
||||||
|
inherited CreateNew(AOwner, 1);
|
||||||
|
|
||||||
|
FNonFormDesigner := ANonFormDesigner;
|
||||||
|
FNonFormDesigner.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TNonFormProxyDesignerForm.Paint;
|
||||||
|
begin
|
||||||
|
inherited Paint;
|
||||||
|
FNonFormDesigner.Paint;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TNonFormProxyDesignerForm.SetBounds(ALeft, ATop, AWidth, AHeight: integer);
|
||||||
|
begin
|
||||||
|
inherited SetBounds(aLeft, aTop, aWidth, aHeight);
|
||||||
|
if Assigned(FNonFormDesigner) then
|
||||||
|
FNonFormDesigner.SetBounds(ALeft, ATop, AWidth, AHeight);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TNonFormProxyDesignerForm.SetDesignerFormBounds(ALeft, ATop, AWidth, AHeight: integer);
|
||||||
|
begin
|
||||||
|
inherited SetBounds(aLeft, aTop, aWidth, aHeight);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TNonFormProxyDesignerForm.SetPublishedBounds(ALeft, ATop, AWidth, AHeight: integer);
|
||||||
|
begin
|
||||||
|
SetPublishedBounds(0, ALeft);
|
||||||
|
SetPublishedBounds(1, ATop);
|
||||||
|
SetPublishedBounds(2, AWidth);
|
||||||
|
SetPublishedBounds(3, AHeight);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TNonFormProxyDesignerForm.SetLookupRootBounds(ALeft, ATop, AWidth, AHeight: integer);
|
||||||
|
begin
|
||||||
|
if LookupRoot is TControl then
|
||||||
|
TControl(LookupRoot).SetBounds(ALeft, ATop, AWidth, AHeight);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TNonFormProxyDesignerForm.DockedDesigner: boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TDesignerMediator }
|
{ TDesignerMediator }
|
||||||
|
|
||||||
procedure TDesignerMediator.SetRoot(const AValue: TComponent);
|
procedure TDesignerMediator.SetRoot(const AValue: TComponent);
|
||||||
|
@ -69,6 +69,9 @@ function GetUnitResourcefileFormats: TUnitResourcefileFormatArr;
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
FormEditingIntf;
|
||||||
|
|
||||||
var
|
var
|
||||||
GUnitResourcefileFormats: TUnitResourcefileFormatArr;
|
GUnitResourcefileFormats: TUnitResourcefileFormatArr;
|
||||||
|
|
||||||
@ -146,11 +149,11 @@ class function TCustomLFMUnitResourceFileFormat.FindComponentClass(
|
|||||||
aClassName: string): TComponentClass;
|
aClassName: string): TComponentClass;
|
||||||
begin
|
begin
|
||||||
if CompareText(aClassName,'TForm')=0 then
|
if CompareText(aClassName,'TForm')=0 then
|
||||||
Result:=TForm
|
Result:=FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TForm]
|
||||||
else if CompareText(aClassName,'TFrame')=0 then
|
else if CompareText(aClassName,'TFrame')=0 then
|
||||||
Result:=TFrame
|
Result:=FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TFrame]
|
||||||
else if CompareText(aClassName,'TDataModule')=0 then
|
else if CompareText(aClassName,'TDataModule')=0 then
|
||||||
Result:=TDataModule
|
Result:=FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TDataModule]
|
||||||
else
|
else
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
end;
|
end;
|
||||||
@ -167,8 +170,7 @@ begin
|
|||||||
Result:=TForm;
|
Result:=TForm;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class function TUnitResourcefileFormat.FindComponentClass(aClassName: string
|
class function TUnitResourcefileFormat.FindComponentClass(aClassName: string): TComponentClass;
|
||||||
): TComponentClass;
|
|
||||||
begin
|
begin
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
end;
|
end;
|
||||||
|
@ -1160,8 +1160,8 @@ begin
|
|||||||
InvalidateGrabbers;
|
InvalidateGrabbers;
|
||||||
OldCustomForm:=FForm;
|
OldCustomForm:=FForm;
|
||||||
FForm:=NewCustomForm;
|
FForm:=NewCustomForm;
|
||||||
if FForm is TNonControlDesignerForm then
|
if FForm is FormEditingHook.NonFormProxyDesignerForm[NonControlProxyDesignerFormId] then
|
||||||
FMediator:=TNonControlDesignerForm(FForm).Mediator
|
FMediator:=(FForm as INonControlDesigner).Mediator
|
||||||
else
|
else
|
||||||
FMediator:=nil;
|
FMediator:=nil;
|
||||||
FLookupRoot:=GetSelectionOwner;
|
FLookupRoot:=GetSelectionOwner;
|
||||||
@ -1177,8 +1177,7 @@ begin
|
|||||||
Result:=FGrabbers[AGrabIndex];
|
Result:=FGrabbers[AGrabIndex];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TControlSelection.SetGrabbers(AGrabIndex:TGrabIndex;
|
procedure TControlSelection.SetGrabbers(AGrabIndex:TGrabIndex; const AGrabber: TGrabber);
|
||||||
const AGrabber: TGrabber);
|
|
||||||
begin
|
begin
|
||||||
FGrabbers[AGrabIndex]:=AGrabber;
|
FGrabbers[AGrabIndex]:=AGrabber;
|
||||||
end;
|
end;
|
||||||
|
@ -31,27 +31,32 @@ interface
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, LCLProc, Graphics, GraphType, Forms, Controls,
|
Classes, SysUtils, LCLProc, Graphics, GraphType, Forms, Controls,
|
||||||
IDEProcs;
|
IDEProcs, FormEditingIntf;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
{ TCustomNonFormDesignerForm }
|
{ TCustomNonFormDesignerForm }
|
||||||
|
|
||||||
TCustomNonFormDesignerForm = class(TForm)
|
TCustomNonFormDesignerForm = class(TInterfacedObject, INonFormDesigner)
|
||||||
private
|
private
|
||||||
FLookupRoot: TComponent;
|
FNonFormProxyDesignerForm: TNonFormProxyDesignerForm;
|
||||||
FOnLoadBounds: TNotifyEvent;
|
FOnLoadBounds: TNotifyEvent;
|
||||||
FOnSaveBounds: TNotifyEvent;
|
FOnSaveBounds: TNotifyEvent;
|
||||||
protected
|
protected
|
||||||
|
function GetLookupRoot: TComponent; virtual;
|
||||||
procedure SetLookupRoot(const AValue: TComponent); virtual;
|
procedure SetLookupRoot(const AValue: TComponent); virtual;
|
||||||
procedure Notification(AComponent: TComponent; Operation: TOperation);
|
procedure Notification(AComponent: TComponent; Operation: TOperation); virtual;
|
||||||
override;
|
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
procedure Create; virtual; overload;
|
||||||
|
constructor Create(ANonFormProxyDesignerForm: TNonFormProxyDesignerForm); virtual; overload;
|
||||||
|
destructor Destroy; override;
|
||||||
procedure DoLoadBounds; virtual;
|
procedure DoLoadBounds; virtual;
|
||||||
procedure DoSaveBounds; virtual;
|
procedure DoSaveBounds; virtual;
|
||||||
|
procedure SetBounds(ALeft, ATop, AWidth, AHeight: integer); virtual;
|
||||||
|
procedure Paint; virtual;
|
||||||
public
|
public
|
||||||
property LookupRoot: TComponent read FLookupRoot write SetLookupRoot;
|
property LookupRoot: TComponent read GetLookupRoot write SetLookupRoot;
|
||||||
|
property NonFormProxyDesignerForm: TNonFormProxyDesignerForm read FNonFormProxyDesignerForm;
|
||||||
property OnLoadBounds: TNotifyEvent read FOnLoadBounds write FOnLoadBounds;
|
property OnLoadBounds: TNotifyEvent read FOnLoadBounds write FOnLoadBounds;
|
||||||
property OnSaveBounds: TNotifyEvent read FOnSaveBounds write FOnSaveBounds;
|
property OnSaveBounds: TNotifyEvent read FOnSaveBounds write FOnSaveBounds;
|
||||||
end;
|
end;
|
||||||
@ -65,42 +70,42 @@ implementation
|
|||||||
|
|
||||||
function CompareNonFormDesignerForms(Data1, Data2: Pointer): integer;
|
function CompareNonFormDesignerForms(Data1, Data2: Pointer): integer;
|
||||||
var
|
var
|
||||||
Form1: TCustomNonFormDesignerForm;
|
Form1: INonFormDesigner;
|
||||||
Form2: TCustomNonFormDesignerForm;
|
Form2: INonFormDesigner;
|
||||||
begin
|
begin
|
||||||
Form1 := TCustomNonFormDesignerForm(Data1);
|
Form1 := TNonFormProxyDesignerForm(Data1) as INonFormDesigner;
|
||||||
Form2 := TCustomNonFormDesignerForm(Data2);
|
Form2 := TNonFormProxyDesignerForm(Data2) as INonFormDesigner;
|
||||||
Result := PtrInt(Form1.LookupRoot) - PtrInt(Form2.LookupRoot);
|
Result := PtrInt(Form1.LookupRoot) - PtrInt(Form2.LookupRoot);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function CompareLookupRootAndNonFormDesignerForm(Key, Data: Pointer): integer;
|
function CompareLookupRootAndNonFormDesignerForm(Key, Data: Pointer): integer;
|
||||||
var
|
var
|
||||||
LookupRoot: TComponent;
|
LookupRoot: TComponent;
|
||||||
Form: TCustomNonFormDesignerForm;
|
Form: INonFormDesigner;
|
||||||
begin
|
begin
|
||||||
LookupRoot := TComponent(Key);
|
LookupRoot := TComponent(Key);
|
||||||
Form := TCustomNonFormDesignerForm(Data);
|
Form := TNonFormProxyDesignerForm(Data) as INonFormDesigner;
|
||||||
Result := PtrInt(LookupRoot) - PtrInt(Form.LookupRoot);
|
Result := PtrInt(LookupRoot) - PtrInt(Form.LookupRoot);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TCustomNonFormDesignerForm }
|
{ TCustomNonFormDesignerForm }
|
||||||
|
|
||||||
constructor TCustomNonFormDesignerForm.Create(AOwner: TComponent);
|
function TCustomNonFormDesignerForm.GetLookupRoot: TComponent;
|
||||||
begin
|
begin
|
||||||
inherited CreateNew(AOwner, 1);
|
Result := FNonFormProxyDesignerForm.LookupRoot;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomNonFormDesignerForm.SetLookupRoot(const AValue: TComponent);
|
procedure TCustomNonFormDesignerForm.SetLookupRoot(const AValue: TComponent);
|
||||||
begin
|
begin
|
||||||
if FLookupRoot = AValue then
|
if FNonFormProxyDesignerForm.LookupRoot = AValue then
|
||||||
Exit;
|
Exit;
|
||||||
if FLookupRoot<>nil then
|
if FNonFormProxyDesignerForm.LookupRoot<>nil then
|
||||||
FLookupRoot.RemoveFreeNotification(Self);
|
FNonFormProxyDesignerForm.LookupRoot.RemoveFreeNotification(FNonFormProxyDesignerForm);
|
||||||
DoSaveBounds;
|
DoSaveBounds;
|
||||||
FLookupRoot := AValue;
|
FNonFormProxyDesignerForm.LookupRoot := AValue;
|
||||||
if FLookupRoot <> nil then begin
|
if FNonFormProxyDesignerForm.LookupRoot <> nil then begin
|
||||||
FLookupRoot.FreeNotification(Self);
|
FNonFormProxyDesignerForm.LookupRoot.FreeNotification(FNonFormProxyDesignerForm);
|
||||||
Caption := FLookupRoot.Name;
|
FNonFormProxyDesignerForm.Caption := FNonFormProxyDesignerForm.LookupRoot.Name;
|
||||||
end;
|
end;
|
||||||
DoLoadBounds;
|
DoLoadBounds;
|
||||||
end;
|
end;
|
||||||
@ -108,12 +113,27 @@ end;
|
|||||||
procedure TCustomNonFormDesignerForm.Notification(AComponent: TComponent;
|
procedure TCustomNonFormDesignerForm.Notification(AComponent: TComponent;
|
||||||
Operation: TOperation);
|
Operation: TOperation);
|
||||||
begin
|
begin
|
||||||
inherited Notification(AComponent, Operation);
|
|
||||||
if Operation=opRemove then begin
|
if Operation=opRemove then begin
|
||||||
if AComponent=FLookupRoot then FLookupRoot:=nil;
|
if AComponent=FNonFormProxyDesignerForm.LookupRoot then FNonFormProxyDesignerForm.LookupRoot:=nil;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
constructor TCustomNonFormDesignerForm.Create(
|
||||||
|
ANonFormProxyDesignerForm: TNonFormProxyDesignerForm);
|
||||||
|
begin
|
||||||
|
FNonFormProxyDesignerForm := ANonFormProxyDesignerForm;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TCustomNonFormDesignerForm.Destroy;
|
||||||
|
begin
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCustomNonFormDesignerForm.Create;
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCustomNonFormDesignerForm.DoLoadBounds;
|
procedure TCustomNonFormDesignerForm.DoLoadBounds;
|
||||||
begin
|
begin
|
||||||
if Assigned(OnLoadBounds) then
|
if Assigned(OnLoadBounds) then
|
||||||
@ -126,5 +146,15 @@ begin
|
|||||||
OnSaveBounds(Self);
|
OnSaveBounds(Self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCustomNonFormDesignerForm.SetBounds(ALeft, ATop, AWidth,
|
||||||
|
AHeight: integer);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCustomNonFormDesignerForm.Paint;
|
||||||
|
begin
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -617,17 +617,19 @@ end;
|
|||||||
constructor TDesigner.Create(TheDesignerForm: TCustomForm;
|
constructor TDesigner.Create(TheDesignerForm: TCustomForm;
|
||||||
AControlSelection: TControlSelection);
|
AControlSelection: TControlSelection);
|
||||||
var
|
var
|
||||||
|
LNonControlDesigner: INonControlDesigner;
|
||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
//debugln(['TDesigner.Create Self=',dbgs(Pointer(Self)),' TheDesignerForm=',DbgSName(TheDesignerForm)]);
|
//debugln(['TDesigner.Create Self=',dbgs(Pointer(Self)),' TheDesignerForm=',DbgSName(TheDesignerForm)]);
|
||||||
FForm := TheDesignerForm;
|
FForm := TheDesignerForm;
|
||||||
if FForm is TNonControlDesignerForm then begin
|
if FForm is BaseFormEditor1.NonFormProxyDesignerForm[NonControlProxyDesignerFormId] then begin
|
||||||
FLookupRoot := TNonControlDesignerForm(FForm).LookupRoot;
|
LNonControlDesigner := FForm as INonControlDesigner;
|
||||||
Mediator:=TNonControlDesignerForm(FForm).Mediator;
|
FLookupRoot := LNonControlDesigner.LookupRoot;
|
||||||
|
Mediator := LNonControlDesigner.Mediator;
|
||||||
end
|
end
|
||||||
else if FForm is TFrameDesignerForm then
|
else if FForm is BaseFormEditor1.NonFormProxyDesignerForm[FrameProxyDesignerFormId] then
|
||||||
FLookupRoot := TFrameDesignerForm(FForm).LookupRoot
|
FLookupRoot := (FForm as IFrameDesigner).LookupRoot
|
||||||
else
|
else
|
||||||
FLookupRoot := FForm;
|
FLookupRoot := FForm;
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ type
|
|||||||
|
|
||||||
{ TFrameDesignerForm }
|
{ TFrameDesignerForm }
|
||||||
|
|
||||||
TFrameDesignerForm = class(TCustomNonFormDesignerForm)
|
TFrameDesignerForm = class(TCustomNonFormDesignerForm, INonFormDesigner, IFrameDesigner)
|
||||||
protected
|
protected
|
||||||
FChangingBounds: Boolean;
|
FChangingBounds: Boolean;
|
||||||
FResizing: Boolean;
|
FResizing: Boolean;
|
||||||
@ -45,7 +45,8 @@ type
|
|||||||
procedure OnControlChangeBounds(Sender: TObject);
|
procedure OnControlChangeBounds(Sender: TObject);
|
||||||
procedure OnControlResize(Sender: TObject);
|
procedure OnControlResize(Sender: TObject);
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
procedure Create; override;
|
||||||
|
constructor Create(ANonFormProxyDesignerForm: TNonFormProxyDesignerForm); override;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure DoLoadBounds; override;
|
procedure DoLoadBounds; override;
|
||||||
procedure DoSaveBounds; override;
|
procedure DoSaveBounds; override;
|
||||||
@ -57,14 +58,6 @@ implementation
|
|||||||
|
|
||||||
{ TFrameDesignerForm }
|
{ TFrameDesignerForm }
|
||||||
|
|
||||||
constructor TFrameDesignerForm.Create(AOwner: TComponent);
|
|
||||||
begin
|
|
||||||
Position := poDesigned;
|
|
||||||
inherited Create(AOwner);
|
|
||||||
// workaround problem with out assumption that Width = ClientWidth, Height = ClientHeight
|
|
||||||
AutoScroll := False;
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TFrameDesignerForm.Destroy;
|
destructor TFrameDesignerForm.Destroy;
|
||||||
begin
|
begin
|
||||||
if LookupRoot is TControl then
|
if LookupRoot is TControl then
|
||||||
@ -82,7 +75,7 @@ begin
|
|||||||
if (AValue is TControl) then
|
if (AValue is TControl) then
|
||||||
begin
|
begin
|
||||||
AControl := TControl(AValue);
|
AControl := TControl(AValue);
|
||||||
AControl.Parent := Self;
|
AControl.Parent := NonFormProxyDesignerForm;
|
||||||
AControl.AddHandlerOnChangeBounds(@OnControlChangeBounds, True);
|
AControl.AddHandlerOnChangeBounds(@OnControlChangeBounds, True);
|
||||||
AControl.AddHandlerOnResize(@OnControlResize, True);
|
AControl.AddHandlerOnResize(@OnControlResize, True);
|
||||||
end;
|
end;
|
||||||
@ -102,7 +95,7 @@ begin
|
|||||||
for a := Low(TAnchorKind) to High(TAnchorKind) do
|
for a := Low(TAnchorKind) to High(TAnchorKind) do
|
||||||
AControl.AnchorSide[a].Control := nil;
|
AControl.AnchorSide[a].Control := nil;
|
||||||
// reset left, top but save width and height
|
// reset left, top but save width and height
|
||||||
AControl.SetBounds(0, 0, AControl.Width, AControl.Height);
|
NonFormProxyDesignerForm.SetLookupRootBounds(0, 0, AControl.Width, AControl.Height);
|
||||||
finally
|
finally
|
||||||
FChangingBounds := False;
|
FChangingBounds := False;
|
||||||
end;
|
end;
|
||||||
@ -117,22 +110,48 @@ begin
|
|||||||
FResizing := True;
|
FResizing := True;
|
||||||
try
|
try
|
||||||
// update form bounds
|
// update form bounds
|
||||||
SetBounds(Left, Top, AControl.Width, AControl.Height);
|
with NonFormProxyDesignerForm do
|
||||||
|
SetPublishedBounds(Left, Top, AControl.Width, AControl.Height);
|
||||||
finally
|
finally
|
||||||
FResizing := False;
|
FResizing := False;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TFrameDesignerForm.Create;
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
// workaround problem with out assumption that Width = ClientWidth, Height = ClientHeight
|
||||||
|
NonFormProxyDesignerForm.AutoScroll := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TFrameDesignerForm.Create(
|
||||||
|
ANonFormProxyDesignerForm: TNonFormProxyDesignerForm);
|
||||||
|
begin
|
||||||
|
inherited Create(ANonFormProxyDesignerForm);
|
||||||
|
NonFormProxyDesignerForm.Position := poDesigned;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TFrameDesignerForm.DoLoadBounds;
|
procedure TFrameDesignerForm.DoLoadBounds;
|
||||||
|
|
||||||
procedure SetNewBounds(NewLeft, NewTop, NewWidth, NewHeight: integer);
|
procedure SetNewBounds(NewLeft, NewTop, NewWidth, NewHeight: integer);
|
||||||
|
begin
|
||||||
|
with NonFormProxyDesignerForm do
|
||||||
begin
|
begin
|
||||||
if NewWidth <= 0 then NewWidth := Width;
|
if NewWidth <= 0 then NewWidth := Width;
|
||||||
if NewHeight <= 0 then NewHeight := Height;
|
if NewHeight <= 0 then NewHeight := Height;
|
||||||
|
|
||||||
|
if DockedDesigner then
|
||||||
|
begin
|
||||||
|
NewLeft:=Max(0,NewLeft);
|
||||||
|
NewTop:=Max(0,NewTop);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
NewWidth := Max(20, Min(NewWidth, Screen.Width - 50));
|
NewWidth := Max(20, Min(NewWidth, Screen.Width - 50));
|
||||||
NewHeight := Max(20, Min(NewHeight, Screen.Height - 50));
|
NewHeight := Max(20, Min(NewHeight, Screen.Height - 50));
|
||||||
SetBounds(NewLeft, NewTop, Max(20, NewWidth), Max(NewHeight, 20));
|
end;
|
||||||
|
SetPublishedBounds(NewLeft, NewTop, NewWidth, NewHeight);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -159,11 +178,12 @@ end;
|
|||||||
procedure TFrameDesignerForm.DoSaveBounds;
|
procedure TFrameDesignerForm.DoSaveBounds;
|
||||||
begin
|
begin
|
||||||
if LookupRoot is TControl then
|
if LookupRoot is TControl then
|
||||||
|
with NonFormProxyDesignerForm do
|
||||||
begin
|
begin
|
||||||
// store designer position
|
// store designer position
|
||||||
LookupRoot.DesignInfo := LeftTopToDesignInfo(Left, Top);
|
LookupRoot.DesignInfo := LeftTopToDesignInfo(Left, Top);
|
||||||
// always fill the whole designer form
|
// always fill the whole designer form
|
||||||
TControl(LookupRoot).SetBounds(0, 0, Width, Height);
|
SetLookupRootBounds(0, 0, Width, Height);
|
||||||
//DebugLn(['TFrameDesignerForm.DoSaveBounds ',Left,',',Top,' ',LazLongRec(LookupRoot.DesignInfo).Lo,',',LazLongRec(LookupRoot.DesignInfo).hi]);
|
//DebugLn(['TFrameDesignerForm.DoSaveBounds ',Left,',',Top,' ',LazLongRec(LookupRoot.DesignInfo).Lo,',',LazLongRec(LookupRoot.DesignInfo).hi]);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -176,8 +196,9 @@ procedure TFrameDesignerForm.SetBounds(aLeft, aTop, aWidth, aHeight: integer);
|
|||||||
begin
|
begin
|
||||||
// auto apply width and height
|
// auto apply width and height
|
||||||
inherited SetBounds(aLeft, aTop, aWidth, aHeight);
|
inherited SetBounds(aLeft, aTop, aWidth, aHeight);
|
||||||
if (LookupRoot is TControl) then
|
|
||||||
TControl(LookupRoot).SetBounds(0, 0, Width, Height);
|
with NonFormProxyDesignerForm do
|
||||||
|
SetLookupRootBounds(0, 0, Width, Height);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -38,25 +38,25 @@ type
|
|||||||
|
|
||||||
{ TNonControlDesignerForm }
|
{ TNonControlDesignerForm }
|
||||||
|
|
||||||
TNonControlDesignerForm = class(TCustomNonFormDesignerForm)
|
TNonControlDesignerForm = class(TCustomNonFormDesignerForm, INonFormDesigner, INonControlDesigner)
|
||||||
private
|
private
|
||||||
FFrameWidth: integer;
|
FFrameWidth: integer;
|
||||||
FMediator: TDesignerMediator;
|
function GetMediator: TDesignerMediator;
|
||||||
procedure SetMediator(const AValue: TDesignerMediator);
|
procedure SetMediator(AValue: TDesignerMediator);
|
||||||
protected
|
protected
|
||||||
procedure SetFrameWidth(const AValue: integer); virtual;
|
procedure SetFrameWidth(const AValue: integer); virtual;
|
||||||
procedure DoSetBounds(ALeft, ATop, AWidth, AHeight: integer); override;
|
|
||||||
procedure Notification(AComponent: TComponent; Operation: TOperation);
|
procedure Notification(AComponent: TComponent; Operation: TOperation);
|
||||||
override;
|
override;
|
||||||
public
|
public
|
||||||
constructor Create(TheOwner: TComponent); override;
|
procedure Create; override; overload;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure Paint; override;
|
procedure Paint; override;
|
||||||
|
procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;
|
||||||
procedure DoLoadBounds; override;
|
procedure DoLoadBounds; override;
|
||||||
procedure DoSaveBounds; override;
|
procedure DoSaveBounds; override;
|
||||||
public
|
public
|
||||||
property FrameWidth: integer read FFrameWidth write SetFrameWidth;
|
property FrameWidth: integer read FFrameWidth write SetFrameWidth;
|
||||||
property Mediator: TDesignerMediator read FMediator write SetMediator;
|
property Mediator: TDesignerMediator read GetMediator write SetMediator;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -65,19 +65,27 @@ implementation
|
|||||||
|
|
||||||
{ TNonControlDesignerForm }
|
{ TNonControlDesignerForm }
|
||||||
|
|
||||||
procedure TNonControlDesignerForm.SetMediator(const AValue: TDesignerMediator);
|
function TNonControlDesignerForm.GetMediator: TDesignerMediator;
|
||||||
begin
|
begin
|
||||||
if FMediator=AValue then exit;
|
Result := TNonControlProxyDesignerForm(NonFormProxyDesignerForm).Mediator;
|
||||||
if FMediator<>nil then begin
|
end;
|
||||||
FMediator.LCLForm:=nil;
|
|
||||||
FMediator.RemoveFreeNotification(Self);
|
procedure TNonControlDesignerForm.SetMediator(AValue: TDesignerMediator);
|
||||||
|
begin
|
||||||
|
with TNonControlProxyDesignerForm(NonFormProxyDesignerForm) do
|
||||||
|
begin
|
||||||
|
if Mediator=AValue then exit;
|
||||||
|
if Mediator<>nil then begin
|
||||||
|
Mediator.LCLForm:=nil;
|
||||||
|
Mediator.RemoveFreeNotification(NonFormProxyDesignerForm);
|
||||||
end;
|
end;
|
||||||
FMediator:=AValue;
|
Mediator:=AValue;
|
||||||
if FMediator<>nil then begin
|
if Mediator<>nil then begin
|
||||||
FMediator.LCLForm:=Self;
|
Mediator.LCLForm:=NonFormProxyDesignerForm;
|
||||||
FMediator.FreeNotification(Self);
|
Mediator.FreeNotification(NonFormProxyDesignerForm);
|
||||||
DoLoadBounds;
|
DoLoadBounds;
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TNonControlDesignerForm.SetFrameWidth(const AValue: integer);
|
procedure TNonControlDesignerForm.SetFrameWidth(const AValue: integer);
|
||||||
@ -85,15 +93,15 @@ begin
|
|||||||
if FFrameWidth = AValue then
|
if FFrameWidth = AValue then
|
||||||
Exit;
|
Exit;
|
||||||
FFrameWidth := AValue;
|
FFrameWidth := AValue;
|
||||||
Invalidate;
|
NonFormProxyDesignerForm.Invalidate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TNonControlDesignerForm.DoSetBounds(ALeft, ATop, AWidth,
|
procedure TNonControlDesignerForm.SetBounds(aLeft, aTop, aWidth,
|
||||||
AHeight: integer);
|
aHeight: integer);
|
||||||
begin
|
begin
|
||||||
inherited DoSetBounds(ALeft, ATop, AWidth, AHeight);
|
inherited SetBounds(ALeft, ATop, AWidth, AHeight);
|
||||||
if Mediator<>nil then
|
if Mediator<>nil then
|
||||||
Mediator.SetFormBounds(LookupRoot,BoundsRect,ClientRect);
|
Mediator.SetFormBounds(LookupRoot,NonFormProxyDesignerForm.BoundsRect,NonFormProxyDesignerForm.ClientRect);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TNonControlDesignerForm.Notification(AComponent: TComponent;
|
procedure TNonControlDesignerForm.Notification(AComponent: TComponent;
|
||||||
@ -101,21 +109,22 @@ procedure TNonControlDesignerForm.Notification(AComponent: TComponent;
|
|||||||
begin
|
begin
|
||||||
inherited Notification(AComponent, Operation);
|
inherited Notification(AComponent, Operation);
|
||||||
if Operation=opRemove then begin
|
if Operation=opRemove then begin
|
||||||
if FMediator=AComponent then FMediator:=nil;
|
if Mediator=AComponent then Mediator:=nil;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TNonControlDesignerForm.Create(TheOwner: TComponent);
|
procedure TNonControlDesignerForm.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create(TheOwner);
|
inherited;
|
||||||
FFrameWidth := 1;
|
FFrameWidth := 1;
|
||||||
ControlStyle := ControlStyle - [csAcceptsControls];
|
NonFormProxyDesignerForm.ControlStyle := NonFormProxyDesignerForm.ControlStyle - [csAcceptsControls];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TNonControlDesignerForm.Destroy;
|
destructor TNonControlDesignerForm.Destroy;
|
||||||
begin
|
begin
|
||||||
try
|
try
|
||||||
FreeAndNil(FMediator);
|
Mediator.Free;
|
||||||
|
Mediator := nil;
|
||||||
except
|
except
|
||||||
on E: Exception do begin
|
on E: Exception do begin
|
||||||
debugln(['TNonControlDesignerForm.Destroy freeing mediator failed: ',E.Message]);
|
debugln(['TNonControlDesignerForm.Destroy freeing mediator failed: ',E.Message]);
|
||||||
@ -129,15 +138,16 @@ var
|
|||||||
ARect: TRect;
|
ARect: TRect;
|
||||||
begin
|
begin
|
||||||
inherited Paint;
|
inherited Paint;
|
||||||
|
with NonFormProxyDesignerForm do
|
||||||
with Canvas do begin
|
with Canvas do begin
|
||||||
if LookupRoot is TDataModule then
|
if LookupRoot is TDataModule then
|
||||||
begin
|
begin
|
||||||
Brush.Color:=clWhite;
|
Brush.Color:=clWhite;
|
||||||
ARect:=Rect(FrameWidth,FrameWidth,
|
ARect:=Rect(FrameWidth,FrameWidth,
|
||||||
Self.ClientWidth-FrameWidth,
|
ClientWidth-FrameWidth,
|
||||||
Self.ClientHeight-FrameWidth);
|
ClientHeight-FrameWidth);
|
||||||
FillRect(ARect);
|
FillRect(ARect);
|
||||||
ARect:=Rect(0,0,Self.ClientWidth+1,Self.ClientHeight+1);
|
ARect:=Rect(0,0,ClientWidth+1,ClientHeight+1);
|
||||||
Pen.Color:=clBlack;
|
Pen.Color:=clBlack;
|
||||||
Frame3d(ARect, FrameWidth, bvLowered);
|
Frame3d(ARect, FrameWidth, bvLowered);
|
||||||
end;
|
end;
|
||||||
@ -149,17 +159,28 @@ end;
|
|||||||
procedure TNonControlDesignerForm.DoLoadBounds;
|
procedure TNonControlDesignerForm.DoLoadBounds;
|
||||||
|
|
||||||
procedure SetNewBounds(NewLeft, NewTop, NewWidth, NewHeight: integer);
|
procedure SetNewBounds(NewLeft, NewTop, NewWidth, NewHeight: integer);
|
||||||
|
begin
|
||||||
|
with NonFormProxyDesignerForm do
|
||||||
begin
|
begin
|
||||||
if NewWidth<=0 then NewWidth:=Width;
|
if NewWidth<=0 then NewWidth:=Width;
|
||||||
if NewHeight<=0 then NewHeight:=Height;
|
if NewHeight<=0 then NewHeight:=Height;
|
||||||
|
|
||||||
|
if DockedDesigner then
|
||||||
|
begin
|
||||||
|
NewLeft:=Max(0,NewLeft);
|
||||||
|
NewTop:=Max(0,NewTop);
|
||||||
|
SetPublishedBounds(NewLeft,NewTop,Max(0,NewWidth),Max(NewHeight,0));
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
NewWidth:=Max(20,Min(NewWidth,Screen.Width-50));
|
NewWidth:=Max(20,Min(NewWidth,Screen.Width-50));
|
||||||
NewHeight:=Max(20,Min(NewHeight,Screen.Height-50));
|
NewHeight:=Max(20,Min(NewHeight,Screen.Height-50));
|
||||||
NewLeft:=Max(0,Min(NewLeft,Screen.Width-NewWidth-50));
|
NewLeft:=Max(0,Min(NewLeft,Screen.Width-NewWidth-50));
|
||||||
NewTop:=Max(0,Min(NewTop,Screen.Height-NewHeight-50));
|
NewTop:=Max(0,Min(NewTop,Screen.Height-NewHeight-50));
|
||||||
|
SetPublishedBounds(NewLeft,NewTop,Max(20,NewWidth),Max(NewHeight,20));
|
||||||
|
end;
|
||||||
//debugln('TNonControlDesignerForm.DoLoadBounds (TDataModule) ',dbgsName(LookupRoot),' ',dbgs(NewLeft),',',dbgs(NewTop),',',dbgs(NewWidth),',',dbgs(NewHeight));
|
//debugln('TNonControlDesignerForm.DoLoadBounds (TDataModule) ',dbgsName(LookupRoot),' ',dbgs(NewLeft),',',dbgs(NewTop),',',dbgs(NewWidth),',',dbgs(NewHeight));
|
||||||
SetBounds(NewLeft,NewTop,Max(20,NewWidth),Max(NewHeight,20));
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -180,7 +201,7 @@ begin
|
|||||||
NewHeight := CurDataModule.DesignSize.Y;
|
NewHeight := CurDataModule.DesignSize.Y;
|
||||||
|
|
||||||
SetNewBounds(NewLeft, NewTop, NewWidth, NewHeight);
|
SetNewBounds(NewLeft, NewTop, NewWidth, NewHeight);
|
||||||
end else begin
|
end else with NonFormProxyDesignerForm do begin
|
||||||
if Mediator<>nil then begin
|
if Mediator<>nil then begin
|
||||||
Mediator.GetFormBounds(LookupRoot,NewBounds,NewClientRect);
|
Mediator.GetFormBounds(LookupRoot,NewBounds,NewClientRect);
|
||||||
NewLeft:=NewBounds.Left;
|
NewLeft:=NewBounds.Left;
|
||||||
@ -203,17 +224,23 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TNonControlDesignerForm.DoSaveBounds;
|
procedure TNonControlDesignerForm.DoSaveBounds;
|
||||||
|
var
|
||||||
|
LBoundsRect: TRect;
|
||||||
|
LClientRect: TRect;
|
||||||
begin
|
begin
|
||||||
if LookupRoot is TDataModule then begin
|
if LookupRoot is TDataModule then begin
|
||||||
with TDataModule(LookupRoot) do begin
|
with NonFormProxyDesignerForm, TDataModule(LookupRoot) do begin
|
||||||
DesignOffset:=Point(Left,Top);
|
DesignOffset:=Point(Left,Top);
|
||||||
DesignSize:=Point(Width,Height);
|
DesignSize:=Point(Width,Height);
|
||||||
//debugln('TNonControlDesignerForm.DoSaveBounds (TDataModule) ',dbgsName(LookupRoot),' ',dbgs(DesignOffset.X),',',dbgs(DesignOffset.Y));
|
//debugln('TNonControlDesignerForm.DoSaveBounds (TDataModule) ',dbgsName(LookupRoot),' ',dbgs(DesignOffset.X),',',dbgs(DesignOffset.Y));
|
||||||
end;
|
end;
|
||||||
end else if LookupRoot<>nil then begin
|
end else if LookupRoot<>nil then with NonFormProxyDesignerForm do begin
|
||||||
//debugln(['TNonControlDesignerForm.DoSaveBounds ',dbgsName(LookupRoot),' ',dbgs(Left),',',dbgs(Top),' ',DbgSName(Mediator)]);
|
//debugln(['TNonControlDesignerForm.DoSaveBounds ',dbgsName(LookupRoot),' ',dbgs(Left),',',dbgs(Top),' ',DbgSName(Mediator)]);
|
||||||
if Mediator<>nil then begin
|
if Mediator<>nil then begin
|
||||||
Mediator.SetFormBounds(LookupRoot,BoundsRect,ClientRect);
|
LBoundsRect := Rect(Left, Top, Left + Width, Top + Height);
|
||||||
|
LClientRect := Rect(0, 0, Width, Height);
|
||||||
|
|
||||||
|
Mediator.SetFormBounds(LookupRoot, LBoundsRect, LClientRect);
|
||||||
end else begin
|
end else begin
|
||||||
SetComponentLeftTopOrDesignInfo(LookupRoot,Left,Top);
|
SetComponentLeftTopOrDesignInfo(LookupRoot,Left,Top);
|
||||||
end;
|
end;
|
||||||
|
@ -102,6 +102,8 @@ type
|
|||||||
var ComponentClass: TComponentClass);
|
var ComponentClass: TComponentClass);
|
||||||
|
|
||||||
function GetDesignerBaseClasses(Index: integer): TComponentClass; override;
|
function GetDesignerBaseClasses(Index: integer): TComponentClass; override;
|
||||||
|
function GetStandardDesignerBaseClasses(Index: integer): TComponentClass; override;
|
||||||
|
procedure SetStandardDesignerBaseClasses(Index: integer; AValue: TComponentClass); override;
|
||||||
procedure OnDesignerMenuItemClick(Sender: TObject); virtual;
|
procedure OnDesignerMenuItemClick(Sender: TObject); virtual;
|
||||||
function FindNonFormFormNode(LookupRoot: TComponent): TAvgLvlTreeNode;
|
function FindNonFormFormNode(LookupRoot: TComponent): TAvgLvlTreeNode;
|
||||||
|
|
||||||
@ -134,38 +136,28 @@ type
|
|||||||
function IsJITComponent(AComponent: TComponent): boolean;
|
function IsJITComponent(AComponent: TComponent): boolean;
|
||||||
function GetJITListOfType(AncestorType: TComponentClass): TJITComponentList;
|
function GetJITListOfType(AncestorType: TComponentClass): TJITComponentList;
|
||||||
function FindJITList(AComponent: TComponent): TJITComponentList;
|
function FindJITList(AComponent: TComponent): TJITComponentList;
|
||||||
function FindJITListByClassName(const AComponentClassName: string
|
function FindJITListByClassName(const AComponentClassName: string): TJITComponentList;
|
||||||
): TJITComponentList;
|
function FindJITListByClass(AComponentClass: TComponentClass): TJITComponentList;
|
||||||
function FindJITListByClass(AComponentClass: TComponentClass
|
|
||||||
): TJITComponentList;
|
|
||||||
function GetDesignerForm(APersistent: TPersistent): TCustomForm; override;
|
function GetDesignerForm(APersistent: TPersistent): TCustomForm; override;
|
||||||
|
|
||||||
function FindNonFormForm(LookupRoot: TComponent): TCustomNonFormDesignerForm;
|
function FindNonFormForm(LookupRoot: TComponent): TNonFormProxyDesignerForm;
|
||||||
|
function CreateNonFormForm(LookupRoot: TComponent): TNonFormProxyDesignerForm;
|
||||||
|
|
||||||
function CreateNonFormForm(LookupRoot: TComponent): TCustomNonFormDesignerForm;
|
procedure RenameJITComponent(AComponent: TComponent; const NewClassName: shortstring);
|
||||||
|
procedure RenameJITComponentUnitname(AComponent: TComponent; const NewUnitName: shortstring);
|
||||||
procedure RenameJITComponent(AComponent: TComponent;
|
|
||||||
const NewClassName: shortstring);
|
|
||||||
procedure RenameJITComponentUnitname(AComponent: TComponent;
|
|
||||||
const NewUnitName: shortstring);
|
|
||||||
procedure UpdateDesignerFormName(AComponent: TComponent);
|
procedure UpdateDesignerFormName(AComponent: TComponent);
|
||||||
procedure UpdateComponentName(AComponent: TComponent);
|
procedure UpdateComponentName(AComponent: TComponent);
|
||||||
function CreateNewJITMethod(ALookupRoot: TComponent;
|
function CreateNewJITMethod(ALookupRoot: TComponent; const AMethodName: shortstring): TMethod;
|
||||||
const AMethodName: shortstring): TMethod;
|
procedure RenameJITMethod(AComponent: TComponent; const OldMethodName, NewMethodName: shortstring);
|
||||||
procedure RenameJITMethod(AComponent: TComponent;
|
|
||||||
const OldMethodName, NewMethodName: shortstring);
|
|
||||||
procedure SaveHiddenDesignerFormProperties(AComponent: TComponent);
|
procedure SaveHiddenDesignerFormProperties(AComponent: TComponent);
|
||||||
function FindJITComponentByClassName(const AComponentClassName: string
|
function FindJITComponentByClassName(const AComponentClassName: string): TComponent;
|
||||||
): TComponent;
|
function FindJITComponentByClass(AComponentClass: TComponentClass): TComponent;
|
||||||
function FindJITComponentByClass(AComponentClass: TComponentClass
|
|
||||||
): TComponent;
|
|
||||||
procedure WriteMethodPropertyEvent(Writer: TWriter; {%H-}Instance: TPersistent;
|
procedure WriteMethodPropertyEvent(Writer: TWriter; {%H-}Instance: TPersistent;
|
||||||
PropInfo: PPropInfo; const MethodValue, DefMethodValue: TMethod;
|
PropInfo: PPropInfo; const MethodValue, DefMethodValue: TMethod;
|
||||||
var Handled: boolean);
|
var Handled: boolean);
|
||||||
function SaveUnitComponentToBinStream(AnUnitInfo: TUnitInfo;
|
function SaveUnitComponentToBinStream(AnUnitInfo: TUnitInfo;
|
||||||
var BinCompStream: TExtMemoryStream): TModalResult;
|
var BinCompStream: TExtMemoryStream): TModalResult;
|
||||||
function OnGetDanglingMethodName(const AMethod: TMethod;
|
function OnGetDanglingMethodName(const AMethod: TMethod; aRootComponent: TObject): string;
|
||||||
aRootComponent: TObject): string;
|
|
||||||
|
|
||||||
// ancestors
|
// ancestors
|
||||||
function GetAncestorLookupRoot(AComponent: TComponent): TComponent; override;
|
function GetAncestorLookupRoot(AComponent: TComponent): TComponent; override;
|
||||||
@ -177,6 +169,7 @@ type
|
|||||||
function DescendFromDesignerBaseClass(AClass: TComponentClass): integer; override;
|
function DescendFromDesignerBaseClass(AClass: TComponentClass): integer; override;
|
||||||
function FindDesignerBaseClassByName(const AClassName: shortstring; WithDefaults: boolean): TComponentClass; override;
|
function FindDesignerBaseClassByName(const AClassName: shortstring; WithDefaults: boolean): TComponentClass; override;
|
||||||
|
|
||||||
|
function StandardDesignerBaseClassesCount: Integer; override;
|
||||||
// designers
|
// designers
|
||||||
function DesignerCount: integer; override;
|
function DesignerCount: integer; override;
|
||||||
function GetDesigner(Index: integer): TIDesigner; override;
|
function GetDesigner(Index: integer): TIDesigner; override;
|
||||||
@ -302,8 +295,8 @@ type
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
const
|
var
|
||||||
StandardDesignerBaseClasses: array[1..3] of TComponentClass =
|
StandardDesignerBaseClasses: array[0..2] of TComponentClass =
|
||||||
(
|
(
|
||||||
Forms.TForm,
|
Forms.TForm,
|
||||||
TDataModule,
|
TDataModule,
|
||||||
@ -461,7 +454,7 @@ begin
|
|||||||
FSelection := TPersistentSelectionList.Create;
|
FSelection := TPersistentSelectionList.Create;
|
||||||
FDesignerBaseClasses:=TFPList.Create;
|
FDesignerBaseClasses:=TFPList.Create;
|
||||||
FDesignerMediatorClasses:=TFPList.Create;
|
FDesignerMediatorClasses:=TFPList.Create;
|
||||||
for l:=Low(StandardDesignerBaseClasses) to High(StandardDesignerBaseClasses) do
|
for l:=0 to StandardDesignerBaseClassesCount - 1 do
|
||||||
FDesignerBaseClasses.Add(StandardDesignerBaseClasses[l]);
|
FDesignerBaseClasses.Add(StandardDesignerBaseClasses[l]);
|
||||||
|
|
||||||
JITFormList := TJITForms.Create(nil);
|
JITFormList := TJITForms.Create(nil);
|
||||||
@ -567,7 +560,7 @@ Begin
|
|||||||
end else if JITNonFormList.IsJITNonForm(AComponent) then begin
|
end else if JITNonFormList.IsJITNonForm(AComponent) then begin
|
||||||
// free/unbind a non form component and its designer form
|
// free/unbind a non form component and its designer form
|
||||||
aForm:=GetDesignerForm(AComponent);
|
aForm:=GetDesignerForm(AComponent);
|
||||||
if (AForm<>nil) and (not (AForm is TCustomNonFormDesignerForm)) then
|
if (AForm<>nil) and (not (AForm is TNonFormProxyDesignerForm)) then
|
||||||
RaiseException(Format(
|
RaiseException(Format(
|
||||||
lisCFETCustomFormEditorDeleteComponentWhereIsTheTCustomN, [AComponent.
|
lisCFETCustomFormEditorDeleteComponentWhereIsTheTCustomN, [AComponent.
|
||||||
ClassName]));
|
ClassName]));
|
||||||
@ -575,7 +568,7 @@ Begin
|
|||||||
if (AForm <> nil) then
|
if (AForm <> nil) then
|
||||||
begin
|
begin
|
||||||
FNonFormForms.Remove(AForm);
|
FNonFormForms.Remove(AForm);
|
||||||
TCustomNonFormDesignerForm(AForm).LookupRoot := nil;
|
(AForm as INonFormDesigner).LookupRoot := nil;
|
||||||
Application.ReleaseComponent(AForm);
|
Application.ReleaseComponent(AForm);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -812,20 +805,21 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomFormEditor.FindNonFormForm(LookupRoot: TComponent): TCustomNonFormDesignerForm;
|
function TCustomFormEditor.FindNonFormForm(LookupRoot: TComponent): TNonFormProxyDesignerForm;
|
||||||
var
|
var
|
||||||
AVLNode: TAvgLvlTreeNode;
|
AVLNode: TAvgLvlTreeNode;
|
||||||
begin
|
begin
|
||||||
AVLNode := FindNonFormFormNode(LookupRoot);
|
AVLNode := FindNonFormFormNode(LookupRoot);
|
||||||
if AVLNode <> nil then
|
if AVLNode <> nil then
|
||||||
Result := TCustomNonFormDesignerForm(AVLNode.Data)
|
Result := TNonFormProxyDesignerForm(AVLNode.Data)
|
||||||
else
|
else
|
||||||
Result := nil;
|
Result := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomFormEditor.CreateNonFormForm(LookupRoot: TComponent): TCustomNonFormDesignerForm;
|
function TCustomFormEditor.CreateNonFormForm(LookupRoot: TComponent): TNonFormProxyDesignerForm;
|
||||||
var
|
var
|
||||||
MediatorClass: TDesignerMediatorClass;
|
MediatorClass: TDesignerMediatorClass;
|
||||||
|
LNonFormProxyDesignerClass: TNonFormProxyDesignerFormClass;
|
||||||
begin
|
begin
|
||||||
Result := Nil;
|
Result := Nil;
|
||||||
if FindNonFormFormNode(LookupRoot) <> nil then
|
if FindNonFormFormNode(LookupRoot) <> nil then
|
||||||
@ -833,18 +827,26 @@ begin
|
|||||||
if LookupRoot is TComponent then
|
if LookupRoot is TComponent then
|
||||||
begin
|
begin
|
||||||
if LookupRoot is TCustomFrame then
|
if LookupRoot is TCustomFrame then
|
||||||
Result := TFrameDesignerForm.Create(nil)
|
begin
|
||||||
|
LNonFormProxyDesignerClass := BaseFormEditor1.NonFormProxyDesignerForm[FrameProxyDesignerFormId];
|
||||||
|
Result := TNonFormProxyDesignerForm(LNonFormProxyDesignerClass.NewInstance);
|
||||||
|
Result.Create(nil, TFrameDesignerForm.Create(Result));
|
||||||
|
end
|
||||||
else
|
else
|
||||||
Result := TNonControlDesignerForm.Create(nil);
|
begin
|
||||||
|
LNonFormProxyDesignerClass := BaseFormEditor1.NonFormProxyDesignerForm[NonControlProxyDesignerFormId];
|
||||||
|
Result := TNonFormProxyDesignerForm(LNonFormProxyDesignerClass.NewInstance);
|
||||||
|
Result.Create(nil, TNonControlDesignerForm.Create(Result));
|
||||||
|
end;
|
||||||
Result.Name:='_Designer_'+LookupRoot.Name;
|
Result.Name:='_Designer_'+LookupRoot.Name;
|
||||||
Result.LookupRoot := LookupRoot;
|
(Result as INonFormDesigner).LookupRoot := LookupRoot;
|
||||||
FNonFormForms.Add(Result);
|
FNonFormForms.Add(Result);
|
||||||
|
|
||||||
if Result is TNonControlDesignerForm then begin
|
if Result is BaseFormEditor1.NonFormProxyDesignerForm[NonControlProxyDesignerFormId] then begin
|
||||||
// create the mediator
|
// create the mediator
|
||||||
MediatorClass:=GetDesignerMediatorClass(TComponentClass(LookupRoot.ClassType));
|
MediatorClass:=GetDesignerMediatorClass(TComponentClass(LookupRoot.ClassType));
|
||||||
if MediatorClass<>nil then
|
if MediatorClass<>nil then
|
||||||
TNonControlDesignerForm(Result).Mediator:=MediatorClass.CreateMediator(nil,LookupRoot);
|
(Result as INonControlDesigner).Mediator:=MediatorClass.CreateMediator(nil,LookupRoot);
|
||||||
end;
|
end;
|
||||||
end else
|
end else
|
||||||
RaiseException(Format(lisCFETCustomFormEditorCreateNonFormFormUnknownType, [
|
RaiseException(Format(lisCFETCustomFormEditorCreateNonFormFormUnknownType, [
|
||||||
@ -875,7 +877,7 @@ end;
|
|||||||
|
|
||||||
procedure TCustomFormEditor.UpdateDesignerFormName(AComponent: TComponent);
|
procedure TCustomFormEditor.UpdateDesignerFormName(AComponent: TComponent);
|
||||||
var
|
var
|
||||||
ANonFormForm: TCustomNonFormDesignerForm;
|
ANonFormForm: TNonFormProxyDesignerForm;
|
||||||
begin
|
begin
|
||||||
ANonFormForm := FindNonFormForm(AComponent);
|
ANonFormForm := FindNonFormForm(AComponent);
|
||||||
//DebugLn(['TCustomFormEditor.UpdateDesignerFormName ',ANonFormForm<>nil, ' ',AComponent.Name]);
|
//DebugLn(['TCustomFormEditor.UpdateDesignerFormName ',ANonFormForm<>nil, ' ',AComponent.Name]);
|
||||||
@ -922,11 +924,11 @@ end;
|
|||||||
|
|
||||||
procedure TCustomFormEditor.SaveHiddenDesignerFormProperties(AComponent: TComponent);
|
procedure TCustomFormEditor.SaveHiddenDesignerFormProperties(AComponent: TComponent);
|
||||||
var
|
var
|
||||||
NonFormForm: TCustomNonFormDesignerForm;
|
NonFormForm: TNonFormProxyDesignerForm;
|
||||||
begin
|
begin
|
||||||
NonFormForm := FindNonFormForm(AComponent);
|
NonFormForm := FindNonFormForm(AComponent);
|
||||||
if NonFormForm <> nil then
|
if NonFormForm <> nil then
|
||||||
NonFormForm.DoSaveBounds;
|
(NonFormForm as INonFormDesigner).DoSaveBounds;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomFormEditor.FindJITComponentByClassName(
|
function TCustomFormEditor.FindJITComponentByClassName(
|
||||||
@ -1616,8 +1618,7 @@ begin
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomFormEditor.GetAncestorInstance(AComponent: TComponent
|
function TCustomFormEditor.GetAncestorInstance(AComponent: TComponent): TComponent;
|
||||||
): TComponent;
|
|
||||||
{ Returns the next ancestor instance.
|
{ Returns the next ancestor instance.
|
||||||
For example:
|
For example:
|
||||||
TFrame3 = class(TFrame2), TFrame2 = class(TFrame1)
|
TFrame3 = class(TFrame2), TFrame2 = class(TFrame1)
|
||||||
@ -1650,8 +1651,7 @@ begin
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomFormEditor.RegisterDesignerBaseClass(AClass: TComponentClass
|
function TCustomFormEditor.RegisterDesignerBaseClass(AClass: TComponentClass): integer;
|
||||||
): integer;
|
|
||||||
begin
|
begin
|
||||||
if AClass=nil then
|
if AClass=nil then
|
||||||
RaiseGDBException('TCustomFormEditor.RegisterDesignerBaseClass');
|
RaiseGDBException('TCustomFormEditor.RegisterDesignerBaseClass');
|
||||||
@ -1669,21 +1669,18 @@ procedure TCustomFormEditor.UnregisterDesignerBaseClass(AClass: TComponentClass)
|
|||||||
var
|
var
|
||||||
l: Integer;
|
l: Integer;
|
||||||
begin
|
begin
|
||||||
for l:=Low(StandardDesignerBaseClasses) to High(StandardDesignerBaseClasses)
|
for l := 0 to StandardDesignerBaseClassesCount-1 do
|
||||||
do
|
|
||||||
if StandardDesignerBaseClasses[l]=AClass then
|
if StandardDesignerBaseClasses[l]=AClass then
|
||||||
RaiseGDBException('TCustomFormEditor.UnregisterDesignerBaseClass');
|
RaiseGDBException('TCustomFormEditor.UnregisterDesignerBaseClass');
|
||||||
FDesignerBaseClasses.Remove(AClass);
|
FDesignerBaseClasses.Remove(AClass);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomFormEditor.IndexOfDesignerBaseClass(AClass: TComponentClass
|
function TCustomFormEditor.IndexOfDesignerBaseClass(AClass: TComponentClass): integer;
|
||||||
): integer;
|
|
||||||
begin
|
begin
|
||||||
Result:=FDesignerBaseClasses.IndexOf(AClass);
|
Result:=FDesignerBaseClasses.IndexOf(AClass);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomFormEditor.DescendFromDesignerBaseClass(AClass: TComponentClass
|
function TCustomFormEditor.DescendFromDesignerBaseClass(AClass: TComponentClass): integer;
|
||||||
): integer;
|
|
||||||
begin
|
begin
|
||||||
Result:=FDesignerBaseClasses.Count-1;
|
Result:=FDesignerBaseClasses.Count-1;
|
||||||
while (Result>=0)
|
while (Result>=0)
|
||||||
@ -1695,24 +1692,43 @@ function TCustomFormEditor.FindDesignerBaseClassByName(
|
|||||||
const AClassName: shortstring; WithDefaults: boolean): TComponentClass;
|
const AClassName: shortstring; WithDefaults: boolean): TComponentClass;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
|
||||||
if WithDefaults then begin
|
function SearchInParent(AParent: TComponentClass): TComponentClass;
|
||||||
for i:=Low(StandardDesignerBaseClasses) to high(StandardDesignerBaseClasses)
|
|
||||||
do begin
|
|
||||||
if CompareText(AClassName,StandardDesignerBaseClasses[i].ClassName)=0 then
|
|
||||||
begin
|
begin
|
||||||
Result:=StandardDesignerBaseClasses[i];
|
Result := nil;
|
||||||
exit;
|
while AParent <> nil do
|
||||||
|
begin
|
||||||
|
if CompareText(AClassName, AParent.ClassName)=0 then
|
||||||
|
Exit(AParent);
|
||||||
|
AParent:=TComponentClass(AParent.ClassParent);
|
||||||
|
if AParent = TComponent then
|
||||||
|
Exit;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
if WithDefaults then
|
||||||
|
begin
|
||||||
|
for i := 0 to StandardDesignerBaseClassesCount - 1 do
|
||||||
|
begin
|
||||||
|
Result := SearchInParent(StandardDesignerBaseClasses[i]);
|
||||||
|
if Result <> nil then
|
||||||
|
Exit(StandardDesignerBaseClasses[i]);
|
||||||
end;
|
end;
|
||||||
for i:=FDesignerBaseClasses.Count-1 downto 0 do begin
|
end;
|
||||||
|
for i:=FDesignerBaseClasses.Count-1 downto 0 do
|
||||||
|
begin
|
||||||
Result:=DesignerBaseClasses[i];
|
Result:=DesignerBaseClasses[i];
|
||||||
if CompareText(Result.ClassName,AClassName)=0 then exit;
|
if CompareText(Result.ClassName,AClassName)=0 then exit;
|
||||||
end;
|
end;
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TCustomFormEditor.StandardDesignerBaseClassesCount: Integer;
|
||||||
|
begin
|
||||||
|
Result := Succ(High(CustomFormEditor.StandardDesignerBaseClasses) - Low(CustomFormEditor.StandardDesignerBaseClasses));
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCustomFormEditor.FindDefineProperty(
|
procedure TCustomFormEditor.FindDefineProperty(
|
||||||
const APersistentClassName, AncestorClassName, Identifier: string;
|
const APersistentClassName, AncestorClassName, Identifier: string;
|
||||||
var IsDefined: boolean);
|
var IsDefined: boolean);
|
||||||
@ -2185,6 +2201,16 @@ begin
|
|||||||
Result:=TComponentClass(FDesignerBaseClasses[Index]);
|
Result:=TComponentClass(FDesignerBaseClasses[Index]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TCustomFormEditor.GetStandardDesignerBaseClasses(Index: integer): TComponentClass;
|
||||||
|
begin
|
||||||
|
Result := CustomFormEditor.StandardDesignerBaseClasses[Index];
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCustomFormEditor.SetStandardDesignerBaseClasses(Index: integer; AValue: TComponentClass);
|
||||||
|
begin
|
||||||
|
CustomFormEditor.StandardDesignerBaseClasses[Index] := AValue;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCustomFormEditor.FrameCompGetCreationClass(Sender: TObject;
|
procedure TCustomFormEditor.FrameCompGetCreationClass(Sender: TObject;
|
||||||
var NewComponentClass: TComponentClass);
|
var NewComponentClass: TComponentClass);
|
||||||
begin
|
begin
|
||||||
@ -2226,8 +2252,7 @@ begin
|
|||||||
TListSortCompare(@ComparePersClassNameAndDefPropCacheItem));
|
TListSortCompare(@ComparePersClassNameAndDefPropCacheItem));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomFormEditor.CreateUniqueComponentName(AComponent: TComponent
|
function TCustomFormEditor.CreateUniqueComponentName(AComponent: TComponent): string;
|
||||||
): string;
|
|
||||||
begin
|
begin
|
||||||
Result:='';
|
Result:='';
|
||||||
if (AComponent=nil) then exit;
|
if (AComponent=nil) then exit;
|
||||||
@ -2258,8 +2283,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCustomFormEditor.TranslateKeyToDesignerCommand(Key: word;
|
function TCustomFormEditor.TranslateKeyToDesignerCommand(Key: word; Shift: TShiftState): word;
|
||||||
Shift: TShiftState): word;
|
|
||||||
begin
|
begin
|
||||||
//debugln(['TCustomFormEditor.TranslateKeyToDesignerCommand ',DbgSName(TDesignerIDECommandForm),' ',Key,' ',dbgs(Shift)]);
|
//debugln(['TCustomFormEditor.TranslateKeyToDesignerCommand ',DbgSName(TDesignerIDECommandForm),' ',Key,' ',dbgs(Shift)]);
|
||||||
Result:=EditorOpts.KeyMap.TranslateKey(Key,Shift,TDesignerIDECommandForm);
|
Result:=EditorOpts.KeyMap.TranslateKey(Key,Shift,TDesignerIDECommandForm);
|
||||||
@ -2318,7 +2342,7 @@ var
|
|||||||
i: Integer;
|
i: Integer;
|
||||||
CurComponent: TComponent;
|
CurComponent: TComponent;
|
||||||
P: TPoint;
|
P: TPoint;
|
||||||
AForm: TCustomNonFormDesignerForm;
|
AForm: TNonFormProxyDesignerForm;
|
||||||
MinX: Integer;
|
MinX: Integer;
|
||||||
MinY: Integer;
|
MinY: Integer;
|
||||||
MaxX: Integer;
|
MaxX: Integer;
|
||||||
@ -2415,8 +2439,7 @@ begin
|
|||||||
CustomForm.Designer.Modified;
|
CustomForm.Designer.Modified;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomFormEditor.SetObj_Inspector(
|
procedure TCustomFormEditor.SetObj_Inspector(AnObjectInspector: TObjectInspectorDlg);
|
||||||
AnObjectInspector: TObjectInspectorDlg);
|
|
||||||
begin
|
begin
|
||||||
if AnObjectInspector=FObj_Inspector then exit;
|
if AnObjectInspector=FObj_Inspector then exit;
|
||||||
if FObj_Inspector<>nil then begin
|
if FObj_Inspector<>nil then begin
|
||||||
@ -2442,8 +2465,9 @@ begin
|
|||||||
DesignerForm := GetDesignerForm(APersistent);
|
DesignerForm := GetDesignerForm(APersistent);
|
||||||
|
|
||||||
// ask TMediator
|
// ask TMediator
|
||||||
if DesignerForm is TNonControlDesignerForm then begin
|
if DesignerForm is BaseFormEditor1.NonFormProxyDesignerForm[NonControlProxyDesignerFormId] then
|
||||||
Mediator:=TNonControlDesignerForm(DesignerForm).Mediator;
|
begin
|
||||||
|
Mediator:=(DesignerForm as INonControlDesigner).Mediator;
|
||||||
if Mediator<>nil then
|
if Mediator<>nil then
|
||||||
Mediator.GetObjInspNodeImageIndex(APersistent, AImageIndex);
|
Mediator.GetObjInspNodeImageIndex(APersistent, AImageIndex);
|
||||||
end;
|
end;
|
||||||
|
@ -45,7 +45,8 @@ uses
|
|||||||
DiskDiffsDialog, InputHistory, CheckLFMDlg, LCLMemManager, CodeToolManager,
|
DiskDiffsDialog, InputHistory, CheckLFMDlg, LCLMemManager, CodeToolManager,
|
||||||
CodeToolsStructs, ConvCodeTool, CodeCache, CodeTree, FindDeclarationTool,
|
CodeToolsStructs, ConvCodeTool, CodeCache, CodeTree, FindDeclarationTool,
|
||||||
BasicCodeTools, SynEdit, UnitResources, IDEExternToolIntf, ObjectInspector,
|
BasicCodeTools, SynEdit, UnitResources, IDEExternToolIntf, ObjectInspector,
|
||||||
PublishModule, etMessagesWnd;
|
PublishModule, etMessagesWnd,
|
||||||
|
FormEditingIntf;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
@ -1611,6 +1612,8 @@ var
|
|||||||
IsPartOfProject: Boolean;
|
IsPartOfProject: Boolean;
|
||||||
RequiredPackages: String;
|
RequiredPackages: String;
|
||||||
Src: String;
|
Src: String;
|
||||||
|
i: Integer;
|
||||||
|
LFindDesignerBaseClassByName: Boolean = True;
|
||||||
begin
|
begin
|
||||||
//debugln('TLazSourceFileManager.NewFile A NewFilename=',NewFilename);
|
//debugln('TLazSourceFileManager.NewFile A NewFilename=',NewFilename);
|
||||||
// empty NewFilename is ok, it will be auto generated
|
// empty NewFilename is ok, it will be auto generated
|
||||||
@ -1776,6 +1779,18 @@ begin
|
|||||||
|
|
||||||
// create component
|
// create component
|
||||||
AncestorType:=NewFileDescriptor.ResourceClass;
|
AncestorType:=NewFileDescriptor.ResourceClass;
|
||||||
|
if AncestorType <> nil then
|
||||||
|
begin
|
||||||
|
// loop for Inherited Items
|
||||||
|
for i:=0 to BaseFormEditor1.StandardDesignerBaseClassesCount - 1 do
|
||||||
|
if AncestorType.InheritsFrom(BaseFormEditor1.StandardDesignerBaseClasses[i]) then
|
||||||
|
begin
|
||||||
|
LFindDesignerBaseClassByName := False;
|
||||||
|
Break;
|
||||||
|
end;
|
||||||
|
if LFindDesignerBaseClassByName then
|
||||||
|
AncestorType:=FormEditor1.FindDesignerBaseClassByName(AncestorType.ClassName, True);
|
||||||
|
end;
|
||||||
//DebugLn(['TLazSourceFileManager.NewFile AncestorType=',dbgsName(AncestorType),' ComponentName',NewUnitInfo.ComponentName]);
|
//DebugLn(['TLazSourceFileManager.NewFile AncestorType=',dbgsName(AncestorType),' ComponentName',NewUnitInfo.ComponentName]);
|
||||||
if AncestorType<>nil then begin
|
if AncestorType<>nil then begin
|
||||||
ResType:=MainBuildBoss.GetResourceType(NewUnitInfo);
|
ResType:=MainBuildBoss.GetResourceType(NewUnitInfo);
|
||||||
@ -5952,7 +5967,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end else begin
|
end else begin
|
||||||
// default is TForm
|
// default is TForm
|
||||||
AComponentClass:=TForm;
|
AComponentClass:=BaseFormEditor1.StandardDesignerBaseClasses[DesignerBaseClassId_TForm];
|
||||||
end;
|
end;
|
||||||
Result:=true;
|
Result:=true;
|
||||||
end;
|
end;
|
||||||
@ -6017,7 +6032,7 @@ begin
|
|||||||
|
|
||||||
// use TForm as default ancestor
|
// use TForm as default ancestor
|
||||||
if AncestorClass=nil then
|
if AncestorClass=nil then
|
||||||
AncestorClass:=TForm;
|
AncestorClass:=BaseFormEditor1.StandardDesignerBaseClasses[DesignerBaseClassId_TForm];
|
||||||
//DebugLn('TLazSourceFileManager.LoadAncestorDependencyHidden Filename="',AnUnitInfo.Filename,'" AncestorClassName=',AncestorClassName,' AncestorClass=',dbgsName(AncestorClass));
|
//DebugLn('TLazSourceFileManager.LoadAncestorDependencyHidden Filename="',AnUnitInfo.Filename,'" AncestorClassName=',AncestorClassName,' AncestorClass=',dbgsName(AncestorClass));
|
||||||
Result:=mrOk;
|
Result:=mrOk;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user