added "tool-chaining" feature to custom tools

This commit is contained in:
Basile Burg 2015-01-05 09:20:20 +01:00
parent 75a9d12a57
commit ebb34743b8
2 changed files with 66 additions and 10 deletions

View File

@ -20,10 +20,15 @@ type
fParameters: TStringList;
fToolAlias: string;
fQueryParams: boolean;
fChainBefore: TStringList;
fChainAfter: TStringList;
//fShortcut: string;
fLogMessager: TCELogMessageSubject;
procedure setParameters(const aValue: TStringList);
procedure setParameters(aValue: TStringList);
procedure setChainBefore(aValue: TStringList);
procedure setChainAfter(aValue: TStringList);
procedure processOutput(sender: TObject);
procedure execute;
published
property toolAlias: string read fToolAlias write fToolAlias;
property options: TProcessOptions read fOpts write fOpts;
@ -32,12 +37,12 @@ type
property parameters: TStringList read fParameters write setParameters;
property showWindows: TShowWindowOptions read fShowWin write fShowWin;
property queryParameters: boolean read fQueryParams write fQueryParams;
property chainBefore: TStringList read fChainBefore write setchainBefore;
property chainAfter: TStringList read fChainAfter write setChainAfter;
//property shortcut: string read fShortcut write fShortcut;
public
constructor create(ACollection: TCollection); override;
destructor destroy; override;
//
procedure execute;
end;
TCETools = class(TWritableComponent, ICEMainMenuProvider)
@ -56,6 +61,8 @@ type
destructor destroy; override;
//
function addTool: TCEToolItem;
procedure executeTool(aTool: TCEToolItem); overload;
procedure executeTool(aToolIndex: Integer); overload;
property tool[index: integer]: TCEToolItem read getTool;
end;
@ -75,22 +82,36 @@ begin
inherited;
fToolAlias := format('<tool %d>', [ID]);
fParameters := TStringList.create;
fChainBefore := TStringList.Create;
fChainAfter := TStringList.Create;
fLogMessager := TCELogMessageSubject.create;
end;
destructor TCEToolItem.destroy;
begin
fParameters.Free;
fChainAfter.Free;
fChainBefore.Free;
fLogMessager.Free;
killProcess(fProcess);
inherited;
end;
procedure TCEToolItem.setParameters(const aValue: TStringList);
procedure TCEToolItem.setParameters(aValue: TStringList);
begin
fParameters.Assign(aValue);
end;
procedure TCEToolItem.setChainBefore(aValue: TStringList);
begin
fChainBefore.Assign(aValue);
end;
procedure TCEToolItem.setChainAfter(aValue: TStringList);
begin
fChainAfter.Assign(aValue);
end;
procedure TCEToolItem.execute;
var
i: Integer;
@ -155,7 +176,8 @@ end;
procedure TCETools.executeToolFromMenu(sender: TObject);
begin
TCEToolItem(TMenuItem(sender).tag).execute;
//TCEToolItem(TMenuItem(sender).tag).execute;
executeTool(TCEToolItem(TMenuItem(sender).tag));
end;
procedure TCETools.menuDeclare(item: TMenuItem);
@ -210,6 +232,36 @@ begin
result := TCEToolItem(fTools.Add);
end;
procedure TCETools.executeTool(aTool: TCEToolItem);
var
nme: string;
chained: TCollectionItem;
begin
if aTool = nil then exit;
if not exeInSysPath(aTool.executable) then
if (aTool.chainAfter.Count = 0) and (aTool.chainBefore.Count = 0) then
exit;
// TODO-cWiki: toolchain, process is async but poWaitOnExit can be set to force syncro.
for nme in aTool.chainBefore do
for chained in fTools do
if TCEToolItem(chained).toolAlias = nme then
TCEToolItem(chained).execute;
if exeInSysPath(aTool.executable) then
aTool.execute;
for nme in aTool.chainAfter do
for chained in fTools do
if TCEToolItem(chained).toolAlias = nme then
TCEToolItem(chained).execute;
end;
procedure TCETools.executeTool(aToolIndex: Integer);
begin
if aToolIndex < 0 then exit;
if aToolIndex > fTools.Count-1 then exit;
//
executeTool(tool[aToolIndex]);
end;
initialization
RegisterClasses([TCEToolItem, TCETools]);
CustomTools := TCETools.create(nil);

View File

@ -31,6 +31,7 @@ type
procedure lstToolsSelectionChange(Sender: TObject; User: boolean);
procedure propsEdModified(Sender: TObject);
private
procedure executeSelectedTool;
procedure DataToGui;
procedure updateNames;
public
@ -137,18 +138,21 @@ begin
updateNames;
end;
procedure TCEToolsEditorWidget.btnRunClick(Sender: TObject);
procedure TCEToolsEditorWidget.executeSelectedTool;
begin
if lstTools.ItemIndex = -1 then
exit;
CustomTools.tool[lstTools.ItemIndex].execute;
CustomTools.executeTool(lstTools.ItemIndex);
end;
procedure TCEToolsEditorWidget.btnRunClick(Sender: TObject);
begin
executeSelectedTool;
end;
procedure TCEToolsEditorWidget.lstToolsDblClick(Sender: TObject);
begin
if lstTools.ItemIndex = -1 then
exit;
CustomTools.tool[lstTools.ItemIndex].execute;
executeSelectedTool;
end;
end.