1 {
2  ***************************************************************************
3  *                                                                         *
4  *   This source is free software; you can redistribute it and/or modify   *
5  *   it under the terms of the GNU General Public License as published by  *
6  *   the Free Software Foundation; either version 2 of the License, or     *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
9  *   This code is distributed in the hope that it will be useful, but      *
10  *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
12  *   General Public License for more details.                              *
13  *                                                                         *
14  *   A copy of the GNU General Public License is available on the World    *
15  *   Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also      *
16  *   obtain it by writing to the Free Software Foundation,                 *
17  *   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA.   *
18  *                                                                         *
19  ***************************************************************************
20 
21   Author: Mattias Gaertner
22 
23   Abstract:
24     Defines the TExternalToolList which stores the settings of all external
25     tools. (= Programfilename and parameters)
26     And provides TExternalToolDlg which is a dialog for editing this list.
27 }
28 unit ExtToolDialog;
29 
30 {$mode objfpc}
31 {$H+}
32 
33 {$I ide.inc}
34 
35 interface
36 
37 uses
38   {$IFDEF IDE_MEM_CHECK}
39   MemCheck,
40   {$ENDIF}
41   Classes, SysUtils, LCLType, LCLProc, Controls, Forms,
42   Buttons, StdCtrls, ComCtrls, Dialogs, ExtCtrls, ButtonPanel, Menus,
43   FileProcs, FileUtil,
44   IDEExternToolIntf, IDEImagesIntf, IDEDialogs, IDEHelpIntf, IDECommands,
45   ProjectIntf,
46   EnvironmentOpts,
47   ExtToolEditDlg, KeyMapping, TransferMacros, IDEProcs, LazFileUtils,
48   CompilerOptions,
49   LazarusIDEStrConsts, IDEOptionDefs, EditorOptions;
50 
51 const
52   MaxExtTools = ecExtToolLast-ecExtToolFirst+1;
53 
54 type
55   { TExternalToolDialog -
56     the dialog to edit all external tools }
57 
58   TExternalToolDialog = class(TForm)
59     ButtonPanel: TButtonPanel;
60     ListBox: TListBox;
61     MenuItemImport: TMenuItem;
62     MenuItemExport: TMenuItem;
63     MenuItemSeparator: TMenuItem;
64     MenuItemClone: TMenuItem;
65     OpenDialog1: TOpenDialog;
66     PopupDropdownMenu: TPopupMenu;
67     SaveDialog1: TSaveDialog;
68     ToolBar: TToolBar;
69     AddButton: TToolButton;
70     RemoveButton: TToolButton;
71     EditButton: TToolButton;
72     tbSeparator: TToolButton;
73     MoveUpButton: TToolButton;
74     MoveDownButton: TToolButton;
75     tbSeparator2: TToolButton;
76     ExtraButton: TToolButton;
77     procedure AddButtonClick(Sender: TObject);
78     procedure HelpButtonClick(Sender: TObject);
79     procedure MenuItemCloneClick(Sender: TObject);
80     procedure MenuItemExportClick(Sender: TObject);
81     procedure MenuItemImportClick(Sender: TObject);
82     procedure RemoveButtonClick(Sender: TObject);
83     procedure EditButtonClick(Sender: TObject);
84     procedure MoveUpButtonClick(Sender: TObject);
85     procedure MoveDownButtonClick(Sender: TObject);
86     procedure ListboxClick(Sender: TObject);
87   private
88     fExtToolList: TExternalUserTools;
89     fTransferMacros: TTransferMacroList;
90     procedure Load;
91     procedure SetExtToolList(NewExtToolList: TExternalUserTools);
92     procedure SetTransferMacros(NewMacros: TTransferMacroList);
ToolDescriptionnull93     function ToolDescription(Index: integer): string;
94     procedure EnableButtons;
95   public
96     constructor Create(AnOwner: TComponent); override;
97     destructor Destroy; override;
98     property ExtToolList: TExternalUserTools read fExtToolList write SetExtToolList;
99     property TransferMacros: TTransferMacroList
100                                    read fTransferMacros write SetTransferMacros;
101   end;
102 
ShowExtToolDialognull103 function ShowExtToolDialog(ExtToolList: TExternalUserTools;
104   TransferMacros: TTransferMacroList):TModalResult;
105 
106 implementation
107 
108 {$R *.lfm}
109 
ShowExtToolDialognull110 function ShowExtToolDialog(ExtToolList: TExternalUserTools;
111   TransferMacros: TTransferMacroList):TModalResult;
112 var
113   ExternalToolDialog: TExternalToolDialog;
114 begin
115   Result:=mrCancel;
116   ExternalToolDialog:=TExternalToolDialog.Create(nil);
117   try
118     ExternalToolDialog.TransferMacros:=TransferMacros;
119     ExternalToolDialog.ExtToolList:=ExtToolList;
120     Result:=ExternalToolDialog.ShowModal;
121     if Result=mrOk then
122       ExtToolList.Assign(ExternalToolDialog.ExtToolList);
123   finally
124     ExternalToolDialog.Free;
125   end;
126 end;
127 
128 { TExternalToolDialog }
129 
130 constructor TExternalToolDialog.Create(AnOwner: TComponent);
131 begin
132   inherited Create(AnOwner);
133   Name:='ExternalToolDialog';
134 
135   Caption:=lisExtToolExternalTools;
136 
137   ToolBar.Images := IDEImages.Images_16;
138 
139   AddButton.Caption:=lisAdd;
140   RemoveButton.Caption:=lisRemove;
141   EditButton.Caption:=lisEdit;
142   MoveUpButton.Caption:=lisUp;
143   MoveDownButton.Caption:=lisDown;
144 
145   ExtraButton.Caption:=lisMoreSub;
146   ExtraButton.Style:=tbsButtonDrop;
147   MenuItemClone.Caption:=lisClone;
148   MenuItemExport.Caption:=lisDlgExport;
149   MenuItemImport.Caption:=lisDlgImport;
150 
151   ButtonPanel.HelpButton.OnClick := @HelpButtonClick;
152 
153   AddButton.ImageIndex := IDEImages.LoadImage('laz_add');
154   RemoveButton.ImageIndex := IDEImages.LoadImage('laz_delete');
155   EditButton.ImageIndex := IDEImages.LoadImage('laz_edit');
156   MoveUpButton.ImageIndex := IDEImages.LoadImage('arrow_up');
157   MoveDownButton.ImageIndex := IDEImages.LoadImage('arrow_down');
158 
159   fExtToolList:=TExternalUserTools.Create;
160 
161   OpenDialog1.Filter:= dlgFilterXML+'|*.xml|'+dlgFilterAll+'|'+GetAllFilesMask;
162   SaveDialog1.Filter:= OpenDialog1.Filter;
163 end;
164 
165 destructor TExternalToolDialog.Destroy;
166 begin
167   FreeAndNil(fExtToolList);
168   inherited Destroy;
169 end;
170 
171 procedure TExternalToolDialog.SetExtToolList(NewExtToolList: TExternalUserTools);
172 begin
173   if fExtToolList=NewExtToolList then exit;
174   fExtToolList.Assign(NewExtToolList);
175   Load;
176 end;
177 
178 procedure TExternalToolDialog.SetTransferMacros(NewMacros: TTransferMacroList);
179 begin
180   if fTransferMacros=NewMacros then exit;
181   fTransferMacros:=NewMacros;
182 end;
183 
ToolDescriptionnull184 function TExternalToolDialog.ToolDescription(Index: integer): string;
185 begin
186   Result:=fExtToolList[Index].Title;
187   if Result='' then
188     Result:=ExtractFilename(fExtToolList[Index].Filename);
189   //DebugLn(['TExternalToolDialog.ToolDescription Index=',Index,' Result=',Result,' Cmd="',fExtToolList[Index].Filename,' ',fExtToolList[Index].CmdLineParams,'"']);
190 end;
191 
192 procedure TExternalToolDialog.Load;
193 var
194   i: integer;
195 begin
196   Listbox.Items.BeginUpdate;
197   Listbox.Items.Clear;
198   for i:=0 to fExtToolList.Count-1 do
199     Listbox.Items.Add(ToolDescription(i));
200   Listbox.Items.EndUpdate;
201   EnableButtons;
202 end;
203 
204 procedure TExternalToolDialog.AddButtonClick(Sender: TObject);
205 var
206   MsgResult: TModalResult;
207   NewTool: TExternalUserTool;
208 begin
209   if fExtToolList.Count>=MaxExtTools then begin
210     IDEMessageDialog(lisExtToolMaximumToolsReached,
211                   Format(lisExtToolThereIsAMaximumOfTools, [IntToStr(MaxExtTools)]),
212                   mtInformation,[mbCancel]);
213     exit;
214   end;
215   NewTool:=TExternalUserTool.Create(nil);
216   MsgResult:=ShowExtToolOptionDlg(fTransferMacros, NewTool, EditorOpts.KeyMap);
217   if MsgResult=mrOk then
218   begin
219     fExtToolList.Add(NewTool);
220     Listbox.Items.Add(ToolDescription(fExtToolList.Count-1));
221   end else begin
222     NewTool.Free;
223   end;
224   EnableButtons;
225 end;
226 
227 procedure TExternalToolDialog.HelpButtonClick(Sender: TObject);
228 begin
229   LazarusHelp.ShowHelpForIDEControl(Self);
230 end;
231 
232 procedure TExternalToolDialog.MenuItemCloneClick(Sender: TObject);
233 var
234   NewTool, OldTool: TExternalUserTool;
235 begin
236   If Listbox.ItemIndex <> -1 Then Begin
237     OldTool := fExtToolList.Items[Listbox.ItemIndex];
238     If Assigned(OldTool) Then Begin
239       NewTool:=TExternalUserTool.Create(nil);
240       NewTool.Assign(OldTool);
241       fExtToolList.Add(NewTool);
242       Listbox.Items.Add(ToolDescription(fExtToolList.Count-1));
243     end;
244   end;
245 end;
246 
247 procedure TExternalToolDialog.MenuItemExportClick(Sender: TObject);
248 Var
249   FileConfig : TXMLOptionsStorage;
250   AFileName : String;
251 begin
252   If SaveDialog1.Execute Then Begin
253     AFileName := SaveDialog1.FileName;
254     Case SaveDialog1.FilterIndex Of
255       1 : Begin
256             AFileName := ChangeFileExt(AFileName, '.xml');
257           end;
258     end;
259     FileConfig := TXMLOptionsStorage.Create(AFileName, False);
260     fExtToolList.Save(FileConfig);
261     FileConfig.WriteToDisk;
262     FreeAndNil(FileConfig);
263   end;
264 end;
265 
266 procedure TExternalToolDialog.MenuItemImportClick(Sender: TObject);
267 Var
268   FileConfig: TXMLOptionsStorage;
269   NewToolList: TExternalUserTools;
270 begin
271   If OpenDialog1.Execute Then Begin
272     NewToolList := TExternalUserTools.Create;
273     FileConfig := TXMLOptionsStorage.Create(OpenDialog1.FileName, True);
274     NewToolList.Load(FileConfig);
275     SetExtToolList(NewToolList);
276     FreeAndNil(FileConfig);
277     FreeAndNil(NewToolList);
278   end;
279 end;
280 
281 procedure TExternalToolDialog.RemoveButtonClick(Sender: TObject);
282 begin
283   if Listbox.ItemIndex<0 then exit;
284   fExtToolList.Delete(Listbox.ItemIndex);
285   ListBox.Items.Delete(Listbox.ItemIndex);
286   EnableButtons;
287 end;
288 
289 procedure TExternalToolDialog.EditButtonClick(Sender: TObject);
290 var
291   i: LongInt;
292 begin
293   i:=Listbox.ItemIndex;
294   if i<0 then exit;
295   if ShowExtToolOptionDlg(fTransferMacros,fExtToolList[i],EditorOpts.KeyMap)=mrOk
296   then begin
297     Listbox.Items[i]:=ToolDescription(i);
298     EnableButtons;
299   end;
300 end;
301 
302 procedure TExternalToolDialog.MoveUpButtonClick(Sender: TObject);
303 var
304   i: integer;
305 begin
306   i:=Listbox.ItemIndex;
307   if i<1 then exit;
308   fExtToolList.Move(i,i-1);
309   Listbox.Items.Move(i,i-1);
310   Listbox.ItemIndex:=i-1;
311   EnableButtons;
312 end;
313 
314 procedure TExternalToolDialog.MoveDownButtonClick(Sender: TObject);
315 var
316   i: integer;
317 begin
318   i:=Listbox.ItemIndex;
319   if (i<0) or (i>=Listbox.Items.Count-1) then exit;
320   fExtToolList.Move(i,i+1);
321   Listbox.Items.Move(i,i+1);
322   Listbox.ItemIndex:=i+1;
323   EnableButtons;
324 end;
325 
326 procedure TExternalToolDialog.EnableButtons;
327 var
328   i: integer;
329 begin
330   i:=Listbox.ItemIndex;
331   AddButton.Enabled:=fExtToolList.Count<MaxExtTools;
332   RemoveButton.Enabled:=(i>=0);
333   EditButton.Enabled:=(i>=0);
334   MoveUpButton.Enabled:=(i>0);
335   MoveDownButton.Enabled:=(i>=0) and (i<fExtToolList.Count-1);
336 end;
337 
338 procedure TExternalToolDialog.ListboxClick(Sender: TObject);
339 begin
340   EnableButtons;
341 end;
342 
343 end.
344