mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-28 10:02:14 +00:00
972 lines
29 KiB
ObjectPascal
972 lines
29 KiB
ObjectPascal
{
|
|
Double Commander
|
|
-------------------------------------------------------------------------
|
|
Toolbar configuration options page
|
|
|
|
Copyright (C) 2006-2010 Koblov Alexander (Alexx2000@mail.ru)
|
|
Copyright (C) 2012 Przemyslaw Nagay (cobines@gmail.com)
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
}
|
|
|
|
unit fOptionsToolbar;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
|
|
ComCtrls, ExtCtrls, Buttons, fOptionsFrame, KASToolBar, KASToolItems,
|
|
uFormCommands, uHotkeyManager, DCBasicTypes,
|
|
fOptionsHotkeysEditHotkey, DCXmlConfig;
|
|
|
|
type
|
|
|
|
{ TfrmOptionsToolbar }
|
|
|
|
TfrmOptionsToolbar = class(TOptionsEditor)
|
|
btnInsertButton: TButton;
|
|
btnCloneButton: TButton;
|
|
btnDeleteButton: TButton;
|
|
btnOpenFile: TButton;
|
|
btnEditHotkey: TButton;
|
|
btnRemoveHotkey: TButton;
|
|
cbInternalCommand: TComboBox;
|
|
cbFlatButtons: TCheckBox;
|
|
edtExternalParameters: TEdit;
|
|
edtExternalCommand: TEdit;
|
|
lblHotkeyValue: TLabel;
|
|
edtStartPath: TEdit;
|
|
edtToolTip: TEdit;
|
|
gbGroupBox: TGroupBox;
|
|
edtIconFileName: TEdit;
|
|
lblInternalParameters: TLabel;
|
|
lblBarSize: TLabel;
|
|
lblBarSizeValue: TLabel;
|
|
lblInternalCommand: TLabel;
|
|
lblExternalCommand: TLabel;
|
|
lblHotkey: TLabel;
|
|
lblIconFile: TLabel;
|
|
lblIconSize: TLabel;
|
|
lblIconSizeValue: TLabel;
|
|
lblExternalParameters: TLabel;
|
|
lblStartPath: TLabel;
|
|
lblToolTip: TLabel;
|
|
edtInternalParameters: TMemo;
|
|
OpenDialog: TOpenDialog;
|
|
pnlEditControls: TPanel;
|
|
pnlFullToolbarButtons: TPanel;
|
|
pnlEditToolbar: TPanel;
|
|
pnlToolbarButtons: TPanel;
|
|
rgToolItemType: TRadioGroup;
|
|
btnOpenIcon: TButton;
|
|
sboxToolbars: TScrollBox;
|
|
trbBarSize: TTrackBar;
|
|
trbIconSize: TTrackBar;
|
|
procedure btnEditHotkeyClick(Sender: TObject);
|
|
procedure btnInsertButtonClick(Sender: TObject);
|
|
procedure btnRemoveHotKeyClick(Sender: TObject);
|
|
procedure btnCloneButtonClick(Sender: TObject);
|
|
procedure btnDeleteButtonClick(Sender: TObject);
|
|
procedure btnOpenFileClick(Sender: TObject);
|
|
procedure cbInternalCommandSelect(Sender: TObject);
|
|
procedure cbFlatButtonsChange(Sender: TObject);
|
|
procedure edtIconFileNameChange(Sender: TObject);
|
|
procedure ToolbarDragOver(Sender, Source: TObject; X, Y: Integer;
|
|
State: TDragState; var Accept: Boolean);
|
|
procedure ToolbarDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
function ToolbarLoadButtonGlyph(ToolItem: TKASToolItem; iIconSize: Integer;
|
|
clBackColor: TColor): TBitmap;
|
|
procedure ToolbarToolButtonClick(Sender: TObject);
|
|
procedure ToolbarToolButtonDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
procedure ToolbarToolButtonDragOver(Sender, Source: TObject; X, Y: Integer;
|
|
State: TDragState; var Accept: Boolean; NumberOfButton: Integer);
|
|
procedure ToolbarToolButtonMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure ToolbarToolButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
|
|
Y: Integer; NumberOfButton: Integer);
|
|
procedure ToolbarToolButtonMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure btnOpenIconClick(Sender: TObject);
|
|
function ToolbarToolItemShortcutsHint(ToolItem: TKASNormalItem): String;
|
|
procedure rgToolItemTypeSelectionChanged(Sender: TObject);
|
|
procedure trbBarSizeChange(Sender: TObject);
|
|
procedure trbIconSizeChange(Sender: TObject);
|
|
private
|
|
FCurrentButton: TKASToolButton;
|
|
FEditForm: TfrmEditHotkey;
|
|
FFormCommands: IFormCommands;
|
|
FToolButtonMouseX, FToolButtonMouseY, FToolDragButtonNumber: Integer; // For dragging
|
|
FUpdatingButtonType: Boolean;
|
|
FUpdatingIconText: Boolean;
|
|
function AddNewSubToolbar(ToolItem: TKASMenuItem): TKASToolBar;
|
|
procedure ApplyEditControls;
|
|
procedure CloseToolbarsBelowCurrentButton;
|
|
procedure CloseToolbar(Index: Integer);
|
|
function CreateToolbar(Items: TKASToolBarItems): TKASToolBar;
|
|
class function FindHotkey(NormalItem: TKASNormalItem; Hotkeys: THotkeys): THotkey;
|
|
class function FindHotkey(NormalItem: TKASNormalItem): THotkey;
|
|
function GetTopToolbar: TKASToolBar;
|
|
procedure LoadCurrentButton;
|
|
procedure LoadToolbar(ToolBar: TKASToolBar; Config: TXmlConfig; RootNode: TXmlNode);
|
|
procedure MarkCurrentToolbar;
|
|
procedure PressButtonDown(Button: TKASToolButton);
|
|
procedure UpdateIcon(Icon: String);
|
|
protected
|
|
procedure Init; override;
|
|
procedure Load; override;
|
|
function Save: TOptionsEditorSaveFlags; override;
|
|
public
|
|
class function GetIconIndex: Integer; override;
|
|
class function GetShortcuts(NormalItem: TKASNormalItem): TDynamicStringArray;
|
|
class function GetTitle: String; override;
|
|
procedure SelectButton(ButtonNumber: Integer);
|
|
end;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
uses
|
|
LCLProc, LCLVersion, Toolwin,
|
|
DCStrUtils, uGlobs, uLng, uOSForms, uDCUtils, uPixMapManager,
|
|
uKASToolItemsExtended,
|
|
fMain;
|
|
|
|
const
|
|
cHotKeyCommand = 'cm_ExecuteToolbarItem';
|
|
|
|
{ TfrmOptionsToolbar }
|
|
|
|
class function TfrmOptionsToolbar.GetIconIndex: Integer;
|
|
begin
|
|
Result := 32;
|
|
end;
|
|
|
|
class function TfrmOptionsToolbar.GetShortcuts(NormalItem: TKASNormalItem): TDynamicStringArray;
|
|
var
|
|
Hotkey: THotkey;
|
|
begin
|
|
Hotkey := FindHotkey(NormalItem);
|
|
if Assigned(Hotkey) then
|
|
Result := Hotkey.Shortcuts
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
class function TfrmOptionsToolbar.GetTitle: String;
|
|
begin
|
|
Result := rsOptionsEditorToolbar;
|
|
end;
|
|
|
|
function TfrmOptionsToolbar.GetTopToolbar: TKASToolBar;
|
|
begin
|
|
if sboxToolbars.ControlCount > 0 then
|
|
Result := sboxToolbars.Controls[0] as TKASToolBar
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.Init;
|
|
var
|
|
ToolBar: TKASToolBar;
|
|
begin
|
|
FFormCommands := frmMain as IFormCommands;
|
|
FFormCommands.GetCommandsList(cbInternalCommand.Items);
|
|
cbInternalCommand.Sorted := True;
|
|
FUpdatingButtonType := True;
|
|
ParseLineToList(rsOptToolbarButtonType, rgToolItemType.Items);
|
|
FUpdatingButtonType := False;
|
|
FToolDragButtonNumber := -1;
|
|
{$IF LCL_FULLVERSION >= 093100}
|
|
rgToolItemType.OnSelectionChanged := @rgToolItemTypeSelectionChanged;
|
|
{$ELSE}
|
|
rgToolItemType.OnClick := @rgToolItemTypeSelectionChanged;
|
|
{$ENDIF}
|
|
ToolBar := CreateToolbar(nil);
|
|
if Assigned(ToolBar) then
|
|
// Put first one on top so that any other toolbars
|
|
// created before Show are put below it.
|
|
ToolBar.Top := 0;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.Load;
|
|
var
|
|
ToolBarNode: TXmlNode;
|
|
ToolBar: TKASToolBar;
|
|
begin
|
|
trbBarSize.Position := gToolBarButtonSize div 2;
|
|
trbIconSize.Position := gToolBarIconSize div 2;
|
|
cbFlatButtons.Checked := gToolBarFlat;
|
|
|
|
lblBarSizeValue.Caption := IntToStr(trbBarSize.Position*2);
|
|
lblIconSizeValue.Caption := IntToStr(trbIconSize.Position*2);
|
|
|
|
FCurrentButton := nil;
|
|
CloseToolbarsBelowCurrentButton;
|
|
|
|
ToolBar := GetTopToolbar;
|
|
ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', False);
|
|
LoadToolbar(ToolBar, gConfig, ToolBarNode);
|
|
if ToolBar.ButtonCount > 0 then
|
|
PressButtonDown(ToolBar.Buttons[0]);
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.LoadCurrentButton;
|
|
var
|
|
ToolItem: TKASToolItem;
|
|
NormalItem: TKASNormalItem;
|
|
CommandItem: TKASCommandItem;
|
|
ProgramItem: TKASProgramItem;
|
|
EnableNormal, EnableCommand, EnableProgram: Boolean;
|
|
ButtonTypeIndex: Integer = -1;
|
|
ShortcutsHint: String;
|
|
begin
|
|
EnableNormal := False;
|
|
EnableCommand := False;
|
|
EnableProgram := False;
|
|
|
|
DisableAutoSizing;
|
|
try
|
|
CloseToolbarsBelowCurrentButton;
|
|
|
|
if Assigned(FCurrentButton) then
|
|
begin
|
|
ToolItem := FCurrentButton.ToolItem;
|
|
if ToolItem is TKASSeparatorItem then
|
|
ButtonTypeIndex := 0;
|
|
if ToolItem is TKASNormalItem then
|
|
begin
|
|
EnableNormal := True;
|
|
NormalItem := TKASNormalItem(ToolItem);
|
|
FUpdatingIconText := True;
|
|
edtIconFileName.Text := NormalItem.Icon;
|
|
FUpdatingIconText := False;
|
|
edtToolTip.Text := NormalItem.Hint;
|
|
ShortcutsHint := NormalItem.GetShortcutsHint;
|
|
if ShortcutsHint = '' then
|
|
lblHotkeyValue.Caption := rsOptHotkeysNoHotkey
|
|
else
|
|
lblHotkeyValue.Caption := ShortcutsHint;
|
|
btnRemoveHotkey.Enabled := ShortcutsHint <> '';
|
|
end;
|
|
if ToolItem is TKASCommandItem then
|
|
begin
|
|
ButtonTypeIndex := 1;
|
|
EnableCommand := True;
|
|
CommandItem := TKASCommandItem(ToolItem);
|
|
cbInternalCommand.Text := CommandItem.Command;
|
|
SetStringsFromArray(edtInternalParameters.Lines, CommandItem.Params);
|
|
end;
|
|
if ToolItem is TKASProgramItem then
|
|
begin
|
|
ButtonTypeIndex := 2;
|
|
EnableProgram := True;
|
|
ProgramItem := TKASProgramItem(ToolItem);
|
|
edtExternalCommand.Text := ProgramItem.Command;
|
|
edtExternalParameters.Text := ProgramItem.Params;
|
|
edtStartPath.Text := ProgramItem.StartPath;
|
|
end;
|
|
if ToolItem is TKASMenuItem then
|
|
begin
|
|
ButtonTypeIndex := 3;
|
|
AddNewSubToolbar(TKASMenuItem(ToolItem));
|
|
end;
|
|
end;
|
|
|
|
FUpdatingButtonType := True;
|
|
rgToolItemType.ItemIndex := ButtonTypeIndex;
|
|
FUpdatingButtonType := False;
|
|
|
|
lblIconFile.Visible := EnableNormal;
|
|
edtIconFileName.Visible := EnableNormal;
|
|
btnOpenIcon.Visible := EnableNormal;
|
|
lblToolTip.Visible := EnableNormal;
|
|
edtToolTip.Visible := EnableNormal;
|
|
lblInternalCommand.Visible := EnableCommand;
|
|
cbInternalCommand.Visible := EnableCommand;
|
|
lblInternalParameters.Visible := EnableCommand;
|
|
edtInternalParameters.Visible := EnableCommand;
|
|
lblExternalCommand.Visible := EnableProgram;
|
|
edtExternalCommand.Visible := EnableProgram;
|
|
lblExternalParameters.Visible := EnableProgram;
|
|
edtExternalParameters.Visible := EnableProgram;
|
|
lblStartPath.Visible := EnableProgram;
|
|
edtStartPath.Visible := EnableProgram;
|
|
btnOpenFile.Visible := EnableProgram;
|
|
lblHotkey.Visible := EnableNormal;
|
|
lblHotkeyValue.Visible := EnableNormal;
|
|
btnEditHotkey.Visible := EnableNormal;
|
|
btnRemoveHotkey.Visible := EnableNormal;
|
|
btnCloneButton.Visible := Assigned(FCurrentButton);
|
|
btnDeleteButton.Visible := Assigned(FCurrentButton);
|
|
rgToolItemType.Visible := Assigned(FCurrentButton);
|
|
|
|
MarkCurrentToolbar;
|
|
finally
|
|
EnableAutoSizing;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.LoadToolbar(ToolBar: TKASToolBar; Config: TXmlConfig; RootNode: TXmlNode);
|
|
var
|
|
ToolBarLoader: TKASToolBarExtendedLoader;
|
|
begin
|
|
ToolBarLoader := TKASToolBarExtendedLoader.Create;
|
|
try
|
|
if Assigned(RootNode) then
|
|
ToolBar.LoadConfiguration(Config, RootNode, ToolBarLoader);
|
|
finally
|
|
ToolBarLoader.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.MarkCurrentToolbar;
|
|
var
|
|
MarkToolBar, ToolBar, PrevToolBar: TKASToolBar;
|
|
i: Integer;
|
|
begin
|
|
if Assigned(FCurrentButton) then
|
|
MarkToolBar := FCurrentButton.ToolBar
|
|
else
|
|
MarkToolBar := GetTopToolbar;
|
|
|
|
if Assigned(MarkToolBar) then
|
|
begin
|
|
DisableAutoSizing;
|
|
try
|
|
PrevToolBar := nil;
|
|
for i := 0 to sboxToolbars.ControlCount - 1 do
|
|
begin
|
|
ToolBar := sboxToolbars.Controls[i] as TKASToolBar;
|
|
if ToolBar = MarkToolBar then
|
|
begin
|
|
if Assigned(PrevToolBar) then
|
|
begin
|
|
PrevToolBar.EdgeBorders := [ebBottom];
|
|
PrevToolBar.EdgeInner := esLowered;
|
|
PrevToolBar.EdgeOuter := esLowered;
|
|
end;
|
|
ToolBar.EdgeInner := esRaised;
|
|
ToolBar.EdgeOuter := esRaised;
|
|
ToolBar.EdgeBorders := [ebTop, ebBottom];
|
|
end
|
|
else if PrevToolBar = MarkToolBar then
|
|
begin
|
|
ToolBar.EdgeInner := esLowered;
|
|
ToolBar.EdgeOuter := esLowered;
|
|
ToolBar.EdgeBorders := [ebTop];
|
|
end
|
|
else
|
|
begin
|
|
ToolBar.EdgeInner := esNone;
|
|
ToolBar.EdgeOuter := esNone;
|
|
ToolBar.EdgeBorders := [];
|
|
end;
|
|
PrevToolBar := ToolBar;
|
|
end;
|
|
PrevToolBar.EdgeOuter := esRaised;
|
|
PrevToolBar.EdgeBorders := [ebBottom];
|
|
finally
|
|
EnableAutoSizing;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.PressButtonDown(Button: TKASToolButton);
|
|
begin
|
|
FUpdatingButtonType := True;
|
|
Button.Click;
|
|
FUpdatingButtonType := False;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.rgToolItemTypeSelectionChanged(Sender: TObject);
|
|
var
|
|
ToolBar: TKASToolBar;
|
|
ToolItem: TKASToolItem = nil;
|
|
NewButton: TKASToolButton;
|
|
begin
|
|
if not FUpdatingButtonType and Assigned(FCurrentButton) then
|
|
begin
|
|
case rgToolItemType.ItemIndex of
|
|
0: ToolItem := TKASSeparatorItem.Create;
|
|
1: ToolItem := TKASCommandItem.Create;
|
|
2: ToolItem := TKASProgramItem.Create;
|
|
3: ToolItem := TKASMenuItem.Create;
|
|
end;
|
|
if Assigned(ToolItem) then
|
|
begin
|
|
ToolBar := FCurrentButton.ToolBar;
|
|
// Copy what you can from previous button type.
|
|
ToolItem.Assign(FCurrentButton.ToolItem);
|
|
NewButton := ToolBar.InsertButton(FCurrentButton, ToolItem);
|
|
ToolBar.RemoveButton(FCurrentButton);
|
|
FCurrentButton := NewButton;
|
|
PressButtonDown(NewButton);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TfrmOptionsToolbar.Save: TOptionsEditorSaveFlags;
|
|
var
|
|
ToolBarNode: TXmlNode;
|
|
ToolBar: TKASToolBar;
|
|
begin
|
|
ApplyEditControls;
|
|
|
|
gToolBarFlat := cbFlatButtons.Checked;
|
|
gToolBarButtonSize := trbBarSize.Position * 2;
|
|
gToolBarIconSize := trbIconSize.Position * 2;
|
|
|
|
ToolBar := GetTopToolbar;
|
|
if Assigned(ToolBar) then
|
|
begin
|
|
ToolBarNode := gConfig.FindNode(gConfig.RootNode, 'Toolbars/MainToolbar', True);
|
|
gConfig.ClearNode(ToolBarNode);
|
|
Toolbar.SaveConfiguration(gConfig, ToolBarNode);
|
|
end;
|
|
|
|
Result := [];
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.btnOpenIconClick(Sender: TObject);
|
|
var
|
|
sFileName: String;
|
|
begin
|
|
sFileName := GetCmdDirFromEnvVar(edtIconFileName.Text);
|
|
if ShowOpenIconDialog(Self, sFileName) then
|
|
edtIconFileName.Text := sFileName;
|
|
end;
|
|
|
|
function TfrmOptionsToolbar.CreateToolbar(Items: TKASToolBarItems): TKASToolBar;
|
|
begin
|
|
Result := TKASToolBar.Create(sboxToolbars);
|
|
Result.AutoSize := True;
|
|
Result.Constraints.MinHeight := 24;
|
|
Result.Flat := cbFlatButtons.Checked;
|
|
Result.GlyphSize := trbIconSize.Position * 2;
|
|
Result.RadioToolBar := True;
|
|
Result.SetButtonSize(trbBarSize.Position * 2, trbBarSize.Position * 2);
|
|
Result.ShowDividerAsButton := True;
|
|
Result.OnDragOver := @ToolbarDragOver;
|
|
Result.OnDragDrop := @ToolbarDragDrop;
|
|
Result.OnLoadButtonGlyph := @ToolbarLoadButtonGlyph;
|
|
Result.OnToolButtonClick := @ToolbarToolButtonClick;
|
|
Result.OnToolButtonMouseDown := @ToolbarToolButtonMouseDown;
|
|
Result.OnToolButtonMouseUp := @ToolbarToolButtonMouseUp;
|
|
Result.OnToolButtonMouseMove := @ToolbarToolButtonMouseMove;
|
|
Result.OnToolButtonDragDrop := @ToolbarToolButtonDragDrop;
|
|
Result.OnToolButtonDragOver := @ToolbarToolButtonDragOver;
|
|
Result.OnToolItemShortcutsHint := @ToolbarToolItemShortcutsHint;
|
|
Result.BorderSpacing.Bottom := 2;
|
|
Result.EdgeInner := esNone;
|
|
Result.EdgeOuter := esNone;
|
|
Result.EdgeBorders := [];
|
|
Result.Top := MaxInt; // So that it is put under all existing toolbars (because of Align=alTop).
|
|
|
|
Result.UseItems(Items);
|
|
Result.Parent := sboxToolbars;
|
|
end;
|
|
|
|
function TfrmOptionsToolbar.AddNewSubToolbar(ToolItem: TKASMenuItem): TKASToolBar;
|
|
begin
|
|
Result := CreateToolbar(ToolItem.SubItems);
|
|
if Result.ButtonCount = 0 then
|
|
Result.AddButton(TKASCommandItem.Create);
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.ApplyEditControls;
|
|
var
|
|
ToolItem: TKASToolItem;
|
|
NormalItem: TKASNormalItem;
|
|
CommandItem: TKASCommandItem;
|
|
ProgramItem: TKASProgramItem;
|
|
begin
|
|
if Assigned(FCurrentButton) then
|
|
begin
|
|
ToolItem := FCurrentButton.ToolItem;
|
|
if ToolItem is TKASNormalItem then
|
|
begin
|
|
NormalItem := TKASNormalItem(ToolItem);
|
|
NormalItem.Icon := edtIconFileName.Text;
|
|
NormalItem.Hint := edtToolTip.Text;
|
|
end;
|
|
if ToolItem is TKASCommandItem then
|
|
begin
|
|
CommandItem := TKASCommandItem(ToolItem);
|
|
CommandItem.Command := cbInternalCommand.Text;
|
|
CommandItem.Params := GetArrayFromStrings(edtInternalParameters.Lines);
|
|
end;
|
|
if ToolItem is TKASProgramItem then
|
|
begin
|
|
ProgramItem := TKASProgramItem(ToolItem);
|
|
ProgramItem.Command := edtExternalCommand.Text;
|
|
ProgramItem.Params := edtExternalParameters.Text;
|
|
ProgramItem.StartPath := edtStartPath.Text;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
(*Add new button on tool bar*)
|
|
procedure TfrmOptionsToolbar.btnInsertButtonClick(Sender: TObject);
|
|
var
|
|
ToolBar: TKASToolBar;
|
|
begin
|
|
if Assigned(FCurrentButton) then
|
|
begin
|
|
ApplyEditControls;
|
|
ToolBar := FCurrentButton.ToolBar;
|
|
end
|
|
else
|
|
ToolBar := GetTopToolbar;
|
|
|
|
if Assigned(ToolBar) then
|
|
begin
|
|
FCurrentButton := ToolBar.InsertButton(FCurrentButton, TKASCommandItem.Create);
|
|
PressButtonDown(FCurrentButton);
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.btnRemoveHotKeyClick(Sender: TObject);
|
|
procedure RemoveHotkey(Hotkeys: THotkeys; NormalItem: TKASNormalItem);
|
|
var
|
|
Hotkey: THotkey;
|
|
begin
|
|
Hotkey := FindHotkey(NormalItem, Hotkeys);
|
|
Hotkeys.Remove(Hotkey);
|
|
end;
|
|
var
|
|
HMForm: THMForm;
|
|
ToolItem: TKASToolItem;
|
|
NormalItem: TKASNormalItem;
|
|
I: Integer;
|
|
begin
|
|
ToolItem := FCurrentButton.ToolItem;
|
|
if ToolItem is TKASNormalItem then
|
|
begin
|
|
NormalItem := TKASNormalItem(ToolItem);
|
|
HMForm := HotMan.Forms.Find('Main');
|
|
if Assigned(HMForm) then
|
|
begin
|
|
RemoveHotkey(HMForm.Hotkeys, NormalItem);
|
|
for I := 0 to HMForm.Controls.Count - 1 do
|
|
RemoveHotkey(HMForm.Controls[I].Hotkeys, NormalItem);
|
|
end;
|
|
LoadCurrentButton;
|
|
end;
|
|
end;
|
|
|
|
(*Clone selected button on tool bar*)
|
|
procedure TfrmOptionsToolbar.btnCloneButtonClick(Sender: TObject);
|
|
var
|
|
SourceItem: TKASToolItem;
|
|
Button: TKASToolButton;
|
|
begin
|
|
if Assigned(FCurrentButton) then
|
|
begin
|
|
ApplyEditControls;
|
|
SourceItem := FCurrentButton.ToolItem;
|
|
Button := FCurrentButton.ToolBar.InsertButton(FCurrentButton, SourceItem.Clone);
|
|
PressButtonDown(Button);
|
|
end;
|
|
end;
|
|
|
|
(*Remove current button*)
|
|
procedure TfrmOptionsToolbar.btnDeleteButtonClick(Sender: TObject);
|
|
var
|
|
NextButton: Integer;
|
|
ToolBar: TKASToolBar;
|
|
begin
|
|
if Assigned(FCurrentButton) then
|
|
begin
|
|
ToolBar := FCurrentButton.ToolBar;
|
|
NextButton := FCurrentButton.Tag;
|
|
Toolbar.RemoveButton(FCurrentButton);
|
|
FCurrentButton := nil;
|
|
if Toolbar.ButtonCount > 0 then
|
|
begin
|
|
// Select next button or the last one.
|
|
if NextButton >= Toolbar.ButtonCount then
|
|
NextButton := Toolbar.ButtonCount - 1;
|
|
PressButtonDown(Toolbar.Buttons[NextButton]);
|
|
end
|
|
else
|
|
begin
|
|
LoadCurrentButton;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.btnEditHotkeyClick(Sender: TObject);
|
|
var
|
|
HMForm: THMForm;
|
|
TemplateHotkey, Hotkey: THotkey;
|
|
ToolItem: TKASToolItem;
|
|
NormalItem: TKASNormalItem;
|
|
AControls: TDynamicStringArray = nil;
|
|
I: Integer;
|
|
begin
|
|
if not Assigned(FEditForm) then
|
|
FEditForm := TfrmEditHotkey.Create(Self);
|
|
|
|
ToolItem := FCurrentButton.ToolItem;
|
|
if ToolItem is TKASNormalItem then
|
|
begin
|
|
NormalItem := TKASNormalItem(ToolItem);
|
|
TemplateHotkey := THotkey.Create;
|
|
try
|
|
TemplateHotkey.Command := cHotKeyCommand;
|
|
SetValue(TemplateHotkey.Params, 'ToolItemID', NormalItem.ID);
|
|
|
|
HMForm := HotMan.Forms.Find('Main');
|
|
if Assigned(HMForm) then
|
|
begin
|
|
Hotkey := FindHotkey(NormalItem, HMForm.Hotkeys);
|
|
if Assigned(Hotkey) then
|
|
TemplateHotkey.Shortcuts := Hotkey.Shortcuts;
|
|
for I := 0 to HMForm.Controls.Count - 1 do
|
|
begin
|
|
Hotkey := FindHotkey(NormalItem, HMForm.Controls[I].Hotkeys);
|
|
if Assigned(Hotkey) then
|
|
begin
|
|
TemplateHotkey.Shortcuts := Hotkey.Shortcuts;
|
|
AddString(AControls, HMForm.Controls[I].Name);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
if FEditForm.Execute(True, 'Main', cHotKeyCommand, TemplateHotkey, AControls, [ehoHideParams]) then
|
|
begin
|
|
LoadCurrentButton;
|
|
end;
|
|
finally
|
|
TemplateHotkey.Free;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.btnOpenFileClick(Sender: TObject);
|
|
begin
|
|
OpenDialog.DefaultExt:= EmptyStr;
|
|
OpenDialog.Filter:= EmptyStr;
|
|
if OpenDialog.Execute then
|
|
begin
|
|
edtExternalCommand.Text := OpenDialog.FileName;
|
|
edtStartPath.Text := ExtractFilePath(OpenDialog.FileName);
|
|
edtIconFileName.Text := OpenDialog.FileName;
|
|
edtToolTip.Text := ExtractOnlyFileName(OpenDialog.FileName);
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.cbInternalCommandSelect(Sender: TObject);
|
|
var
|
|
Command: String;
|
|
begin
|
|
Command := cbInternalCommand.Items[cbInternalCommand.ItemIndex];
|
|
edtToolTip.Text := FFormCommands.GetCommandCaption(Command, cctLong);
|
|
edtInternalParameters.HelpKeyword := '/cmds.html#' + Command;
|
|
edtIconFileName.Text := UTF8LowerCase(Command);
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.CloseToolbarsBelowCurrentButton;
|
|
var
|
|
CloseFrom: Integer = 1;
|
|
i: Integer;
|
|
begin
|
|
if Assigned(FCurrentButton) then
|
|
begin
|
|
for i := 0 to sboxToolbars.ControlCount - 1 do
|
|
if sboxToolbars.Controls[i] = FCurrentButton.ToolBar then
|
|
begin
|
|
CloseFrom := i + 1;
|
|
Break;
|
|
end;
|
|
end;
|
|
for i := sboxToolbars.ControlCount - 1 downto CloseFrom do
|
|
CloseToolbar(i);
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.CloseToolbar(Index: Integer);
|
|
begin
|
|
if Index > 0 then
|
|
sboxToolbars.Controls[Index].Free;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.cbFlatButtonsChange(Sender: TObject);
|
|
var
|
|
i: Integer;
|
|
ToolBar: TKASToolBar;
|
|
begin
|
|
for i := 0 to sboxToolbars.ControlCount - 1 do
|
|
begin
|
|
ToolBar := sboxToolbars.Controls[i] as TKASToolBar;
|
|
ToolBar.Flat := cbFlatButtons.Checked;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.edtIconFileNameChange(Sender: TObject);
|
|
begin
|
|
if not FUpdatingIconText then
|
|
UpdateIcon(edtIconFileName.Text);
|
|
end;
|
|
|
|
class function TfrmOptionsToolbar.FindHotkey(NormalItem: TKASNormalItem; Hotkeys: THotkeys): THotkey;
|
|
var
|
|
i: Integer;
|
|
ToolItemID: String;
|
|
begin
|
|
for i := 0 to Hotkeys.Count - 1 do
|
|
begin
|
|
Result := Hotkeys.Items[i];
|
|
if (Result.Command = cHotKeyCommand) and
|
|
(GetParamValue(Result.Params, 'ToolItemID', ToolItemID)) and
|
|
(ToolItemID = NormalItem.ID) then
|
|
Exit;
|
|
end;
|
|
Result := nil;
|
|
end;
|
|
|
|
class function TfrmOptionsToolbar.FindHotkey(NormalItem: TKASNormalItem): THotkey;
|
|
var
|
|
HMForm: THMForm;
|
|
i: Integer;
|
|
begin
|
|
HMForm := HotMan.Forms.Find('Main');
|
|
if Assigned(HMForm) then
|
|
begin
|
|
Result := FindHotkey(NormalItem, HMForm.Hotkeys);
|
|
if not Assigned(Result) then
|
|
begin
|
|
for i := 0 to HMForm.Controls.Count - 1 do
|
|
begin
|
|
Result := FindHotkey(NormalItem, HMForm.Controls[i].Hotkeys);
|
|
if Assigned(Result) then
|
|
Break;
|
|
end;
|
|
end;
|
|
end
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.trbBarSizeChange(Sender: TObject);
|
|
var
|
|
ToolBar: TKASToolBar;
|
|
i: Integer;
|
|
begin
|
|
DisableAutoSizing;
|
|
try
|
|
lblBarSizeValue.Caption := IntToStr(trbBarSize.Position*2);
|
|
trbIconSize.Position := trbBarSize.Position - (trbBarSize.Position div 5);
|
|
for i := 0 to sboxToolbars.ControlCount - 1 do
|
|
begin
|
|
ToolBar := sboxToolbars.Controls[i] as TKASToolBar;
|
|
ToolBar.SetButtonSize(trbBarSize.Position * 2, trbBarSize.Position * 2);
|
|
end;
|
|
finally
|
|
EnableAutoSizing;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.trbIconSizeChange(Sender: TObject);
|
|
var
|
|
ToolBar: TKASToolBar;
|
|
i: Integer;
|
|
begin
|
|
DisableAutoSizing;
|
|
try
|
|
lblIconSizeValue.Caption := IntToStr(trbIconSize.Position * 2);
|
|
for i := 0 to sboxToolbars.ControlCount - 1 do
|
|
begin
|
|
ToolBar := sboxToolbars.Controls[i] as TKASToolBar;
|
|
ToolBar.GlyphSize := trbIconSize.Position * 2;
|
|
end;
|
|
finally
|
|
EnableAutoSizing;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.UpdateIcon(Icon: String);
|
|
var
|
|
ToolItem: TKASToolItem;
|
|
NormalItem: TKASNormalItem;
|
|
begin
|
|
// Refresh icon on the toolbar.
|
|
ToolItem := FCurrentButton.ToolItem;
|
|
if ToolItem is TKASNormalItem then
|
|
begin
|
|
NormalItem := TKASNormalItem(ToolItem);
|
|
NormalItem.Icon := Icon;
|
|
FCurrentButton.ToolBar.UpdateIcon(FCurrentButton);
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.ToolbarDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
|
|
begin
|
|
// Drag to a different toolbar.
|
|
Accept := (Source is TKASToolButton) and (TKASToolButton(Source).ToolBar <> Sender);
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.ToolbarDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
var
|
|
SourceButton: TKASToolButton;
|
|
TargetToolbar: TKASToolBar;
|
|
begin
|
|
if Source is TKASToolButton then
|
|
begin
|
|
SourceButton := Source as TKASToolButton;
|
|
TargetToolbar := Sender as TKASToolBar;
|
|
if SourceButton.ToolBar <> TargetToolBar then
|
|
SourceButton.ToolBar.MoveButton(SourceButton, TargetToolbar, nil);
|
|
end;
|
|
end;
|
|
|
|
function TfrmOptionsToolbar.ToolbarLoadButtonGlyph(ToolItem: TKASToolItem;
|
|
iIconSize: Integer; clBackColor: TColor): TBitmap;
|
|
begin
|
|
if ToolItem is TKASSeparatorItem then // Paint 'separator' icon
|
|
begin
|
|
Result := TBitmap.Create;
|
|
Result.Transparent := True;
|
|
Result.TransparentColor := clFuchsia;
|
|
Result.SetSize(iIconSize, iIconSize);
|
|
Result.Canvas.Brush.Color:= clFuchsia;
|
|
Result.Canvas.FillRect(Rect(0,0,iIconSize,iIconSize));
|
|
Result.Canvas.Brush.Color:= clBtnText;
|
|
Result.Canvas.RoundRect(Rect(Round(iIconSize * 0.4), 2, Round(iIconSize * 0.6), iIconSize - 2),iIconSize div 8,iIconSize div 4);
|
|
end
|
|
else if ToolItem is TKASNormalItem then
|
|
Result := PixMapManager.LoadBitmapEnhanced(TKASNormalItem(ToolItem).Icon, iIconSize, True, clBackColor)
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
(*Select button on panel*)
|
|
procedure TfrmOptionsToolbar.ToolbarToolButtonClick(Sender: TObject);
|
|
var
|
|
ClickedButton: TKASToolButton;
|
|
begin
|
|
ClickedButton := Sender as TKASToolButton;
|
|
|
|
if not FUpdatingButtonType then
|
|
ApplyEditControls;
|
|
|
|
if Assigned(FCurrentButton) then
|
|
begin
|
|
// If current toolbar has changed depress the previous button.
|
|
if FCurrentButton.ToolBar <> ClickedButton.ToolBar then
|
|
FCurrentButton.Down := False;
|
|
end;
|
|
|
|
FCurrentButton := ClickedButton;
|
|
LoadCurrentButton;
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.ToolbarToolButtonDragDrop(Sender, Source: TObject;
|
|
X, Y: Integer);
|
|
var
|
|
SourceButton, TargetButton: TKASToolButton;
|
|
begin
|
|
if Source is TKASToolButton then
|
|
begin
|
|
SourceButton := Source as TKASToolButton;
|
|
TargetButton := Sender as TKASToolButton;
|
|
// Drop to a different toolbar.
|
|
if SourceButton.ToolBar <> TargetButton.ToolBar then
|
|
begin
|
|
SourceButton.ToolBar.MoveButton(SourceButton, TargetButton.ToolBar, TargetButton);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
(* Move button if it is dragged*)
|
|
procedure TfrmOptionsToolbar.ToolbarToolButtonDragOver(Sender, Source: TObject;
|
|
X, Y: Integer; State: TDragState; var Accept: Boolean; NumberOfButton: Integer);
|
|
var
|
|
SourceButton, TargetButton: TKASToolButton;
|
|
begin
|
|
if Source is TKASToolButton then
|
|
begin
|
|
SourceButton := Source as TKASToolButton;
|
|
TargetButton := Sender as TKASToolButton;
|
|
// Move on the same toolbar.
|
|
if SourceButton.ToolBar = TargetButton.ToolBar then
|
|
begin
|
|
if FToolDragButtonNumber <> TargetButton.Tag then
|
|
begin
|
|
SourceButton.ToolBar.MoveButton(SourceButton.Tag, TargetButton.Tag);
|
|
FToolDragButtonNumber := TargetButton.Tag;
|
|
Accept := True;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
(* Do not start drag in here, because oterwise button wouldn't be pushed down*)
|
|
procedure TfrmOptionsToolbar.ToolbarToolButtonMouseDown(Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
FToolButtonMouseX := X;
|
|
FToolButtonMouseY := Y;
|
|
end;
|
|
|
|
(* Start dragging only if mbLeft if pressed and mouse moved.*)
|
|
procedure TfrmOptionsToolbar.ToolbarToolButtonMouseMove(Sender: TObject;
|
|
Shift: TShiftState; X, Y: Integer; NumberOfButton: Integer);
|
|
var
|
|
Button: TKASToolButton;
|
|
begin
|
|
if Sender is TKASToolButton then
|
|
begin
|
|
if (ssLeft in Shift) and (FToolDragButtonNumber = -1) then
|
|
if (abs(FToolButtonMouseX-X)>10) or (abs(FToolButtonMouseY-Y)>10) then
|
|
begin
|
|
Button := TKASToolButton(Sender);
|
|
FToolDragButtonNumber := NumberOfButton;
|
|
Button.Toolbar.Buttons[NumberOfButton].BeginDrag(False, 5);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
(* End button drag*)
|
|
procedure TfrmOptionsToolbar.ToolbarToolButtonMouseUp(Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
FToolDragButtonNumber := -1;
|
|
end;
|
|
|
|
function TfrmOptionsToolbar.ToolbarToolItemShortcutsHint(ToolItem: TKASNormalItem): String;
|
|
begin
|
|
Result := ShortcutsToText(GetShortcuts(ToolItem));
|
|
end;
|
|
|
|
procedure TfrmOptionsToolbar.SelectButton(ButtonNumber: Integer);
|
|
var
|
|
ToolBar: TKASToolBar;
|
|
begin
|
|
if sboxToolbars.ControlCount > 0 then
|
|
begin
|
|
ToolBar := sboxToolbars.Controls[0] as TKASToolBar;
|
|
if (ButtonNumber >= 0) and (ButtonNumber < Toolbar.ButtonCount) then
|
|
begin
|
|
FCurrentButton := Toolbar.Buttons[ButtonNumber];
|
|
PressButtonDown(FCurrentButton);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
end.
|
|
|