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; fParameters: TStringList;
fToolAlias: string; fToolAlias: string;
fQueryParams: boolean; fQueryParams: boolean;
fChainBefore: TStringList;
fChainAfter: TStringList;
//fShortcut: string; //fShortcut: string;
fLogMessager: TCELogMessageSubject; fLogMessager: TCELogMessageSubject;
procedure setParameters(const aValue: TStringList); procedure setParameters(aValue: TStringList);
procedure setChainBefore(aValue: TStringList);
procedure setChainAfter(aValue: TStringList);
procedure processOutput(sender: TObject); procedure processOutput(sender: TObject);
procedure execute;
published published
property toolAlias: string read fToolAlias write fToolAlias; property toolAlias: string read fToolAlias write fToolAlias;
property options: TProcessOptions read fOpts write fOpts; property options: TProcessOptions read fOpts write fOpts;
@ -32,12 +37,12 @@ type
property parameters: TStringList read fParameters write setParameters; property parameters: TStringList read fParameters write setParameters;
property showWindows: TShowWindowOptions read fShowWin write fShowWin; property showWindows: TShowWindowOptions read fShowWin write fShowWin;
property queryParameters: boolean read fQueryParams write fQueryParams; 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; //property shortcut: string read fShortcut write fShortcut;
public public
constructor create(ACollection: TCollection); override; constructor create(ACollection: TCollection); override;
destructor destroy; override; destructor destroy; override;
//
procedure execute;
end; end;
TCETools = class(TWritableComponent, ICEMainMenuProvider) TCETools = class(TWritableComponent, ICEMainMenuProvider)
@ -56,6 +61,8 @@ type
destructor destroy; override; destructor destroy; override;
// //
function addTool: TCEToolItem; function addTool: TCEToolItem;
procedure executeTool(aTool: TCEToolItem); overload;
procedure executeTool(aToolIndex: Integer); overload;
property tool[index: integer]: TCEToolItem read getTool; property tool[index: integer]: TCEToolItem read getTool;
end; end;
@ -75,22 +82,36 @@ begin
inherited; inherited;
fToolAlias := format('<tool %d>', [ID]); fToolAlias := format('<tool %d>', [ID]);
fParameters := TStringList.create; fParameters := TStringList.create;
fChainBefore := TStringList.Create;
fChainAfter := TStringList.Create;
fLogMessager := TCELogMessageSubject.create; fLogMessager := TCELogMessageSubject.create;
end; end;
destructor TCEToolItem.destroy; destructor TCEToolItem.destroy;
begin begin
fParameters.Free; fParameters.Free;
fChainAfter.Free;
fChainBefore.Free;
fLogMessager.Free; fLogMessager.Free;
killProcess(fProcess); killProcess(fProcess);
inherited; inherited;
end; end;
procedure TCEToolItem.setParameters(const aValue: TStringList); procedure TCEToolItem.setParameters(aValue: TStringList);
begin begin
fParameters.Assign(aValue); fParameters.Assign(aValue);
end; end;
procedure TCEToolItem.setChainBefore(aValue: TStringList);
begin
fChainBefore.Assign(aValue);
end;
procedure TCEToolItem.setChainAfter(aValue: TStringList);
begin
fChainAfter.Assign(aValue);
end;
procedure TCEToolItem.execute; procedure TCEToolItem.execute;
var var
i: Integer; i: Integer;
@ -155,7 +176,8 @@ end;
procedure TCETools.executeToolFromMenu(sender: TObject); procedure TCETools.executeToolFromMenu(sender: TObject);
begin begin
TCEToolItem(TMenuItem(sender).tag).execute; //TCEToolItem(TMenuItem(sender).tag).execute;
executeTool(TCEToolItem(TMenuItem(sender).tag));
end; end;
procedure TCETools.menuDeclare(item: TMenuItem); procedure TCETools.menuDeclare(item: TMenuItem);
@ -210,6 +232,36 @@ begin
result := TCEToolItem(fTools.Add); result := TCEToolItem(fTools.Add);
end; 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 initialization
RegisterClasses([TCEToolItem, TCETools]); RegisterClasses([TCEToolItem, TCETools]);
CustomTools := TCETools.create(nil); CustomTools := TCETools.create(nil);

View File

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