From 46e42a95fee7bc7f1a2cef556eb02ef9682f3d96 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 10 Sep 2011 13:29:48 +0200 Subject: [PATCH] fix issues with FormKeyHandler --- .../FormKeyHandler.cs | 33 +++++---- .../FormsDesigner.AddIn.csproj | 1 + .../FormsDesignerViewContent.cs | 4 ++ .../Project/FormsDesigner.csproj | 1 - .../Project/FormsDesignerAppDomainHost.cs | 10 +-- .../Src/Services/MenuCommandService.cs | 68 +++++++++++++++++++ 6 files changed, 98 insertions(+), 19 deletions(-) rename src/AddIns/DisplayBindings/FormsDesigner/{Project/Src => FormsDesigner.AddIn}/FormKeyHandler.cs (85%) diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/FormKeyHandler.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormKeyHandler.cs similarity index 85% rename from src/AddIns/DisplayBindings/FormsDesigner/Project/Src/FormKeyHandler.cs rename to src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormKeyHandler.cs index 2f8e12f06e..20867dee4f 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/FormKeyHandler.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormKeyHandler.cs @@ -6,30 +6,36 @@ using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; +using System.Diagnostics; using System.Reflection; using System.Windows.Forms; using System.Windows.Forms.Design; +using ICSharpCode.Core; +using ICSharpCode.FormsDesigner.Services; namespace ICSharpCode.FormsDesigner { - public sealed class FormKeyHandler : IMessageFilter + public sealed class FormKeyHandler : MarshalByRefObject, IMessageFilter { const int keyPressedMessage = 0x100; const int leftMouseButtonDownMessage = 0x0202; readonly Dictionary keyTable = new Dictionary(); - FormsDesignerAppDomainHost host; + FormsDesignerViewContent formsDesigner; public static bool inserted = false; - public static void Insert(FormsDesignerAppDomainHost host) + public static void Insert(FormsDesignerViewContent formsDesigner) { + Debug.Assert(!DesignerAppDomainManager.IsDesignerDomain); inserted = true; - Application.AddMessageFilter(new FormKeyHandler(host)); + Application.AddMessageFilter(new FormKeyHandler(formsDesigner)); } - public FormKeyHandler(FormsDesignerAppDomainHost host) + public FormKeyHandler(FormsDesignerViewContent formsDesigner) { - this.host = host; + Debug.Assert(!DesignerAppDomainManager.IsDesignerDomain); + + this.formsDesigner = formsDesigner; // normal keys keyTable[Keys.Left] = new CommandWrapper(MenuCommands.KeyMoveLeft); @@ -68,8 +74,6 @@ namespace ICSharpCode.FormsDesigner return false; } - IFormsDesigner formsDesigner = host.GetService(typeof(IFormsDesigner)) as IFormsDesigner; - if (formsDesigner == null || (formsDesigner.DesignerContent != null && !((Control)formsDesigner.DesignerContent).ContainsFocus)) { return false; } @@ -98,10 +102,11 @@ namespace ICSharpCode.FormsDesigner return false; } } - host.LoggingService.Debug("Run menu command: " + commandWrapper.CommandID); + var host = formsDesigner.AppDomainHost; + LoggingService.Debug("Run menu command: " + commandWrapper.CommandID); - IMenuCommandService menuCommandService = host.MenuCommandService; - ISelectionService selectionService = (ISelectionService)host.GetService(typeof(ISelectionService)); + IMenuCommandServiceProxy menuCommandService = (IMenuCommandServiceProxy)host.MenuCommandService; + ISelectionService selectionService = host.SelectionService; ICollection components = selectionService.GetSelectedComponents(); if (components.Count == 1) { foreach (IComponent component in components) { @@ -110,7 +115,7 @@ namespace ICSharpCode.FormsDesigner } } - menuCommandService.GlobalInvoke(commandWrapper.CommandID); + menuCommandService.GlobalInvoke(CommandIDEnumConverter.ToCommandIDEnum(commandWrapper.CommandID)); if (commandWrapper.RestoreSelection) { selectionService.SetSelectedComponents(components); @@ -126,9 +131,9 @@ namespace ICSharpCode.FormsDesigner Assembly asm = typeof(WindowsFormsDesignerOptionService).Assembly; // Microsoft made ToolStripKeyboardHandlingService internal, so we need Reflection Type keyboardType = asm.GetType("System.Windows.Forms.Design.ToolStripKeyboardHandlingService"); - object keyboardService = host.GetService(keyboardType); + object keyboardService = formsDesigner.AppDomainHost.GetService(keyboardType); if (keyboardService == null) { - host.LoggingService.Debug("no ToolStripKeyboardHandlingService found"); + LoggingService.Debug("no ToolStripKeyboardHandlingService found"); return false; // handle command normally } if (activeComponent is ToolStripItem) { diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj index 91f9ddd6ab..7de520af03 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesigner.AddIn.csproj @@ -88,6 +88,7 @@ + diff --git a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs index 376a75caff..68beb100a8 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/FormsDesigner.AddIn/FormsDesignerViewContent.cs @@ -168,6 +168,10 @@ namespace ICSharpCode.FormsDesigner toolbox = new ToolboxProvider(appDomainHost); appDomainHost.UseSDAssembly(typeof(CustomWindowsFormsHost).Assembly.FullName, typeof(CustomWindowsFormsHost).Assembly.Location); + if (!FormKeyHandler.inserted) { + FormKeyHandler.Insert(this); + } + Application.Idle += ApplicationIdle; } diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj index e79a82abff..ea83a310c1 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesigner.csproj @@ -67,7 +67,6 @@ - diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs index fa513db791..8ba46b0353 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/FormsDesignerAppDomainHost.cs @@ -107,10 +107,6 @@ namespace ICSharpCode.FormsDesigner // container.AddService(typeof(System.ComponentModel.Design.IResourceService), new DesignerResourceService(properties.ResourceStore, this)); InitializeEvents(); - - if (!FormKeyHandler.inserted) { - FormKeyHandler.Insert(this); - } } #region Events @@ -436,6 +432,12 @@ namespace ICSharpCode.FormsDesigner } } + public ISelectionService SelectionService { + get { + return new SelectionServiceProxy(GetService(typeof(ISelectionService)) as ISelectionService); + } + } + List designerVerbs; public List CommandVerbs { diff --git a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs index 1f75db7ee6..ee239c9db6 100644 --- a/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs +++ b/src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/MenuCommandService.cs @@ -98,11 +98,17 @@ namespace ICSharpCode.FormsDesigner.Services { return FindCommand(CommandIDEnumConverter.ToCommandID(command)).Enabled; } + + public void GlobalInvoke(CommandIDEnum command) + { + GlobalInvoke(CommandIDEnumConverter.ToCommandID(command)); + } } public interface IMenuCommandServiceProxy { bool IsCommandEnabled(CommandIDEnum command); + void GlobalInvoke(CommandIDEnum command); } public interface IDesignerVerbProxy @@ -138,4 +144,66 @@ namespace ICSharpCode.FormsDesigner.Services verb.Invoke(); } } + + public class SelectionServiceProxy : MarshalByRefObject, ISelectionService + { + ISelectionService svc; + + public SelectionServiceProxy(ISelectionService svc) + { + this.svc = svc; + this.svc.SelectionChanged += delegate { OnSelectionChanged(EventArgs.Empty); }; + this.svc.SelectionChanging += delegate { OnSelectionChanging(EventArgs.Empty); }; + } + + public event EventHandler SelectionChanged; + + protected virtual void OnSelectionChanged(EventArgs e) + { + if (SelectionChanged != null) { + SelectionChanged(this, e); + } + } + + public event EventHandler SelectionChanging; + + protected virtual void OnSelectionChanging(EventArgs e) + { + if (SelectionChanging != null) { + SelectionChanging(this, e); + } + } + + public object PrimarySelection { + get { + return svc.PrimarySelection; + } + } + + public int SelectionCount { + get { + return svc.SelectionCount; + } + } + + public bool GetComponentSelected(object component) + { + return svc.GetComponentSelected(component); + } + + public System.Collections.ICollection GetSelectedComponents() + { + return svc.GetSelectedComponents(); + } + + public void SetSelectedComponents(System.Collections.ICollection components) + { + svc.SetSelectedComponents(components); + } + + public void SetSelectedComponents(System.Collections.ICollection components, SelectionTypes selectionType) + { + svc.SetSelectedComponents(components, selectionType); + } + } }