IDE: fixup references when dropping a frame onto a form

git-svn-id: trunk@22260 -
This commit is contained in:
mattias 2009-10-22 13:56:11 +00:00
parent 2265922f51
commit 29ea3fdaa5
5 changed files with 35 additions and 17 deletions

View File

@ -1820,8 +1820,12 @@ var
ParentCI,NewComponentClass,'', ParentCI,NewComponentClass,'',
NewLeft,NewTop,NewWidth,NewHeight)); NewLeft,NewTop,NewWidth,NewHeight));
if NewCI=nil then exit; if NewCI=nil then exit;
Modified;
NewComponent:=NewCI.Component; NewComponent:=NewCI.Component;
TheFormEditor.FixupReferences(NewComponent); // e.g. frame references a datamodule
// modified
Modified;
// set initial properties // set initial properties
if NewComponent is TControl then begin if NewComponent is TControl then begin

View File

@ -1772,7 +1772,7 @@ end;
procedure TJITComponentList.ReaderReferenceName(Reader: TReader; procedure TJITComponentList.ReaderReferenceName(Reader: TReader;
var RefName: Ansistring); var RefName: Ansistring);
begin begin
// debugln('[TJITComponentList.ReaderReferenceName] Name='''+RefName+''''); debugln('[TJITComponentList.ReaderReferenceName] Name='''+RefName+'''');
end; end;
procedure TJITComponentList.ReaderAncestorNotFound(Reader: TReader; procedure TJITComponentList.ReaderAncestorNotFound(Reader: TReader;

View File

@ -45,7 +45,7 @@ uses
// IDEIntf // IDEIntf
PropEdits, ObjectInspector, IDECommands, FormEditingIntf, PropEdits, ObjectInspector, IDECommands, FormEditingIntf,
// IDE // IDE
LazarusIDEStrConsts, Project, JITForms, LazarusIDEStrConsts, Project, JITForms, MainIntf,
CustomNonFormDesigner, NonControlDesigner, FrameDesigner, CustomNonFormDesigner, NonControlDesigner, FrameDesigner,
ComponentReg, IDEProcs, ComponentEditors, KeyMapping, EditorOptions, ComponentReg, IDEProcs, ComponentEditors, KeyMapping, EditorOptions,
EnvironmentOpts, DesignerProcs; EnvironmentOpts, DesignerProcs;
@ -270,6 +270,7 @@ each control that's dropped onto the form
function CreateChildComponentFromStream(BinStream: TStream; function CreateChildComponentFromStream(BinStream: TStream;
ComponentClass: TComponentClass; Root: TComponent; ComponentClass: TComponentClass; Root: TComponent;
ParentControl: TWinControl): TIComponentInterface; override; ParentControl: TWinControl): TIComponentInterface; override;
function FixupReferences(AComponent: TComponent): TModalResult;
procedure WriterFindAncestor(Writer: TWriter; Component: TComponent; procedure WriterFindAncestor(Writer: TWriter; Component: TComponent;
const Name: string; const Name: string;
var Ancestor, RootAncestor: TComponent); var Ancestor, RootAncestor: TComponent);
@ -1909,6 +1910,11 @@ begin
Result:=CreateComponentInterface(NewComponent,true); Result:=CreateComponentInterface(NewComponent,true);
end; end;
function TCustomFormEditor.FixupReferences(AComponent: TComponent): TModalResult;
begin
Result:=MainIDEInterface.DoFixupComponentReferences(AComponent,[]);
end;
procedure TCustomFormEditor.WriterFindAncestor(Writer: TWriter; procedure TCustomFormEditor.WriterFindAncestor(Writer: TWriter;
Component: TComponent; const Name: string; var Ancestor, Component: TComponent; const Name: string; var Ancestor,
RootAncestor: TComponent); RootAncestor: TComponent);

View File

@ -639,8 +639,9 @@ type
function FindBaseComponentClass(const AComponentClassName, function FindBaseComponentClass(const AComponentClassName,
DescendantClassName: string; DescendantClassName: string;
out AComponentClass: TComponentClass): boolean; out AComponentClass: TComponentClass): boolean;
function DoFixupComponentReferences(AnUnitInfo: TUnitInfo; function DoFixupComponentReferences(
OpenFlags: TOpenFlags): TModalResult; RootComponent: TComponent;
OpenFlags: TOpenFlags): TModalResult; override;
function DoLoadAncestorDependencyHidden(AnUnitInfo: TUnitInfo; function DoLoadAncestorDependencyHidden(AnUnitInfo: TUnitInfo;
const DescendantClassName: string; const DescendantClassName: string;
OpenFlags: TOpenFlags; OpenFlags: TOpenFlags;
@ -5744,7 +5745,7 @@ begin
AnUnitInfo.AddRequiresComponentDependency(AncestorUnitInfo,[ucdtAncestor]); AnUnitInfo.AddRequiresComponentDependency(AncestorUnitInfo,[ucdtAncestor]);
if NewComponent<>nil then begin if NewComponent<>nil then begin
// component loaded, now load the referenced units // component loaded, now load the referenced units
Result:=DoFixupComponentReferences(AnUnitInfo,OpenFlags); Result:=DoFixupComponentReferences(AnUnitInfo.Component,OpenFlags);
if Result<>mrOk then begin if Result<>mrOk then begin
DebugLn(['TMainIDE.DoLoadLFM DoFixupComponentReferences failed']); DebugLn(['TMainIDE.DoLoadLFM DoFixupComponentReferences failed']);
exit; exit;
@ -5856,10 +5857,10 @@ begin
Result:=true; Result:=true;
end; end;
function TMainIDE.DoFixupComponentReferences(AnUnitInfo: TUnitInfo; function TMainIDE.DoFixupComponentReferences(
OpenFlags: TOpenFlags): TModalResult; RootComponent: TComponent; OpenFlags: TOpenFlags): TModalResult;
var var
AnUnitInfo: TUnitInfo;
UsedUnitFilenames: TStrings; UsedUnitFilenames: TStrings;
ComponentNameToUnitFilename: TStringList; ComponentNameToUnitFilename: TStringList;
@ -5984,21 +5985,25 @@ var
i: Integer; i: Integer;
RefRootName: string; RefRootName: string;
begin begin
CurRoot:=AnUnitInfo.Component; CurRoot:=RootComponent;
if CurRoot=nil then exit(mrOk); while CurRoot.Owner<>nil do
CurRoot:=CurRoot.Owner;
AnUnitInfo:=Project1.UnitWithComponent(CurRoot);
if AnUnitInfo=nil then exit(mrOk);
UsedUnitFilenames:=nil; UsedUnitFilenames:=nil;
ComponentNameToUnitFilename:=nil; ComponentNameToUnitFilename:=nil;
ReferenceRootNames:=TStringList.Create; ReferenceRootNames:=TStringList.Create;
ReferenceInstanceNames:=TStringList.Create; ReferenceInstanceNames:=TStringList.Create;
try try
GetFixupReferenceNames(CurRoot,ReferenceRootNames); GetFixupReferenceNames(RootComponent,ReferenceRootNames);
Result:=mrOk; Result:=mrOk;
for i:=0 to ReferenceRootNames.Count-1 do begin for i:=0 to ReferenceRootNames.Count-1 do begin
RefRootName:=ReferenceRootNames[i]; RefRootName:=ReferenceRootNames[i];
ReferenceInstanceNames.Clear; ReferenceInstanceNames.Clear;
GetFixupInstanceNames(CurRoot,RefRootName,ReferenceInstanceNames); GetFixupInstanceNames(RootComponent,RefRootName,ReferenceInstanceNames);
DebugLn(['TMainIDE.DoFixupComponentReferences BEFORE loading ',i,' ',dbgsName(CurRoot),' RefRoot=',RefRootName,' Refs="',Trim(ReferenceInstanceNames.Text),'"']); DebugLn(['TMainIDE.DoFixupComponentReferences BEFORE loading ',i,' Root=',dbgsName(RootComponent),' RefRoot=',RefRootName,' Refs="',Trim(ReferenceInstanceNames.Text),'"']);
// load the referenced component // load the referenced component
Result:=LoadDependencyHidden(RefRootName); Result:=LoadDependencyHidden(RefRootName);
@ -6013,11 +6018,11 @@ begin
end; end;
ReferenceInstanceNames.Clear; ReferenceInstanceNames.Clear;
GetFixupInstanceNames(CurRoot,RefRootName,ReferenceInstanceNames); GetFixupInstanceNames(RootComponent,RefRootName,ReferenceInstanceNames);
DebugLn(['TMainIDE.DoFixupComponentReferences AFTER loading ',i,' ',dbgsName(CurRoot),' RefRoot=',RefRootName,' Refs="',Trim(ReferenceInstanceNames.Text),'"']); DebugLn(['TMainIDE.DoFixupComponentReferences AFTER loading ',i,' ',dbgsName(RootComponent),' RefRoot=',RefRootName,' Refs="',Trim(ReferenceInstanceNames.Text),'"']);
// forget the rest of the dangling references // forget the rest of the dangling references
RemoveFixupReferences(CurRoot,RefRootName); RemoveFixupReferences(RootComponent,RefRootName);
if Result<>mrOk then begin if Result<>mrOk then begin
// ToDo: give a nice error message and give user the choice between // ToDo: give a nice error message and give user the choice between

View File

@ -161,6 +161,9 @@ type
const SrcDirectory, DestDirectory: string const SrcDirectory, DestDirectory: string
): TModalResult; virtual; abstract; ): TModalResult; virtual; abstract;
function DoFixupComponentReferences(RootComponent: TComponent;
OpenFlags: TOpenFlags): TModalResult; virtual; abstract;
procedure UpdateWindowMenu; virtual; abstract; procedure UpdateWindowMenu; virtual; abstract;
procedure SaveEnvironment; virtual; abstract; procedure SaveEnvironment; virtual; abstract;
procedure UpdateHighlighters(Immediately: boolean = false); virtual; abstract; procedure UpdateHighlighters(Immediately: boolean = false); virtual; abstract;