1 {
2 *****************************************************************************
3 * This file is part of the EducationLaz package
4 *
5 * See the file COPYING.modifiedLGPL.txt, included in this distribution,
6 * for details about the license.
7 *****************************************************************************
8
9 Author: Michael Kuhardt
10
11 Abstract:
12 Frame to setup SpeedButtons
13 }
14 unit EduSpeedButtons;
15
16 {$mode objfpc}{$H+}
17
18 interface
19
20 uses
21 Classes, SysUtils, Laz_AVL_Tree,
22 // LCL
23 Controls, Graphics, LResources, Forms, StdCtrls, ExtCtrls, Dialogs,
24 ComCtrls, Buttons,
25 // LazUtils
26 LazConfigStorage, AvgLvlTree,
27 // IdeIntf
28 IDEOptionsIntf, IDEOptEditorIntf, LazIDEIntf, IDEImagesIntf,
29 // Education
30 EduOptions;
31
32 type
33
34 { EduSpeedButtonsOptions }
35
36 TEduSpeedButtonsOptions = class(TEduOptionsNode)
37 private
38 fVisible: TStringToStringTree;
GetButtonVisiblenull39 function GetButtonVisible(ButtonName: string): boolean;
40 procedure SetButtonVisible(ButtonName: string; const AValue: boolean);
41
42 public
43 constructor Create; override;
44 destructor Destroy; override;
Loadnull45 function Load(Config: TConfigStorage): TModalResult; override;
Savenull46 function Save(Config: TConfigStorage): TModalResult; override;
GetToolBarnull47 function GetToolBar(tbName: string): TToolBar;
48 procedure Apply(Enable: boolean); override;
49 property ButtonVisible[ButtonName: string]: boolean read GetButtonVisible write SetButtonVisible;
50
51 end;
52
53 { TEduSpeedButtonsFrame }
54
55 TEduSpeedButtonsFrame = class(TAbstractIDEOptionsEditor)
56 ShowSelectionButton: TButton;
57 ShowAllButton: TButton;
58 HideAllButton: TButton;
59 SpeedButtonsGroupBox: TGroupBox;
60 Panel: TPanel;
61 SpeedButtonsTreeView: TTreeView;
62 procedure HideAllButtonClick(Sender: TObject);
63 procedure ShowAllButtonClick(Sender: TObject);
64 procedure ShowSelectionButtonClick(Sender: TObject);
65 procedure SpeedButtonsTreeViewMouseDown(Sender: TObject;
66 Button: TMouseButton; {%H-}Shift: TShiftState; X, Y: Integer);
67 procedure FrameClick(Sender: TObject);
68 private
69 HideImgID: LongInt;
70 ShowImgID: LongInt;
71 procedure FillSpeedButtonsTreeView;
72 procedure SaveFillSpeedButtonsTreeView;
73 procedure ShowHideAll(aShow: boolean);
74 procedure ShowSelected;
GetImageForSpeedBtnnull75 function GetImageForSpeedBtn(btnName: String): TCustomBitmap;
76 public
GetTitlenull77 function GetTitle: String; override;
78 procedure ReadSettings(AOptions: TAbstractIDEOptions); override;
79 procedure Setup({%H-}ADialog: TAbstractOptionsEditorDialog); override;
SupportedOptionsClassnull80 class function SupportedOptionsClass: TAbstractIDEOptionsClass; override;
81 procedure WriteSettings(AOptions: TAbstractIDEOptions); override;
82 end;
83
84 var
85 EduSpeedButtonsOptions: TEduSpeedButtonsOptions = nil;
86
87 procedure Register;
88
89 implementation
90
91 procedure Register;
92 begin
93 EduSpeedButtonsOptions:=TEduSpeedButtonsOptions.Create;
94 EducationOptions.Root.Add(EduSpeedButtonsOptions);
95 EduSpeedButtonsOptionsID:=RegisterIDEOptionsEditor(EduOptionID,
96 TEduSpeedButtonsFrame,EduSpeedButtonsOptionsID)^.Index;
97 end;
98
99 { TEduSpeedButtonsOptions }
100
101 constructor TEduSpeedButtonsOptions.Create;
102
103 begin
104 inherited Create;
105 Name:='SpeedButtons';
106 fVisible:=TStringToStringTree.Create(false);
107 end;
108
109 destructor TEduSpeedButtonsOptions.Destroy;
110 begin
111 FreeAndNil(fVisible);
112 inherited Destroy;
113 end;
114
TEduSpeedButtonsOptions.GetButtonVisiblenull115 function TEduSpeedButtonsOptions.GetButtonVisible(ButtonName: string): boolean;
116 begin
117 Result:=fVisible[ButtonName]='1';
118 end;
119
120 procedure TEduSpeedButtonsOptions.SetButtonVisible(
121 ButtonName: string; const AValue: boolean);
122 begin
123 if AValue then
124 fVisible[ButtonName]:='1'
125 else
126 fVisible.Remove(ButtonName);
127 end;
128
Loadnull129 function TEduSpeedButtonsOptions.Load(Config: TConfigStorage): TModalResult;
130 var
131 Cnt: LongInt;
132 i: Integer;
133 ButtonName: String;
134
135 begin
136
137 fVisible.Clear;
138 Cnt:=Config.GetValue('Visible/Count',0);
139 for i:=1 to Cnt do begin
140 ButtonName:=Config.GetValue('Visible/Item'+IntToStr(i),'');
141 if ButtonName='' then continue;
142 fVisible[ButtonName]:='1';
143 end;
144 Result:=inherited Load(Config);
145 end;
146
TEduSpeedButtonsOptions.Savenull147 function TEduSpeedButtonsOptions.Save(Config: TConfigStorage): TModalResult;
148 var
149 Node: TAvlTreeNode;
150 Item: PStringToStringItem;
151 Cnt: Integer;
152 begin
153 Cnt:=0;
154 Node:=fVisible.Tree.FindLowest;
155 while Node<>nil do begin
156 inc(Cnt);
157 Item:=PStringToStringItem(Node.Data);
158 Config.SetDeleteValue('Visible/Item'+IntToStr(Cnt),Item^.Name,'');
159 Node:=fVisible.Tree.FindSuccessor(Node);
160 end;
161 Config.SetDeleteValue('Visible/Count',Cnt,0);
162 Result:=inherited Save(Config);
163
164 end;
165
166 procedure TEduSpeedButtonsOptions.Apply(Enable: boolean);
167 var
168 i: Integer;
169 curButton: TToolButton;
170 Bar: TToolBar;
171 begin
172 Bar := GetToolBar('tbStandard');
173 if Assigned(Bar) then
174 for i:=0 to Bar.ButtonCount-1 do begin
175 curButton:=Bar.Buttons[i];
176 if Assigned(curButton) and (curButton.Name <> '') then
177 curButton.Visible:=(not Enable) or ButtonVisible[curButton.Name];
178 end;
179
180 Bar := GetToolBar('tbViewDebug');
181 if Assigned(Bar) then
182 for i:=0 to Bar.ButtonCount-1 do begin
183 curButton:=Bar.Buttons[i];
184 if Assigned(curButton) and (curButton.Name <> '') then
185 curButton.Visible:=(not Enable) or ButtonVisible[curButton.Name];
186 end;
187 end;
188
TEduSpeedButtonsOptions.GetToolBarnull189 function TEduSpeedButtonsOptions.GetToolBar(tbName: string): TToolBar;
190 var
191 AComponent: TComponent;
192 begin
193 if (tbName='tbStandard') or (tbName='tbViewDebug')then begin
194 AComponent:=LazarusIDE.OwningComponent.FindComponent(tbName);
195 if AComponent is TToolBar then
196 Result:=TToolBar(AComponent)
197 else
198 Result:=nil;
199 end;
200 end;
201
202 { TEduSpeedButtonsFrame }
203
204 procedure TEduSpeedButtonsFrame.SpeedButtonsTreeViewMouseDown(Sender: TObject;
205 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
206 var
207 Node: TTreeNode;
208 Hit: THitTests;
209 begin
210 if Button<>mbLeft then exit;
211 Node:=SpeedButtonsTreeView.GetNodeAt(X,Y);
212 if (Node=nil) then exit;
213 if Node.Parent=nil then exit;
214 Hit:=SpeedButtonsTreeView.GetHitTestInfoAt(X,Y);
215 if [htOnIcon,htOnStateIcon]*Hit<>[] then begin
216 if Node.StateIndex=ShowImgID then
217 Node.StateIndex:=HideImgID
218 else
219 Node.StateIndex:=ShowImgID;
220 end;
221 end;
222
223 procedure TEduSpeedButtonsFrame.ShowHideAll(aShow: boolean);
224 var
225 Node: TTreeNode;
226 ButtonName: String;
227 begin
228 SpeedButtonsTreeView.BeginUpdate;
229 Node:=SpeedButtonsTreeView.Items.GetFirstNode;
230 while Node<>nil do begin
231 if Node.Parent<>nil then begin
232 ButtonName:=Node.Text;
233
234 EduSpeedButtonsOptions.ButtonVisible[ButtonName]:=aShow;
235 if aShow then
236 Node.StateIndex:=ShowImgID
237 else
238 Node.StateIndex:=HideImgID;
239 end
240
241 else begin
242
243 end;
244
245 Node:=Node.GetNext;
246 end;
247 SpeedButtonsTreeView.EndUpdate;
248 end;
249
250 procedure TEduSpeedButtonsFrame.ShowSelected;
251 var
252 Node: TTreeNode;
253 ButtonName: String;
254 SelectedButtons: array[0..9] of String;
255 i: integer;
256 begin
257
258 SelectedButtons[0] := 'NewFormSpeedBtn';
259 SelectedButtons[1] := 'OpenFileSpeedBtn';
260 SelectedButtons[2] := 'PauseSpeedButton';
261 SelectedButtons[3] := 'RunSpeedButton';
262 SelectedButtons[4] := 'SaveAllSpeedBtn';
263 SelectedButtons[5] := 'StepIntoSpeedButton';
264 SelectedButtons[6] := 'StepOverpeedButton';
265 SelectedButtons[7] := 'StopSpeedButton';
266 SelectedButtons[8] := 'ToggleFormSpeedBtn';
267 SelectedButtons[9] := 'EduNewSingleFileProgramBtn';
268
269 SpeedButtonsTreeView.BeginUpdate;
270 Node:=SpeedButtonsTreeView.Items.GetFirstNode;
271 while Node<>nil do begin
272 if Node.Parent<>nil then begin
273 ButtonName:=Node.Text;
274 for i := 0 to 9 do begin
275 if (CompareText (ButtonName , SelectedButtons[i] )=0) then begin
276 EduSpeedButtonsOptions.ButtonVisible[ButtonName]:=true;
277 Node.StateIndex:=ShowImgID;
278 end;
279 end;
280
281 end;
282
283 Node:=Node.GetNext;
284 end;
285 SpeedButtonsTreeView.EndUpdate;
286 end;
287
288 procedure TEduSpeedButtonsFrame.HideAllButtonClick(Sender: TObject);
289 begin
290 ShowHideAll(false);
291 end;
292
293 procedure TEduSpeedButtonsFrame.ShowAllButtonClick(Sender: TObject);
294 begin
295 ShowHideAll(true);
296 end;
297
298 procedure TEduSpeedButtonsFrame.ShowSelectionButtonClick(Sender: TObject);
299 begin
300 ShowHideAll(false);
301 ShowSelected;
302 end;
303
304 procedure TEduSpeedButtonsFrame.FrameClick(Sender: TObject);
305 begin
306
307 end;
308
GetImageForSpeedBtnnull309 function TEduSpeedButtonsFrame.GetImageForSpeedBtn(btnName: String) :TCustomBitmap;
310 begin
311 if (CompareText(btnName,'NewUnitSpeedBtn')=0) or (CompareText(btnName,'EduNewSingleFileProgramBtn')=0) then begin
312 Result := CreateBitmapFromResourceName(HInstance, 'item_unit');
313 end
314 else if (CompareText(btnName,'OpenFileSpeedBtn')=0) then begin
315 Result := CreateBitmapFromResourceName(HInstance, 'laz_open');
316 end
317 else if (CompareText(btnName,'SaveSpeedBtn')=0) then begin
318 Result := CreateBitmapFromResourceName(HInstance, 'laz_save');
319 end
320 else if (CompareText(btnName,'SaveAllSpeedBtn')=0) then begin
321 Result := CreateBitmapFromResourceName(HInstance, 'menu_save_all');
322 end
323 else if (CompareText(btnName,'NewFormSpeedBtn')=0) then begin
324 Result := CreateBitmapFromResourceName(HInstance, 'item_form');
325 end
326 else if (CompareText(btnName,'ToggleFormSpeedBtn')=0) then begin
327 Result := CreateBitmapFromResourceName(HInstance, 'menu_view_toggle_form_unit');
328 end
329 else if (CompareText(btnName,'ViewUnitsSpeedBtn')=0) then begin
330 Result := CreateBitmapFromResourceName(HInstance, 'menu_view_units');
331 end
332 else if (CompareText(btnName,'ViewFormsSpeedBtn')=0) then begin
333 Result := CreateBitmapFromResourceName(HInstance, 'menu_view_forms');
334 end
335 else if (CompareText(btnName,'RunSpeedButton')=0) then begin
336 Result := CreateBitmapFromResourceName(HInstance, 'menu_run');
337 end
338 else if (CompareText(btnName,'PauseSpeedButton')=0) then begin
339 Result := CreateBitmapFromResourceName(HInstance, 'menu_pause');
340 end
341 else if (CompareText(btnName,'StopSpeedButton')=0) then begin
342 Result := CreateBitmapFromResourceName(HInstance, 'menu_stop');
343 end
344 else if (CompareText(btnName,'StepIntoSpeedButton')=0) then begin
345 Result := CreateBitmapFromResourceName(HInstance, 'menu_stepinto');
346 end
347 else if (CompareText(btnName,'StepOverpeedButton')=0) then begin
348 Result := CreateBitmapFromResourceName(HInstance, 'menu_stepover');
349 end
350 else
351 result := nil;
352 end;
353
354 procedure TEduSpeedButtonsFrame.FillSpeedButtonsTreeView;
355 var
356 i: Integer;
357 curNode: TTreeNode;
358 CategoryNode: TTreeNode;
359 curButton: TToolButton;
360 Image: TCustomBitmap;
361 StandardBar, ViewDebugBar: TToolBar;
362 begin
363 StandardBar:=EduSpeedButtonsOptions.GetToolBar('tbStandard');
364 ViewDebugBar:=EduSpeedButtonsOptions.GetToolBar('tbViewDebug');
365 if (StandardBar=Nil) or (ViewDebugBar=Nil) then Exit;
366
367 SpeedButtonsTreeView.BeginUpdate;
368 SpeedButtonsTreeView.Items.Clear;
369
370 if SpeedButtonsTreeView.Images=nil then begin
371 SpeedButtonsTreeView.Images:=TImageList.Create(Self);
372 SpeedButtonsTreeView.Images.Width:=StandardBar.ButtonWidth;
373 SpeedButtonsTreeView.Images.Height:=StandardBar.ButtonHeight;
374 SpeedButtonsTreeView.StateImages:=IDEImages.Images_16;
375 end else
376
377 SpeedButtonsTreeView.Images.Clear;
378 ShowImgID:=IDEImages.LoadImage('menu_run');
379 HideImgID:=IDEImages.LoadImage('menu_stop');
380
381 CategoryNode:=SpeedButtonsTreeView.Items.Add(nil,'Standard Buttons');
382 for i:=0 to StandardBar.ButtonCount-1 do begin
383
384 curButton:=StandardBar.Buttons[i];
385 if NOT(curButton.Name = '') then begin
386 curNode:=SpeedButtonsTreeView.Items.AddChild(CategoryNode,curButton.Name);
387 Image := GetImageForSpeedBtn(curButton.Name);
388 if (Image = nil) then
389 Image := CreateBitmapFromResourceName(HInstance, 'default');
390 curNode.ImageIndex:=SpeedButtonsTreeView.Images.Add(Image,nil);
391 Image.Free;
392 curNode.SelectedIndex:=curNode.ImageIndex;
393
394 if (EduSpeedButtonsOptions.ButtonVisible[curButton.Name]) then
395 curNode.StateIndex:=ShowImgID
396 else
397 curNode.StateIndex:=HideImgID;
398 end;
399 end;
400 CategoryNode.Expanded:=true;
401
402 CategoryNode:=SpeedButtonsTreeView.Items.Add(nil,'Debug Buttons');
403 for i:=0 to ViewDebugBar.ButtonCount-1 do begin
404
405 curButton:=ViewDebugBar.Buttons[i];
406 if NOT(curButton.Name = '') then begin
407 curNode:=SpeedButtonsTreeView.Items.AddChild(CategoryNode,curButton.Name);
408 Image := GetImageForSpeedBtn(curButton.Name);
409 if (Image = nil) then
410 Image := CreateBitmapFromResourceName(HInstance, 'default');
411 curNode.ImageIndex:=SpeedButtonsTreeView.Images.Add(Image,nil);
412 Image.Free;
413 curNode.SelectedIndex:=curNode.ImageIndex;
414
415 if (EduSpeedButtonsOptions.ButtonVisible[curButton.Name]) then
416 curNode.StateIndex:=ShowImgID
417 else
418 curNode.StateIndex:=HideImgID;
419 end;
420 end;
421 CategoryNode.Expanded:=true;
422 SpeedButtonsTreeView.EndUpdate;
423
424 end;
425
426 procedure TEduSpeedButtonsFrame.SaveFillSpeedButtonsTreeView;
427 var
428 Node: TTreeNode;
429 ButtonName: String;
430 begin
431 Node:=SpeedButtonsTreeView.Items.GetFirstNode;
432 while Node<>nil do begin
433 if Node.Parent<>nil then begin
434 ButtonName:=Node.Text;
435 EduSpeedButtonsOptions.ButtonVisible[ButtonName]:=
436 Node.StateIndex=ShowImgID;
437 end else begin
438
439 end;
440 Node:=Node.GetNext;
441 end;
442 end;
443
GetTitlenull444 function TEduSpeedButtonsFrame.GetTitle: String;
445 begin
446 Result:=ersEduSBTitle;
447 end;
448
449 procedure TEduSpeedButtonsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
450 begin
451 if AOptions=EducationOptions then begin
452 FillSpeedButtonsTreeView;
453 end;
454 end;
455
456 procedure TEduSpeedButtonsFrame.Setup(ADialog: TAbstractOptionsEditorDialog);
457 begin
458 ShowAllButton.Caption:=ersShowAll;
459 HideAllButton.Caption:=ersHideAll;
460 ShowSelectionButton.Caption:=ersShowSelection;
461 SpeedButtonsGroupBox.Caption:=ersVisibleSpeedButtons;
462 end;
463
TEduSpeedButtonsFrame.SupportedOptionsClassnull464 class function TEduSpeedButtonsFrame.SupportedOptionsClass: TAbstractIDEOptionsClass;
465 begin
466 Result:=EducationIDEOptionsClass;
467 end;
468
469 procedure TEduSpeedButtonsFrame.WriteSettings(AOptions: TAbstractIDEOptions);
470 begin
471 if AOptions=EducationOptions then begin
472 SaveFillSpeedButtonsTreeView;
473 end;
474 end;
475
476 {$R *.lfm}
477
478 end.
479