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 @@ @@ -7,10 +7,11 @@
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Windows;
using System.Windows.Controls;
using ICSharpCode.Core;
using ICSharpCode.Core.WinForms;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Gui;
@ -224,108 +225,112 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -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;
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; }
}
// 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)
{
Text = StringParser.Parse("${res:XML.MainMenu.BuildMenu.AbortBuild}");
ShortcutKeyDisplayString = StringParser.Parse("${res:XML.MainMenu.BuildMenu.BreakKey}");
Header = StringParser.Parse("${res:XML.MainMenu.BuildMenu.AbortBuild}");
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
if (e.KeyData == Keys.Pause) {
if (Enabled) {
if (e.KeyData == System.Windows.Forms.Keys.Pause) {
if (IsEnabled) {
LoggingService.Debug("BREAK was pressed, aborting build.");
PerformClick();
RaiseEvent(new RoutedEventArgs(ClickEvent));
e.Handled = true;
}
}
}
protected override void OnClick(EventArgs e)
protected override void OnClick()
{
base.OnClick(e);
base.OnClick();
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)
return new ToolStripItem[0];
return new MenuItem[0];
IList<string> configurationNames = ProjectService.OpenSolution.GetConfigurationNames();
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++) {
items[i] = new ToolStripMenuItem(configurationNames[i]);
items[i] = new MenuItem {
Header = configurationNames[i],
IsChecked = activeConfiguration == configurationNames[i]
};
items[i].Click += SetConfigurationItemClick;
items[i].Checked = activeConfiguration == configurationNames[i];
}
return items;
}
void SetConfigurationItemClick(object sender, EventArgs e)
{
ToolStripMenuItem item = (ToolStripMenuItem)sender;
ProjectService.OpenSolution.Preferences.ActiveConfiguration = item.Text;
MenuItem item = (MenuItem)sender;
ProjectService.OpenSolution.Preferences.ActiveConfiguration = (string)item.Header;
ProjectService.OpenSolution.ApplySolutionConfigurationAndPlatformToProjects();
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)
return new ToolStripItem[0];
return new MenuItem[0];
IList<string> platformNames = ProjectService.OpenSolution.GetPlatformNames();
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++) {
items[i] = new ToolStripMenuItem(platformNames[i]);
items[i] = new MenuItem {
Header = platformNames[i],
IsChecked = activePlatform == platformNames[i]
};
items[i].Click += SetPlatformItemClick;
items[i].Checked = activePlatform == platformNames[i];
}
return items;
}
void SetPlatformItemClick(object sender, EventArgs e)
{
ToolStripMenuItem item = (ToolStripMenuItem)sender;
ProjectService.OpenSolution.Preferences.ActivePlatform = item.Text;
MenuItem item = (MenuItem)sender;
ProjectService.OpenSolution.Preferences.ActivePlatform = (string)item.Header;
ProjectService.OpenSolution.ApplySolutionConfigurationAndPlatformToProjects();
ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView();
}

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

@ -208,19 +208,33 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -208,19 +208,33 @@ namespace ICSharpCode.SharpDevelop.Commands
}
}
public class ToolMenuBuilder : ISubmenuBuilder
public class ToolMenuBuilder : ISubmenuBuilder, IMenuItemBuilder
{
public ToolStripItem[] BuildSubmenu(Codon codon, object owner)
{
MenuCommand[] items = new MenuCommand[ToolLoader.Tool.Count];
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('&'));
items[i] = item;
}
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)
{
Process p = (Process)sender;
@ -229,69 +243,54 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -229,69 +243,54 @@ namespace ICSharpCode.SharpDevelop.Commands
TaskService.BuildMessageViewCategory.AppendText(output + Environment.NewLine + "${res:XML.MainMenu.ToolMenu.ExternalTools.ExitedWithCode} " + p.ExitCode + Environment.NewLine);
}
/// <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)
void RunTool(ExternalTool tool)
{
MenuCommand item = (MenuCommand)sender;
// TODO: ToolLoader.Tool should get a string indexor. Overloading List or making it a Dictionary<string,ExternalTool> would work.
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;
// 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
// the second try would also throw because MessageService.ShowError() calls StringParser.Parse()
try {
command = StringParser.Parse(tool.Command);
args = StringParser.Parse(tool.Arguments);
} catch (Exception ex) {
MessageService.ShowError("${res:XML.MainMenu.ToolMenu.ExternalTools.ExecutionFailed} '" + ex.Message);
// 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()
try {
command = StringParser.Parse(tool.Command);
args = StringParser.Parse(tool.Arguments);
} catch (Exception ex) {
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;
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) {
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;
args = box.TextBox.Text;
startinfo.WorkingDirectory = StringParser.Parse(tool.InitialDirectory);
if (tool.UseOutputPad) {
startinfo.UseShellExecute = false;
startinfo.RedirectStandardOutput = true;
}
try {
ProcessStartInfo startinfo;
if (args == null || args.Length == 0 || args.Trim('"', ' ').Length == 0) {
startinfo = new ProcessStartInfo(command);
} 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);
Process process = new Process();
process.EnableRaisingEvents = true;
process.StartInfo = startinfo;
if (tool.UseOutputPad) {
process.Exited += new EventHandler(ProcessExitEvent);
}
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 @@ @@ -6,8 +6,8 @@
// </file>
using System;
using ICSharpCode.Core;
using System.Windows.Controls;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Gui
{

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

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

Loading…
Cancel
Save