Browse Source

r7324@daniel-notebook (orig r3355): daniel | 2008-08-14 22:29:16 +0200

Convert menu builders in "Build" menu to WPF.


git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0wpf@3357 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
ae5d33a76c
  1. 91
      src/Main/Base/Project/Src/Commands/BuildCommands.cs
  2. 115
      src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs
  3. 2
      src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs
  4. 6
      src/Main/Base/Project/Src/Util/ExtensionMethods.cs

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

@ -7,10 +7,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Windows.Forms; using System.Windows;
using System.Windows.Controls;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.WinForms; using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Debugging; using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
@ -224,108 +225,112 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
} }
} }
public class AbortBuild : ISubmenuBuilder public class AbortBuild : IMenuItemBuilder
{ {
public ToolStripItem[] BuildSubmenu(Codon codon, object owner) public System.Collections.ICollection BuildItems(Codon codon, object owner)
{ {
return new[] { new MenuItem() }; return new[] { new MyMenuItem() };
} }
sealed class MenuItem : ToolStripMenuItem sealed class MyMenuItem : MenuItem
{ {
public MenuItem() public MyMenuItem()
{ {
WorkbenchSingleton.Workbench.ProcessCommandKey += OnProcessCommandKey; WorkbenchSingleton.Workbench.ProcessCommandKey += OnProcessCommandKey;
ResourceService.LanguageChanged += OnLanguageChanged; ResourceService.LanguageChanged += OnLanguageChanged;
OnLanguageChanged(null, null); OnLanguageChanged(null, null);
} }
protected override void Dispose(bool disposing) // protected override void Dispose(bool disposing)
{ // {
base.Dispose(disposing); // base.Dispose(disposing);
if (disposing) { // if (disposing) {
WorkbenchSingleton.Workbench.ProcessCommandKey -= OnProcessCommandKey; // WorkbenchSingleton.Workbench.ProcessCommandKey -= OnProcessCommandKey;
ResourceService.LanguageChanged -= OnLanguageChanged; // ResourceService.LanguageChanged -= OnLanguageChanged;
} // }
} // }
//
public override bool Enabled { // public override bool Enabled {
get { return BuildEngine.IsGuiBuildRunning; } // get { return BuildEngine.IsGuiBuildRunning; }
} // }
void OnLanguageChanged(object sender, EventArgs e) void OnLanguageChanged(object sender, EventArgs e)
{ {
Text = StringParser.Parse("${res:XML.MainMenu.BuildMenu.AbortBuild}"); Header = StringParser.Parse("${res:XML.MainMenu.BuildMenu.AbortBuild}");
ShortcutKeyDisplayString = StringParser.Parse("${res:XML.MainMenu.BuildMenu.BreakKey}"); InputGestureText = StringParser.Parse("${res:XML.MainMenu.BuildMenu.BreakKey}");
} }
void OnProcessCommandKey(object sender, KeyEventArgs e) void OnProcessCommandKey(object sender, System.Windows.Forms.KeyEventArgs e)
{ {
// ToolStripMenuItem does not support Pause/Break as shortcut key, so we handle it manually // ToolStripMenuItem does not support Pause/Break as shortcut key, so we handle it manually
if (e.KeyData == Keys.Pause) { if (e.KeyData == System.Windows.Forms.Keys.Pause) {
if (Enabled) { if (IsEnabled) {
LoggingService.Debug("BREAK was pressed, aborting build."); LoggingService.Debug("BREAK was pressed, aborting build.");
PerformClick(); RaiseEvent(new RoutedEventArgs(ClickEvent));
e.Handled = true; e.Handled = true;
} }
} }
} }
protected override void OnClick(EventArgs e) protected override void OnClick()
{ {
base.OnClick(e); base.OnClick();
BuildEngine.CancelGuiBuild(); BuildEngine.CancelGuiBuild();
} }
} }
} }
public class SetConfigurationMenuBuilder : ISubmenuBuilder public class SetConfigurationMenuBuilder : IMenuItemBuilder
{ {
public ToolStripItem[] BuildSubmenu(Codon codon, object owner) public System.Collections.ICollection BuildItems(Codon codon, object owner)
{ {
if (ProjectService.OpenSolution == null) if (ProjectService.OpenSolution == null)
return new ToolStripItem[0]; return new MenuItem[0];
IList<string> configurationNames = ProjectService.OpenSolution.GetConfigurationNames(); IList<string> configurationNames = ProjectService.OpenSolution.GetConfigurationNames();
string activeConfiguration = ProjectService.OpenSolution.Preferences.ActiveConfiguration; string activeConfiguration = ProjectService.OpenSolution.Preferences.ActiveConfiguration;
ToolStripMenuItem[] items = new ToolStripMenuItem[configurationNames.Count]; MenuItem[] items = new MenuItem[configurationNames.Count];
for (int i = 0; i < items.Length; i++) { for (int i = 0; i < items.Length; i++) {
items[i] = new ToolStripMenuItem(configurationNames[i]); items[i] = new MenuItem {
Header = configurationNames[i],
IsChecked = activeConfiguration == configurationNames[i]
};
items[i].Click += SetConfigurationItemClick; items[i].Click += SetConfigurationItemClick;
items[i].Checked = activeConfiguration == configurationNames[i];
} }
return items; return items;
} }
void SetConfigurationItemClick(object sender, EventArgs e) void SetConfigurationItemClick(object sender, EventArgs e)
{ {
ToolStripMenuItem item = (ToolStripMenuItem)sender; MenuItem item = (MenuItem)sender;
ProjectService.OpenSolution.Preferences.ActiveConfiguration = item.Text; ProjectService.OpenSolution.Preferences.ActiveConfiguration = (string)item.Header;
ProjectService.OpenSolution.ApplySolutionConfigurationAndPlatformToProjects(); ProjectService.OpenSolution.ApplySolutionConfigurationAndPlatformToProjects();
ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView(); ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView();
} }
} }
public class SetPlatformMenuBuilder : ISubmenuBuilder public class SetPlatformMenuBuilder : IMenuItemBuilder
{ {
public ToolStripItem[] BuildSubmenu(Codon codon, object owner) public System.Collections.ICollection BuildItems(Codon codon, object owner)
{ {
if (ProjectService.OpenSolution == null) if (ProjectService.OpenSolution == null)
return new ToolStripItem[0]; return new MenuItem[0];
IList<string> platformNames = ProjectService.OpenSolution.GetPlatformNames(); IList<string> platformNames = ProjectService.OpenSolution.GetPlatformNames();
string activePlatform = ProjectService.OpenSolution.Preferences.ActivePlatform; string activePlatform = ProjectService.OpenSolution.Preferences.ActivePlatform;
ToolStripMenuItem[] items = new ToolStripMenuItem[platformNames.Count]; MenuItem[] items = new MenuItem[platformNames.Count];
for (int i = 0; i < items.Length; i++) { for (int i = 0; i < items.Length; i++) {
items[i] = new ToolStripMenuItem(platformNames[i]); items[i] = new MenuItem {
Header = platformNames[i],
IsChecked = activePlatform == platformNames[i]
};
items[i].Click += SetPlatformItemClick; items[i].Click += SetPlatformItemClick;
items[i].Checked = activePlatform == platformNames[i];
} }
return items; return items;
} }
void SetPlatformItemClick(object sender, EventArgs e) void SetPlatformItemClick(object sender, EventArgs e)
{ {
ToolStripMenuItem item = (ToolStripMenuItem)sender; MenuItem item = (MenuItem)sender;
ProjectService.OpenSolution.Preferences.ActivePlatform = item.Text; ProjectService.OpenSolution.Preferences.ActivePlatform = (string)item.Header;
ProjectService.OpenSolution.ApplySolutionConfigurationAndPlatformToProjects(); ProjectService.OpenSolution.ApplySolutionConfigurationAndPlatformToProjects();
ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView(); ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView();
} }

115
src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs

@ -208,19 +208,33 @@ namespace ICSharpCode.SharpDevelop.Commands
} }
} }
public class ToolMenuBuilder : ISubmenuBuilder public class ToolMenuBuilder : ISubmenuBuilder, IMenuItemBuilder
{ {
public ToolStripItem[] BuildSubmenu(Codon codon, object owner) public ToolStripItem[] BuildSubmenu(Codon codon, object owner)
{ {
MenuCommand[] items = new MenuCommand[ToolLoader.Tool.Count]; MenuCommand[] items = new MenuCommand[ToolLoader.Tool.Count];
for (int i = 0; i < ToolLoader.Tool.Count; ++i) { for (int i = 0; i < ToolLoader.Tool.Count; ++i) {
MenuCommand item = new MenuCommand(ToolLoader.Tool[i].ToString(), new EventHandler(ToolEvt)); ExternalTool tool = ToolLoader.Tool[i];
MenuCommand item = new MenuCommand(tool.ToString(), delegate { RunTool(tool); });
item.Description = "Start tool " + String.Join(String.Empty, ToolLoader.Tool[i].ToString().Split('&')); item.Description = "Start tool " + String.Join(String.Empty, ToolLoader.Tool[i].ToString().Split('&'));
items[i] = item; items[i] = item;
} }
return items; return items;
} }
public ICollection BuildItems(Codon codon, object owner)
{
var items = new System.Windows.Controls.MenuItem[ToolLoader.Tool.Count];
for (int i = 0; i < ToolLoader.Tool.Count; ++i) {
ExternalTool tool = ToolLoader.Tool[i];
items[i] = new System.Windows.Controls.MenuItem {
Header = tool.ToString()
};
items[i].Click += delegate { RunTool(tool); };
}
return items;
}
void ProcessExitEvent(object sender, EventArgs e) void ProcessExitEvent(object sender, EventArgs e)
{ {
Process p = (Process)sender; Process p = (Process)sender;
@ -229,69 +243,54 @@ namespace ICSharpCode.SharpDevelop.Commands
TaskService.BuildMessageViewCategory.AppendText(output + Environment.NewLine + "${res:XML.MainMenu.ToolMenu.ExternalTools.ExitedWithCode} " + p.ExitCode + Environment.NewLine); TaskService.BuildMessageViewCategory.AppendText(output + Environment.NewLine + "${res:XML.MainMenu.ToolMenu.ExternalTools.ExitedWithCode} " + p.ExitCode + Environment.NewLine);
} }
void RunTool(ExternalTool tool)
/// <summary>
/// This handler gets called when a tool in the Tool menu is clicked on.
/// </summary>
/// <param name="sender">The MenuCommand that sent the event.</param>
/// <param name="e">Event arguments.</param>
void ToolEvt(object sender, EventArgs e)
{ {
MenuCommand item = (MenuCommand)sender; // Set these to somewhat useful values in case StingParser.Parse() passes when being called on one of them.
string command = tool.Command;
// TODO: ToolLoader.Tool should get a string indexor. Overloading List or making it a Dictionary<string,ExternalTool> would work. string args = tool.Arguments;
for (int i = 0; i < ToolLoader.Tool.Count; ++i) {
if (item.Text != ToolLoader.Tool[i].ToString()) { continue; }
ExternalTool tool = (ExternalTool)ToolLoader.Tool[i];
// Set these to somewhat useful values in case StingParser.Parse() passes when being called on one of them.
string command = tool.Command;
string args = tool.Arguments;
// This needs it's own try/catch because if parsing these messages fail, the catch block after // This needs it's own try/catch because if parsing these messages fail, the catch block after
// the second try would also throw because MessageService.ShowError() calls StringParser.Parse() // the second try would also throw because MessageService.ShowError() calls StringParser.Parse()
try { try {
command = StringParser.Parse(tool.Command); command = StringParser.Parse(tool.Command);
args = StringParser.Parse(tool.Arguments); args = StringParser.Parse(tool.Arguments);
} catch (Exception ex) { } catch (Exception ex) {
MessageService.ShowError("${res:XML.MainMenu.ToolMenu.ExternalTools.ExecutionFailed} '" + ex.Message); MessageService.ShowError("${res:XML.MainMenu.ToolMenu.ExternalTools.ExecutionFailed} '" + ex.Message);
return;
}
if (tool.PromptForArguments) {
InputBox box = new InputBox();
box.Text = tool.MenuCommand;
box.Label.Text = ResourceService.GetString("XML.MainMenu.ToolMenu.ExternalTools.EnterArguments");
box.TextBox.Text = args;
if (box.ShowDialog(WorkbenchSingleton.MainWin32Window) != DialogResult.OK)
return; return;
args = box.TextBox.Text;
}
try {
ProcessStartInfo startinfo;
if (args == null || args.Length == 0 || args.Trim('"', ' ').Length == 0) {
startinfo = new ProcessStartInfo(command);
} else {
startinfo = new ProcessStartInfo(command, args);
} }
if (tool.PromptForArguments) { startinfo.WorkingDirectory = StringParser.Parse(tool.InitialDirectory);
InputBox box = new InputBox(); if (tool.UseOutputPad) {
box.Text = tool.MenuCommand; startinfo.UseShellExecute = false;
box.Label.Text = ResourceService.GetString("XML.MainMenu.ToolMenu.ExternalTools.EnterArguments"); startinfo.RedirectStandardOutput = true;
box.TextBox.Text = args;
if (box.ShowDialog(WorkbenchSingleton.MainWin32Window) != DialogResult.OK)
return;
args = box.TextBox.Text;
} }
Process process = new Process();
try { process.EnableRaisingEvents = true;
ProcessStartInfo startinfo; process.StartInfo = startinfo;
if (args == null || args.Length == 0 || args.Trim('"', ' ').Length == 0) { if (tool.UseOutputPad) {
startinfo = new ProcessStartInfo(command); process.Exited += new EventHandler(ProcessExitEvent);
} else {
startinfo = new ProcessStartInfo(command, args);
}
startinfo.WorkingDirectory = StringParser.Parse(tool.InitialDirectory);
if (tool.UseOutputPad) {
startinfo.UseShellExecute = false;
startinfo.RedirectStandardOutput = true;
}
Process process = new Process();
process.EnableRaisingEvents = true;
process.StartInfo = startinfo;
if (tool.UseOutputPad) {
process.Exited += new EventHandler(ProcessExitEvent);
}
process.Start();
} catch (Exception ex) {
MessageService.ShowError("${res:XML.MainMenu.ToolMenu.ExternalTools.ExecutionFailed} '" + command + " " + args + "'\n" + ex.Message);
} }
return; process.Start();
} catch (Exception ex) {
MessageService.ShowError("${res:XML.MainMenu.ToolMenu.ExternalTools.ExecutionFailed} '" + command + " " + args + "'\n" + ex.Message);
} }
} }
} }

2
src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs

@ -6,8 +6,8 @@
// </file> // </file>
using System; using System;
using ICSharpCode.Core;
using System.Windows.Controls; using System.Windows.Controls;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Gui namespace ICSharpCode.SharpDevelop.Gui
{ {

6
src/Main/Base/Project/Src/Util/ExtensionMethods.cs

@ -10,9 +10,11 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Linq; using System.Linq;
using System.Windows;
using System.Windows.Controls;
using WinForms = System.Windows.Forms; using WinForms = System.Windows.Forms;
using System.Windows.Controls; using System.Windows.Documents;
namespace ICSharpCode.SharpDevelop namespace ICSharpCode.SharpDevelop
{ {
@ -131,6 +133,8 @@ namespace ICSharpCode.SharpDevelop
Child = (System.Windows.Forms.Control)content Child = (System.Windows.Forms.Control)content
}; };
} }
} else if (content is string) {
contentControl.Content = new TextBlock(new Run(content.ToString())) { TextWrapping = TextWrapping.Wrap };
} else { } else {
contentControl.Content = content; contentControl.Content = content;
} }

Loading…
Cancel
Save