am2000shortcut.pas
上传用户:powellwoo
上传日期:2007-01-07
资源大小:109k
文件大小:8k
源码类别:

Delphi控件源码

开发平台:

C++ Builder

  1. {*******************************************************}
  2. {                                                       }
  3. {       AnimatedMenus/2000                              }
  4. {       Shortcut editor                                 }
  5. {                                                       }
  6. {       Copyright (c) 1997-99 AnimatedMenus.com         }
  7. {       All rights reserved.                            }
  8. {                                                       }
  9. {*******************************************************}
  10. unit am2000shortcut;
  11. {$I am2000.inc}
  12. interface
  13. uses
  14.   SysUtils, ComCtrls, StdCtrls, Controls, ExtCtrls, Classes, Forms,
  15.   DsgnIntf;
  16. type
  17.   // shortcut property
  18.   T_AM2000_ShortCutProperty = class(TPropertyEditor)
  19.   public
  20.     function GetValue: string; override;
  21.     function GetAttributes: TPropertyAttributes; override;
  22.     function AllEqual: Boolean; override;
  23.     procedure Edit; override;
  24.   end;
  25.   // shortcut editor
  26.   T_AM2000_ShortCutEditor = class(TForm)
  27.     ListView1: TListView;
  28.     Panel1: TPanel;
  29.     Button1: TButton;
  30.     StatusBar1: TStatusBar;
  31.     PrefC: TCheckBox;
  32.     PrefSC: TCheckBox;
  33.     PrefCA: TCheckBox;
  34.     PrefSCA: TCheckBox;
  35.     Button3: TButton;
  36.     PrefS: TCheckBox;
  37.     PrefFn: TCheckBox;
  38.     PrefA: TCheckBox;
  39.     PrefSA: TCheckBox;
  40.     procedure RebuildShortCuts(Sender: TObject);
  41.     procedure Button2Click(Sender: TObject);
  42.     procedure FormShow(Sender: TObject);
  43.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  44.   private
  45.     FShortCuts: String;
  46.     procedure SetShortCuts(AShortCuts: String);
  47.     function GetShortCuts: String;
  48.   protected
  49.     procedure Loaded; override;
  50.   public
  51.     function EditShortCuts(var AShortCuts: String): Boolean;
  52.   end;
  53. implementation
  54. uses
  55.   Registry,
  56.   am2000const;
  57. const
  58.   SHORTCUT_REGISTRY_KEY : String = 'SoftwareAnimatedMenus.comAnimatedMenus/2000ShortCutEditor';
  59. {$R *.DFM}
  60. procedure T_AM2000_ShortCutEditor.Loaded;
  61. var
  62.   R: TRegistry;
  63. begin
  64.   R:= TRegistry.Create;
  65.   R.OpenKey(SHORTCUT_REGISTRY_KEY, True);
  66.   try PrefA.Checked:= R.ReadBool('Alt');
  67.   except end;
  68.   try PrefC.Checked:= R.ReadBool('Ctrl');
  69.   except end;
  70.   try PrefS.Checked:= R.ReadBool('Shift');
  71.   except end;
  72.   try PrefCA.Checked:= R.ReadBool('CtrlAlt');
  73.   except end;
  74.   try PrefSA.Checked:= R.ReadBool('ShiftAlt');
  75.   except end;
  76.   try PrefSC.Checked:= R.ReadBool('ShiftCtrl');
  77.   except end;
  78.   try PrefSCA.Checked:= R.ReadBool('ShiftCtrlAlt');
  79.   except end;
  80.   try PrefFn.Checked:= R.ReadBool('Func');
  81.   except end;
  82.   R.Free;
  83.   RebuildShortCuts(nil);
  84. end;
  85. procedure T_AM2000_ShortCutEditor.SetShortCuts(AShortCuts: String);
  86. var
  87.   I, P, E: Integer;
  88.   T: TListItem;
  89.   S: String;
  90. begin
  91.   FShortCuts:= AShortCuts;
  92.   // add visible shortcuts
  93.   for I:= 0 to ListView1.Items.Count -1 do begin
  94.     T:= ListView1.Items[I];
  95.     P:= Pos(T.Caption, AShortCuts);
  96.     E:= P + Length(T.Caption);
  97.     if (P <> 0)
  98.     and ((P = 1) or (AShortCuts[P -1] = ';'))
  99.     and ((E > Length(AShortCuts)) or (AShortCuts[E] = ';'))
  100.     then begin
  101.       T.Checked:= True;
  102.       Delete(AShortCuts, P, E -P);
  103.     end
  104.     else
  105.       if T.Checked
  106.       then T.Checked:= False;
  107.   end;
  108.   // add other shortcuts
  109.   while AShortCuts <> '' do begin
  110.     P:= Pos(';', AShortCuts);
  111.     if P = 0 then P:= Length(AShortCuts) +1;
  112.     S:= Copy(AShortCuts, 1, P -1);
  113.     Delete(AShortCuts, 1, P);
  114.     if S <> '' then
  115.       with ListView1.Items.Add do begin
  116.         Caption:= S;
  117.         Checked:= True;
  118.       end;
  119.   end;
  120. end;
  121. function T_AM2000_ShortCutEditor.GetShortCuts: String;
  122. var
  123.   I: Integer;
  124.   T: TListItem;
  125. begin
  126.   Result:= '';
  127.   for I:= 0 to ListView1.Items.Count -1 do begin
  128.     T:= ListView1.Items[I];
  129.     if T.Checked then begin
  130.       if Result <> '' then AppendStr(Result, ';');
  131.       AppendStr(Result, T.Caption);
  132.     end;
  133.   end;
  134. end;
  135. procedure T_AM2000_ShortCutEditor.RebuildShortCuts(Sender: TObject);
  136. const
  137.   nMaxPref = 8;
  138.   Prefixes : array [0..nMaxPref -1] of String =
  139.     ('',
  140.      SAlt + '+' ,
  141.      SCtrl + '+',
  142.      SShift + '+',
  143.      SCtrl + '+' + SAlt + '+',
  144.      SShift + '+' + SAlt + '+',
  145.      SShift + '+' + SCtrl + '+',
  146.      SShift + '+' + SCtrl + '+' + SAlt  + '+');
  147. var
  148.   I, J: Integer;
  149.   C: Char;
  150.   PrefCheck : array [0..nMaxPref -1] of TCheckBox;
  151.   procedure AddCustomShortCut(SC: String);
  152.   var
  153.     I: Integer;
  154.   begin
  155.     ListView1.Items.Add.Caption:= SC;
  156. //    ListView1.Items.Add.Caption:= 'Shift+' + SC;
  157.     for I:= 1 to nMaxPref -1 do
  158.       if PrefCheck[I].Checked then
  159.         ListView1.Items.Add.Caption:= Prefixes[I] + SC;
  160.   end;
  161. begin
  162.   PrefCheck[0]:= nil;
  163.   PrefCheck[1]:= PrefA;
  164.   PrefCheck[2]:= PrefC;
  165.   PrefCheck[3]:= PrefS;
  166.   PrefCheck[4]:= PrefCA;
  167.   PrefCheck[5]:= PrefSA;
  168.   PrefCheck[6]:= PrefSC;
  169.   PrefCheck[7]:= PrefSCA;
  170.   with ListView1.Items do begin
  171.     BeginUpdate;
  172.     Clear;
  173.     for I:= 1 to nMaxPref -1 do
  174.       if PrefCheck[I].Checked
  175.       and (I <> 3)
  176.       then
  177.         for C:= 'A' to 'Z' do
  178.           Add.Caption:= Prefixes[I] + C;
  179.     if PrefFn.Checked then
  180.       for I:= 0 to nMaxPref -1 do
  181.         if (PrefCheck[I] = nil)
  182.         or PrefCheck[I].Checked
  183.         then
  184.           for J:= 1 to 12 do
  185.             Add.Caption:= Prefixes[I] + 'F' + IntToStr(J);
  186.     // custom shortcuts
  187.     AddCustomShortCut('Esc');
  188.     AddCustomShortCut(SIns);
  189.     AddCustomShortCut(SDel);
  190.     AddCustomShortCut('BkSp');
  191.     EndUpdate;
  192.   end;
  193.   SetShortCuts(FShortCuts);
  194. end;
  195. procedure T_AM2000_ShortCutEditor.Button2Click(Sender: TObject);
  196. begin
  197.   SetShortCuts('');
  198. end;
  199. function T_AM2000_ShortCutEditor.EditShortCuts(
  200.   var AShortCuts: String): Boolean;
  201. begin
  202.   SetShortCuts(AShortCuts);
  203.   Result:= ShowModal = mrOk;
  204.   if Result then AShortCuts:= GetShortCuts;
  205. end;
  206. { T_AM2000_ShortCutProperty }
  207. procedure T_AM2000_ShortCutProperty.Edit;
  208. var
  209.   ShortCutEditor: T_AM2000_ShortCutEditor;
  210.   S: String;
  211. begin
  212.   ShortCutEditor:= T_AM2000_ShortCutEditor.Create(Application);
  213.   S:= GetStrValue;
  214.   if ShortCutEditor.EditShortCuts(S) then begin
  215.     SetStrValue(S);
  216.     Modified;
  217.   end;
  218.   ShortCutEditor.Free;
  219. end;
  220. function T_AM2000_ShortCutProperty.GetAttributes: TPropertyAttributes;
  221. begin
  222.   Result := [paMultiSelect, paDialog];
  223. end;
  224. function T_AM2000_ShortCutProperty.GetValue: string;
  225. begin
  226.   Result:= GetStrValue;
  227.   if Result = '' then Result:= '(None)';
  228. end;
  229. function T_AM2000_ShortCutProperty.AllEqual: Boolean;
  230. var
  231.   I: Integer;
  232.   S: String;
  233. begin
  234.   Result:= False;
  235.   if PropCount > 1 then
  236.   begin
  237.     S:= GetStrValue;
  238.     for I:= 1 to PropCount - 1 do
  239.       if GetStrValueAt(I) <> S then Exit;
  240.   end;
  241.   Result:= True;
  242. end;
  243. procedure T_AM2000_ShortCutEditor.FormShow(Sender: TObject);
  244. begin
  245.   PrefA.Caption:=  SAlt + '+...';
  246.   PrefC.Caption:=  SCtrl + '+...';
  247.   PrefS.Caption:= SShift + '+...';
  248.   PrefCA.Caption:= SCtrl + '+' + SAlt + '+...';
  249.   PrefSA.Caption:= SShift + '+' + SAlt + '+...';
  250.   PrefSC.Caption:= SShift + '+' + SCtrl + '+...';
  251.   PrefSCA.Caption:= SShift + '+' + SCtrl + '+' + SAlt + '+...';
  252. end;
  253. procedure T_AM2000_ShortCutEditor.FormClose(Sender: TObject;
  254.   var Action: TCloseAction);
  255. var
  256.   R: TRegistry;
  257. begin
  258.   R:= TRegistry.Create;
  259.   R.OpenKey(SHORTCUT_REGISTRY_KEY, True);
  260.   try R.WriteBool('Alt', PrefA.Checked);
  261.   except end;
  262.   try R.WriteBool('Ctrl', PrefC.Checked);
  263.   except end;
  264.   try R.WriteBool('Shift', PrefS.Checked);
  265.   except end;
  266.   try R.WriteBool('CtrlAlt', PrefCA.Checked);
  267.   except end;
  268.   try R.WriteBool('ShiftAlt', PrefSA.Checked);
  269.   except end;
  270.   try R.WriteBool('ShiftCtrl', PrefSC.Checked);
  271.   except end;
  272.   try R.WriteBool('ShiftCtrlAlt', PrefSCA.Checked);
  273.   except end;
  274.   try R.WriteBool('Func', PrefFn.Checked);
  275.   except end;
  276.   R.Free;
  277. end;
  278. end.