Răsfoiți Sursa

UPD: Different approach to executing hotkeys for submenus items in toolbar.

cobines 13 ani în urmă
părinte
comite
d909e9c50d
2 a modificat fișierele cu 36 adăugiri și 31 ștergeri
  1. 5 31
      components/KASToolBar/kastoolbar.pas
  2. 31 0
      components/KASToolBar/kastoolitems.pas

+ 5 - 31
components/KASToolBar/kastoolbar.pas

@@ -103,10 +103,9 @@ type
     FKASToolBarFlags: TToolBarFlags;
     FKASToolBarFlags: TToolBarFlags;
     FResizeButtonsNeeded: Boolean;
     FResizeButtonsNeeded: Boolean;
     procedure AssignToolButtonProperties(ToolButton: TKASToolButton);
     procedure AssignToolButtonProperties(ToolButton: TKASToolButton);
-    function CheckMenuItemClick(ToolItem: TKASToolItem; ToolItemID: String): Boolean;
     procedure ClearExecutors;
     procedure ClearExecutors;
     function CreateButton(Item: TKASToolItem): TKASToolButton;
     function CreateButton(Item: TKASToolItem): TKASToolButton;
-    function DoExecuteToolItem(Item: TKASToolItem): Boolean;
+    function ExecuteToolItem(Item: TKASToolItem): Boolean;
     function FindButton(Button: TKASToolButton): Integer;
     function FindButton(Button: TKASToolButton): Integer;
     function GetChangePath: String;
     function GetChangePath: String;
     function GetEnvVar: String;
     function GetEnvVar: String;
@@ -618,7 +617,7 @@ begin
   if FRadioToolBar and not Button.Down then
   if FRadioToolBar and not Button.Down then
     Button.Down := True;
     Button.Down := True;
 
 
-  if not DoExecuteToolItem(Button.ToolItem) then
+  if not ExecuteToolItem(Button.ToolItem) then
   begin
   begin
     if Assigned(FOnToolButtonClick) then
     if Assigned(FOnToolButtonClick) then
       FOnToolButtonClick(Button)
       FOnToolButtonClick(Button)
@@ -648,7 +647,7 @@ end;
 
 
 procedure TKASToolBar.ToolMenuClicked(Sender: TObject);
 procedure TKASToolBar.ToolMenuClicked(Sender: TObject);
 begin
 begin
-  DoExecuteToolItem(TKASToolItem((Sender as TMenuItem).Tag));
+  ExecuteToolItem(TKASToolItem((Sender as TMenuItem).Tag));
 end;
 end;
 
 
 procedure TKASToolBar.ToolButtonMouseMove(Sender: TObject; Shift:TShiftState; X,Y:Integer);
 procedure TKASToolBar.ToolButtonMouseMove(Sender: TObject; Shift:TShiftState; X,Y:Integer);
@@ -757,31 +756,6 @@ begin
   end;
   end;
 end;
 end;
 
 
-function TKASToolBar.CheckMenuItemClick(ToolItem: TKASToolItem; ToolItemID: String): Boolean;
-var
-  I: Integer;
-  MenuItem: TKASMenuItem;
-  NormalItem: TKASNormalItem;
-begin
-  if ToolItem is TKASMenuItem then
-  begin
-    MenuItem := TKASMenuItem(ToolItem);
-    for I := 0 to MenuItem.SubItems.Count - 1 do
-    begin
-      if MenuItem.SubItems[I] is TKASNormalItem then
-      begin
-        NormalItem := TKASNormalItem(MenuItem.SubItems[I]);
-        if NormalItem.ID = ToolItemID then
-        begin
-          DoExecuteToolItem(NormalItem);
-          Exit(True);
-        end;
-      end;
-    end;
-  end;
-  Result := False;
-end;
-
 procedure TKASToolBar.Clear;
 procedure TKASToolBar.Clear;
 var
 var
   I: Integer;
   I: Integer;
@@ -824,7 +798,7 @@ begin
         Break;
         Break;
       end;
       end;
 
 
-      if CheckMenuItemClick(Button.ToolItem, ToolItemID) then
+      if Button.ToolItem.CheckExecute(ToolItemID) then
         Break;
         Break;
     end;
     end;
   end;
   end;
@@ -901,7 +875,7 @@ begin
     FToolItems.Free;
     FToolItems.Free;
 end;
 end;
 
 
-function TKASToolBar.DoExecuteToolItem(Item: TKASToolItem): Boolean;
+function TKASToolBar.ExecuteToolItem(Item: TKASToolItem): Boolean;
 var
 var
   I: Integer;
   I: Integer;
   Executor: PToolItemExecutor;
   Executor: PToolItemExecutor;

+ 31 - 0
components/KASToolBar/kastoolitems.pas

@@ -38,6 +38,7 @@ type
   {$interfaces corba}
   {$interfaces corba}
   IToolOwner = interface
   IToolOwner = interface
     ['{A7908D38-1E13-4E8D-8FA7-8830A2FF9290}']
     ['{A7908D38-1E13-4E8D-8FA7-8830A2FF9290}']
+    function ExecuteToolItem(Item: TKASToolItem): Boolean;
     function GetToolItemShortcutsHint(Item: TKASToolItem): String;
     function GetToolItemShortcutsHint(Item: TKASToolItem): String;
   end;
   end;
   {$interfaces default}
   {$interfaces default}
@@ -61,6 +62,7 @@ type
     property ToolOwner: IToolOwner read FToolOwner;
     property ToolOwner: IToolOwner read FToolOwner;
   public
   public
     procedure Assign(OtherItem: TKASToolItem); virtual;
     procedure Assign(OtherItem: TKASToolItem); virtual;
+    function CheckExecute(ToolItemID: String): Boolean; virtual;
     function Clone: TKASToolItem; virtual; abstract;
     function Clone: TKASToolItem; virtual; abstract;
     function ConfigNodeName: String; virtual; abstract;
     function ConfigNodeName: String; virtual; abstract;
     function GetEffectiveHint: String; virtual; abstract;
     function GetEffectiveHint: String; virtual; abstract;
@@ -96,6 +98,7 @@ type
     Text: String;
     Text: String;
     Hint: String;
     Hint: String;
     procedure Assign(OtherItem: TKASToolItem); override;
     procedure Assign(OtherItem: TKASToolItem); override;
+    function CheckExecute(ToolItemID: String): Boolean; override;
     function Clone: TKASToolItem; override;
     function Clone: TKASToolItem; override;
     function ConfigNodeName: String; override;
     function ConfigNodeName: String; override;
     function GetEffectiveHint: String; override;
     function GetEffectiveHint: String; override;
@@ -116,6 +119,7 @@ type
     constructor Create; reintroduce;
     constructor Create; reintroduce;
     destructor Destroy; override;
     destructor Destroy; override;
     procedure Assign(OtherItem: TKASToolItem); override;
     procedure Assign(OtherItem: TKASToolItem); override;
+    function CheckExecute(ToolItemID: String): Boolean; override;
     function Clone: TKASToolItem; override;
     function Clone: TKASToolItem; override;
     function ConfigNodeName: String; override;
     function ConfigNodeName: String; override;
     procedure Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); override;
     procedure Load(Config: TXmlConfig; Node: TXmlNode; Loader: TKASToolBarLoader); override;
@@ -176,6 +180,11 @@ begin
   FUserData := OtherItem.FUserData;
   FUserData := OtherItem.FUserData;
 end;
 end;
 
 
+function TKASToolItem.CheckExecute(ToolItemID: String): Boolean;
+begin
+  Result := False;
+end;
+
 procedure TKASToolItem.Save(Config: TXmlConfig; Node: TXmlNode);
 procedure TKASToolItem.Save(Config: TXmlConfig; Node: TXmlNode);
 begin
 begin
   Node := Config.AddNode(Node, ConfigNodeName);
   Node := Config.AddNode(Node, ConfigNodeName);
@@ -282,6 +291,21 @@ begin
   end;
   end;
 end;
 end;
 
 
+function TKASMenuItem.CheckExecute(ToolItemID: String): Boolean;
+var
+  I: Integer;
+begin
+  Result := inherited CheckExecute(ToolItemID);
+  if not Result then
+  begin
+    for I := 0 to SubItems.Count - 1 do
+    begin
+      if SubItems[I].CheckExecute(ToolItemID) then
+        Exit(True);
+    end;
+  end;
+end;
+
 function TKASMenuItem.Clone: TKASToolItem;
 function TKASMenuItem.Clone: TKASToolItem;
 begin
 begin
   Result := TKASMenuItem.Create;
   Result := TKASMenuItem.Create;
@@ -396,6 +420,13 @@ begin
   end;
   end;
 end;
 end;
 
 
+function TKASNormalItem.CheckExecute(ToolItemID: String): Boolean;
+begin
+  Result := (ID = ToolItemID);
+  if Result and Assigned(FToolOwner) then
+    FToolOwner.ExecuteToolItem(Self);
+end;
+
 function TKASNormalItem.Clone: TKASToolItem;
 function TKASNormalItem.Clone: TKASToolItem;
 begin
 begin
   Result := TKASNormalItem.Create;
   Result := TKASNormalItem.Create;