📄 solution.cs
字号:
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision: 1417 $</version>
// </file>
using System;
using System.ComponentModel;
using System.CodeDom.Compiler;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.SharpDevelop.Project
{
public class Solution : SolutionFolder, IDisposable
{
// contains <guid>, (IProject/ISolutionFolder) pairs.
Dictionary<string, ISolutionFolder> guidDictionary = new Dictionary<string, ISolutionFolder>();
string fileName = String.Empty;
public IProject FindProjectContainingFile(string fileName)
{
IProject currentProject = ProjectService.CurrentProject;
if (currentProject != null && currentProject.IsFileInProject(fileName))
return currentProject;
// Try all project's in the solution.
foreach (IProject project in Projects) {
if (project.IsFileInProject(fileName)) {
return project;
}
}
return null;
}
[Browsable(false)]
public IEnumerable<IProject> Projects {
get {
Stack<ISolutionFolder> stack = new Stack<ISolutionFolder>();
foreach (ISolutionFolder solutionFolder in Folders) {
stack.Push(solutionFolder);
}
while (stack.Count > 0) {
ISolutionFolder currentFolder = stack.Pop();
if (currentFolder is IProject) {
yield return ((IProject)currentFolder);
}
if (currentFolder is ISolutionFolderContainer) {
ISolutionFolderContainer currentContainer = (ISolutionFolderContainer)currentFolder;
foreach (ISolutionFolder subFolder in currentContainer.Folders) {
stack.Push(subFolder);
}
}
}
}
}
[Browsable(false)]
public IEnumerable<ISolutionFolderContainer> SolutionFolderContainers {
get {
Stack<ISolutionFolder> stack = new Stack<ISolutionFolder>();
foreach (ISolutionFolder solutionFolder in Folders) {
stack.Push(solutionFolder);
}
while (stack.Count > 0) {
ISolutionFolder currentFolder = stack.Pop();
if (currentFolder is ISolutionFolderContainer) {
ISolutionFolderContainer currentContainer = (ISolutionFolderContainer)currentFolder;
yield return currentContainer;
foreach (ISolutionFolder subFolder in currentContainer.Folders) {
stack.Push(subFolder);
}
}
}
}
}
[Browsable(false)]
public IEnumerable<ISolutionFolder> SolutionFolders {
get {
Stack<ISolutionFolder> stack = new Stack<ISolutionFolder>();
foreach (ISolutionFolder solutionFolder in Folders) {
stack.Push(solutionFolder);
}
while (stack.Count > 0) {
ISolutionFolder currentFolder = stack.Pop();
yield return currentFolder;
if (currentFolder is ISolutionFolderContainer) {
ISolutionFolderContainer currentContainer = (ISolutionFolderContainer)currentFolder;
foreach (ISolutionFolder subFolder in currentContainer.Folders) {
stack.Push(subFolder);
}
}
}
}
}
[Browsable(false)]
public IProject StartupProject {
get {
if (!HasProjects) {
return null;
}
IProject startupProject = preferences.StartupProject;
if (startupProject != null)
return startupProject;
foreach (IProject project in Projects) {
if (project.IsStartable) {
return project;
}
}
return null;
}
}
[Browsable(false)]
public bool HasProjects {
get {
return Projects.GetEnumerator().MoveNext();
}
}
[Browsable(false)]
public string FileName {
get {
return fileName;
}
set {
fileName = value;
}
}
[Browsable(false)]
public string Directory {
get {
return Path.GetDirectoryName(fileName);
}
}
[Browsable(false)]
public bool IsDirty {
get {
foreach (IProject project in Projects) {
if (project.IsDirty) {
return true;
}
}
return false;
}
}
#region ISolutionFolderContainer implementations
public override ProjectSection SolutionItems {
get {
foreach (SolutionFolder folder in Folders) {
if (folder.Name == "Solution Items") {
return folder.SolutionItems;
}
}
SolutionFolder newFolder = CreateFolder("Solution Items");
return newFolder.SolutionItems;
}
}
public override void AddFolder(ISolutionFolder folder)
{
base.AddFolder(folder);
guidDictionary[folder.IdGuid] = folder;
}
#endregion
SolutionPreferences preferences;
[Browsable(false)]
public SolutionPreferences Preferences {
get {
return preferences;
}
}
public Solution()
{
preferences = new SolutionPreferences(this);
}
public ISolutionFolder GetSolutionFolder(string guid)
{
foreach (ISolutionFolder solutionFolder in SolutionFolders) {
if (solutionFolder.IdGuid == guid) {
return solutionFolder;
}
}
return null;
}
public void Save()
{
try {
Save(fileName);
} catch (IOException ex) {
MessageService.ShowError("Could not save " + fileName + ":\n" + ex.Message);
} catch (UnauthorizedAccessException ex) {
MessageService.ShowError("Could not save " + fileName + ":\n" + ex.Message + "\n\nEnsure the file is writable.");
}
}
public SolutionFolder CreateFolder(string folderName)
{
return new SolutionFolder(folderName, folderName, "{" + Guid.NewGuid().ToString().ToUpperInvariant() + "}");
}
public void Save(string fileName)
{
this.fileName = fileName;
string outputDirectory = Path.GetDirectoryName(fileName);
if (!System.IO.Directory.Exists(outputDirectory)) {
System.IO.Directory.CreateDirectory(outputDirectory);
}
StringBuilder projectSection = new StringBuilder();
StringBuilder nestedProjectsSection = new StringBuilder();
List<ISolutionFolder> folderList = Folders;
Stack<ISolutionFolder> stack = new Stack<ISolutionFolder>(folderList.Count);
// push folders in reverse order because it's a stack
for (int i = folderList.Count - 1; i >= 0; i--) {
stack.Push(folderList[i]);
}
while (stack.Count > 0) {
ISolutionFolder currentFolder = stack.Pop();
projectSection.Append("Project(\"");
projectSection.Append(currentFolder.TypeGuid);
projectSection.Append("\")");
projectSection.Append(" = ");
projectSection.Append('"');
projectSection.Append(currentFolder.Name);
projectSection.Append("\", ");
string relativeLocation;
if (currentFolder is IProject) {
currentFolder.Location = ((IProject)currentFolder).FileName;
}
if (Path.IsPathRooted(currentFolder.Location)) {
relativeLocation = FileUtility.GetRelativePath(Path.GetDirectoryName(FileName), currentFolder.Location);
} else {
relativeLocation = currentFolder.Location;
}
projectSection.Append('"');
projectSection.Append(relativeLocation);
projectSection.Append("\", ");
projectSection.Append('"');
projectSection.Append(currentFolder.IdGuid);
projectSection.Append("\"");
projectSection.AppendLine();
if (currentFolder is IProject) {
IProject project = (IProject)currentFolder;
// Web projects can have sections
SaveProjectSections(project.ProjectSections, projectSection);
} else if (currentFolder is SolutionFolder) {
SolutionFolder folder = (SolutionFolder)currentFolder;
SaveProjectSections(folder.Sections, projectSection);
foreach (ISolutionFolder subFolder in folder.Folders) {
stack.Push(subFolder);
nestedProjectsSection.Append("\t\t");
nestedProjectsSection.Append(subFolder.IdGuid);
nestedProjectsSection.Append(" = ");
nestedProjectsSection.Append(folder.IdGuid);
nestedProjectsSection.Append(Environment.NewLine);
}
} else {
LoggingService.Warn("Solution.Load(): unknown folder : " + currentFolder);
}
projectSection.Append("EndProject");
projectSection.Append(Environment.NewLine);
}
StringBuilder globalSection = new StringBuilder();
globalSection.Append("Global");
globalSection.Append(Environment.NewLine);
foreach (ProjectSection section in Sections) {
globalSection.Append("\tGlobalSection(");
globalSection.Append(section.Name);
globalSection.Append(") = ");
globalSection.Append(section.SectionType);
globalSection.Append(Environment.NewLine);
section.AppendSection(globalSection, "\t\t");
globalSection.Append("\tEndGlobalSection");
globalSection.Append(Environment.NewLine);
}
// we need to specify UTF8 because MsBuild needs the BOM
using (StreamWriter sw = new StreamWriter(fileName, false, Encoding.UTF8)) {
sw.WriteLine("Microsoft Visual Studio Solution File, Format Version 9.00");
Version v = System.Reflection.Assembly.GetEntryAssembly().GetName().Version;
sw.WriteLine("# SharpDevelop " + v.Major + "." + v.Minor + "." + v.Build + "." + v.Revision);
sw.Write(projectSection.ToString());
sw.Write(globalSection.ToString());
if (nestedProjectsSection.Length > 0) {
sw.WriteLine("\tGlobalSection(NestedProjects) = preSolution");
sw.Write(nestedProjectsSection.ToString());
sw.WriteLine("\tEndGlobalSection");
}
sw.WriteLine("EndGlobal");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -