Componentes.Terceros.jcl/official/1.96/experts/projectanalyzer/ProjAnalyzerImpl.pas

300 lines
10 KiB
ObjectPascal

{**************************************************************************************************}
{ }
{ Project JEDI Code Library (JCL) }
{ }
{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); }
{ you may not use this file except in compliance with the License. You may obtain a copy of the }
{ License at http://www.mozilla.org/MPL/ }
{ }
{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF }
{ ANY KIND, either express or implied. See the License for the specific language governing rights }
{ and limitations under the License. }
{ }
{ The Original Code is ProjAnalyzerImpl.pas. }
{ }
{ The Initial Developer of the Original Code is documented in the accompanying }
{ help file JCL.chm. Portions created by these individuals are Copyright (C) of these individuals. }
{ }
{**************************************************************************************************}
{ }
{ Unit owner: Petr Vones }
{ Last modified: March 17, 2002 }
{ }
{**************************************************************************************************}
unit ProjAnalyzerImpl;
{$I jcl.inc}
interface
uses
Classes, Menus, ActnList, ToolsAPI, SysUtils, Graphics, Dialogs, Forms,
JclOtaUtils, ProjAnalyzerFrm;
type
TJclProjectAnalyzerExpert = class(TJclOTAExpert)
private
FBuildMenuItem: TMenuItem;
FBuildAction: TAction;
procedure ActionExecute(Sender: TObject);
procedure ActionUpdate(Sender: TObject);
public
constructor Create; reintroduce;
destructor Destroy; override;
procedure RegisterCommands; override;
procedure UnregisterCommands; override;
end;
// design package entry point
procedure Register;
// expert DLL entry point
function JCLWizardInit(const BorlandIDEServices: IBorlandIDEServices;
RegisterProc: TWizardRegisterProc;
var TerminateProc: TWizardTerminateProc): Boolean; stdcall;
implementation
{$R ProjAnalyzerIcon.res}
uses
JclDebug, JclFileUtils, JclOtaConsts,
JclOtaResources;
procedure Register;
begin
try
RegisterPackageWizard(TJclProjectAnalyzerExpert.Create);
except
on ExceptionObj: TObject do
begin
JclExpertShowExceptionDialog(ExceptionObj);
raise;
end;
end;
end;
var
JCLWizardIndex: Integer;
procedure JclWizardTerminate;
var
OTAWizardServices: IOTAWizardServices;
begin
try
if JCLWizardIndex <> -1 then
begin
Supports(BorlandIDEServices, IOTAWizardServices, OTAWizardServices);
if not Assigned(OTAWizardServices) then
raise EJclExpertException.CreateTrace(RsENoWizardServices);
OTAWizardServices.RemoveWizard(JCLWizardIndex);
end;
except
on ExceptionObj: TObject do
begin
JclExpertShowExceptionDialog(ExceptionObj);
end;
end;
end;
function JCLWizardInit(const BorlandIDEServices: IBorlandIDEServices;
RegisterProc: TWizardRegisterProc;
var TerminateProc: TWizardTerminateProc): Boolean stdcall;
var
OTAWizardServices: IOTAWizardServices;
begin
try
TerminateProc := JclWizardTerminate;
Supports(BorlandIDEServices, IOTAWizardServices, OTAWizardServices);
if not Assigned(OTAWizardServices) then
raise EJclExpertException.CreateTrace(RsENoWizardServices);
JCLWizardIndex := OTAWizardServices.AddWizard(TJclProjectAnalyzerExpert.Create);
Result := True;
except
on ExceptionObj: TObject do
begin
JclExpertShowExceptionDialog(ExceptionObj);
Result := False;
end;
end;
end;
//=== { TJclProjectAnalyzerExpert } ==========================================
constructor TJclProjectAnalyzerExpert.Create;
begin
inherited Create('JclProjectAnalyzerExpert');
end;
destructor TJclProjectAnalyzerExpert.Destroy;
begin
FreeAndNil(ProjectAnalyzerForm);
inherited Destroy;
end;
procedure TJclProjectAnalyzerExpert.ActionExecute(Sender: TObject);
var
TempActiveProject: IOTAProject;
BuildOK, Succ: Boolean;
ProjOptions: IOTAProjectOptions;
SaveMapFile: Variant;
OutputDirectory, ProjectFileName, MapFileName, ExecutableFileName: string;
ProjectName: string;
OptionsModifiedState: Boolean;
begin
try
TempActiveProject := ActiveProject;
if not Assigned(TempActiveProject) then
raise EJclExpertException.CreateTrace(RsENoActiveProject);
ProjectFileName := TempActiveProject.FileName;
ProjectName := ExtractFileName(ProjectFileName);
Succ := False;
ProjOptions := TempActiveProject.ProjectOptions;
if not Assigned(ProjOptions) then
raise EJclExpertException.CreateTrace(RsENoProjectOptions);
OutputDirectory := GetOutputDirectory(TempActiveProject);
MapFileName := GetMapFileName(TempActiveProject);
if ProjectAnalyzerForm = nil then
begin
ProjectAnalyzerForm := TProjectAnalyzerForm.Create(Application, Settings);
ProjectAnalyzerForm.Show;
end;
ProjectAnalyzerForm.ClearContent;
ProjectAnalyzerForm.StatusBarText := Format(RsBuildingProject, [ProjectName]);
OptionsModifiedState := ProjOptions.ModifiedState;
SaveMapFile := ProjOptions.Values[MapFileOptionName];
ProjOptions.Values[MapFileOptionName] := MapFileOptionDetailed;
BuildOK := TempActiveProject.ProjectBuilder.BuildProject(cmOTABuild, False);
ProjOptions.Values[MapFileOptionName] := SaveMapFile;
ProjOptions.ModifiedState := OptionsModifiedState;
if BuildOK then
begin // Build was successful, continue ...
Succ := FileExists(MapFileName) and FindExecutableName(MapFileName, OutputDirectory, ExecutableFileName);
if Succ then
begin // MAP files was created
ProjectAnalyzerForm.SetFileName(ExecutableFileName, MapFileName, ProjectName);
ProjectAnalyzerForm.Show;
end;
if SaveMapFile <> MapFileOptionDetailed then
begin // delete MAP and DRC file
DeleteFile(MapFileName);
DeleteFile(ChangeFileExt(MapFileName, DrcFileExtension));
end;
end;
if not Succ then
begin
ProjectAnalyzerForm.StatusBarText := '';
if BuildOK then
MessageDlg(RsCantFindFiles, mtError, [mbOk], 0);
end;
except
on ExceptionObj: TObject do
begin
JclExpertShowExceptionDialog(ExceptionObj);
raise;
end;
end;
end;
procedure TJclProjectAnalyzerExpert.ActionUpdate(Sender: TObject);
var
TempActiveProject: IOTAProject;
ProjectName: string;
begin
try
TempActiveProject := ActiveProject;
if Assigned(TempActiveProject) then
ProjectName := ExtractFileName(TempActiveProject.FileName)
else
ProjectName := '';
FBuildAction.Enabled := Assigned(TempActiveProject);
if not FBuildAction.Enabled then
ProjectName := RsProjectNone;
FBuildAction.Caption := Format(RsAnalyzeActionCaption, [ProjectName]);
except
on ExceptionObj: TObject do
begin
JclExpertShowExceptionDialog(ExceptionObj);
raise;
end;
end;
end;
procedure TJclProjectAnalyzerExpert.RegisterCommands;
var
IDEMainMenu: TMainMenu;
IDEProjectItem: TMenuItem;
IDEActionList: TActionList;
I: Integer;
ImageBmp: TBitmap;
begin
inherited RegisterCommands;
FBuildAction := TAction.Create(nil);
FBuildAction.Caption := Format(RsAnalyzeActionCaption, [RsProjectNone]);
FBuildAction.Visible := True;
FBuildAction.OnExecute := ActionExecute;
FBuildAction.OnUpdate := ActionUpdate;
FBuildAction.Name := RsAnalyzeActionName;
ImageBmp := TBitmap.Create;
try
ImageBmp.LoadFromResourceName(FindResourceHInstance(ModuleHInstance), 'PROJANALYZER');
FBuildAction.ImageIndex := NTAServices.AddMasked(ImageBmp, clOlive);
finally
ImageBmp.Free;
end;
IDEMainMenu := NTAServices.MainMenu;
IDEProjectItem := nil;
with IDEMainMenu do
for I := 0 to Items.Count - 1 do
if Items[I].Name = 'ProjectMenu' then
begin
IDEProjectItem := Items[I];
Break;
end;
if not Assigned(IDEProjectItem) then
raise EJclExpertException.CreateTrace(RsENoProjectMenuItem);
with IDEProjectItem do
for I := 0 to Count - 1 do
if Items[I].Name = 'ProjectInformationItem' then
begin
IDEActionList := TActionList(NTAServices.ActionList);
if Assigned(Items[I].Action) then
FBuildAction.Category := TContainedAction(Items[I].Action).Category;
FBuildAction.ActionList := IDEActionList;
RegisterAction(FBuildAction);
FBuildMenuItem := TMenuItem.Create(nil);
FBuildMenuItem.Action := FBuildAction;
IDEProjectItem.Insert(I + 1, FBuildMenuItem);
System.Break;
end;
if not Assigned(FBuildMenuItem.Parent) then
raise EJclExpertException.CreateTrace(RsAnalyseMenuItemNotInserted);
end;
procedure TJclProjectAnalyzerExpert.UnregisterCommands;
begin
inherited UnregisterCommands;
UnregisterAction(FBuildAction);
FreeAndNil(FBuildMenuItem);
FreeAndNil(FBuildAction);
end;
end.