From 2ca8f21e64bc8d897af7a3d411e52e981202a06d Mon Sep 17 00:00:00 2001 From: juha Date: Sun, 12 Jul 2015 23:05:08 +0000 Subject: [PATCH] IdeIntf: Improve identification of designer forms. r49352,r49367,r49371,r49510 from free-sparta branch by Maciej Izak. git-svn-id: trunk@49528 - --- components/ideintf/formeditingintf.pas | 255 ++++++++++++++++++++++++- components/ideintf/unitresources.pas | 12 +- designer/controlselection.pp | 7 +- designer/customnonformdesigner.pas | 82 +++++--- designer/designer.pp | 12 +- designer/framedesigner.pas | 63 ++++-- designer/noncontroldesigner.pas | 113 ++++++----- ide/customformeditor.pp | 156 ++++++++------- ide/sourcefilemanager.pas | 21 +- 9 files changed, 546 insertions(+), 175 deletions(-) diff --git a/components/ideintf/formeditingintf.pas b/components/ideintf/formeditingintf.pas index 786d60854c..87a432a716 100644 --- a/components/ideintf/formeditingintf.pas +++ b/components/ideintf/formeditingintf.pas @@ -24,6 +24,11 @@ const ComponentPaletteImageHeight = 24; ComponentPaletteBtnWidth = ComponentPaletteImageWidth + 3; ComponentPaletteBtnHeight = ComponentPaletteImageHeight + 3; + DesignerBaseClassId_TForm = 0; + DesignerBaseClassId_TDataModule = 1; + DesignerBaseClassId_TFrame = 2; + NonControlProxyDesignerFormId = 0; + FrameProxyDesignerFormId = 1; type TDMCompAtPosFlag = ( @@ -32,6 +37,93 @@ type ); 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 To edit designer forms which do not use the LCL, register a TDesignerMediator, which will emulate the painting, handle the mouse and editing bounds. } @@ -89,11 +181,18 @@ type { TAbstractFormEditor } TAbstractFormEditor = class + private + FNonFormProxyDesignerFormClass: array[0..1] of TNonFormProxyDesignerFormClass; protected 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 GetDesignerMediators(Index: integer): TDesignerMediatorClass; virtual; abstract; + function GetNonFormProxyDesignerForm(Index: Integer): TNonFormProxyDesignerFormClass; virtual; + procedure SetNonFormProxyDesignerForm(Index: Integer; AValue: TNonFormProxyDesignerFormClass); virtual; public + constructor Create; // persistent procedure RegisterDefineProperty(const APersistentClassName, Identifier: string); virtual; abstract; @@ -138,13 +237,18 @@ type function DescendFromDesignerBaseClass(AClass: TComponentClass): integer; 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 function DesignerCount: integer; virtual; abstract; property Designer[Index: integer]: TIDesigner read GetDesigner; function GetCurrentDesigner: TIDesigner; virtual; abstract; function GetDesignerForm(APersistent: TPersistent): TCustomForm; virtual; abstract; - function GetDesignerByComponent(AComponent: TComponent - ): TIDesigner; virtual; abstract; + function GetDesignerByComponent(AComponent: TComponent): TIDesigner; virtual; abstract; + function NonFormProxyDesignerFormCount: integer; virtual; + property NonFormProxyDesignerForm[Index: integer]: TNonFormProxyDesignerFormClass read GetNonFormProxyDesignerForm + write SetNonFormProxyDesignerForm; // mediators for non LCL forms 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; function LeftTopToDesignInfo(const ALeft, ATop: SmallInt): LongInt; inline; procedure DesignInfoToLeftTop(ADesignInfo: LongInt; out ALeft, ATop: SmallInt); inline; +function IsFormDesign(AForm: TCustomForm): boolean; +function LookupRoot(AForm: TCustomForm): TComponent; implementation @@ -280,6 +386,151 @@ begin ATop := LazLongRec(ADesignInfo).Hi; 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 } procedure TDesignerMediator.SetRoot(const AValue: TComponent); diff --git a/components/ideintf/unitresources.pas b/components/ideintf/unitresources.pas index 6d31d40ace..775fb0b8fb 100644 --- a/components/ideintf/unitresources.pas +++ b/components/ideintf/unitresources.pas @@ -69,6 +69,9 @@ function GetUnitResourcefileFormats: TUnitResourcefileFormatArr; implementation +uses + FormEditingIntf; + var GUnitResourcefileFormats: TUnitResourcefileFormatArr; @@ -146,11 +149,11 @@ class function TCustomLFMUnitResourceFileFormat.FindComponentClass( aClassName: string): TComponentClass; begin if CompareText(aClassName,'TForm')=0 then - Result:=TForm + Result:=FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TForm] else if CompareText(aClassName,'TFrame')=0 then - Result:=TFrame + Result:=FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TFrame] else if CompareText(aClassName,'TDataModule')=0 then - Result:=TDataModule + Result:=FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TDataModule] else Result:=nil; end; @@ -167,8 +170,7 @@ begin Result:=TForm; end; -class function TUnitResourcefileFormat.FindComponentClass(aClassName: string - ): TComponentClass; +class function TUnitResourcefileFormat.FindComponentClass(aClassName: string): TComponentClass; begin Result:=nil; end; diff --git a/designer/controlselection.pp b/designer/controlselection.pp index beb4314f7b..2244f8984f 100644 --- a/designer/controlselection.pp +++ b/designer/controlselection.pp @@ -1160,8 +1160,8 @@ begin InvalidateGrabbers; OldCustomForm:=FForm; FForm:=NewCustomForm; - if FForm is TNonControlDesignerForm then - FMediator:=TNonControlDesignerForm(FForm).Mediator + if FForm is FormEditingHook.NonFormProxyDesignerForm[NonControlProxyDesignerFormId] then + FMediator:=(FForm as INonControlDesigner).Mediator else FMediator:=nil; FLookupRoot:=GetSelectionOwner; @@ -1177,8 +1177,7 @@ begin Result:=FGrabbers[AGrabIndex]; end; -procedure TControlSelection.SetGrabbers(AGrabIndex:TGrabIndex; - const AGrabber: TGrabber); +procedure TControlSelection.SetGrabbers(AGrabIndex:TGrabIndex; const AGrabber: TGrabber); begin FGrabbers[AGrabIndex]:=AGrabber; end; diff --git a/designer/customnonformdesigner.pas b/designer/customnonformdesigner.pas index e0d7e6018d..add1e9f871 100644 --- a/designer/customnonformdesigner.pas +++ b/designer/customnonformdesigner.pas @@ -31,27 +31,32 @@ interface uses Classes, SysUtils, LCLProc, Graphics, GraphType, Forms, Controls, - IDEProcs; + IDEProcs, FormEditingIntf; type { TCustomNonFormDesignerForm } - TCustomNonFormDesignerForm = class(TForm) + TCustomNonFormDesignerForm = class(TInterfacedObject, INonFormDesigner) private - FLookupRoot: TComponent; + FNonFormProxyDesignerForm: TNonFormProxyDesignerForm; FOnLoadBounds: TNotifyEvent; FOnSaveBounds: TNotifyEvent; protected + function GetLookupRoot: TComponent; virtual; procedure SetLookupRoot(const AValue: TComponent); virtual; - procedure Notification(AComponent: TComponent; Operation: TOperation); - override; + procedure Notification(AComponent: TComponent; Operation: TOperation); virtual; public - constructor Create(AOwner: TComponent); override; + procedure Create; virtual; overload; + constructor Create(ANonFormProxyDesignerForm: TNonFormProxyDesignerForm); virtual; overload; + destructor Destroy; override; procedure DoLoadBounds; virtual; procedure DoSaveBounds; virtual; + procedure SetBounds(ALeft, ATop, AWidth, AHeight: integer); virtual; + procedure Paint; virtual; 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 OnSaveBounds: TNotifyEvent read FOnSaveBounds write FOnSaveBounds; end; @@ -65,42 +70,42 @@ implementation function CompareNonFormDesignerForms(Data1, Data2: Pointer): integer; var - Form1: TCustomNonFormDesignerForm; - Form2: TCustomNonFormDesignerForm; + Form1: INonFormDesigner; + Form2: INonFormDesigner; begin - Form1 := TCustomNonFormDesignerForm(Data1); - Form2 := TCustomNonFormDesignerForm(Data2); + Form1 := TNonFormProxyDesignerForm(Data1) as INonFormDesigner; + Form2 := TNonFormProxyDesignerForm(Data2) as INonFormDesigner; Result := PtrInt(Form1.LookupRoot) - PtrInt(Form2.LookupRoot); end; function CompareLookupRootAndNonFormDesignerForm(Key, Data: Pointer): integer; var LookupRoot: TComponent; - Form: TCustomNonFormDesignerForm; + Form: INonFormDesigner; begin LookupRoot := TComponent(Key); - Form := TCustomNonFormDesignerForm(Data); + Form := TNonFormProxyDesignerForm(Data) as INonFormDesigner; Result := PtrInt(LookupRoot) - PtrInt(Form.LookupRoot); end; { TCustomNonFormDesignerForm } -constructor TCustomNonFormDesignerForm.Create(AOwner: TComponent); +function TCustomNonFormDesignerForm.GetLookupRoot: TComponent; begin - inherited CreateNew(AOwner, 1); + Result := FNonFormProxyDesignerForm.LookupRoot; end; procedure TCustomNonFormDesignerForm.SetLookupRoot(const AValue: TComponent); begin - if FLookupRoot = AValue then + if FNonFormProxyDesignerForm.LookupRoot = AValue then Exit; - if FLookupRoot<>nil then - FLookupRoot.RemoveFreeNotification(Self); + if FNonFormProxyDesignerForm.LookupRoot<>nil then + FNonFormProxyDesignerForm.LookupRoot.RemoveFreeNotification(FNonFormProxyDesignerForm); DoSaveBounds; - FLookupRoot := AValue; - if FLookupRoot <> nil then begin - FLookupRoot.FreeNotification(Self); - Caption := FLookupRoot.Name; + FNonFormProxyDesignerForm.LookupRoot := AValue; + if FNonFormProxyDesignerForm.LookupRoot <> nil then begin + FNonFormProxyDesignerForm.LookupRoot.FreeNotification(FNonFormProxyDesignerForm); + FNonFormProxyDesignerForm.Caption := FNonFormProxyDesignerForm.LookupRoot.Name; end; DoLoadBounds; end; @@ -108,23 +113,48 @@ end; procedure TCustomNonFormDesignerForm.Notification(AComponent: TComponent; Operation: TOperation); begin - inherited Notification(AComponent, Operation); if Operation=opRemove then begin - if AComponent=FLookupRoot then FLookupRoot:=nil; + if AComponent=FNonFormProxyDesignerForm.LookupRoot then FNonFormProxyDesignerForm.LookupRoot:=nil; 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; begin - if Assigned(OnLoadBounds) then + if Assigned(OnLoadBounds) then OnLoadBounds(Self); end; procedure TCustomNonFormDesignerForm.DoSaveBounds; begin - if Assigned(OnSaveBounds) then + if Assigned(OnSaveBounds) then OnSaveBounds(Self); end; +procedure TCustomNonFormDesignerForm.SetBounds(ALeft, ATop, AWidth, + AHeight: integer); +begin +end; + +procedure TCustomNonFormDesignerForm.Paint; +begin + +end; + end. diff --git a/designer/designer.pp b/designer/designer.pp index 388393a237..bdaf608e18 100644 --- a/designer/designer.pp +++ b/designer/designer.pp @@ -617,17 +617,19 @@ end; constructor TDesigner.Create(TheDesignerForm: TCustomForm; AControlSelection: TControlSelection); var + LNonControlDesigner: INonControlDesigner; i: integer; begin inherited Create; //debugln(['TDesigner.Create Self=',dbgs(Pointer(Self)),' TheDesignerForm=',DbgSName(TheDesignerForm)]); FForm := TheDesignerForm; - if FForm is TNonControlDesignerForm then begin - FLookupRoot := TNonControlDesignerForm(FForm).LookupRoot; - Mediator:=TNonControlDesignerForm(FForm).Mediator; + if FForm is BaseFormEditor1.NonFormProxyDesignerForm[NonControlProxyDesignerFormId] then begin + LNonControlDesigner := FForm as INonControlDesigner; + FLookupRoot := LNonControlDesigner.LookupRoot; + Mediator := LNonControlDesigner.Mediator; end - else if FForm is TFrameDesignerForm then - FLookupRoot := TFrameDesignerForm(FForm).LookupRoot + else if FForm is BaseFormEditor1.NonFormProxyDesignerForm[FrameProxyDesignerFormId] then + FLookupRoot := (FForm as IFrameDesigner).LookupRoot else FLookupRoot := FForm; diff --git a/designer/framedesigner.pas b/designer/framedesigner.pas index e172258297..20b436b08c 100644 --- a/designer/framedesigner.pas +++ b/designer/framedesigner.pas @@ -37,7 +37,7 @@ type { TFrameDesignerForm } - TFrameDesignerForm = class(TCustomNonFormDesignerForm) + TFrameDesignerForm = class(TCustomNonFormDesignerForm, INonFormDesigner, IFrameDesigner) protected FChangingBounds: Boolean; FResizing: Boolean; @@ -45,7 +45,8 @@ type procedure OnControlChangeBounds(Sender: TObject); procedure OnControlResize(Sender: TObject); public - constructor Create(AOwner: TComponent); override; + procedure Create; override; + constructor Create(ANonFormProxyDesignerForm: TNonFormProxyDesignerForm); override; destructor Destroy; override; procedure DoLoadBounds; override; procedure DoSaveBounds; override; @@ -57,14 +58,6 @@ implementation { 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; begin if LookupRoot is TControl then @@ -82,7 +75,7 @@ begin if (AValue is TControl) then begin AControl := TControl(AValue); - AControl.Parent := Self; + AControl.Parent := NonFormProxyDesignerForm; AControl.AddHandlerOnChangeBounds(@OnControlChangeBounds, True); AControl.AddHandlerOnResize(@OnControlResize, True); end; @@ -102,7 +95,7 @@ begin for a := Low(TAnchorKind) to High(TAnchorKind) do AControl.AnchorSide[a].Control := nil; // 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 FChangingBounds := False; end; @@ -117,22 +110,48 @@ begin FResizing := True; try // update form bounds - SetBounds(Left, Top, AControl.Width, AControl.Height); + with NonFormProxyDesignerForm do + SetPublishedBounds(Left, Top, AControl.Width, AControl.Height); finally FResizing := False; 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 SetNewBounds(NewLeft, NewTop, NewWidth, NewHeight: integer); begin - if NewWidth <= 0 then NewWidth := Width; - if NewHeight <= 0 then NewHeight := Height; + with NonFormProxyDesignerForm do + begin + if NewWidth <= 0 then NewWidth := Width; + if NewHeight <= 0 then NewHeight := Height; - NewWidth := Max(20, Min(NewWidth, Screen.Width - 50)); - NewHeight := Max(20, Min(NewHeight, Screen.Height - 50)); - SetBounds(NewLeft, NewTop, Max(20, NewWidth), Max(NewHeight, 20)); + if DockedDesigner then + begin + NewLeft:=Max(0,NewLeft); + NewTop:=Max(0,NewTop); + end + else + begin + NewWidth := Max(20, Min(NewWidth, Screen.Width - 50)); + NewHeight := Max(20, Min(NewHeight, Screen.Height - 50)); + end; + SetPublishedBounds(NewLeft, NewTop, NewWidth, NewHeight); + end; end; var @@ -159,11 +178,12 @@ end; procedure TFrameDesignerForm.DoSaveBounds; begin if LookupRoot is TControl then + with NonFormProxyDesignerForm do begin // store designer position LookupRoot.DesignInfo := LeftTopToDesignInfo(Left, Top); // 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]); end else @@ -176,8 +196,9 @@ procedure TFrameDesignerForm.SetBounds(aLeft, aTop, aWidth, aHeight: integer); begin // auto apply width and height 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. diff --git a/designer/noncontroldesigner.pas b/designer/noncontroldesigner.pas index 64134d681c..98d0ad564a 100644 --- a/designer/noncontroldesigner.pas +++ b/designer/noncontroldesigner.pas @@ -38,25 +38,25 @@ type { TNonControlDesignerForm } - TNonControlDesignerForm = class(TCustomNonFormDesignerForm) + TNonControlDesignerForm = class(TCustomNonFormDesignerForm, INonFormDesigner, INonControlDesigner) private FFrameWidth: integer; - FMediator: TDesignerMediator; - procedure SetMediator(const AValue: TDesignerMediator); + function GetMediator: TDesignerMediator; + procedure SetMediator(AValue: TDesignerMediator); protected procedure SetFrameWidth(const AValue: integer); virtual; - procedure DoSetBounds(ALeft, ATop, AWidth, AHeight: integer); override; procedure Notification(AComponent: TComponent; Operation: TOperation); override; public - constructor Create(TheOwner: TComponent); override; + procedure Create; override; overload; destructor Destroy; override; procedure Paint; override; + procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override; procedure DoLoadBounds; override; procedure DoSaveBounds; override; public property FrameWidth: integer read FFrameWidth write SetFrameWidth; - property Mediator: TDesignerMediator read FMediator write SetMediator; + property Mediator: TDesignerMediator read GetMediator write SetMediator; end; @@ -65,18 +65,26 @@ implementation { TNonControlDesignerForm } -procedure TNonControlDesignerForm.SetMediator(const AValue: TDesignerMediator); +function TNonControlDesignerForm.GetMediator: TDesignerMediator; begin - if FMediator=AValue then exit; - if FMediator<>nil then begin - FMediator.LCLForm:=nil; - FMediator.RemoveFreeNotification(Self); - end; - FMediator:=AValue; - if FMediator<>nil then begin - FMediator.LCLForm:=Self; - FMediator.FreeNotification(Self); - DoLoadBounds; + Result := TNonControlProxyDesignerForm(NonFormProxyDesignerForm).Mediator; +end; + +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; + Mediator:=AValue; + if Mediator<>nil then begin + Mediator.LCLForm:=NonFormProxyDesignerForm; + Mediator.FreeNotification(NonFormProxyDesignerForm); + DoLoadBounds; + end; end; end; @@ -85,15 +93,15 @@ begin if FFrameWidth = AValue then Exit; FFrameWidth := AValue; - Invalidate; + NonFormProxyDesignerForm.Invalidate; end; -procedure TNonControlDesignerForm.DoSetBounds(ALeft, ATop, AWidth, - AHeight: integer); +procedure TNonControlDesignerForm.SetBounds(aLeft, aTop, aWidth, + aHeight: integer); begin - inherited DoSetBounds(ALeft, ATop, AWidth, AHeight); + inherited SetBounds(ALeft, ATop, AWidth, AHeight); if Mediator<>nil then - Mediator.SetFormBounds(LookupRoot,BoundsRect,ClientRect); + Mediator.SetFormBounds(LookupRoot,NonFormProxyDesignerForm.BoundsRect,NonFormProxyDesignerForm.ClientRect); end; procedure TNonControlDesignerForm.Notification(AComponent: TComponent; @@ -101,21 +109,22 @@ procedure TNonControlDesignerForm.Notification(AComponent: TComponent; begin inherited Notification(AComponent, Operation); if Operation=opRemove then begin - if FMediator=AComponent then FMediator:=nil; + if Mediator=AComponent then Mediator:=nil; end; end; -constructor TNonControlDesignerForm.Create(TheOwner: TComponent); +procedure TNonControlDesignerForm.Create; begin - inherited Create(TheOwner); + inherited; FFrameWidth := 1; - ControlStyle := ControlStyle - [csAcceptsControls]; + NonFormProxyDesignerForm.ControlStyle := NonFormProxyDesignerForm.ControlStyle - [csAcceptsControls]; end; destructor TNonControlDesignerForm.Destroy; begin try - FreeAndNil(FMediator); + Mediator.Free; + Mediator := nil; except on E: Exception do begin debugln(['TNonControlDesignerForm.Destroy freeing mediator failed: ',E.Message]); @@ -129,15 +138,16 @@ var ARect: TRect; begin inherited Paint; + with NonFormProxyDesignerForm do with Canvas do begin if LookupRoot is TDataModule then begin Brush.Color:=clWhite; ARect:=Rect(FrameWidth,FrameWidth, - Self.ClientWidth-FrameWidth, - Self.ClientHeight-FrameWidth); + ClientWidth-FrameWidth, + ClientHeight-FrameWidth); FillRect(ARect); - ARect:=Rect(0,0,Self.ClientWidth+1,Self.ClientHeight+1); + ARect:=Rect(0,0,ClientWidth+1,ClientHeight+1); Pen.Color:=clBlack; Frame3d(ARect, FrameWidth, bvLowered); end; @@ -150,16 +160,27 @@ procedure TNonControlDesignerForm.DoLoadBounds; procedure SetNewBounds(NewLeft, NewTop, NewWidth, NewHeight: integer); begin - if NewWidth<=0 then NewWidth:=Width; - if NewHeight<=0 then NewHeight:=Height; + with NonFormProxyDesignerForm do + begin + if NewWidth<=0 then NewWidth:=Width; + if NewHeight<=0 then NewHeight:=Height; - NewWidth:=Max(20,Min(NewWidth,Screen.Width-50)); - NewHeight:=Max(20,Min(NewHeight,Screen.Height-50)); - NewLeft:=Max(0,Min(NewLeft,Screen.Width-NewWidth-50)); - NewTop:=Max(0,Min(NewTop,Screen.Height-NewHeight-50)); - - //debugln('TNonControlDesignerForm.DoLoadBounds (TDataModule) ',dbgsName(LookupRoot),' ',dbgs(NewLeft),',',dbgs(NewTop),',',dbgs(NewWidth),',',dbgs(NewHeight)); - SetBounds(NewLeft,NewTop,Max(20,NewWidth),Max(NewHeight,20)); + 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)); + NewHeight:=Max(20,Min(NewHeight,Screen.Height-50)); + NewLeft:=Max(0,Min(NewLeft,Screen.Width-NewWidth-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)); + end; end; var @@ -180,7 +201,7 @@ begin NewHeight := CurDataModule.DesignSize.Y; SetNewBounds(NewLeft, NewTop, NewWidth, NewHeight); - end else begin + end else with NonFormProxyDesignerForm do begin if Mediator<>nil then begin Mediator.GetFormBounds(LookupRoot,NewBounds,NewClientRect); NewLeft:=NewBounds.Left; @@ -203,17 +224,23 @@ begin end; procedure TNonControlDesignerForm.DoSaveBounds; +var + LBoundsRect: TRect; + LClientRect: TRect; begin if LookupRoot is TDataModule then begin - with TDataModule(LookupRoot) do begin + with NonFormProxyDesignerForm, TDataModule(LookupRoot) do begin DesignOffset:=Point(Left,Top); DesignSize:=Point(Width,Height); //debugln('TNonControlDesignerForm.DoSaveBounds (TDataModule) ',dbgsName(LookupRoot),' ',dbgs(DesignOffset.X),',',dbgs(DesignOffset.Y)); 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)]); 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 SetComponentLeftTopOrDesignInfo(LookupRoot,Left,Top); end; diff --git a/ide/customformeditor.pp b/ide/customformeditor.pp index 0f87cce355..647f47ed02 100644 --- a/ide/customformeditor.pp +++ b/ide/customformeditor.pp @@ -102,6 +102,8 @@ type var ComponentClass: TComponentClass); function GetDesignerBaseClasses(Index: integer): TComponentClass; override; + function GetStandardDesignerBaseClasses(Index: integer): TComponentClass; override; + procedure SetStandardDesignerBaseClasses(Index: integer; AValue: TComponentClass); override; procedure OnDesignerMenuItemClick(Sender: TObject); virtual; function FindNonFormFormNode(LookupRoot: TComponent): TAvgLvlTreeNode; @@ -134,38 +136,28 @@ type function IsJITComponent(AComponent: TComponent): boolean; function GetJITListOfType(AncestorType: TComponentClass): TJITComponentList; function FindJITList(AComponent: TComponent): TJITComponentList; - function FindJITListByClassName(const AComponentClassName: string - ): TJITComponentList; - function FindJITListByClass(AComponentClass: TComponentClass - ): TJITComponentList; + function FindJITListByClassName(const AComponentClassName: string): TJITComponentList; + function FindJITListByClass(AComponentClass: TComponentClass): TJITComponentList; 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 UpdateComponentName(AComponent: TComponent); - function CreateNewJITMethod(ALookupRoot: TComponent; - const AMethodName: shortstring): TMethod; - procedure RenameJITMethod(AComponent: TComponent; - const OldMethodName, NewMethodName: shortstring); + function CreateNewJITMethod(ALookupRoot: TComponent; const AMethodName: shortstring): TMethod; + procedure RenameJITMethod(AComponent: TComponent; const OldMethodName, NewMethodName: shortstring); procedure SaveHiddenDesignerFormProperties(AComponent: TComponent); - function FindJITComponentByClassName(const AComponentClassName: string - ): TComponent; - function FindJITComponentByClass(AComponentClass: TComponentClass - ): TComponent; + function FindJITComponentByClassName(const AComponentClassName: string): TComponent; + function FindJITComponentByClass(AComponentClass: TComponentClass): TComponent; procedure WriteMethodPropertyEvent(Writer: TWriter; {%H-}Instance: TPersistent; PropInfo: PPropInfo; const MethodValue, DefMethodValue: TMethod; var Handled: boolean); function SaveUnitComponentToBinStream(AnUnitInfo: TUnitInfo; var BinCompStream: TExtMemoryStream): TModalResult; - function OnGetDanglingMethodName(const AMethod: TMethod; - aRootComponent: TObject): string; + function OnGetDanglingMethodName(const AMethod: TMethod; aRootComponent: TObject): string; // ancestors function GetAncestorLookupRoot(AComponent: TComponent): TComponent; override; @@ -177,6 +169,7 @@ type function DescendFromDesignerBaseClass(AClass: TComponentClass): integer; override; function FindDesignerBaseClassByName(const AClassName: shortstring; WithDefaults: boolean): TComponentClass; override; + function StandardDesignerBaseClassesCount: Integer; override; // designers function DesignerCount: integer; override; function GetDesigner(Index: integer): TIDesigner; override; @@ -302,8 +295,8 @@ type end; -const - StandardDesignerBaseClasses: array[1..3] of TComponentClass = +var + StandardDesignerBaseClasses: array[0..2] of TComponentClass = ( Forms.TForm, TDataModule, @@ -461,7 +454,7 @@ begin FSelection := TPersistentSelectionList.Create; FDesignerBaseClasses:=TFPList.Create; FDesignerMediatorClasses:=TFPList.Create; - for l:=Low(StandardDesignerBaseClasses) to High(StandardDesignerBaseClasses) do + for l:=0 to StandardDesignerBaseClassesCount - 1 do FDesignerBaseClasses.Add(StandardDesignerBaseClasses[l]); JITFormList := TJITForms.Create(nil); @@ -567,7 +560,7 @@ Begin end else if JITNonFormList.IsJITNonForm(AComponent) then begin // free/unbind a non form component and its designer form aForm:=GetDesignerForm(AComponent); - if (AForm<>nil) and (not (AForm is TCustomNonFormDesignerForm)) then + if (AForm<>nil) and (not (AForm is TNonFormProxyDesignerForm)) then RaiseException(Format( lisCFETCustomFormEditorDeleteComponentWhereIsTheTCustomN, [AComponent. ClassName])); @@ -575,7 +568,7 @@ Begin if (AForm <> nil) then begin FNonFormForms.Remove(AForm); - TCustomNonFormDesignerForm(AForm).LookupRoot := nil; + (AForm as INonFormDesigner).LookupRoot := nil; Application.ReleaseComponent(AForm); end; @@ -812,20 +805,21 @@ begin exit; end; -function TCustomFormEditor.FindNonFormForm(LookupRoot: TComponent): TCustomNonFormDesignerForm; +function TCustomFormEditor.FindNonFormForm(LookupRoot: TComponent): TNonFormProxyDesignerForm; var AVLNode: TAvgLvlTreeNode; begin AVLNode := FindNonFormFormNode(LookupRoot); if AVLNode <> nil then - Result := TCustomNonFormDesignerForm(AVLNode.Data) + Result := TNonFormProxyDesignerForm(AVLNode.Data) else Result := nil; end; -function TCustomFormEditor.CreateNonFormForm(LookupRoot: TComponent): TCustomNonFormDesignerForm; +function TCustomFormEditor.CreateNonFormForm(LookupRoot: TComponent): TNonFormProxyDesignerForm; var MediatorClass: TDesignerMediatorClass; + LNonFormProxyDesignerClass: TNonFormProxyDesignerFormClass; begin Result := Nil; if FindNonFormFormNode(LookupRoot) <> nil then @@ -833,18 +827,26 @@ begin if LookupRoot is TComponent then begin 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 - 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.LookupRoot := LookupRoot; + (Result as INonFormDesigner).LookupRoot := LookupRoot; FNonFormForms.Add(Result); - if Result is TNonControlDesignerForm then begin + if Result is BaseFormEditor1.NonFormProxyDesignerForm[NonControlProxyDesignerFormId] then begin // create the mediator MediatorClass:=GetDesignerMediatorClass(TComponentClass(LookupRoot.ClassType)); if MediatorClass<>nil then - TNonControlDesignerForm(Result).Mediator:=MediatorClass.CreateMediator(nil,LookupRoot); + (Result as INonControlDesigner).Mediator:=MediatorClass.CreateMediator(nil,LookupRoot); end; end else RaiseException(Format(lisCFETCustomFormEditorCreateNonFormFormUnknownType, [ @@ -875,7 +877,7 @@ end; procedure TCustomFormEditor.UpdateDesignerFormName(AComponent: TComponent); var - ANonFormForm: TCustomNonFormDesignerForm; + ANonFormForm: TNonFormProxyDesignerForm; begin ANonFormForm := FindNonFormForm(AComponent); //DebugLn(['TCustomFormEditor.UpdateDesignerFormName ',ANonFormForm<>nil, ' ',AComponent.Name]); @@ -922,11 +924,11 @@ end; procedure TCustomFormEditor.SaveHiddenDesignerFormProperties(AComponent: TComponent); var - NonFormForm: TCustomNonFormDesignerForm; + NonFormForm: TNonFormProxyDesignerForm; begin NonFormForm := FindNonFormForm(AComponent); if NonFormForm <> nil then - NonFormForm.DoSaveBounds; + (NonFormForm as INonFormDesigner).DoSaveBounds; end; function TCustomFormEditor.FindJITComponentByClassName( @@ -1616,8 +1618,7 @@ begin {$ENDIF} end; -function TCustomFormEditor.GetAncestorInstance(AComponent: TComponent - ): TComponent; +function TCustomFormEditor.GetAncestorInstance(AComponent: TComponent): TComponent; { Returns the next ancestor instance. For example: TFrame3 = class(TFrame2), TFrame2 = class(TFrame1) @@ -1650,8 +1651,7 @@ begin {$ENDIF} end; -function TCustomFormEditor.RegisterDesignerBaseClass(AClass: TComponentClass - ): integer; +function TCustomFormEditor.RegisterDesignerBaseClass(AClass: TComponentClass): integer; begin if AClass=nil then RaiseGDBException('TCustomFormEditor.RegisterDesignerBaseClass'); @@ -1669,21 +1669,18 @@ procedure TCustomFormEditor.UnregisterDesignerBaseClass(AClass: TComponentClass) var l: Integer; begin - for l:=Low(StandardDesignerBaseClasses) to High(StandardDesignerBaseClasses) - do + for l := 0 to StandardDesignerBaseClassesCount-1 do if StandardDesignerBaseClasses[l]=AClass then RaiseGDBException('TCustomFormEditor.UnregisterDesignerBaseClass'); FDesignerBaseClasses.Remove(AClass); end; -function TCustomFormEditor.IndexOfDesignerBaseClass(AClass: TComponentClass - ): integer; +function TCustomFormEditor.IndexOfDesignerBaseClass(AClass: TComponentClass): integer; begin Result:=FDesignerBaseClasses.IndexOf(AClass); end; -function TCustomFormEditor.DescendFromDesignerBaseClass(AClass: TComponentClass - ): integer; +function TCustomFormEditor.DescendFromDesignerBaseClass(AClass: TComponentClass): integer; begin Result:=FDesignerBaseClasses.Count-1; while (Result>=0) @@ -1695,24 +1692,43 @@ function TCustomFormEditor.FindDesignerBaseClassByName( const AClassName: shortstring; WithDefaults: boolean): TComponentClass; var i: Integer; -begin - if WithDefaults then begin - for i:=Low(StandardDesignerBaseClasses) to high(StandardDesignerBaseClasses) - do begin - if CompareText(AClassName,StandardDesignerBaseClasses[i].ClassName)=0 then - begin - Result:=StandardDesignerBaseClasses[i]; - exit; - end; + + function SearchInParent(AParent: TComponentClass): TComponentClass; + begin + Result := nil; + 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; - for i:=FDesignerBaseClasses.Count-1 downto 0 do begin + +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 Result:=DesignerBaseClasses[i]; if CompareText(Result.ClassName,AClassName)=0 then exit; end; Result:=nil; end; +function TCustomFormEditor.StandardDesignerBaseClassesCount: Integer; +begin + Result := Succ(High(CustomFormEditor.StandardDesignerBaseClasses) - Low(CustomFormEditor.StandardDesignerBaseClasses)); +end; + procedure TCustomFormEditor.FindDefineProperty( const APersistentClassName, AncestorClassName, Identifier: string; var IsDefined: boolean); @@ -2185,6 +2201,16 @@ begin Result:=TComponentClass(FDesignerBaseClasses[Index]); 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; var NewComponentClass: TComponentClass); begin @@ -2226,8 +2252,7 @@ begin TListSortCompare(@ComparePersClassNameAndDefPropCacheItem)); end; -function TCustomFormEditor.CreateUniqueComponentName(AComponent: TComponent - ): string; +function TCustomFormEditor.CreateUniqueComponentName(AComponent: TComponent): string; begin Result:=''; if (AComponent=nil) then exit; @@ -2258,8 +2283,7 @@ begin end; end; -function TCustomFormEditor.TranslateKeyToDesignerCommand(Key: word; - Shift: TShiftState): word; +function TCustomFormEditor.TranslateKeyToDesignerCommand(Key: word; Shift: TShiftState): word; begin //debugln(['TCustomFormEditor.TranslateKeyToDesignerCommand ',DbgSName(TDesignerIDECommandForm),' ',Key,' ',dbgs(Shift)]); Result:=EditorOpts.KeyMap.TranslateKey(Key,Shift,TDesignerIDECommandForm); @@ -2318,7 +2342,7 @@ var i: Integer; CurComponent: TComponent; P: TPoint; - AForm: TCustomNonFormDesignerForm; + AForm: TNonFormProxyDesignerForm; MinX: Integer; MinY: Integer; MaxX: Integer; @@ -2415,8 +2439,7 @@ begin CustomForm.Designer.Modified; end; -procedure TCustomFormEditor.SetObj_Inspector( - AnObjectInspector: TObjectInspectorDlg); +procedure TCustomFormEditor.SetObj_Inspector(AnObjectInspector: TObjectInspectorDlg); begin if AnObjectInspector=FObj_Inspector then exit; if FObj_Inspector<>nil then begin @@ -2442,8 +2465,9 @@ begin DesignerForm := GetDesignerForm(APersistent); // ask TMediator - if DesignerForm is TNonControlDesignerForm then begin - Mediator:=TNonControlDesignerForm(DesignerForm).Mediator; + if DesignerForm is BaseFormEditor1.NonFormProxyDesignerForm[NonControlProxyDesignerFormId] then + begin + Mediator:=(DesignerForm as INonControlDesigner).Mediator; if Mediator<>nil then Mediator.GetObjInspNodeImageIndex(APersistent, AImageIndex); end; diff --git a/ide/sourcefilemanager.pas b/ide/sourcefilemanager.pas index 63e996d262..54b112f22f 100644 --- a/ide/sourcefilemanager.pas +++ b/ide/sourcefilemanager.pas @@ -45,7 +45,8 @@ uses DiskDiffsDialog, InputHistory, CheckLFMDlg, LCLMemManager, CodeToolManager, CodeToolsStructs, ConvCodeTool, CodeCache, CodeTree, FindDeclarationTool, BasicCodeTools, SynEdit, UnitResources, IDEExternToolIntf, ObjectInspector, - PublishModule, etMessagesWnd; + PublishModule, etMessagesWnd, + FormEditingIntf; type @@ -1611,6 +1612,8 @@ var IsPartOfProject: Boolean; RequiredPackages: String; Src: String; + i: Integer; + LFindDesignerBaseClassByName: Boolean = True; begin //debugln('TLazSourceFileManager.NewFile A NewFilename=',NewFilename); // empty NewFilename is ok, it will be auto generated @@ -1776,6 +1779,18 @@ begin // create component 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]); if AncestorType<>nil then begin ResType:=MainBuildBoss.GetResourceType(NewUnitInfo); @@ -5952,7 +5967,7 @@ begin end; end else begin // default is TForm - AComponentClass:=TForm; + AComponentClass:=BaseFormEditor1.StandardDesignerBaseClasses[DesignerBaseClassId_TForm]; end; Result:=true; end; @@ -6017,7 +6032,7 @@ begin // use TForm as default ancestor if AncestorClass=nil then - AncestorClass:=TForm; + AncestorClass:=BaseFormEditor1.StandardDesignerBaseClasses[DesignerBaseClassId_TForm]; //DebugLn('TLazSourceFileManager.LoadAncestorDependencyHidden Filename="',AnUnitInfo.Filename,'" AncestorClassName=',AncestorClassName,' AncestorClass=',dbgsName(AncestorClass)); Result:=mrOk; end;