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

View File

@ -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;

View File

@ -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

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
+'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
]);

View File

@ -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