mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-11 21:55:56 +02:00
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:
parent
b5c463103f
commit
6291169acd
@ -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"/>
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
]);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user