Componentes.Terceros.jvcl/official/3.32/devtools/PackagesCheck/DefineForm.pas

369 lines
11 KiB
ObjectPascal

{-----------------------------------------------------------------------------
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/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: DefineForm.pas, released on 2006-02-20.
The Initial Developer of the Original Code is Florent Ouchet [ouchet dott florent att laposte dott net]
Portions created by Florent Ouchet are Copyright (C) 2006 Florent Ouchet.
All Rights Reserved.
Contributor(s):
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: DefineForm.pas 10610 2006-05-19 13:35:08Z elahn $
unit DefineForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, JvExComCtrls, JvComCtrls, ActnList,
TargetInfo, JvDialogs;
type
TDefForm = class(TForm)
LabelSymbols: TLabel;
MemoSymbols: TMemo;
LabelTarget: TLabel;
ComboBoxTargets: TComboBox;
LabelIncludeDirs: TLabel;
MemoIncludeDirs: TMemo;
LabelUnits: TLabel;
JvTreeViewUnits: TJvTreeView;
ButtonLoadPackage: TButton;
ButtonAddPackage: TButton;
ButtonAddUnit: TButton;
ButtonDelete: TButton;
ButtonClose: TButton;
ActionList: TActionList;
ActionAddPackage: TAction;
ActionAddUnit: TAction;
ActionDelete: TAction;
ButtonAddTarget: TButton;
ButtonDeleteTarget: TButton;
ButtonRenameTarget: TButton;
ActionLoadPackage: TAction;
ActionRenameTarget: TAction;
ActionAddTarget: TAction;
ActionDeleteTarget: TAction;
JvOpenDialogBpl: TJvOpenDialog;
ButtonRename: TButton;
ActionRename: TAction;
procedure ActionAddPackageUpdate(Sender: TObject);
procedure ActionAddUnitUpdate(Sender: TObject);
procedure ActionAddPackageExecute(Sender: TObject);
procedure ActionAddUnitExecute(Sender: TObject);
procedure ActionDeleteExecute(Sender: TObject);
procedure ComboBoxTargetsChange(Sender: TObject);
procedure ActionDeleteUpdate(Sender: TObject);
procedure ActionLoadPackageUpdate(Sender: TObject);
procedure ActionRenameTargetExecute(Sender: TObject);
procedure ActionAddTargetUpdate(Sender: TObject);
procedure ActionDeleteTargetUpdate(Sender: TObject);
procedure ActionDeleteTargetExecute(Sender: TObject);
procedure ActionAddTargetExecute(Sender: TObject);
procedure ActionRenameTargetUpdate(Sender: TObject);
procedure ActionLoadPackageExecute(Sender: TObject);
procedure ActionRenameUpdate(Sender: TObject);
procedure ActionRenameExecute(Sender: TObject);
private
FTargetsInfo: TTargetsInfo;
FCurrentTarget: TTargetInfo;
procedure LoadTarget(ATargetInfo: TTargetInfo);
procedure SaveTarget(ATargetInfo: TTargetInfo);
public
function Execute(ATargetsInfo: TTargetsInfo): Boolean;
end;
implementation
uses
JclPeImage,
JclFileUtils;
{$R *.dfm}
{ TDefForm }
procedure TDefForm.ActionAddPackageExecute(Sender: TObject);
var
PackageName: string;
begin
PackageName := InputBox(Application.Title, 'Package name', '');
if PackageName <> '' then
JvTreeViewUnits.Items.AddChild(nil, PackageName);
end;
procedure TDefForm.ActionAddPackageUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled := JvTreeViewUnits.Enabled;
end;
procedure TDefForm.ActionAddTargetExecute(Sender: TObject);
var
TargetName: string;
begin
TargetName := InputBox(Application.Title, 'Target name', '');
if TargetName <> '' then
begin
SaveTarget(FCurrentTarget);
ComboBoxTargets.ItemIndex := ComboBoxTargets.Items.Add(TargetName);
FCurrentTarget := FTargetsInfo.AddInfo(TargetName);
LoadTarget(FCurrentTarget);
end;
end;
procedure TDefForm.ActionAddTargetUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled := True;
end;
procedure TDefForm.ActionAddUnitExecute(Sender: TObject);
var
UnitName: string;
CurrentNode: TTreeNode;
begin
CurrentNode := JvTreeViewUnits.Selected;
while CurrentNode.Parent <> nil do
CurrentNode := CurrentNode.Parent;
UnitName := InputBox(Application.Title, 'Unit name', '');
if UnitName <> '' then
JvTreeViewUnits.Items.AddChild(CurrentNode, UnitName);
end;
procedure TDefForm.ActionAddUnitUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled := JvTreeViewUnits.Enabled
and Assigned(JvTreeViewUnits.Selected);
end;
procedure TDefForm.ActionDeleteExecute(Sender: TObject);
begin
JvTreeViewUnits.Selected.Free;
end;
procedure TDefForm.ActionDeleteTargetExecute(Sender: TObject);
begin
FTargetsInfo.DeleteInfo(ComboBoxTargets.ItemIndex);
ComboBoxTargets.Items.Delete(ComboBoxTargets.ItemIndex);
ComboBoxTargets.ItemIndex := -1;
ComboBoxTargets.Text := '';
FCurrentTarget := nil;
LoadTarget(nil);
end;
procedure TDefForm.ActionDeleteTargetUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled := ComboBoxTargets.ItemIndex >= 0;
end;
procedure TDefForm.ActionDeleteUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled := JvTreeViewUnits.Enabled
and Assigned(JvTreeViewUnits.Selected);
end;
procedure TDefForm.ActionLoadPackageExecute(Sender: TObject);
var
PeImage: TJclPeImage;
ExportList: TJclPeExportFuncList;
IndexPackage, IndexFile, IndexExport, EndOfUnitPos: Integer;
ExportName, UnitName, FileName, PackageName: string;
TargetPackage: TTargetPackage;
begin
SaveTarget(FCurrentTarget);
if JvOpenDialogBpl.Execute then
begin
for IndexFile := 0 to JvOpenDialogBpl.Files.Count - 1 do
begin
FileName := JvOpenDialogBpl.Files.Strings[IndexFile];
PackageName := PathExtractFileNameNoExt(FileName);
IndexPackage := FCurrentTarget.IndexOf(PackageName);
if IndexPackage >= 0 then
TargetPackage := FCurrentTarget.Packages[IndexPackage]
else
TargetPackage := FCurrentTarget.AddPackage(PackageName);
TargetPackage.Clear;
PeImage := TJclPeImage.Create;
try
PeImage.FileName := FileName;
ExportList := PeImage.ExportList;
for IndexExport := 0 to ExportList.FunctionCount - 1 do
begin
ExportName := ExportList.Items[IndexExport].Name;
if (Length(ExportName) > 0) and (ExportName[1] = '@') then
begin
UnitName := Copy(ExportName, 2, Length(ExportName) - 1);
EndOfUnitPos := Pos('@', UnitName);
if EndOfUnitPos > 0 then
begin
SetLength(UnitName, EndOfUnitPos - 1);
if Pos('$', UnitName) = 0 then
TargetPackage.AddUnit(UnitName);
end;
end;
end;
finally
PeImage.Free;
end;
end;
end;
LoadTarget(FCurrentTarget);
end;
procedure TDefForm.ActionLoadPackageUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled := JvTreeViewUnits.Enabled;
end;
procedure TDefForm.ActionRenameExecute(Sender: TObject);
var
SelectedNode: TTreeNode;
begin
SelectedNode := JvTreeViewUnits.Selected;
SelectedNode.Text := InputBox(Application.Title, 'New name', SelectedNode.Text);
end;
procedure TDefForm.ActionRenameTargetExecute(Sender: TObject);
var
TargetName: string;
begin
TargetName := ComboBoxTargets.Text;
TargetName := InputBox(Application.Title, 'New target name', TargetName);
FTargetsInfo.Names[ComboBoxTargets.ItemIndex] := TargetName;
ComboBoxTargets.Items.Strings[ComboBoxTargets.ItemIndex] := TargetName;
end;
procedure TDefForm.ActionRenameTargetUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled := ComboBoxTargets.ItemIndex >= 0;
end;
procedure TDefForm.ActionRenameUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled := JvTreeViewUnits.Enabled
and Assigned(JvTreeViewUnits.Selected);
end;
procedure TDefForm.ComboBoxTargetsChange(Sender: TObject);
begin
SaveTarget(FCurrentTarget);
if ComboBoxTargets.ItemIndex >= 0 then
FCurrentTarget := FTargetsInfo.Infos[ComboBoxTargets.ItemIndex]
else
FCurrentTarget := nil;
LoadTarget(FCurrentTarget);
end;
function TDefForm.Execute(ATargetsInfo: TTargetsInfo): Boolean;
var
IndexTarget: Integer;
begin
FTargetsInfo := ATargetsInfo;
ComboBoxTargets.Items.Clear;
for IndexTarget := 0 to ATargetsInfo.TargetCount - 1 do
ComboBoxTargets.Items.Add(ATargetsInfo.Names[IndexTarget]);
if ATargetsInfo.TargetCount > 0 then
begin
ComboBoxTargets.ItemIndex := 0;
FCurrentTarget := ATargetsInfo.Infos[0];
end
else
FCurrentTarget := nil;
LoadTarget(FCurrentTarget);
Result := ShowModal = mrOk;
SaveTarget(FCurrentTarget);
end;
procedure TDefForm.LoadTarget(ATargetInfo: TTargetInfo);
var
IndexPackage, IndexUnit: Integer;
PackageTreeNode: TTreeNode;
TargetPackage: TTargetPackage;
begin
if Assigned(ATargetInfo) then
begin
MemoSymbols.Enabled := True;
MemoSymbols.Color := clWindow;
MemoSymbols.Lines.Assign(ATargetInfo.Defines);
MemoIncludeDirs.Enabled := True;
MemoIncludeDirs.Color := clWindow;
MemoIncludeDirs.Lines.Assign(ATargetInfo.IncludeDirs);
JvTreeViewUnits.Enabled := True;
JvTreeViewUnits.Color := clWindow;
JvTreeViewUnits.Items.Clear;
for IndexPackage := 0 to ATargetInfo.PackageCount - 1 do
begin
PackageTreeNode := JvTreeViewUnits.Items.AddChild(nil, ATargetInfo.Names[IndexPackage]);
TargetPackage := ATargetInfo.Packages[IndexPackage];
for IndexUnit := 0 to TargetPackage.UnitCount - 1 do
JvTreeViewUnits.Items.AddChild(PackageTreeNode, TargetPackage.Units[IndexUnit]);
end;
end
else
begin
MemoSymbols.Enabled := False;
MemoSymbols.Color := clBtnFace;
MemoSymbols.Lines.Clear;
MemoIncludeDirs.Enabled := False;
MemoIncludeDirs.Color := clBtnFace;
MemoIncludeDirs.Lines.Clear;
JvTreeViewUnits.Enabled := False;
JvTreeViewUnits.Color := clBtnFace;
JvTreeViewUnits.Items.Clear;
end;
end;
procedure TDefForm.SaveTarget(ATargetInfo: TTargetInfo);
var
IndexUnit: Integer;
PackageTreeNode: TTreeNode;
TargetPackage: TTargetPackage;
begin
if Assigned(ATargetInfo) then
begin
ATargetInfo.Clear;
ATargetInfo.Defines.Assign(MemoSymbols.Lines);
ATargetInfo.IncludeDirs.Assign(MemoIncludeDirs.Lines);
PackageTreeNode := JvTreeViewUnits.Items.GetFirstNode;
while Assigned(PackageTreeNode) do
begin
TargetPackage := ATargetInfo.AddPackage(PackageTreeNode.Text);
for IndexUnit := 0 to PackageTreeNode.Count - 1 do
TargetPackage.AddUnit(PackageTreeNode.Item[IndexUnit].Text);
PackageTreeNode := PackageTreeNode.getNextSibling;
end;
end;
end;
end.