📄 menuitembuilders.cs
字号:
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Kr黦er" email="mike@icsharpcode.net"/>
// <version value="$version"/>
// </file>
using System;
using System.Diagnostics;
using System.IO;
using System.Collections;
using System.Windows.Forms;
using System.Text;
using Reflector.UserInterface;
using ICSharpCode.Core.AddIns;
using ICSharpCode.Core.AddIns.Codons;
using ICSharpCode.Core.AddIns.Conditions;
using ICSharpCode.Core.Properties;
using ICSharpCode.Core.Services;
using ICSharpCode.SharpDevelop.Services;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Gui.Components;
using ICSharpCode.SharpDevelop.Gui.Dialogs;
using ICSharpCode.SharpDevelop.Internal.Project;
using ICSharpCode.SharpDevelop.Internal.ExternalTool;
using ICSharpCode.SharpDevelop.Gui.Pads.ProjectBrowser;
namespace ICSharpCode.SharpDevelop.Commands
{
public class RecentFilesMenuBuilder : ISubmenuBuilder
{
public CommandBarItem[] BuildSubmenu(ConditionCollection conditionCollection, object owner)
{
IFileService fileService = (IFileService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IFileService));
ResourceService resourceService = (ResourceService)ServiceManager.Services.GetService(typeof(IResourceService));
StringParserService stringParserService = (StringParserService)ServiceManager.Services.GetService(typeof(StringParserService));
RecentOpen recentOpen = fileService.RecentOpen;
if (recentOpen.RecentFile.Count > 0) {
SdMenuCommand[] items = new SdMenuCommand[recentOpen.RecentFile.Count];
for (int i = 0; i < recentOpen.RecentFile.Count; ++i) {
//// Alex: stringbuilder to prevent allocations
StringBuilder accelaratorKeyPrefix=new StringBuilder("");
////string accelaratorKeyPrefix = i < 10 ? "&" + ((i + 1) % 10).ToString() + " " : "";
if (i<10) {
accelaratorKeyPrefix.Append("&");
accelaratorKeyPrefix.Append(((i + 1) % 10).ToString());
accelaratorKeyPrefix.Append(" ");
}
accelaratorKeyPrefix.Append(recentOpen.RecentFile[i].ToString());
////items[i] = new SdMenuCommand(null, null, accelaratorKeyPrefix + recentOpen.RecentFile[i].ToString(), new EventHandler(LoadRecentFile));
items[i] = new SdMenuCommand(null, null, accelaratorKeyPrefix.ToString(), new EventHandler(LoadRecentFile));
items[i].Tag = recentOpen.RecentFile[i].ToString();
items[i].Description = stringParserService.Parse(resourceService.GetString("Dialog.Componnents.RichMenuItem.LoadFileDescription"),
new string[,] { {"FILE", recentOpen.RecentFile[i].ToString()} });
}
return items;
}
SdMenuCommand defaultMenu = new SdMenuCommand(null, null, resourceService.GetString("Dialog.Componnents.RichMenuItem.NoRecentFilesString"));
defaultMenu.IsEnabled = false;
return new SdMenuCommand[] { defaultMenu };
}
void LoadRecentFile(object sender, EventArgs e)
{
SdMenuCommand item = (SdMenuCommand)sender;
IFileService fileService = (IFileService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IFileService));
fileService.OpenFile(item.Tag.ToString());
}
}
public class RecentProjectsMenuBuilder : ISubmenuBuilder
{
public CommandBarItem[] BuildSubmenu(ConditionCollection conditionCollection, object owner)
{
IFileService fileService = (IFileService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IFileService));
ResourceService resourceService = (ResourceService)ServiceManager.Services.GetService(typeof(IResourceService));
StringParserService stringParserService = (StringParserService)ServiceManager.Services.GetService(typeof(StringParserService));
RecentOpen recentOpen = fileService.RecentOpen;
if (recentOpen.RecentProject.Count > 0) {
SdMenuCommand[] items = new SdMenuCommand[recentOpen.RecentProject.Count];
for (int i = 0; i < recentOpen.RecentProject.Count; ++i) {
//// Alex: use String builder instead of concat's
////string accelaratorKeyPrefix = i < 10 ? "&" + ((i + 1) % 10).ToString() + " " : "";
StringBuilder accelaratorKeyPrefix = new StringBuilder("");
if (i<10) {
accelaratorKeyPrefix.Append("&");
accelaratorKeyPrefix.Append(((i + 1) % 10).ToString());
accelaratorKeyPrefix.Append(" ");
}
accelaratorKeyPrefix.Append(recentOpen.RecentProject[i].ToString());
////items[i] = new SdMenuCommand(null, null, accelaratorKeyPrefix + recentOpen.RecentProject[i].ToString(), new EventHandler(LoadRecentProject));
items[i] = new SdMenuCommand(null, null, accelaratorKeyPrefix.ToString(), new EventHandler(LoadRecentProject));
items[i].Tag = recentOpen.RecentProject[i].ToString();
items[i].Description = stringParserService.Parse(resourceService.GetString("Dialog.Componnents.RichMenuItem.LoadProjectDescription"),
new string[,] { {"PROJECT", recentOpen.RecentProject[i].ToString()} });
}
return items;
}
SdMenuCommand defaultMenu = new SdMenuCommand(null, null, resourceService.GetString("Dialog.Componnents.RichMenuItem.NoRecentProjectsString"));
defaultMenu.IsEnabled = false;
return new SdMenuCommand[] { defaultMenu };
}
void LoadRecentProject(object sender, EventArgs e)
{
SdMenuCommand item = (SdMenuCommand)sender;
IProjectService projectService = (IProjectService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IProjectService));
string fileName = item.Tag.ToString();
FileUtilityService fileUtilityService = (FileUtilityService)ServiceManager.Services.GetService(typeof(FileUtilityService));
fileUtilityService.ObservedLoad(new NamedFileOperationDelegate(projectService.OpenCombine), fileName);
}
}
public class ToolMenuBuilder : ISubmenuBuilder
{
public CommandBarItem[] BuildSubmenu(ConditionCollection conditionCollection, object owner)
{
SdMenuCommand[] items = new SdMenuCommand[ToolLoader.Tool.Count];
for (int i = 0; i < ToolLoader.Tool.Count; ++i) {
SdMenuCommand item = new SdMenuCommand(null, null, ToolLoader.Tool[i].ToString(), new EventHandler(ToolEvt));
item.Description = "Start tool " + String.Join(String.Empty, ToolLoader.Tool[i].ToString().Split('&'));
items[i] = item;
}
return items;
}
void ProcessExitEvent(object sender, EventArgs e)
{
Process p = (Process)sender;
string output = p.StandardOutput.ReadToEnd();
TaskService taskService = (TaskService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(TaskService));
taskService.CompilerOutput = output + "\n Exited with code:" + p.ExitCode +"\n";
}
void ToolEvt(object sender, EventArgs e)
{
SdMenuCommand item = (SdMenuCommand)sender;
IProjectService projectService = (IProjectService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(IProjectService));
StringParserService stringParserService = (StringParserService)ServiceManager.Services.GetService(typeof(StringParserService));
FileUtilityService fileUtilityService = (FileUtilityService)ServiceManager.Services.GetService(typeof(FileUtilityService));
for (int i = 0; i < ToolLoader.Tool.Count; ++i) {
if (item.Text == ToolLoader.Tool[i].ToString()) {
ExternalTool tool = (ExternalTool)ToolLoader.Tool[i];
IWorkbenchWindow window = WorkbenchSingleton.Workbench.ActiveWorkbenchWindow;
string fileName = window == null ? null : window.ViewContent.FileName;
stringParserService.Properties["ItemPath"] = fileName == null ? String.Empty : fileName;
stringParserService.Properties["ItemDir"] = fileName == null ? String.Empty : Path.GetDirectoryName(fileName);
stringParserService.Properties["ItemFileName"] = fileName == null ? String.Empty : Path.GetFileName(fileName);
stringParserService.Properties["ItemExt"] = fileName == null ? String.Empty : Path.GetExtension(fileName);
// TODO:
stringParserService.Properties["CurLine"] = "0";
stringParserService.Properties["CurCol"] = "0";
stringParserService.Properties["CurText"] = "0";
LanguageBindingService languageBindingService = (LanguageBindingService)ICSharpCode.Core.Services.ServiceManager.Services.GetService(typeof(LanguageBindingService));
ILanguageBinding binding = projectService.CurrentSelectedProject == null ? null : languageBindingService.GetBindingPerLanguageName(projectService.CurrentSelectedProject.ProjectType);
string targetPath = projectService.CurrentSelectedProject == null ? null : binding.GetCompiledOutputName(projectService.CurrentSelectedProject);
stringParserService.Properties["TargetPath"] = targetPath == null ? String.Empty : targetPath;
stringParserService.Properties["TargetDir"] = targetPath == null ? String.Empty : Path.GetDirectoryName(targetPath);
stringParserService.Properties["TargetName"] = targetPath == null ? String.Empty : Path.GetFileName(targetPath);
stringParserService.Properties["TargetExt"] = targetPath == null ? String.Empty : Path.GetExtension(targetPath);
string projectFileName = projectService.CurrentSelectedProject == null ? null : projectService.GetFileName(projectService.CurrentSelectedProject);
stringParserService.Properties["ProjectDir"] = projectFileName == null ? null : Path.GetDirectoryName(projectFileName);
stringParserService.Properties["ProjectFileName"] = projectFileName == null ? null : projectFileName;
string combineFileName = projectService.CurrentOpenCombine == null ? null : projectService.GetFileName(projectService.CurrentOpenCombine);
stringParserService.Properties["CombineDir"] = combineFileName == null ? null : Path.GetDirectoryName(combineFileName);
stringParserService.Properties["CombineFileName"] = combineFileName == null ? null : combineFileName;
stringParserService.Properties["StartupPath"] = Application.StartupPath;
string command = stringParserService.Parse(tool.Command);
string args = stringParserService.Parse(tool.Arguments);
try {
ProcessStartInfo startinfo;
if (args == null || args.Length == 0) {
startinfo = new ProcessStartInfo(command);
} else {
startinfo = new ProcessStartInfo(command, args);
}
startinfo.WorkingDirectory = stringParserService.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) {
IMessageService messageService =(IMessageService)ServiceManager.Services.GetService(typeof(IMessageService));
messageService.ShowError(ex, "External program execution failed.\nError while starting:\n '" + command + " " + args + "'");
}
break;
}
}
}
}
public class OpenContentsMenuBuilder : ISubmenuBuilder
{
class MyMenuItem : SdMenuCheckBox
{
IWorkbenchWindow window;
public MyMenuItem(IWorkbenchWindow window) : base(null, null, window.ViewContent.TitleName)
{
this.window = window;
}
public override void UpdateStatus()
{
if (window != null) {
localizedText = window.ViewContent.TitleName;;
}
base.UpdateStatus();
}
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
((IWorkbenchWindow)Tag).SelectWindow();
IsChecked = true;
}
}
public CommandBarItem[] BuildSubmenu(ConditionCollection conditionCollection, object owner)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -