Browse Source

Improved menu updating.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0wpf@3467 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
b52503bd88
  1. 55
      src/Main/Base/Project/Src/Commands/BuildCommands.cs
  2. 5
      src/Main/Base/Project/Src/Gui/IWorkbench.cs
  3. 2
      src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs
  4. 2
      src/Main/Base/Project/Src/Project/BuildEngine.cs
  5. 6
      src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs
  6. 32
      src/Main/ICSharpCode.Core.Presentation/Menu/MenuCommand.cs
  7. 52
      src/Main/ICSharpCode.Core.Presentation/Menu/MenuService.cs

55
src/Main/Base/Project/Src/Commands/BuildCommands.cs

@ -14,6 +14,7 @@ using ICSharpCode.Core;
using ICSharpCode.Core.Presentation; using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Debugging; using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using System.Windows.Input;
namespace ICSharpCode.SharpDevelop.Project.Commands 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 override bool IsEnabled {
{ get { return BuildEngine.IsGuiBuildRunning; }
public MyMenuItem() set { }
{
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();
}
} }
} }

5
src/Main/Base/Project/Src/Gui/IWorkbench.cs

@ -171,10 +171,5 @@ namespace ICSharpCode.SharpDevelop.Gui
/// Is called, when a workbench view was closed /// Is called, when a workbench view was closed
/// </summary> /// </summary>
event ViewContentEventHandler ViewClosed; event ViewContentEventHandler ViewClosed;
/// <summary>
/// Is called when a key is pressed. Can be used to intercept command keys.
/// </summary>
event System.Windows.Forms.KeyEventHandler ProcessCommandKey;
} }
} }

2
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 System.Windows.Forms.IWin32Window MainWin32Window { get; private set; }
public ISynchronizeInvoke SynchronizingObject { get; set; } public ISynchronizeInvoke SynchronizingObject { get; set; }
public Window MainWindow { get { return this; } } public Window MainWindow { get { return this; } }

2
src/Main/Base/Project/Src/Project/BuildEngine.cs

@ -77,7 +77,7 @@ namespace ICSharpCode.SharpDevelop.Project
public void Done(bool success) public void Done(bool success)
{ {
WorkbenchSingleton.SafeThreadAsyncCall(delegate { guiBuildProgressMonitor = null; }); WorkbenchSingleton.SafeThreadAsyncCall( delegate { guiBuildProgressMonitor = null; });
} }
} }

6
src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs

@ -33,15 +33,9 @@ namespace ICSharpCode.Core.Presentation
this.Icon = new PixelSnapper(image); this.Icon = new PixelSnapper(image);
} catch (ResourceNotFoundException) {} } catch (ResourceNotFoundException) {}
} }
this.SubmenuOpened += CoreMenuItem_SubmenuOpened;
UpdateText(); UpdateText();
} }
void CoreMenuItem_SubmenuOpened(object sender, RoutedEventArgs e)
{
MenuService.UpdateStatus(this.ItemsSource);
}
public void UpdateText() public void UpdateText()
{ {
if (codon != null) { if (codon != null) {

32
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 { public event EventHandler CanExecuteChanged {
add { add { CommandManager.RequerySuggested += value; }
if (canExecuteChanged == null && value != null) { remove { CommandManager.RequerySuggested -= value; }
//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;
}
}
} }
public void Execute(object parameter) public void Execute(object parameter)

52
src/Main/ICSharpCode.Core.Presentation/Menu/MenuService.cs

@ -40,16 +40,48 @@ namespace ICSharpCode.Core.Presentation
return CreateMenuItems(inputBindingOwner, AddInTree.BuildItems<MenuItemDescriptor>(addInTreePath, owner, false)); return CreateMenuItems(inputBindingOwner, AddInTree.BuildItems<MenuItemDescriptor>(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) internal static IList CreateMenuItems(UIElement inputBindingOwner, IEnumerable descriptors)
{ {
ArrayList result = new ArrayList(); ArrayList result = new ArrayList();
foreach (MenuItemDescriptor descriptor in descriptors) { foreach (MenuItemDescriptor descriptor in descriptors) {
object item = CreateMenuItemFromDescriptor(inputBindingOwner, descriptor); result.Add(CreateMenuItemFromDescriptor(inputBindingOwner, descriptor));
if (item is IMenuItemBuilder) { }
IMenuItemBuilder submenuBuilder = (IMenuItemBuilder)item; return result;
result.AddRange(submenuBuilder.BuildItems(descriptor.Codon, descriptor.Caller)); }
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 { } else {
result.Add(item); result.Add(o);
IStatusUpdate statusUpdate = o as IStatusUpdate;
if (statusUpdate != null) {
statusUpdate.UpdateStatus();
statusUpdate.UpdateText();
}
} }
} }
return result; return result;
@ -72,15 +104,19 @@ namespace ICSharpCode.Core.Presentation
return new MenuCommand(inputBindingOwner, codon, descriptor.Caller, createCommand); return new MenuCommand(inputBindingOwner, codon, descriptor.Caller, createCommand);
case "Menu": case "Menu":
var item = new CoreMenuItem(codon, descriptor.Caller) { 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.SubmenuOpened += (sender, args) => {
item.ItemsSource = CreateMenuItems(inputBindingOwner, descriptor.SubItems); item.ItemsSource = ExpandMenuBuilders(subItems);
args.Handled = true; args.Handled = true;
}; };
return item; return item;
case "Builder": 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: default:
throw new System.NotSupportedException("unsupported menu item type : " + type); throw new System.NotSupportedException("unsupported menu item type : " + type);
} }

Loading…
Cancel
Save