📄 fcustomizebuttons.pas
字号:
unit fCustomizeButtons;
//*customized for si.Mail by Miha Vrhovnik
//
// author: Boris Tad, Nov 23, 2003. <botadjik@nmsu.edu>
// This notice is only applicable to CustomizeButtonsTBX_ex8cust unit;
//
// purpose: Customization dialog for use with ToolbarTBX by Alex Denisov
// that looks like MS Explorer Customize buttons dialog
//
// To run this project you must have packages installed:
// Toolbar2000: (C)Jordan Russell, http://www.jrsoftware.org
// ToolbarTBX: (C)Alex A. Denisov, http://g32.org
//
// This project was last checked in D7 to work OK with packages:
// Toolbar2000 tb2k-2.1.2 / ToolbarTBX tbx-2.0 final (Aug 17, 2003)
//
// CustomizeButtonsTBX distributed as a freeware. You may use the code in your
// applications and distribute your applications freely with this code without
// royalties or other requirements. Reference is appreciated, but not required.
//
// This code is based on Toolbar2000 edit dialog by Vinnie Murdico
// (www.softwarewithbrains.com/download/tb2kedit.zip),
// which was rebuild over 50% to work with ToolbarTBX
// and look like Windows Explorer Customize Dialog.
//
// Added support for TBXSubmenuItem, TBXVisibilityToggleItem.
// Corrected exact order of the buttons (was broken in tb2KEdit)
// You can mix TImageList and TTBImageList for TBXToolbar images
//
// Bugs submission, improvements or chewing critics of this code submit to
// Boris Tad <botadjik@nmsu.edu>
// Small corrections in the original code are marked [B.T.] whenever possible.
// This is for internal use only and doesn't reflect actual changes to the code.
//
//
//From TB2KEdit by Vinnie Murdico:
{ *******************************************************
Unit: TB2KEdit
Purpose: Toolbar2000 Component Customizer Dialog
(C)Copyright 2001 Software with Brains, Inc.
All rights reserved.
http://www.softwarewithbrains.com
support@softwarewithbrains.com
Notices:
Toolbar2000 component is (C)Copyright Jordan Russell.
License is granted to use, modify and redistribute
this unit in your applications as you see fit, as
long as the copyright notices contained herein remain
unmodified. All ownership and copyright for this code
shall remain with the original author,
Software with Brains, Inc.
*******************************************************
}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ImgList, ComCtrls, Buttons, StdCtrls, Registry, ExtCtrls, INIFiles,
TB2Item, TB2Toolbar, TB2Dock, TB2ToolWindow,
TBX,
TBXThemes; // const tbxlAuto only
type
TfrmToolbarEdit = class(TForm)
lstAvailable: TListView;
btnInsert: TSpeedButton;
btnRemove: TSpeedButton;
lblAvailableList: TLabel;
lblSelectedList: TLabel;
btnOK: TButton;
btnCancel: TButton;
lstSelected: TListView;
imgButtons: TImageList;
btnRestore: TButton;
Label1: TLabel;
btnApply: TButton;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
Label2: TLabel;
Label3: TLabel;
procedure lstSelectedDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure lstSelectedDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure btnInsertClick(Sender: TObject);
procedure lstSelectedMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure btnRemoveClick(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure btnCancelClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure lstAvailableDblClick(Sender: TObject);
procedure lstSelectedDblClick(Sender: TObject);
procedure SetAvailableList;
procedure SetSelectedList;
procedure btnRestoreClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure btnApplyClick(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure lstSelectedExit(Sender: TObject);
procedure lstSelectedChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
procedure lstSelectedEnter(Sender: TObject);
private
{ Private declarations }
procedure UpdateAvailableList;
procedure AddSeparatorImage;
procedure CheckButtonsState;
public
{ Public declarations }
published
end;
var
frmToolbarEdit: TfrmToolbarEdit;
tbxToolbar : TTBXToolbar;
sRegistryKey, sIniFileName : String;
BakCommands, SelectedCommands : TStrings;
BakCaptionState, BakImageListID : integer;
BakImageList: TImageList;
lHelpContextID : LongInt;
procedure TBXSaveToolbarButtons(Toolbar : TTBXToolbar; CaptionState,ImageListID: Integer);
procedure TBXRestoreToolbarButtons(Toolbar : TTBXToolbar; var CaptionState,ImageListID: Integer);
procedure TBXUpdateToolbarDisplay(Toolbar : TTBXToolbar; SelectedCommands : TStrings; CaptionState, ImageListID: Integer);
function TBXFindToolbarButton(Toolbar : TTBXToolbar; BtnCaption : String) : Integer;
procedure TBXInitializeToolbar(Toolbar : TTBXToolbar; RegistryKey, INIFileName : String; HelpContextID : LongInt);
procedure UpdateOtherApplicationSettings(CaptionState, ImageListID: integer);
implementation
{$R *.DFM}
procedure TfrmToolbarEdit.lstSelectedDragDrop(Sender, Source: TObject; X, Y: Integer);
var
NewListItem : TListItem;
NewPos : Integer;
begin
NewListItem := nil; //B.T.
If (Source is TListView) then
With (Sender as TListView) Do begin
If ((Source as TListView).Selected.Caption <> 'Separator')
or (Sender <> lstAvailable)
or ((Source as TListView) <> lstSelected) Then begin
If (GetItemAt(X,Y) <> Nil) Then
NewPos := GetItemAt(X,Y).Index
Else
NewPos := Items.Count;
NewListItem := Items.Insert(NewPos);
NewListItem.Caption := (Source as TListView).Selected.Caption;
NewListItem.ImageIndex := (Source as TListView).Selected.ImageIndex;
end;
// B.T.->
// find separator item in the lstAvailable after drop down
If ((Source as TListView).Selected.Caption = 'Separator')
and (Sender = lstAvailable)
and ((Source as TListView) = lstSelected)
then NewListItem := lstAvailable.FindCaption(0, 'Separator', False, True, False);
//B.T.|
If (((Source as TListView).Selected.Caption <> 'Separator') or (Sender = lstAvailable))
or (((Source as TListView).Selected.Caption = 'Separator') and (Sender = lstSelected) and ((Source as TListView) = lstSelected))
Then (Source as TListView).Selected.Delete;
end;
//B.T.->
// select new item. Must put here, not above else no drag inside listView
if NewListItem <> nil then begin
NewListItem.Selected:=True;
NewListItem.Focused:=True;
NewListItem.MakeVisible(False); //bring ino view
end;
(Sender as TListView).SetFocus;
// btnOK.Enabled:=True;
btnRestore.Enabled:=True;
btnApply.Enabled:=True;
// to adjust column width to match the clien area (no horis. scrollbar)
lstAvailable.Columns[0].Width:= lstAvailable.ClientWidth;
lstSelected.Columns[0].Width := lstSelected.ClientWidth;
CheckButtonsState;
//B.T.
end;
procedure TfrmToolbarEdit.lstSelectedMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
(Sender as TListView).Selected := (Sender as TListView).GetItemAt(X,Y);
end;
procedure TfrmToolbarEdit.lstSelectedDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := (Source is TListView);
end;
procedure TfrmToolbarEdit.btnInsertClick(Sender: TObject);
begin
If (lstAvailable.Selected <> Nil) Then begin
lstSelectedDragDrop(lstSelected, lstAvailable, $FFFF, $FFFF);
end;
end;
procedure TfrmToolbarEdit.btnRemoveClick(Sender: TObject);
begin
If (lstSelected.Selected <> Nil) Then begin
lstSelectedDragDrop(lstAvailable, lstSelected, $FFFF, $FFFF);
end;
end;
procedure TfrmToolbarEdit.btnOKClick(Sender: TObject);
var
i: integer;
CaptionState: integer;
ImageListID: integer;
begin
SelectedCommands.Clear;
for i := 0 to lstSelected.Items.Count - 1 do
SelectedCommands.Add(lstSelected.Items[I].Caption);
CaptionState := ComboBox1.ItemIndex;
ImageListID := ComboBox2.ItemIndex;
TBXUpdateToolbarDisplay(tbxToolbar, SelectedCommands, CaptionState, ImageListID);
TBXSaveToolbarButtons(tbxToolbar, CaptionState, ImageListID);
// set any other parameters of your application,
// which might depend on CaptionState and ImageListID
UpdateOtherApplicationSettings(CaptionState, ImageListID);
ModalResult := mrOK;
end;
procedure TfrmToolbarEdit.btnCancelClick(Sender: TObject);
begin
// restore Toolbar buttons in case they were modified
TBXUpdateToolbarDisplay(tbxToolbar, BakCommands, BakCaptionState, BakImageListID);
ModalResult := mrCancel; //Close
end;
procedure TfrmToolbarEdit.btnRestoreClick(Sender: TObject);
var
i : integer;
lstItem : TListItem;
begin
// restore Caption & Icon settings
ComboBox1.ItemIndex := BakCaptionState;
ComboBox2.ItemIndex := BakImageListID;
lstAvailable.Items.BeginUpdate;
lstSelected.Items.BeginUpdate;
// restore original images for lstAvailable & lstSelected
imgButtons.Assign(BakImageList);
lstAvailable.Items.Clear;
lstSelected.Items.Clear;
// populate lstAvailable from Toolbar
SetAvailableList;
// move some buttons to the lstSelected list according to Backup
for i := 0 to BakCommands.Count - 1 do begin
lstItem := nil;
lstItem := lstAvailable.FindCaption(0, BakCommands[i], False, True, False);
if (lstItem <> nil) then begin
lstAvailable.Selected := lstItem;
btnInsertClick(btnInsert);
end;
end;
lstAvailable.Items.EndUpdate;
lstSelected.Items.EndUpdate;
if lstSelected.Items.Count > 0 then begin
lstSelected.Items[0].Selected:=True; //select
lstSelected.Items[0].Focused:=True; //set focus
lstSelected.Items[0].MakeVisible(False); //bring ino view
end;
//select first item (separator)
if lstAvailable.Items.Count > 0 then
lstAvailable.ItemIndex := 0;
lstAvailable.SetFocus;
// btnOK.Enabled:=False;
btnRestore.Enabled:=False;
btnApply.Enabled:=False;
// to adjust column width to match the client area (no horis. scrollbar)
lstAvailable.Columns[0].Width:= lstAvailable.ClientWidth;
lstSelected.Columns[0].Width := lstSelected.ClientWidth;
// restore Toolbar buttons in case they were modified
TBXUpdateToolbarDisplay(tbxToolbar, BakCommands, BakCaptionState, BakImageListID);
CheckButtonsState;
end;
procedure TfrmToolbarEdit.SetSelectedList;
var
lstItem : TListItem;
I : Integer;
begin
lstSelected.Items.BeginUpdate;
lstAvailable.Items.BeginUpdate;
lstSelected.SmallImages.Width := BakImageList.Width;
lstSelected.SmallImages.Height := BakImageList.Height;
With lstSelected Do begin
Items.Clear;
// Add the currently displayed (visible) buttons to the selected list.
For I := 0 to tbxToolbar.Items.Count - 1 Do
If (tbxToolbar.Items[I].Visible) Then
begin
lstItem := Nil;
if (tbxToolbar.Items[I] is TTBXSeparatorItem) then
lstItem := lstAvailable.FindCaption(0, 'Separator', False, True, False)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -