#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

219 lines
7.7 KiB

// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision$</version>
// </file>
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Xml;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project.Dialogs;
using Microsoft.Win32;
namespace ICSharpCode.SharpDevelop.Project.Commands
{
public class ViewProjectOptions : AbstractMenuCommand
{
public override void Run()
{
ShowProjectOptions(ProjectService.CurrentProject);
}
public static void ShowProjectOptions(IProject project)
{
if (project == null) {
return;
}
foreach (IViewContent viewContent in WorkbenchSingleton.Workbench.ViewContentCollection) {
ProjectOptionsView projectOptions = viewContent as ProjectOptionsView;
if (projectOptions != null && projectOptions.Project == project) {
projectOptions.WorkbenchWindow.SelectWindow();
return;
}
}
try {
AddInTreeNode projectOptionsNode = AddInTree.GetTreeNode("/SharpDevelop/BackendBindings/ProjectOptions/" + project.Language);
ProjectOptionsView projectOptions = new ProjectOptionsView(projectOptionsNode, project);
WorkbenchSingleton.Workbench.ShowView(projectOptions);
} catch (TreePathNotFoundException) {
MessageService.ShowError("${res:Dialog.ProjectOptions.NoPanelsInstalledForProject}");
}
}
}
public class GenerateProjectDocumentation : AbstractMenuCommand
{
static string FindSHFB()
{
string command = Registry.GetValue(@"HKEY_CLASSES_ROOT\Sandcastle Help File Builder Project\shell\open\command", null, string.Empty) as string;
return ExtractExecutableFromCommand(command);
}
static string ExtractExecutableFromCommand(string command)
{
if (string.IsNullOrEmpty(command))
return null;
command = command.Trim();
if (string.IsNullOrEmpty(command))
return null;
if (command[0] == '"') {
// "program" %1
int pos = command.IndexOf('"', 1);
if (pos < 0)
return null;
return command.Substring(1, pos - 1);
} else {
// program %1
int pos = command.IndexOf(' ');
if (pos < 0)
return command;
else
return command.Substring(0, pos);
}
}
public override void Run()
{
CompilableProject project = ProjectService.CurrentProject as CompilableProject;
if (project == null) {
return;
}
string sandcastleHelpFileBuilderPath = FindSHFB();
if (sandcastleHelpFileBuilderPath == null || !File.Exists(sandcastleHelpFileBuilderPath)) {
using (ToolNotFoundDialog dlg = new ToolNotFoundDialog(
StringParser.Parse("${res:ProjectComponent.ContextMenu.GenerateDocumentation.SHFBNotFound}"),
"http://www.codeplex.com/SHFB/", null))
{
dlg.ShowDialog(WorkbenchSingleton.MainWin32Window);
}
return;
}
string assembly = project.OutputAssemblyFullPath;
string xmlDocFile = project.DocumentationFileFullPath;
if (xmlDocFile == null) {
MessageService.ShowMessage("${res:ProjectComponent.ContextMenu.GenerateDocumentation.NeedToEditBuildOptions}");
return;
}
if (!File.Exists(assembly)) {
MessageService.ShowMessage("${res:ProjectComponent.ContextMenu.GenerateDocumentation.ProjectNeedsToBeCompiled}");
return;
}
if (!File.Exists(xmlDocFile)) {
MessageService.ShowMessage("${res:ProjectComponent.ContextMenu.GenerateDocumentation.ProjectNeedsToBeCompiled2}");
return;
}
string sandcastleHelpFileBuilderProjectFile = Path.ChangeExtension(project.FileName, ".shfbproj");
if (!File.Exists(sandcastleHelpFileBuilderProjectFile)) {
using (XmlTextWriter w = new XmlTextWriter(sandcastleHelpFileBuilderProjectFile, Encoding.UTF8)) {
w.Formatting = Formatting.Indented;
const string ns = "http://schemas.microsoft.com/developer/msbuild/2003";
w.WriteStartElement("Project", ns);
w.WriteAttributeString("DefaultTargets", "Build");
w.WriteAttributeString("ToolsVersion", "3.5");
w.WriteStartElement("PropertyGroup", ns);
w.WriteComment("The configuration and platform will be used to determine which\n" +
"assemblies to include from solution and project documentation\n" +
"sources");
w.WriteStartElement("Configuration", ns);
w.WriteAttributeString("Condition", " '$(Configuration)' == '' ");
w.WriteValue("Debug");
w.WriteEndElement(); // </Configuration>
w.WriteStartElement("Platform", ns);
w.WriteAttributeString("Condition", " '$(Platform)' == '' ");
w.WriteValue("AnyCPU");
w.WriteEndElement(); // </AnyCPU>
w.WriteElementString("SchemaVersion", ns, "2.0");
w.WriteElementString("ProjectGuid", ns, Guid.NewGuid().ToString("B"));
w.WriteElementString("SHFBSchemaVersion", ns, "1.8.0.3");
w.WriteElementString("AssemblyName", ns, "Documentation");
w.WriteElementString("RootNamespace", ns, "Documentation");
w.WriteElementString("Name", ns, "Documentation");
w.WriteElementString("OutputPath", ns, @".\Help\");
w.WriteElementString("HtmlHelpName", ns, "Documentation");
w.WriteStartElement("DocumentationSources", ns);
w.WriteStartElement("DocumentationSource", "");
w.WriteAttributeString("sourceFile", FileUtility.GetRelativePath(Path.GetDirectoryName(sandcastleHelpFileBuilderProjectFile), project.FileName));
w.WriteEndElement(); // </DocumentationSource>
w.WriteEndElement(); // </DocumentationSources>
w.WriteEndElement(); // </PropertyGrup>
w.WriteComment("There are no properties for these groups. AnyCPU needs to appear in\n" +
"order for Visual Studio to perform the build. The others are optional\n" +
"common platform types that may appear.");
string[] confPlatList = {
"Debug|AnyCPU", "Release|AnyCPU", "Debug|x86", "Release|x86", "Debug|x64", "Release|x64", "Debug|Win32", "Release|Win32"
};
foreach (string confPlat in confPlatList) {
w.WriteStartElement("PropertyGroup", ns);
w.WriteAttributeString("Condition", " '$(Configuration)|$(Platform)' == '" + confPlat + "' ");
w.WriteEndElement(); // </PropertyGrup>
}
w.WriteComment("Import the SHFB build targets");
w.WriteStartElement("Import", ns);
w.WriteAttributeString("Project", @"$(SHFBROOT)\SandcastleHelpFileBuilder.targets");
w.WriteEndElement(); // </Import>
w.WriteEndElement(); // </Project>
}
}
ProcessStartInfo psi = new ProcessStartInfo(sandcastleHelpFileBuilderPath, '"' + sandcastleHelpFileBuilderProjectFile + '"');
psi.WorkingDirectory = Path.GetDirectoryName(sandcastleHelpFileBuilderPath);
psi.UseShellExecute = false;
Process.Start(psi);
}
}
/// <summary>
/// Opens the projects output folder in an explorer window.
/// </summary>
public class OpenProjectFolder : AbstractMenuCommand
{
public override void Run()
{
IProject project = ProjectService.CurrentProject;
if (project == null) {
return;
}
OpenFolder.OpenFolderInExplorer(project.Directory);
}
}
/// <summary>
/// Opens the projects output folder in an explorer window.
/// </summary>
public class OpenProjectOutputFolder : AbstractMenuCommand
{
public override void Run()
{
CompilableProject project = ProjectService.CurrentProject as CompilableProject;
if (project == null) {
return;
}
// Explorer does not handle relative paths as a command line argument properly
string outputFolder = project.OutputFullPath;
if (!Directory.Exists(outputFolder)) {
Directory.CreateDirectory(outputFolder);
}
OpenFolder.OpenFolderInExplorer(outputFolder);
}
}
}