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