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 -
This commit is contained in:
vincents 2007-04-29 20:39:05 +00:00
parent b5c463103f
commit 6291169acd
5 changed files with 168 additions and 41 deletions

View File

@ -19,7 +19,7 @@
"/> "/>
<License Value="GPL <License Value="GPL
"/> "/>
<Version Minor="3"/> <Version Minor="4"/>
<Files Count="3"> <Files Count="3">
<Item1> <Item1>
<Filename Value="jumpto_impl.pas"/> <Filename Value="jumpto_impl.pas"/>
@ -38,14 +38,14 @@
<Type Value="DesignTime"/> <Type Value="DesignTime"/>
<RequiredPkgs Count="4"> <RequiredPkgs Count="4">
<Item1> <Item1>
<PackageName Value="IDEIntf"/> <PackageName Value="LCL"/>
</Item1> </Item1>
<Item2> <Item2>
<PackageName Value="FCL"/> <PackageName Value="IDEIntf"/>
<MinVersion Major="1" Valid="True"/>
</Item2> </Item2>
<Item3> <Item3>
<PackageName Value="LCL"/> <PackageName Value="FCL"/>
<MinVersion Major="1" Valid="True"/>
</Item3> </Item3>
<Item4> <Item4>
<PackageName Value="CodeTools"/> <PackageName Value="CodeTools"/>

View File

@ -34,6 +34,12 @@ uses
,MenuIntf ,MenuIntf
; ;
const
cSettingsFile = 'editortoolbar.xml';
cDivider = '---------------';
type type
TEditorToolbar = class(TObject) TEditorToolbar = class(TObject)
@ -46,11 +52,13 @@ type
function CreateJumpItem(AJumpType: TJumpType; O: TComponent): TMenuItem; function CreateJumpItem(AJumpType: TJumpType; O: TComponent): TMenuItem;
procedure DoConfigureToolbar(Sender: TObject); procedure DoConfigureToolbar(Sender: TObject);
protected protected
procedure AddButton(AMenuItem: TIDEMenuItem);
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
procedure InitEditorToolBar; procedure InitEditorToolBar;
procedure AddButton(AMenuItem: TIDEMenuItem); procedure AddCustomItems;
procedure AddDivider;
procedure AddStaticItems; procedure AddStaticItems;
procedure ClearToolbar; procedure ClearToolbar;
end; end;
@ -70,6 +78,8 @@ uses
,SysUtils ,SysUtils
,LResources ,LResources
,EdtTbConfigFrm ,EdtTbConfigFrm
,LazConfigStorage
,BaseIDEIntf
; ;
@ -121,7 +131,6 @@ begin
inherited Destroy; inherited Destroy;
end; end;
procedure TEditorToolbar.InitEditorToolBar; procedure TEditorToolbar.InitEditorToolBar;
begin begin
if not Assigned(W) then if not Assigned(W) then
@ -131,6 +140,8 @@ begin
TB := nil; TB := nil;
CreateEditorToolBar(W, TB, BI); CreateEditorToolBar(W, TB, BI);
end; end;
AddCustomItems;
AddStaticItems; AddStaticItems;
end; end;
@ -139,7 +150,7 @@ var
B: TToolButton; B: TToolButton;
i: integer; i: integer;
begin begin
B := TToolbutton.Create(W); B := TToolButton.Create(TB);
B.Parent := TB; B.Parent := TB;
B.Caption := AMenuItem.Caption; B.Caption := AMenuItem.Caption;
B.Hint := AMenuItem.Caption; // or should we use AMenuItem.Hint? B.Hint := AMenuItem.Caption; // or should we use AMenuItem.Hint?
@ -151,10 +162,48 @@ begin
end end
else else
B.ImageIndex := BI.AddLazarusResource('execute16'); B.ImageIndex := BI.AddLazarusResource('execute16');
B.Style := tbsButton; B.Style := tbsButton;
B.OnClick := AMenuItem.OnClick; B.OnClick := AMenuItem.OnClick;
end; 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; procedure TEditorToolbar.AddStaticItems;
var var
B: TToolButton; B: TToolButton;
@ -163,16 +212,11 @@ var
begin begin
TB.BeginUpdate; TB.BeginUpdate;
try try
if TB.ButtonList.Count <> 0 then if TB.ButtonCount <> 0 then
begin AddDivider;
// divider button
B := TToolbutton.Create(W);
B.Parent := TB;
B.Style := tbsDivider;
end;
// JumpTo Button // JumpTo Button
B := TToolbutton.Create(W); B := TToolbutton.Create(TB);
B.Parent := TB; B.Parent := TB;
B.Caption := 'Jump To'; B.Caption := 'Jump To';
B.Hint := B.Caption; B.Hint := B.Caption;
@ -186,13 +230,10 @@ begin
for T := Low(TJumpType) to High(TJumpType) do for T := Low(TJumpType) to High(TJumpType) do
PM.Items.Add(CreateJumpItem(T,W)); PM.Items.Add(CreateJumpItem(T,W));
// divider button AddDivider;
B := TToolbutton.Create(W);
B.Parent := TB;
B.Style := tbsDivider;
// Config Button // Config Button
B := TToolbutton.Create(W); B := TToolbutton.Create(TB);
B.Parent := TB; B.Parent := TB;
B.Caption := 'Configure Toolbar'; B.Caption := 'Configure Toolbar';
B.Hint := B.Caption; B.Hint := B.Caption;
@ -220,7 +261,7 @@ end;
procedure Register; procedure Register;
begin begin
If (SourceEditorWindow <> nil) then if (SourceEditorWindow <> nil) then
gEditorToolbar.InitEditorToolBar; gEditorToolbar.InitEditorToolBar;
end; end;

View File

@ -95,6 +95,7 @@ object EdtTbConfigForm: TEdtTbConfigForm
Constraints.MaxHeight = 25 Constraints.MaxHeight = 25
Constraints.MinHeight = 25 Constraints.MinHeight = 25
Constraints.MinWidth = 75 Constraints.MinWidth = 75
OnClick = btnAddDividerClick
TabOrder = 1 TabOrder = 1
end end
object lbToolbar: TListBox object lbToolbar: TListBox
@ -128,8 +129,8 @@ object EdtTbConfigForm: TEdtTbConfigForm
Height = 26 Height = 26
Top = 157 Top = 157
Width = 22 Width = 22
Enabled = False
NumGlyphs = 0 NumGlyphs = 0
OnClick = btnMoveUpClick
TabOrder = 5 TabOrder = 5
end end
object btnMoveDown: TBitBtn object btnMoveDown: TBitBtn
@ -137,8 +138,8 @@ object EdtTbConfigForm: TEdtTbConfigForm
Height = 26 Height = 26
Top = 182 Top = 182
Width = 22 Width = 22
Enabled = False
NumGlyphs = 0 NumGlyphs = 0
OnClick = btnMoveDownClick
TabOrder = 6 TabOrder = 6
end end
object TV: TTreeView object TV: TTreeView

View File

@ -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 +'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' +'AutoSize'#9#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#13'btnAddDivider'
+#21'Constraints.MaxHeight'#2#25#21'Constraints.MinHeight'#2#25#20'Constraint' +#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 +'s.MinWidth'#2'K'#7'OnClick'#7#18'btnAddDividerClick'#8'TabOrder'#2#1#0#0#8
+#1#6'Height'#3#225#0#3'Top'#2#28#5'Width'#3#183#0#8'TabOrder'#2#2#8'TopIndex' +'TListBox'#9'lbToolbar'#4'Left'#3#200#1#6'Height'#3#225#0#3'Top'#2#28#5'Widt'
+#2#255#0#0#7'TBitBtn'#9'btnRemove'#4'Left'#3#176#1#6'Height'#2#26#3'Top'#2'J' +'h'#3#183#0#8'TabOrder'#2#2#8'TopIndex'#2#255#0#0#7'TBitBtn'#9'btnRemove'#4
+#5'Width'#2#22#9'NumGlyphs'#2#0#7'OnClick'#7#14'btnRemoveClick'#8'TabOrder'#2 +'Left'#3#176#1#6'Height'#2#26#3'Top'#2'J'#5'Width'#2#22#9'NumGlyphs'#2#0#7'O'
+#3#0#0#7'TBitBtn'#6'btnAdd'#4'Left'#3#176#1#6'Height'#2#26#3'Top'#2'c'#5'Wid' +'nClick'#7#14'btnRemoveClick'#8'TabOrder'#2#3#0#0#7'TBitBtn'#6'btnAdd'#4'Lef'
+'th'#2#22#9'NumGlyphs'#2#0#7'OnClick'#7#11'btnAddClick'#8'TabOrder'#2#4#0#0#7 +'t'#3#176#1#6'Height'#2#26#3'Top'#2'c'#5'Width'#2#22#9'NumGlyphs'#2#0#7'OnCl'
+'TBitBtn'#9'btnMoveUp'#4'Left'#3#176#1#6'Height'#2#26#3'Top'#3#157#0#5'Width' +'ick'#7#11'btnAddClick'#8'TabOrder'#2#4#0#0#7'TBitBtn'#9'btnMoveUp'#4'Left'#3
+#2#22#7'Enabled'#8#9'NumGlyphs'#2#0#8'TabOrder'#2#5#0#0#7'TBitBtn'#11'btnMov' +#176#1#6'Height'#2#26#3'Top'#3#157#0#5'Width'#2#22#9'NumGlyphs'#2#0#7'OnClic'
+'eDown'#4'Left'#3#176#1#6'Height'#2#26#3'Top'#3#182#0#5'Width'#2#22#7'Enable' +'k'#7#14'btnMoveUpClick'#8'TabOrder'#2#5#0#0#7'TBitBtn'#11'btnMoveDown'#4'Le'
+'d'#8#9'NumGlyphs'#2#0#8'TabOrder'#2#6#0#0#9'TTreeView'#2'TV'#4'Left'#2#16#6 +'ft'#3#176#1#6'Height'#2#26#3'Top'#3#182#0#5'Width'#2#22#9'NumGlyphs'#2#0#7
+'Height'#3#253#0#3'Top'#2#28#5'Width'#3#136#1#17'DefaultItemHeight'#2#18#8'T' +'OnClick'#7#16'btnMoveDownClick'#8'TabOrder'#2#6#0#0#9'TTreeView'#2'TV'#4'Le'
+'abOrder'#2#7#8'OnChange'#7#8'TVChange'#0#0#0 +'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
]); ]);

View File

@ -44,11 +44,16 @@ type
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure TVChange(Sender: TObject; Node: TTreeNode); procedure TVChange(Sender: TObject; Node: TTreeNode);
procedure btnAddClick(Sender: TObject); procedure btnAddClick(Sender: TObject);
procedure btnAddDividerClick(Sender: TObject);
procedure btnMoveDownClick(Sender: TObject);
procedure btnMoveUpClick(Sender: TObject);
procedure btnOKClick(Sender: TObject); procedure btnOKClick(Sender: TObject);
procedure btnRemoveClick(Sender: TObject); procedure btnRemoveClick(Sender: TObject);
private private
procedure SetupCaptions; procedure SetupCaptions;
procedure LoadCategories; procedure LoadCategories;
procedure LoadSettings;
procedure SaveSettings;
procedure AddMenuItem(ParentNode: TTreeNode; Item: TIDEMenuItem); procedure AddMenuItem(ParentNode: TTreeNode; Item: TIDEMenuItem);
public public
class function Execute: boolean; class function Execute: boolean;
@ -59,6 +64,9 @@ implementation
uses uses
editortoolbar_impl editortoolbar_impl
,LazConfigStorage
,BaseIDEIntf
,LazIDEIntf
; ;
@ -85,6 +93,7 @@ begin
SetupCaptions; SetupCaptions;
LoadCategories; LoadCategories;
LoadSettings;
end; end;
procedure TEdtTbConfigForm.TVChange(Sender: TObject; Node: TTreeNode); procedure TEdtTbConfigForm.TVChange(Sender: TObject; Node: TTreeNode);
@ -109,10 +118,39 @@ begin
end; end;
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); procedure TEdtTbConfigForm.btnOKClick(Sender: TObject);
var var
i: integer; i: integer;
begin begin
SaveSettings;
if lbToolbar.Items.Count = 0 then if lbToolbar.Items.Count = 0 then
begin begin
{ resets the toolbar to only contain static (default) items } { resets the toolbar to only contain static (default) items }
@ -122,11 +160,7 @@ begin
end; end;
gEditorToolbar.ClearToolbar; gEditorToolbar.ClearToolbar;
for i := 0 to lbToolbar.Items.Count-1 do gEditorToolbar.AddCustomItems;
begin
gEditorToolbar.AddButton(TIDEMenuItem(lbToolBar.Items.Objects[i]));
end;
gEditorToolbar.AddStaticItems; gEditorToolbar.AddStaticItems;
end; end;
@ -160,6 +194,56 @@ begin
end; end;
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; procedure TEdtTbConfigForm.AddMenuItem(ParentNode: TTreeNode;
Item: TIDEMenuItem); Item: TIDEMenuItem);
var var