From 6291169acd15ca14a11b294cb53bbf3ae7edfd3e Mon Sep 17 00:00:00 2001 From: vincents Date: Sun, 29 Apr 2007 20:39:05 +0000 Subject: [PATCH] editor toolbar: patch from Graeme (#8787) + It's now able to save and restore the users selection on the toolbar. + toolbar dividers can now be added + Items can be reordered on the toolbar. git-svn-id: trunk@11031 - --- components/editortoolbar/editortoolbar.lpk | 10 +- .../editortoolbar/editortoolbar_impl.pas | 75 +++++++++++---- components/editortoolbar/edttbconfigfrm.lfm | 5 +- components/editortoolbar/edttbconfigfrm.lrs | 25 ++--- components/editortoolbar/edttbconfigfrm.pas | 94 ++++++++++++++++++- 5 files changed, 168 insertions(+), 41 deletions(-) diff --git a/components/editortoolbar/editortoolbar.lpk b/components/editortoolbar/editortoolbar.lpk index f8d99834fa..3f748988cd 100644 --- a/components/editortoolbar/editortoolbar.lpk +++ b/components/editortoolbar/editortoolbar.lpk @@ -19,7 +19,7 @@ "/> - + @@ -38,14 +38,14 @@ - + - - + - + + diff --git a/components/editortoolbar/editortoolbar_impl.pas b/components/editortoolbar/editortoolbar_impl.pas index 630a46bc95..63c78b900b 100644 --- a/components/editortoolbar/editortoolbar_impl.pas +++ b/components/editortoolbar/editortoolbar_impl.pas @@ -34,6 +34,12 @@ uses ,MenuIntf ; + +const + cSettingsFile = 'editortoolbar.xml'; + cDivider = '---------------'; + + type TEditorToolbar = class(TObject) @@ -46,11 +52,13 @@ type function CreateJumpItem(AJumpType: TJumpType; O: TComponent): TMenuItem; procedure DoConfigureToolbar(Sender: TObject); protected + procedure AddButton(AMenuItem: TIDEMenuItem); public constructor Create; destructor Destroy; override; procedure InitEditorToolBar; - procedure AddButton(AMenuItem: TIDEMenuItem); + procedure AddCustomItems; + procedure AddDivider; procedure AddStaticItems; procedure ClearToolbar; end; @@ -70,6 +78,8 @@ uses ,SysUtils ,LResources ,EdtTbConfigFrm + ,LazConfigStorage + ,BaseIDEIntf ; @@ -121,7 +131,6 @@ begin inherited Destroy; end; - procedure TEditorToolbar.InitEditorToolBar; begin if not Assigned(W) then @@ -131,6 +140,8 @@ begin TB := nil; CreateEditorToolBar(W, TB, BI); end; + + AddCustomItems; AddStaticItems; end; @@ -139,7 +150,7 @@ var B: TToolButton; i: integer; begin - B := TToolbutton.Create(W); + B := TToolButton.Create(TB); B.Parent := TB; B.Caption := AMenuItem.Caption; B.Hint := AMenuItem.Caption; // or should we use AMenuItem.Hint? @@ -151,10 +162,48 @@ begin end else B.ImageIndex := BI.AddLazarusResource('execute16'); + B.Style := tbsButton; B.OnClick := AMenuItem.OnClick; end; +procedure TEditorToolbar.AddCustomItems; +var + i: integer; + c: integer; + cfg: TConfigStorage; + value: string; + mi: TIDEMenuItem; +begin + cfg := GetIDEConfigStorage(cSettingsFile, True); + try + c := cfg.GetValue('Count', 0); + for i := c - 1 downto 0 do + begin + value := cfg.GetValue('Button' + Format('%2.2d', [i+1]) + '/Value', ''); + if value = cDivider then + AddDivider + else + begin + mi := IDEMenuRoots.FindByPath(value, True); + if Assigned(mi) then + AddButton(mi); + end; + end; + finally + cfg.Free; + end; +end; + +procedure TEditorToolbar.AddDivider; +var + B: TToolButton; +begin + B := TToolbutton.Create(TB); + B.Parent := TB; + B.Style := tbsDivider; +end; + procedure TEditorToolbar.AddStaticItems; var B: TToolButton; @@ -163,16 +212,11 @@ var begin TB.BeginUpdate; try - if TB.ButtonList.Count <> 0 then - begin - // divider button - B := TToolbutton.Create(W); - B.Parent := TB; - B.Style := tbsDivider; - end; + if TB.ButtonCount <> 0 then + AddDivider; // JumpTo Button - B := TToolbutton.Create(W); + B := TToolbutton.Create(TB); B.Parent := TB; B.Caption := 'Jump To'; B.Hint := B.Caption; @@ -186,13 +230,10 @@ begin for T := Low(TJumpType) to High(TJumpType) do PM.Items.Add(CreateJumpItem(T,W)); - // divider button - B := TToolbutton.Create(W); - B.Parent := TB; - B.Style := tbsDivider; + AddDivider; // Config Button - B := TToolbutton.Create(W); + B := TToolbutton.Create(TB); B.Parent := TB; B.Caption := 'Configure Toolbar'; B.Hint := B.Caption; @@ -220,7 +261,7 @@ end; procedure Register; begin - If (SourceEditorWindow <> nil) then + if (SourceEditorWindow <> nil) then gEditorToolbar.InitEditorToolBar; end; diff --git a/components/editortoolbar/edttbconfigfrm.lfm b/components/editortoolbar/edttbconfigfrm.lfm index 00a5023ebf..1eb1cf922b 100644 --- a/components/editortoolbar/edttbconfigfrm.lfm +++ b/components/editortoolbar/edttbconfigfrm.lfm @@ -95,6 +95,7 @@ object EdtTbConfigForm: TEdtTbConfigForm Constraints.MaxHeight = 25 Constraints.MinHeight = 25 Constraints.MinWidth = 75 + OnClick = btnAddDividerClick TabOrder = 1 end object lbToolbar: TListBox @@ -128,8 +129,8 @@ object EdtTbConfigForm: TEdtTbConfigForm Height = 26 Top = 157 Width = 22 - Enabled = False NumGlyphs = 0 + OnClick = btnMoveUpClick TabOrder = 5 end object btnMoveDown: TBitBtn @@ -137,8 +138,8 @@ object EdtTbConfigForm: TEdtTbConfigForm Height = 26 Top = 182 Width = 22 - Enabled = False NumGlyphs = 0 + OnClick = btnMoveDownClick TabOrder = 6 end object TV: TTreeView diff --git a/components/editortoolbar/edttbconfigfrm.lrs b/components/editortoolbar/edttbconfigfrm.lrs index f0162cf98c..34ffe950f0 100644 --- a/components/editortoolbar/edttbconfigfrm.lrs +++ b/components/editortoolbar/edttbconfigfrm.lrs @@ -30,16 +30,17 @@ LazarusResources.Add('TEdtTbConfigForm','FORMDATA',[ +'ht'#2#25#3'Top'#3#0#1#5'Width'#2's'#7'Anchors'#11#7'akRight'#8'akBottom'#0#8 +'AutoSize'#9#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#13'btnAddDivider' +#21'Constraints.MaxHeight'#2#25#21'Constraints.MinHeight'#2#25#20'Constraint' - +'s.MinWidth'#2'K'#8'TabOrder'#2#1#0#0#8'TListBox'#9'lbToolbar'#4'Left'#3#200 - +#1#6'Height'#3#225#0#3'Top'#2#28#5'Width'#3#183#0#8'TabOrder'#2#2#8'TopIndex' - +#2#255#0#0#7'TBitBtn'#9'btnRemove'#4'Left'#3#176#1#6'Height'#2#26#3'Top'#2'J' - +#5'Width'#2#22#9'NumGlyphs'#2#0#7'OnClick'#7#14'btnRemoveClick'#8'TabOrder'#2 - +#3#0#0#7'TBitBtn'#6'btnAdd'#4'Left'#3#176#1#6'Height'#2#26#3'Top'#2'c'#5'Wid' - +'th'#2#22#9'NumGlyphs'#2#0#7'OnClick'#7#11'btnAddClick'#8'TabOrder'#2#4#0#0#7 - +'TBitBtn'#9'btnMoveUp'#4'Left'#3#176#1#6'Height'#2#26#3'Top'#3#157#0#5'Width' - +#2#22#7'Enabled'#8#9'NumGlyphs'#2#0#8'TabOrder'#2#5#0#0#7'TBitBtn'#11'btnMov' - +'eDown'#4'Left'#3#176#1#6'Height'#2#26#3'Top'#3#182#0#5'Width'#2#22#7'Enable' - +'d'#8#9'NumGlyphs'#2#0#8'TabOrder'#2#6#0#0#9'TTreeView'#2'TV'#4'Left'#2#16#6 - +'Height'#3#253#0#3'Top'#2#28#5'Width'#3#136#1#17'DefaultItemHeight'#2#18#8'T' - +'abOrder'#2#7#8'OnChange'#7#8'TVChange'#0#0#0 + +'s.MinWidth'#2'K'#7'OnClick'#7#18'btnAddDividerClick'#8'TabOrder'#2#1#0#0#8 + +'TListBox'#9'lbToolbar'#4'Left'#3#200#1#6'Height'#3#225#0#3'Top'#2#28#5'Widt' + +'h'#3#183#0#8'TabOrder'#2#2#8'TopIndex'#2#255#0#0#7'TBitBtn'#9'btnRemove'#4 + +'Left'#3#176#1#6'Height'#2#26#3'Top'#2'J'#5'Width'#2#22#9'NumGlyphs'#2#0#7'O' + +'nClick'#7#14'btnRemoveClick'#8'TabOrder'#2#3#0#0#7'TBitBtn'#6'btnAdd'#4'Lef' + +'t'#3#176#1#6'Height'#2#26#3'Top'#2'c'#5'Width'#2#22#9'NumGlyphs'#2#0#7'OnCl' + +'ick'#7#11'btnAddClick'#8'TabOrder'#2#4#0#0#7'TBitBtn'#9'btnMoveUp'#4'Left'#3 + +#176#1#6'Height'#2#26#3'Top'#3#157#0#5'Width'#2#22#9'NumGlyphs'#2#0#7'OnClic' + +'k'#7#14'btnMoveUpClick'#8'TabOrder'#2#5#0#0#7'TBitBtn'#11'btnMoveDown'#4'Le' + +'ft'#3#176#1#6'Height'#2#26#3'Top'#3#182#0#5'Width'#2#22#9'NumGlyphs'#2#0#7 + +'OnClick'#7#16'btnMoveDownClick'#8'TabOrder'#2#6#0#0#9'TTreeView'#2'TV'#4'Le' + +'ft'#2#16#6'Height'#3#253#0#3'Top'#2#28#5'Width'#3#136#1#17'DefaultItemHeigh' + +'t'#2#18#8'TabOrder'#2#7#8'OnChange'#7#8'TVChange'#0#0#0 ]); diff --git a/components/editortoolbar/edttbconfigfrm.pas b/components/editortoolbar/edttbconfigfrm.pas index 5f966d4f73..ff1f992dbd 100644 --- a/components/editortoolbar/edttbconfigfrm.pas +++ b/components/editortoolbar/edttbconfigfrm.pas @@ -44,11 +44,16 @@ type procedure FormCreate(Sender: TObject); procedure TVChange(Sender: TObject; Node: TTreeNode); procedure btnAddClick(Sender: TObject); + procedure btnAddDividerClick(Sender: TObject); + procedure btnMoveDownClick(Sender: TObject); + procedure btnMoveUpClick(Sender: TObject); procedure btnOKClick(Sender: TObject); procedure btnRemoveClick(Sender: TObject); private procedure SetupCaptions; procedure LoadCategories; + procedure LoadSettings; + procedure SaveSettings; procedure AddMenuItem(ParentNode: TTreeNode; Item: TIDEMenuItem); public class function Execute: boolean; @@ -59,6 +64,9 @@ implementation uses editortoolbar_impl + ,LazConfigStorage + ,BaseIDEIntf + ,LazIDEIntf ; @@ -85,6 +93,7 @@ begin SetupCaptions; LoadCategories; + LoadSettings; end; procedure TEdtTbConfigForm.TVChange(Sender: TObject; Node: TTreeNode); @@ -109,10 +118,39 @@ begin end; end; +procedure TEdtTbConfigForm.btnAddDividerClick(Sender: TObject); +begin + lbToolbar.Items.Add(cDivider); +end; + +procedure TEdtTbConfigForm.btnMoveDownClick(Sender: TObject); +begin + if lbToolbar.ItemIndex = -1 then + exit; + if lbToolbar.ItemIndex < lbToolbar.Items.Count - 1 then + begin + lbToolbar.Items.Exchange(lbToolbar.ItemIndex, lbToolbar.ItemIndex+1); + lbToolbar.ItemIndex := lbToolbar.ItemIndex+1; + end; +end; + +procedure TEdtTbConfigForm.btnMoveUpClick(Sender: TObject); +begin + if lbToolbar.ItemIndex = -1 then + exit; + if lbToolbar.ItemIndex > 0 then + begin + lbToolbar.Items.Exchange(lbToolbar.ItemIndex, lbToolbar.ItemIndex-1); + lbToolbar.ItemIndex := lbToolbar.ItemIndex-1; + end; +end; + procedure TEdtTbConfigForm.btnOKClick(Sender: TObject); var i: integer; begin + SaveSettings; + if lbToolbar.Items.Count = 0 then begin { resets the toolbar to only contain static (default) items } @@ -122,11 +160,7 @@ begin end; gEditorToolbar.ClearToolbar; - for i := 0 to lbToolbar.Items.Count-1 do - begin - gEditorToolbar.AddButton(TIDEMenuItem(lbToolBar.Items.Objects[i])); - end; - + gEditorToolbar.AddCustomItems; gEditorToolbar.AddStaticItems; end; @@ -160,6 +194,56 @@ begin end; end; +procedure TEdtTbConfigForm.LoadSettings; +var + i: integer; + c: integer; + cfg: TConfigStorage; + value: string; + mi: TIDEMenuItem; +begin + cfg := GetIDEConfigStorage(cSettingsFile, True); + try + c := cfg.GetValue('Count', 0); + for i := 0 to c - 1 do + begin + value := cfg.GetValue('Button' + Format('%2.2d', [i+1]) + '/Value', ''); + if value = cDivider then + begin + lbToolbar.Items.Add(value); + Continue; + end; + + mi := IDEMenuRoots.FindByPath(value, true); + if Assigned(mi) then + lbToolbar.Items.AddObject(mi.Caption, TObject(mi)); + end; + finally + cfg.Free; + end; +end; + +procedure TEdtTbConfigForm.SaveSettings; +var + i: integer; + cfg: TConfigStorage; +begin + cfg := GetIDEConfigStorage(cSettingsFile, False); + try + cfg.SetValue('Count', lbToolbar.Items.Count); + for i := 0 to lbToolbar.Items.Count - 1 do + begin + if lbToolbar.Items[i] = cDivider then + cfg.SetDeleteValue('Button' + Format('%2.2d', [i+1]) + '/Value', cDivider, '') + else + cfg.SetDeleteValue('Button' + Format('%2.2d', [i+1]) + '/Value', TIDEMenuItem(lbToolbar.Items.Objects[i]).GetPath, ''); + end; + cfg.WriteToDisk; + finally + cfg.Free; + end; +end; + procedure TEdtTbConfigForm.AddMenuItem(ParentNode: TTreeNode; Item: TIDEMenuItem); var