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);
}