From ae5d33a76ce6b60bb1b774bcbfdbba3d1d839dbb Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 15 Aug 2008 09:19:56 +0000 Subject: [PATCH] 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 --- .../Project/Src/Commands/BuildCommands.cs | 91 +++++++------- .../Project/Src/Commands/MenuItemBuilders.cs | 115 +++++++++--------- .../Base/Project/Src/Gui/Pads/ToolsPad.cs | 2 +- .../Base/Project/Src/Util/ExtensionMethods.cs | 6 +- 4 files changed, 111 insertions(+), 103 deletions(-) diff --git a/src/Main/Base/Project/Src/Commands/BuildCommands.cs b/src/Main/Base/Project/Src/Commands/BuildCommands.cs index 0574060db7..a56e4716ad 100644 --- a/src/Main/Base/Project/Src/Commands/BuildCommands.cs +++ b/src/Main/Base/Project/Src/Commands/BuildCommands.cs @@ -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 } } - 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 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 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(); } diff --git a/src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs b/src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs index ca4f5f2e8e..17c8ab7261 100644 --- a/src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs +++ b/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) { 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 TaskService.BuildMessageViewCategory.AppendText(output + Environment.NewLine + "${res:XML.MainMenu.ToolMenu.ExternalTools.ExitedWithCode} " + p.ExitCode + Environment.NewLine); } - - /// - /// This handler gets called when a tool in the Tool menu is clicked on. - /// - /// The MenuCommand that sent the event. - /// Event arguments. - 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 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); } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs b/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs index ec1b21ea28..0dd691ca6d 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ToolsPad.cs @@ -6,8 +6,8 @@ // using System; -using ICSharpCode.Core; using System.Windows.Controls; +using ICSharpCode.Core; namespace ICSharpCode.SharpDevelop.Gui { diff --git a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs index 801401a2ca..3e1650bde7 100644 --- a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs +++ b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs @@ -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 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; }