IDE: started checking component classes depending on resource format

git-svn-id: trunk@45659 -
This commit is contained in:
mattias 2014-06-25 10:11:30 +00:00
parent 305b0df023
commit 8913df7a49
3 changed files with 72 additions and 26 deletions

View File

@ -41,6 +41,8 @@ type
out MissingClasses: TStrings// e.g. MyFrame2:TMyFrame
): TModalResult; virtual; abstract;
class function Priority: integer; virtual; // higher priority is tested first
class function DefaultComponentClass: TComponentClass; virtual;
class function FindComponentClass({%H-}aClassName: string): TComponentClass; virtual;
end;
TUnitResourcefileFormatClass = class of TUnitResourcefileFormat;
TUnitResourcefileFormatArr = array of TUnitResourcefileFormatClass;
@ -56,6 +58,7 @@ type
class function GetClassNameFromStream(s: TStream; out IsInherited: Boolean): shortstring; override;
class function CreateReader(s: TStream; var DestroyDriver: boolean): TReader; override;
class function CreateWriter(s: TStream; var DestroyDriver: boolean): TWriter; override;
class function FindComponentClass(aClassName: string): TComponentClass; override;
end;
var
@ -139,6 +142,19 @@ begin
Result := CreateLRSWriter(s, DestroyDriver);
end;
class function TCustomLFMUnitResourceFileFormat.FindComponentClass(
aClassName: string): TComponentClass;
begin
if CompareText(aClassName,'TForm')=0 then
Result:=TForm
else if CompareText(aClassName,'TFrame')=0 then
Result:=TFrame
else if CompareText(aClassName,'TDataModule')=0 then
Result:=TDataModule
else
Result:=nil;
end;
{ TUnitResourcefileFormat }
class function TUnitResourcefileFormat.Priority: integer;
@ -146,5 +162,16 @@ begin
Result:=0;
end;
class function TUnitResourcefileFormat.DefaultComponentClass: TComponentClass;
begin
Result:=TForm;
end;
class function TUnitResourcefileFormat.FindComponentClass(aClassName: string
): TComponentClass;
begin
Result:=nil;
end;
end.

View File

@ -197,6 +197,7 @@ var
// search in registered classes
RegComp:=IDEComponentPalette.FindComponent(ObjNode.TypeName);
if (RegComp<>nil) and (RegComp.GetUnitName<>'') then exit;
// search in global registered classes
if GetClass(ObjNode.TypeName) <> nil then
Exit;
// class is missing

View File

@ -171,10 +171,10 @@ type
Flags: TOpenFlags): TModalResult;
function LoadResourceFile(AnUnitInfo: TUnitInfo; var LFMCode, LRSCode: TCodeBuffer;
IgnoreSourceErrors, AutoCreateResourceCode, ShowAbort: boolean): TModalResult;
function FindBaseComponentClass(const AComponentClassName,
function FindBaseComponentClass(AnUnitInfo: TUnitInfo; const AComponentClassName,
DescendantClassName: string; out AComponentClass: TComponentClass): boolean;
function LoadAncestorDependencyHidden(AnUnitInfo: TUnitInfo;
const DescendantClassName: string; OpenFlags: TOpenFlags;
const aComponentClassName: string; OpenFlags: TOpenFlags;
out AncestorClass: TComponentClass; out AncestorUnitInfo: TUnitInfo): TModalResult;
function FindComponentClass(AnUnitInfo: TUnitInfo;
const AComponentClassName: string; Quiet: boolean;
@ -5391,8 +5391,9 @@ begin
AnUnitInfo.HasResources:=true;
// find the classname of the LFM, and check for inherited form
AnUnitInfo.UnitResourceFileformat.QuickCheckResourceBuffer(AnUnitInfo.Source,LFMBuf,LFMType,LFMComponentName,
NewClassName,LCLVersion,MissingClasses);
AnUnitInfo.UnitResourceFileformat.QuickCheckResourceBuffer(
AnUnitInfo.Source,LFMBuf,LFMType,LFMComponentName,
NewClassName,LCLVersion,MissingClasses);
{$IFDEF VerboseLFMSearch}
debugln('TLazSourceFileManager.LoadLFM LFM="',LFMBuf.Source,'"');
@ -5410,7 +5411,7 @@ begin
// load missing component classes (e.g. ancestor and frames)
Result:=LoadAncestorDependencyHidden(AnUnitInfo,NewClassName,OpenFlags,
AncestorType,AncestorUnitInfo);
AncestorType,AncestorUnitInfo);
if Result<>mrOk then begin
DebugLn(['TLazSourceFileManager.LoadLFM DoLoadAncestorDependencyHidden failed for ',AnUnitInfo.Filename]);
exit;
@ -5511,21 +5512,24 @@ begin
if NewUnitName='' then
NewUnitName:=ExtractFileNameOnly(AnUnitInfo.Filename);
DisableAutoSize:=true;
NewComponent:=FormEditor1.CreateRawComponentFromStream(BinStream, AnUnitInfo.UnitResourceFileformat,
AncestorType,copy(NewUnitName,1,255),true,true,DisableAutoSize,AnUnitInfo);
NewComponent:=FormEditor1.CreateRawComponentFromStream(BinStream,
AnUnitInfo.UnitResourceFileformat,
AncestorType,copy(NewUnitName,1,255),true,true,DisableAutoSize,AnUnitInfo);
if (NewComponent is TControl) then begin
NewControl:=TControl(NewComponent);
if ofLoadHiddenResource in OpenFlags then
NewControl.ControlStyle:=NewControl.ControlStyle+[csNoDesignVisible];
if DisableAutoSize then
NewControl.EnableAutoSizing;
if NewComponent is TFrame then
AnUnitInfo.ResourceBaseClass:=pfcbcFrame
else if NewComponent is TDataModule then
AnUnitInfo.ResourceBaseClass:=pfcbcDataModule
else if NewComponent is TForm then
AnUnitInfo.ResourceBaseClass:=pfcbcForm;
end;
if NewComponent is TFrame then
AnUnitInfo.ResourceBaseClass:=pfcbcFrame
else if NewComponent is TDataModule then
AnUnitInfo.ResourceBaseClass:=pfcbcDataModule
else if NewComponent is TForm then
AnUnitInfo.ResourceBaseClass:=pfcbcForm;
Project1.InvalidateUnitComponentDesignerDependencies;
AnUnitInfo.Component:=NewComponent;
if (AncestorUnitInfo<>nil) then
@ -5705,13 +5709,20 @@ begin
Result:=mrCancel;
end;
function TLazSourceFileManager.FindBaseComponentClass(const AComponentClassName,
DescendantClassName: string;
out AComponentClass: TComponentClass): boolean;
function TLazSourceFileManager.FindBaseComponentClass(AnUnitInfo: TUnitInfo;
const AComponentClassName, DescendantClassName: string; out
AComponentClass: TComponentClass): boolean;
// returns false if an error occured
// Important: returns true even if AComponentClass=nil
begin
AComponentClass:=nil;
// find the ancestor class
if AnUnitInfo.UnitResourceFileformat<>nil then
begin
AComponentClass:=AnUnitInfo.UnitResourceFileformat.FindComponentClass(AComponentClassName);
if AComponentClass<>nil then
exit(true);
end;
if AComponentClassName<>'' then begin
if (DescendantClassName<>'')
and (SysUtils.CompareText(AComponentClassName,'TCustomForm')=0) then begin
@ -5743,7 +5754,7 @@ begin
end;
function TLazSourceFileManager.LoadAncestorDependencyHidden(AnUnitInfo: TUnitInfo;
const DescendantClassName: string;
const aComponentClassName: string;
OpenFlags: TOpenFlags;
out AncestorClass: TComponentClass;
out AncestorUnitInfo: TUnitInfo): TModalResult;
@ -5763,14 +5774,15 @@ begin
if Result<>mrOk then exit;
AnUnitInfo.Source:=CodeBuf;
end;
if not CodeToolBoss.FindFormAncestor(AnUnitInfo.Source,DescendantClassName,
if not CodeToolBoss.FindFormAncestor(AnUnitInfo.Source,aComponentClassName,
AncestorClassName,true)
then begin
DebugLn('TLazSourceFileManager.LoadAncestorDependencyHidden Filename="',AnUnitInfo.Filename,'" ClassName=',DescendantClassName,'. Unable to find ancestor class: ',CodeToolBoss.ErrorMessage);
DebugLn('TLazSourceFileManager.LoadAncestorDependencyHidden Filename="',AnUnitInfo.Filename,'" ClassName=',aComponentClassName,'. Unable to find ancestor class: ',CodeToolBoss.ErrorMessage);
end;
// try the base designer classes
if not FindBaseComponentClass(AncestorClassName,DescendantClassName,AncestorClass) then
if not FindBaseComponentClass(AnUnitInfo,AncestorClassName,
aComponentClassName,AncestorClass) then
begin
DebugLn(['TLazSourceFileManager.LoadAncestorDependencyHidden FindUnitComponentClass failed for AncestorClassName=',AncestorClassName]);
exit(mrCancel);
@ -5788,8 +5800,8 @@ begin
mrOk: ;
mrIgnore:
begin
// use TForm as default
AncestorClass:=TForm;
if AnUnitInfo.UnitResourceFileformat<>nil then
AncestorClass:=AnUnitInfo.UnitResourceFileformat.DefaultComponentClass;
AncestorUnitInfo:=nil;
end;
else
@ -5883,10 +5895,16 @@ var
{$ENDIF}
Result:=false;
TheModalResult:=mrCancel;
RegComp:=IDEComponentPalette.FindComponent(aClassName);
if RegComp<>nil then
FoundComponentClass:=RegComp.ComponentClass
else
FoundComponentClass:=nil;
if AnUnitInfo.UnitResourceFileformat<>nil then
FoundComponentClass:=AnUnitInfo.UnitResourceFileformat.FindComponentClass(aClassName);
if FoundComponentClass=nil then
begin
RegComp:=IDEComponentPalette.FindComponent(aClassName);
if RegComp<>nil then
FoundComponentClass:=RegComp.ComponentClass;
end;
if FoundComponentClass=nil then
FoundComponentClass:=FormEditor1.FindDesignerBaseClassByName(aClassName,true);
if FoundComponentClass<>nil then begin
DebugLn(['TLazSourceFileManager.FindComponentClass.TryRegisteredClasses found: ',FoundComponentClass.ClassName]);