From f3e28c206d036e5209dd0c23c9e5b9d9b20f2a74 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Fri, 17 Aug 2012 20:27:23 +0100 Subject: [PATCH] Fix solution not being saved when extensibility global changed. Save solution when: 1) EnvDTE.Solution.Globals.VariablePersists is set to true. 2) An existing solution item is changed by EnvDTE.Solution.Globals.VariableValue. --- .../FakePackageManagementProjectService.cs | 7 ++ .../Project/Src/EnvDTE/Globals.cs | 4 +- .../Project/Src/EnvDTE/Solution.cs | 12 +++- .../EnvDTE/SolutionExtensibilityGlobals.cs | 31 +++++++-- .../Src/IPackageManagementProjectService.cs | 1 + .../Src/PackageManagementProjectService.cs | 10 +++ .../Test/Src/EnvDTE/SolutionGlobalsTests.cs | 69 +++++++++++++++++++ .../Test/Src/Helpers/SolutionHelper.cs | 16 ++++- 8 files changed, 138 insertions(+), 12 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs index c41a7742fd..ff28aa3eed 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs @@ -81,6 +81,13 @@ namespace ICSharpCode.PackageManagement.Design project.Save(); } + public Solution SavedSolution; + + public void Save(Solution solution) + { + SavedSolution = solution; + } + public IProjectContent GetProjectContent(IProject project) { return new DefaultProjectContent(); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Globals.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Globals.cs index 5361c7d93c..7be4996024 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Globals.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Globals.cs @@ -11,13 +11,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE { public class Globals { - SD.Solution solution; SolutionExtensibilityGlobals extensibilityGlobals; SolutionExtensibilityGlobalsPersistence extensibilityGlobalsPersistence; - public Globals(SD.Solution solution) + public Globals(Solution solution) { - this.solution = solution; this.extensibilityGlobals = new SolutionExtensibilityGlobals(solution); this.extensibilityGlobalsPersistence = new SolutionExtensibilityGlobalsPersistence(extensibilityGlobals); } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs index b13dc85e14..c6538299fc 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs @@ -2,6 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using SD = ICSharpCode.SharpDevelop.Project; namespace ICSharpCode.PackageManagement.EnvDTE @@ -16,7 +17,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE this.projectService = projectService; this.solution = projectService.OpenSolution; this.Projects = new Projects(projectService); - this.Globals = new Globals(solution); + this.Globals = new Globals(this); } public string FullName { @@ -33,5 +34,14 @@ namespace ICSharpCode.PackageManagement.EnvDTE public Projects Projects { get; private set; } public Globals Globals { get; private set; } + + internal IList Sections { + get { return solution.Sections; } + } + + internal void Save() + { + projectService.Save(solution); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionExtensibilityGlobals.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionExtensibilityGlobals.cs index ba54f08fbd..6b049b3938 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionExtensibilityGlobals.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionExtensibilityGlobals.cs @@ -11,11 +11,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE { public class SolutionExtensibilityGlobals { - SD.Solution solution; + Solution solution; const string ExtensibilityGlobalsSectionName = "ExtensibilityGlobals"; List nonPersistedSolutionItems = new List(); - public SolutionExtensibilityGlobals(SD.Solution solution) + public SolutionExtensibilityGlobals(Solution solution) { this.solution = solution; } @@ -29,7 +29,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE return item.Location; } set { - GetOrCreateSolutionItem(name, value as string); + UpdateOrCreateSolutionItem(name, value as string); } } @@ -81,12 +81,29 @@ namespace ICSharpCode.PackageManagement.EnvDTE return String.Equals(a, b, StringComparison.OrdinalIgnoreCase); } - void GetOrCreateSolutionItem(string name, string value) + void UpdateOrCreateSolutionItem(string name, string value) + { + if (UpdateItemInSolution(name, value)) { + return; + } + + UpdateOrCreateNonPersistedSolutionItem(name, value); + } + + bool UpdateItemInSolution(string name, string value) { SD.SolutionItem item = GetItemFromSolution(name); - if (item == null) { - item = GetNonPersistedSolutionItem(name); + if (item != null) { + item.Location = value; + solution.Save(); + return true; } + return false; + } + + void UpdateOrCreateNonPersistedSolutionItem(string name, string value) + { + SD.SolutionItem item = GetNonPersistedSolutionItem(name); if (item != null) { item.Location = value; } else { @@ -115,6 +132,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE nonPersistedSolutionItems.Remove(item); SD.ProjectSection section = GetOrCreateExtensibilityGlobalsSection(); section.Items.Add(item); + solution.Save(); } SD.ProjectSection GetOrCreateExtensibilityGlobalsSection() @@ -141,6 +159,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE SD.ProjectSection section = GetExtensibilityGlobalsSection(); section.Items.Remove(item); nonPersistedSolutionItems.Add(item); + solution.Save(); } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs index 1a85ff0827..1dfb33be21 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs @@ -22,6 +22,7 @@ namespace ICSharpCode.PackageManagement void AddProjectItem(IProject project, ProjectItem item); void RemoveProjectItem(IProject project, ProjectItem item); void Save(IProject project); + void Save(Solution solution); IEnumerable GetOpenProjects(); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs index 3bc8a20ff0..9c19c31d58 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs @@ -70,6 +70,16 @@ namespace ICSharpCode.PackageManagement } } + public void Save(Solution solution) + { + if (WorkbenchSingleton.InvokeRequired) { + Action action = Save; + WorkbenchSingleton.SafeThreadCall(action, solution); + } else { + solution.Save(); + } + } + public IProjectContent GetProjectContent(IProject project) { return ParserService.GetProjectContent(project); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionGlobalsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionGlobalsTests.cs index 87f50791f6..3d01aa01c4 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionGlobalsTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionGlobalsTests.cs @@ -389,5 +389,74 @@ namespace PackageManagement.Tests.EnvDTE object value = globals.VariableValue["test"]; Assert.AreEqual("one", value); } + + [Test] + public void VariablePersists_SetToTrueAfterNewVariableAdded_SolutionIsSaved() + { + CreateSolution(); + globals.VariableValue["test"] = "new-value"; + + globals.VariablePersists["test"] = true; + + solutionHelper.AssertSolutionIsSaved(); + } + + [Test] + public void VariablePersists_SetToFalseAfterNewVariableAdded_SolutionIsNotSaved() + { + CreateSolution(); + globals.VariableValue["test"] = "new-value"; + + globals.VariablePersists["test"] = false; + + solutionHelper.AssertSolutionIsNotSaved(); + } + + [Test] + public void VariablePersists_SetToFalseForVariableInSolution_SolutionSaved() + { + CreateSolution(); + AddExtensibilityGlobalsSection(); + AddVariableToExtensibilityGlobals("test", "value"); + + globals.VariablePersists["test"] = false; + + solutionHelper.AssertSolutionIsSaved(); + } + + [Test] + public void VariablePersists_SetToTrueForVariableInSolution_SolutionNotSaved() + { + CreateSolution(); + AddExtensibilityGlobalsSection(); + AddVariableToExtensibilityGlobals("test", "value"); + + globals.VariablePersists["test"] = true; + + solutionHelper.AssertSolutionIsNotSaved(); + } + + [Test] + public void VariableValue_VariableInSolutionChanged_SolutionIsSaved() + { + CreateSolution(); + AddExtensibilityGlobalsSection(); + AddVariableToExtensibilityGlobals("test", "value"); + + globals.VariableValue["test"] = "new-value"; + + solutionHelper.AssertSolutionIsSaved(); + } + + [Test] + public void VariableValue_VariableNotSolutionChanged_SolutionIsNotSaved() + { + CreateSolution(); + globals.VariableValue["test"] = "value"; + + globals.VariableValue["test"] = "new-value"; + + solutionHelper.AssertSolutionIsNotSaved(); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/SolutionHelper.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/SolutionHelper.cs index 63e4dc30c2..90767db0ef 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/SolutionHelper.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/SolutionHelper.cs @@ -3,9 +3,9 @@ using System; using System.Linq; - using ICSharpCode.PackageManagement.Design; using ICSharpCode.PackageManagement.EnvDTE; +using NUnit.Framework; using SD = ICSharpCode.SharpDevelop.Project; namespace PackageManagement.Tests.Helpers @@ -31,7 +31,9 @@ namespace PackageManagement.Tests.Helpers SD.Solution CreateSharpDevelopSolution() { - return new SD.Solution(new SD.MockProjectChangeWatcher()); + return new SD.Solution(new SD.MockProjectChangeWatcher()) { + FileName = @"d:\projects\MyProject\MyProject.sln" + }; } public SD.Solution OpenDifferentSolution() @@ -73,5 +75,15 @@ namespace PackageManagement.Tests.Helpers { return MSBuildSolution.Sections.SingleOrDefault(section => section.Name == "ExtensibilityGlobals"); } + + public void AssertSolutionIsSaved() + { + Assert.AreEqual(MSBuildSolution, FakeProjectService.SavedSolution); + } + + public void AssertSolutionIsNotSaved() + { + Assert.IsNull(FakeProjectService.SavedSolution); + } } }