⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fcustomizebuttons.pas

📁 siMail, siMail, siMail, siMail
💻 PAS
📖 第 1 页 / 共 3 页
字号:
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 + -