285 lines
9.0 KiB
ObjectPascal
285 lines
9.0 KiB
ObjectPascal
unit uEWOTARepositoryExpert;
|
|
|
|
{$I Everwood.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF DELPHI5}DsgnIntf,{$ENDIF}
|
|
{$IFDEF DELPHI6UP}DesignEditors,{$ENDIF}
|
|
Windows, Classes, ToolsAPI;
|
|
|
|
{$IFNDEF BDS}
|
|
const
|
|
sDelphiPersonality = 'Delphi.Personality';
|
|
{$ENDIF}
|
|
|
|
{$IFDEF DELPHI5}
|
|
dAny = 'Any';
|
|
{$ENDIF}
|
|
|
|
type
|
|
TEWRepositoryExpert = class(TInterfacedObject, IOTAWizard, IOTARepositoryWizard{$IFDEF DELPHI6UP}, IOTARepositoryWizard60{$ENDIF} {$IFDEF BDS}, IOTARepositoryWizard80{$ENDIF})
|
|
private
|
|
fIcon: Cardinal;
|
|
fPersonality: string;
|
|
protected
|
|
procedure AfterSave; virtual;
|
|
procedure BeforeSave; virtual;
|
|
procedure Destroyed; virtual;
|
|
procedure Modified; virtual;
|
|
|
|
procedure Execute; virtual;
|
|
function GetAuthor: String; virtual;
|
|
function GetComment: String; virtual;
|
|
function GetGlyph: {$IFDEF DELPHI5}HICON{$ELSE}Cardinal{$ENDIF};
|
|
function GetIDString: String;
|
|
function GetInternalIDString: String; virtual; abstract;
|
|
function GetName: String; virtual; abstract;
|
|
function GetPage: String; virtual; abstract;
|
|
function GetState: TWizardState; virtual;
|
|
function GetDesigner: String; virtual;
|
|
|
|
{$IFDEF BDS}
|
|
function GetGalleryCategory: IOTAGalleryCategory; virtual;
|
|
{$ENDIF}
|
|
function GetPersonality: string; virtual;
|
|
|
|
function LoadGlyph: Cardinal; virtual;
|
|
|
|
function CreateNewModuleFromTemplateFile(const aTemplateFile: string; const aName, aAncestor: string; aVariables: TStrings=nil):IOTAModule;
|
|
function CreateNewModuleFromString(const aTemplateString: string; const aName, aAncestor: string; aVariables: TStrings=nil):IOTAModule;
|
|
function CreateNewProject:IOTAProject;
|
|
function CreateNewProjectFromTemplateFile(aTemplateFile: string; aProjectFileName: string; aVariables: TStrings=nil):IOTAProject;
|
|
function CreateNewProjectFromTemplateFolder(const aTemplateFileName: string; const aProjectFileName: string; aVariables: TStrings=nil):IOTAProject;
|
|
|
|
public
|
|
constructor Create(aPersonality: string = sDelphiPersonality);
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
uses
|
|
SysUtils, uEWOTAWizards, Dialogs, uEWOTAHelpers;
|
|
|
|
{ TEWRepositoryExpert }
|
|
|
|
procedure TEWRepositoryExpert.AfterSave;
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure TEWRepositoryExpert.BeforeSave;
|
|
begin
|
|
|
|
end;
|
|
|
|
constructor TEWRepositoryExpert.Create(aPersonality: string);
|
|
begin
|
|
fPersonality := aPersonality;
|
|
end;
|
|
|
|
function TEWRepositoryExpert.CreateNewModuleFromString(const aTemplateString, aName, aAncestor: string; aVariables: TStrings): IOTAModule;
|
|
var
|
|
lModuleServices: IOTAModuleServices;
|
|
// lSourceTemplate,lDfmTemplate: string;
|
|
// lDfmTemplateFile: string;
|
|
begin
|
|
if BorlandIDEServices.QueryInterface(IOTAModuleServices, lModuleServices) = S_OK then
|
|
result := lModuleServices.CreateModule(TEWFormCreator.Create(aTemplateString,
|
|
'',
|
|
aName, aAncestor, aVariables));
|
|
end;
|
|
|
|
function TEWRepositoryExpert.CreateNewModuleFromTemplateFile(const aTemplateFile: string; const aName, aAncestor: string; aVariables: TStrings):IOTAModule;
|
|
var
|
|
lModuleServices: IOTAModuleServices;
|
|
lSourceTemplate,lDfmTemplate: string;
|
|
lDfmTemplateFile: string;
|
|
begin
|
|
lSourceTemplate := LoadStringFromFile(aTemplateFile);
|
|
|
|
lDfmTemplate := '';
|
|
lDfmTemplateFile := ChangeFileExt(aTemplateFile,'.dfm');
|
|
if FileExists(lDfmTemplateFile) then begin
|
|
lDfmTemplate := LoadStringFromFile(lDfmTemplateFile);
|
|
end;
|
|
|
|
if BorlandIDEServices.QueryInterface(IOTAModuleServices, lModuleServices) = S_OK then
|
|
result := lModuleServices.CreateModule(TEWFormCreator.Create(lSourceTemplate,
|
|
lDfmTemplate,
|
|
aName, aAncestor, aVariables));
|
|
end;
|
|
|
|
function TEWRepositoryExpert.CreateNewProject: IOTAProject;
|
|
var
|
|
lModuleServices: IOTAModuleServices;
|
|
begin
|
|
if BorlandIDEServices.QueryInterface(IOTAModuleServices, lModuleServices) = S_OK then
|
|
result := lModuleServices.CreateModule(TEWProjectCreator.Create('', '', nil)) as IOTAProject;
|
|
end;
|
|
|
|
function TEWRepositoryExpert.CreateNewProjectFromTemplateFile(aTemplateFile: string; aProjectFileName: string; aVariables: TStrings): IOTAProject;
|
|
{$IFNDEF BDS}
|
|
var
|
|
lModuleServices: IOTAModuleServices;
|
|
{$ENDIF}
|
|
begin
|
|
result := NIL;
|
|
{$IFDEF BDS} // AleF: Fixed a typo here. It said BSD!!!
|
|
aProjectFileName := ChangeFileExt(aProjectFileName, '.bdsproj');
|
|
if FileExists(aProjectFileName) then begin
|
|
(BorlandIDEServices as IOTAActionServices).OpenProject(aProjectFileName, false); // Vynnyk: Rolled back - because not compilable
|
|
result := (BorlandIDEServices as IOTAModuleServices).GetActiveProject;
|
|
end;
|
|
{$ELSE}
|
|
if BorlandIDEServices.QueryInterface(IOTAModuleServices, lModuleServices) = S_OK then begin
|
|
result := lModuleServices.CreateModule(TEWProjectCreator.Create(aTemplateFile, aProjectFileName, aVariables)) as IOTAProject;
|
|
end;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
function TEWRepositoryExpert.CreateNewProjectFromTemplateFolder(const aTemplateFileName: string; const aProjectFileName: string; aVariables: TStrings): IOTAProject;
|
|
var
|
|
lString, lName, lFileExt: string;
|
|
lOk: dword;
|
|
lTemplateFolder, lProjectFolder: string;
|
|
lSearch: TSearchRec;
|
|
begin
|
|
lTemplateFolder := ExtractFilePath(aTemplateFileName);
|
|
lProjectFolder := ExtractFilePath(aProjectFileName);
|
|
|
|
if not FileExists(aTemplateFileName) then
|
|
raise Exception.Create('Template not found at '+ExtractFilePath(aTemplateFileName));
|
|
|
|
lOk := FindFirst(lTemplateFolder+'*.*',faAnyFile,lSearch);
|
|
try
|
|
while lOk = 0 do try
|
|
if (lSearch.Attr and faDirectory) = 0 then begin
|
|
{$IFNDEF BDS}
|
|
if ExtractFileExt(lSearch.Name) = '.bdsproj' then
|
|
Continue;
|
|
{$ENDIF}
|
|
|
|
lFileExt := ExtractFileExt(lSearch.Name);
|
|
lName := ReplaceVariables(lSearch.Name, aVariables);
|
|
if SameText(lFileExt,'.res') then begin
|
|
CopyFile(pChar(lTemplateFolder+lSearch.Name), pChar(lProjectFolder+lName),false);
|
|
end
|
|
else begin
|
|
lString := ReplaceVariables(LoadStringFromFile(lTemplateFolder+lSearch.Name), aVariables);
|
|
SaveStringToFile(lProjectFolder+lName,lString);
|
|
end;
|
|
end;
|
|
finally
|
|
lOk := FindNext(lSearch);
|
|
end; { while }
|
|
finally
|
|
FindClose(lSearch);
|
|
end;
|
|
result := CreateNewProjectFromTemplateFile(aTemplateFileName, aProjectFileName, aVariables);
|
|
end;
|
|
|
|
procedure TEWRepositoryExpert.Destroyed;
|
|
begin
|
|
end;
|
|
|
|
procedure TEWRepositoryExpert.Execute;
|
|
begin
|
|
end;
|
|
|
|
function TEWRepositoryExpert.GetAuthor: String;
|
|
begin
|
|
result := 'RemObjects Software'
|
|
end;
|
|
|
|
function TEWRepositoryExpert.GetComment: String;
|
|
begin
|
|
|
|
end;
|
|
|
|
function TEWRepositoryExpert.GetDesigner: String;
|
|
begin
|
|
Result := dAny;
|
|
end;
|
|
|
|
function TEWRepositoryExpert.GetGlyph: {$IFDEF DELPHI5}HICON{$ELSE}Cardinal{$ENDIF};
|
|
begin
|
|
{ We'll cache the Glpyh locally so it won't be loaded again and again.
|
|
Apparently Delphi doesn't free the Glpyh, so this would leak otherwise }
|
|
|
|
if fIcon = 0 then fIcon := LoadGlyph();
|
|
result := fIcon;
|
|
end;
|
|
|
|
function TEWRepositoryExpert.GetIDString: String;
|
|
begin
|
|
result := GetInternalIDString+'.'+fPersonality;
|
|
end;
|
|
|
|
function TEWRepositoryExpert.LoadGlyph: Cardinal;
|
|
begin
|
|
result := LoadIcon(hInstance,'EverwoodWizardStandardIcon');
|
|
end;
|
|
|
|
|
|
function TEWRepositoryExpert.GetState: TWizardState;
|
|
begin
|
|
result := [wsEnabled];
|
|
end;
|
|
|
|
procedure TEWRepositoryExpert.Modified;
|
|
begin
|
|
|
|
end;
|
|
|
|
{$IFDEF BDS}
|
|
function TEWRepositoryExpert.GetGalleryCategory: IOTAGalleryCategory;
|
|
var
|
|
lGalleryCategory: string;
|
|
lGalleryManager: IOTAGalleryCategoryManager;
|
|
lGallery: IOTAGalleryCategory;
|
|
begin
|
|
if fPersonality = sDelphiPersonality then
|
|
lGalleryCategory := sCategoryDelphiNew
|
|
else if fPersonality = sCBuilderPersonality then
|
|
lGalleryCategory := sCategoryCBuilderNew
|
|
else if fPersonality = sDelphiDotNetPersonality then
|
|
lGalleryCategory := sCategoryDelphiDotNetNew
|
|
else if fPersonality = sCSharpPersonality then
|
|
lGalleryCategory := sCategoryCSharpNew
|
|
else if fPersonality = sVBPersonality then
|
|
lGalleryCategory := sCategoryVBNew
|
|
else
|
|
exit;
|
|
|
|
lGalleryManager := (BorlandIDEServices as IOTAGalleryCategoryManager);
|
|
|
|
lGallery := lGalleryManager.FindCategory(lGalleryCategory);
|
|
if assigned(lGallery) then begin
|
|
|
|
if fPersonality = sVBPersonality then
|
|
ShowMessage(lGalleryCategory+' '+fPersonality+' '+GetName+ ' - '+lGallery.DisplayName);
|
|
|
|
result := lGalleryManager.FindCategory(GetPage());
|
|
if not assigned(result) then begin
|
|
lGalleryManager.AddCategory(lGallery, GetPage()+'.'+fPersonality, GetPage());
|
|
end;
|
|
end
|
|
else begin
|
|
result := lGalleryManager.FindCategory(sCategoryGalileoOther);
|
|
end;
|
|
|
|
end;
|
|
{$ENDIF}
|
|
|
|
function TEWRepositoryExpert.GetPersonality: string;
|
|
begin
|
|
result := fPersonality;
|
|
end;
|
|
|
|
end.
|
|
|
|
|