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