From b52503bd885dee0129267706287791548542b7ae Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 30 Aug 2008 22:06:35 +0000 Subject: [PATCH] Improved menu updating. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0wpf@3467 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Project/Src/Commands/BuildCommands.cs | 55 +++---------------- src/Main/Base/Project/Src/Gui/IWorkbench.cs | 5 -- .../Project/Src/Gui/Workbench/WpfWorkbench.cs | 2 - .../Base/Project/Src/Project/BuildEngine.cs | 2 +- .../Menu/CoreMenuItem.cs | 6 -- .../Menu/MenuCommand.cs | 32 +---------- .../Menu/MenuService.cs | 52 +++++++++++++++--- 7 files changed, 54 insertions(+), 100 deletions(-) diff --git a/src/Main/Base/Project/Src/Commands/BuildCommands.cs b/src/Main/Base/Project/Src/Commands/BuildCommands.cs index a56e4716ad..4bc1dc5e6d 100644 --- a/src/Main/Base/Project/Src/Commands/BuildCommands.cs +++ b/src/Main/Base/Project/Src/Commands/BuildCommands.cs @@ -14,6 +14,7 @@ using ICSharpCode.Core; using ICSharpCode.Core.Presentation; using ICSharpCode.SharpDevelop.Debugging; using ICSharpCode.SharpDevelop.Gui; +using System.Windows.Input; namespace ICSharpCode.SharpDevelop.Project.Commands { @@ -225,58 +226,16 @@ namespace ICSharpCode.SharpDevelop.Project.Commands } } - public class AbortBuild : IMenuItemBuilder + public class AbortBuild : AbstractMenuCommand { - public System.Collections.ICollection BuildItems(Codon codon, object owner) + public override void Run() { - return new[] { new MyMenuItem() }; + BuildEngine.CancelGuiBuild(); } - sealed class MyMenuItem : MenuItem - { - public MyMenuItem() - { - WorkbenchSingleton.Workbench.ProcessCommandKey += OnProcessCommandKey; - ResourceService.LanguageChanged += OnLanguageChanged; - OnLanguageChanged(null, null); - } - -// protected override void Dispose(bool disposing) -// { -// base.Dispose(disposing); -// if (disposing) { -// WorkbenchSingleton.Workbench.ProcessCommandKey -= OnProcessCommandKey; -// ResourceService.LanguageChanged -= OnLanguageChanged; -// } -// } -// -// public override bool Enabled { -// get { return BuildEngine.IsGuiBuildRunning; } -// } - - void OnLanguageChanged(object sender, EventArgs e) - { - Header = StringParser.Parse("${res:XML.MainMenu.BuildMenu.AbortBuild}"); - InputGestureText = StringParser.Parse("${res:XML.MainMenu.BuildMenu.BreakKey}"); - } - - void OnProcessCommandKey(object sender, System.Windows.Forms.KeyEventArgs e) - { - // ToolStripMenuItem does not support Pause/Break as shortcut key, so we handle it manually - if (e.KeyData == System.Windows.Forms.Keys.Pause) { - if (IsEnabled) { - LoggingService.Debug("BREAK was pressed, aborting build."); - RaiseEvent(new RoutedEventArgs(ClickEvent)); - e.Handled = true; - } - } - } - - protected override void OnClick() - { - base.OnClick(); - BuildEngine.CancelGuiBuild(); - } + public override bool IsEnabled { + get { return BuildEngine.IsGuiBuildRunning; } + set { } } } diff --git a/src/Main/Base/Project/Src/Gui/IWorkbench.cs b/src/Main/Base/Project/Src/Gui/IWorkbench.cs index c841b1db00..6ed9da80fb 100644 --- a/src/Main/Base/Project/Src/Gui/IWorkbench.cs +++ b/src/Main/Base/Project/Src/Gui/IWorkbench.cs @@ -171,10 +171,5 @@ namespace ICSharpCode.SharpDevelop.Gui /// Is called, when a workbench view was closed /// event ViewContentEventHandler ViewClosed; - - /// - /// Is called when a key is pressed. Can be used to intercept command keys. - /// - event System.Windows.Forms.KeyEventHandler ProcessCommandKey; } } diff --git a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs index 533f6e2b2d..351f78c081 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs @@ -47,8 +47,6 @@ namespace ICSharpCode.SharpDevelop.Gui } } - public event System.Windows.Forms.KeyEventHandler ProcessCommandKey; - public System.Windows.Forms.IWin32Window MainWin32Window { get; private set; } public ISynchronizeInvoke SynchronizingObject { get; set; } public Window MainWindow { get { return this; } } diff --git a/src/Main/Base/Project/Src/Project/BuildEngine.cs b/src/Main/Base/Project/Src/Project/BuildEngine.cs index 6788de8acc..ddd0bd0b4e 100644 --- a/src/Main/Base/Project/Src/Project/BuildEngine.cs +++ b/src/Main/Base/Project/Src/Project/BuildEngine.cs @@ -77,7 +77,7 @@ namespace ICSharpCode.SharpDevelop.Project public void Done(bool success) { - WorkbenchSingleton.SafeThreadAsyncCall(delegate { guiBuildProgressMonitor = null; }); + WorkbenchSingleton.SafeThreadAsyncCall( delegate { guiBuildProgressMonitor = null; }); } } diff --git a/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs b/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs index 9a1fe96021..e2642e0acd 100644 --- a/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs +++ b/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs @@ -33,15 +33,9 @@ namespace ICSharpCode.Core.Presentation this.Icon = new PixelSnapper(image); } catch (ResourceNotFoundException) {} } - this.SubmenuOpened += CoreMenuItem_SubmenuOpened; UpdateText(); } - void CoreMenuItem_SubmenuOpened(object sender, RoutedEventArgs e) - { - MenuService.UpdateStatus(this.ItemsSource); - } - public void UpdateText() { if (codon != null) { diff --git a/src/Main/ICSharpCode.Core.Presentation/Menu/MenuCommand.cs b/src/Main/ICSharpCode.Core.Presentation/Menu/MenuCommand.cs index 12dfdfb4d6..e66618f776 100644 --- a/src/Main/ICSharpCode.Core.Presentation/Menu/MenuCommand.cs +++ b/src/Main/ICSharpCode.Core.Presentation/Menu/MenuCommand.cs @@ -54,37 +54,9 @@ namespace ICSharpCode.Core.Presentation } } - void CommandManager_RequerySuggested(object sender, EventArgs e) - { - //LoggingService.Debug("Received CommandManager_RequerySuggested "); - if (canExecuteChanged != null) - canExecuteChanged(this, e); - } - - // keep a reference to the event handler to prevent it from being gargabe collected - // (CommandManager.RequerySuggested only keeps weak references to the event handlers) - EventHandler requerySuggestedEventHandler; - - // only attach to CommandManager.RequerySuggested if someone listens to the CanExecuteChanged event - EventHandler canExecuteChanged; - public event EventHandler CanExecuteChanged { - add { - if (canExecuteChanged == null && value != null) { - //LoggingService.Debug("Attach CommandManager_RequerySuggested " + codon.Id); - if (requerySuggestedEventHandler == null) - requerySuggestedEventHandler = new EventHandler(CommandManager_RequerySuggested); - CommandManager.RequerySuggested += requerySuggestedEventHandler; - } - canExecuteChanged += value; - } - remove { - canExecuteChanged -= value; - if (canExecuteChanged == null) { - //LoggingService.Debug("Detach CommandManager_RequerySuggested " + codon.Id); - CommandManager.RequerySuggested -= requerySuggestedEventHandler; - } - } + add { CommandManager.RequerySuggested += value; } + remove { CommandManager.RequerySuggested -= value; } } public void Execute(object parameter) diff --git a/src/Main/ICSharpCode.Core.Presentation/Menu/MenuService.cs b/src/Main/ICSharpCode.Core.Presentation/Menu/MenuService.cs index 44bcc0798b..f7867efe74 100644 --- a/src/Main/ICSharpCode.Core.Presentation/Menu/MenuService.cs +++ b/src/Main/ICSharpCode.Core.Presentation/Menu/MenuService.cs @@ -40,16 +40,48 @@ namespace ICSharpCode.Core.Presentation return CreateMenuItems(inputBindingOwner, AddInTree.BuildItems(addInTreePath, owner, false)); } + sealed class MenuItemBuilderPlaceholder + { + readonly IMenuItemBuilder builder; + readonly Codon codon; + readonly object caller; + + public MenuItemBuilderPlaceholder(IMenuItemBuilder builder, Codon codon, object caller) + { + this.builder = builder; + this.codon = codon; + this.caller = caller; + } + + public ICollection BuildItems() + { + return builder.BuildItems(codon, caller); + } + } + internal static IList CreateMenuItems(UIElement inputBindingOwner, IEnumerable descriptors) { ArrayList result = new ArrayList(); foreach (MenuItemDescriptor descriptor in descriptors) { - object item = CreateMenuItemFromDescriptor(inputBindingOwner, descriptor); - if (item is IMenuItemBuilder) { - IMenuItemBuilder submenuBuilder = (IMenuItemBuilder)item; - result.AddRange(submenuBuilder.BuildItems(descriptor.Codon, descriptor.Caller)); + result.Add(CreateMenuItemFromDescriptor(inputBindingOwner, descriptor)); + } + return result; + } + + internal static IList ExpandMenuBuilders(ICollection input) + { + ArrayList result = new ArrayList(input.Count); + foreach (object o in input) { + MenuItemBuilderPlaceholder p = o as MenuItemBuilderPlaceholder; + if (p != null) { + result.AddRange(p.BuildItems()); } else { - result.Add(item); + result.Add(o); + IStatusUpdate statusUpdate = o as IStatusUpdate; + if (statusUpdate != null) { + statusUpdate.UpdateStatus(); + statusUpdate.UpdateText(); + } } } return result; @@ -72,15 +104,19 @@ namespace ICSharpCode.Core.Presentation return new MenuCommand(inputBindingOwner, codon, descriptor.Caller, createCommand); case "Menu": var item = new CoreMenuItem(codon, descriptor.Caller) { - ItemsSource = CreateMenuItems(inputBindingOwner, descriptor.SubItems) + ItemsSource = new object[1] }; + var subItems = CreateMenuItems(inputBindingOwner, descriptor.SubItems); item.SubmenuOpened += (sender, args) => { - item.ItemsSource = CreateMenuItems(inputBindingOwner, descriptor.SubItems); + item.ItemsSource = ExpandMenuBuilders(subItems); args.Handled = true; }; return item; case "Builder": - return codon.AddIn.CreateObject(codon.Properties["class"]); + IMenuItemBuilder builder = codon.AddIn.CreateObject(codon.Properties["class"]) as IMenuItemBuilder; + if (builder == null) + throw new NotSupportedException("Menu item builder " + codon.Properties["class"] + " does not implement IMenuItemBuilder"); + return new MenuItemBuilderPlaceholder(builder, descriptor.Codon, descriptor.Caller); default: throw new System.NotSupportedException("unsupported menu item type : " + type); }