diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index eca6beeac6..720bab0363 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -685,6 +685,7 @@ + diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs index 850e9552da..4b99bdc69f 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/ProjectNodeCommands.cs @@ -24,25 +24,16 @@ namespace ICSharpCode.SharpDevelop.Project.Commands { public override void Run() { - throw new System.NotImplementedException(); -// ProjectBrowserView browser = Owner as ProjectBrowserView; -// AbstractBrowserNode node = null; -// -// if (browser != null) { -// node = browser.SelectedNode as FolderNode; -// } else { -// ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView pbv = (ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView)WorkbenchSingleton.Workbench.GetPad(typeof(ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView)); -// -// node = pbv.GetNodeFromProject(ProjectService.CurrentProject); -// } -// -// if (node != null) { -// Combine combine = node.Combine; -// combine.SingleStartProjectName = node.Project.Name; -// combine.SingleStartupProject = true; -// -// ProjectService.SaveCombine(); -// } + AbstractProjectBrowserTreeNode node = ProjectBrowserPad.Instance.SelectedNode; + Solution solution = ProjectService.OpenSolution; + if (node == null || solution == null) { + return; + } + if (node.Project.IsStartable) { + solution.Preferences.StartupProject = node.Project; + } else { + MessageService.ShowError("${res:BackendBindings.ExecutionManager.CantExecuteDLLError}"); + } } } diff --git a/src/Main/Base/Project/Src/Project/Solution/Solution.cs b/src/Main/Base/Project/Src/Project/Solution/Solution.cs index 3db965e54b..716423c6cd 100644 --- a/src/Main/Base/Project/Src/Project/Solution/Solution.cs +++ b/src/Main/Base/Project/Src/Project/Solution/Solution.cs @@ -144,6 +144,9 @@ namespace ICSharpCode.SharpDevelop.Project if (!HasProjects) { return null; } + IProject startupProject = preferences.StartupProject; + if (startupProject != null) + return startupProject; foreach (IProject project in Projects) { if (project.IsStartable) { return project; @@ -206,8 +209,17 @@ namespace ICSharpCode.SharpDevelop.Project #endregion + SolutionPreferences preferences; + + public SolutionPreferences Preferences { + get { + return preferences; + } + } + public Solution() { + preferences = new SolutionPreferences(this); solutionFolderEnumerator = new SolutionFolderEnumerator(this); solutionFolderContainerEnumerator = new SolutionFolderContainerEnumerator(this); projectEnumerator = new ProjectEnumerator(this); @@ -560,5 +572,6 @@ namespace ICSharpCode.SharpDevelop.Project { return MSBuildProject.RunMSBuild(FileName, "Publish"); } + } } diff --git a/src/Main/Base/Project/Src/Project/Solution/SolutionPreferences.cs b/src/Main/Base/Project/Src/Project/Solution/SolutionPreferences.cs new file mode 100644 index 0000000000..e9a620447e --- /dev/null +++ b/src/Main/Base/Project/Src/Project/Solution/SolutionPreferences.cs @@ -0,0 +1,57 @@ +/* + * Created by SharpDevelop. + * User: Daniel Grunwald + * Date: 19.08.2005 + * Time: 12:09 + */ + +using System; +using ICSharpCode.Core; + +namespace ICSharpCode.SharpDevelop.Project +{ + public class SolutionPreferences : IMementoCapable + { + Solution solution; + + internal SolutionPreferences(Solution solution) + { + this.solution = solution; + } + + string startupProject = ""; + + public IProject StartupProject { + get { + if (startupProject.Length == 0) + return null; + foreach (IProject project in solution.Projects) { + if (project.IdGuid.Equals(startupProject, StringComparison.OrdinalIgnoreCase)) + return project; + } + return null; + } + set { + startupProject = (value != null) ? value.IdGuid : ""; + } + } + + /// + /// Creates a new memento from the state. + /// + public Properties CreateMemento() + { + Properties p = new Properties(); + p.Set("StartupProject", startupProject); + return p; + } + + /// + /// Sets the state to the given memento. + /// + public void SetMemento(Properties memento) + { + startupProject = memento.Get("StartupProject", ""); + } + } +} diff --git a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs index b37eb1a90b..f4e8ee0af8 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs @@ -194,8 +194,12 @@ namespace ICSharpCode.SharpDevelop.Project return; OnSolutionLoaded(new SolutionEventArgs(openSolution)); try { + string file = GetPreferenceFileName(openSolution.FileName); + if (FileUtility.IsValidFileName(file) && File.Exists(file)) { + openSolution.Preferences.SetMemento(Properties.Load(file)); + } foreach (IProject project in openSolution.Projects) { - string file = GetPreferenceFileName(project); + file = GetPreferenceFileName(project.FileName); if (FileUtility.IsValidFileName(file) && File.Exists(file)) { project.SetMemento(Properties.Load(file)); } @@ -229,7 +233,7 @@ namespace ICSharpCode.SharpDevelop.Project solution.Save(solutionFile); openSolution = solution; OnSolutionLoaded(new SolutionEventArgs(openSolution)); - string file = GetPreferenceFileName(project); + string file = GetPreferenceFileName(project.FileName); if (FileUtility.IsValidFileName(file) && File.Exists(file)) { project.SetMemento(Properties.Load(file)); } @@ -246,10 +250,10 @@ namespace ICSharpCode.SharpDevelop.Project } } - static string GetPreferenceFileName(IProject project) + static string GetPreferenceFileName(string projectFileName) { string directory = PropertyService.ConfigDirectory + "preferences"; - string fileName = project.FileName.Substring(3).Replace('/', '.').Replace('\\', '.').Replace(Path.DirectorySeparatorChar, '.'); + string fileName = projectFileName.Substring(3).Replace('/', '.').Replace('\\', '.').Replace(Path.DirectorySeparatorChar, '.'); string fullFileName = Path.Combine(directory, fileName + ".xml"); return fullFileName; } @@ -263,11 +267,21 @@ namespace ICSharpCode.SharpDevelop.Project Directory.CreateDirectory(directory); } + string fullFileName; + Properties memento = openSolution.Preferences.CreateMemento(); + if (memento != null) { + fullFileName = GetPreferenceFileName(openSolution.FileName); + + if (FileUtility.IsValidFileName(fullFileName)) { + FileUtility.ObservedSave(new NamedFileOperationDelegate(memento.Save), fullFileName, FileErrorPolicy.Inform); + } + } + foreach (IProject project in OpenSolution.Projects) { - Properties memento = project.CreateMemento(); + memento = project.CreateMemento(); if (memento == null) continue; - string fullFileName = GetPreferenceFileName(project); + fullFileName = GetPreferenceFileName(project.FileName); if (FileUtility.IsValidFileName(fullFileName)) { FileUtility.ObservedSave(new NamedFileOperationDelegate(memento.Save), fullFileName, FileErrorPolicy.Inform); }