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:
juha 2015-07-12 23:05:08 +00:00
parent 41ca5227fd
commit 2ca8f21e64
9 changed files with 546 additions and 175 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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.

View File

@ -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;

View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -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;