From b537595e0bcd954f5564102f34d05c4c8794646a Mon Sep 17 00:00:00 2001 From: Christian Hornung Date: Thu, 17 Sep 2009 16:10:09 +0000 Subject: [PATCH] Fixed SD2-1016 - #Develop menus cannot be navigated using arrow keys when a winform has the focus. FormKeyHandler now uses Control.FromChildHandle to determine whether the key message actually comes from inside the forms designer. Replaced Hashtable with generic Dictionary. Removed unused local variable "ctl". git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@4948 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/FormKeyHandler.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/FormKeyHandler.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/FormKeyHandler.cs index 06c0dc7f15..11647c3391 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/FormKeyHandler.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/FormKeyHandler.cs @@ -7,6 +7,7 @@ using System; using System.Collections; +using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; using System.Reflection; @@ -18,12 +19,12 @@ using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.FormsDesigner { - public class FormKeyHandler : IMessageFilter + public sealed class FormKeyHandler : IMessageFilter { const int keyPressedMessage = 0x100; const int leftMouseButtonDownMessage = 0x0202; - Hashtable keyTable = new Hashtable(); + readonly Dictionary keyTable = new Dictionary(); public static bool inserted = false; public static void Insert() { @@ -81,6 +82,13 @@ namespace ICSharpCode.FormsDesigner return false; } + Control originControl = Control.FromChildHandle(m.HWnd); + if (originControl != null && formDesigner.Control != null && !(formDesigner.Control == originControl || formDesigner.Control.Contains(originControl))) { + // Ignore if message origin not in forms designer + // (e.g. navigating the main menu) + return false; + } + Keys keyPressed = (Keys)m.WParam.ToInt32() | Control.ModifierKeys; if (keyPressed == Keys.Escape) { @@ -90,8 +98,8 @@ namespace ICSharpCode.FormsDesigner } } - CommandWrapper commandWrapper = (CommandWrapper)keyTable[keyPressed]; - if (commandWrapper != null) { + CommandWrapper commandWrapper; + if (keyTable.TryGetValue(keyPressed, out commandWrapper)) { if (commandWrapper.CommandID == MenuCommands.Delete) { // Check Delete menu is enabled. if (!formDesigner.EnableDelete) { @@ -99,7 +107,6 @@ namespace ICSharpCode.FormsDesigner } } LoggingService.Debug("Run menu command: " + commandWrapper.CommandID); - Control ctl = WorkbenchSingleton.ActiveControl; IMenuCommandService menuCommandService = (IMenuCommandService)formDesigner.Host.GetService(typeof(IMenuCommandService)); ISelectionService selectionService = (ISelectionService)formDesigner.Host.GetService(typeof(ISelectionService)); @@ -160,7 +167,7 @@ namespace ICSharpCode.FormsDesigner return false; // invoke the CommandID } - class CommandWrapper + sealed class CommandWrapper { CommandID commandID; bool restoreSelection;