From ebb34743b8f6263cb178fb6ba09c893aef2bd52b Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Mon, 5 Jan 2015 09:20:20 +0100 Subject: [PATCH] added "tool-chaining" feature to custom tools --- src/ce_tools.pas | 62 ++++++++++++++++++++++++++++++++++++++---- src/ce_toolseditor.pas | 14 ++++++---- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/ce_tools.pas b/src/ce_tools.pas index 2d25ff5e..5891c0cf 100644 --- a/src/ce_tools.pas +++ b/src/ce_tools.pas @@ -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('', [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); diff --git a/src/ce_toolseditor.pas b/src/ce_toolseditor.pas index 70aa8e50..b79cee5f 100644 --- a/src/ce_toolseditor.pas +++ b/src/ce_toolseditor.pas @@ -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.