Browse Source

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.
pull/28/head
Matt Ward 13 years ago
parent
commit
f3e28c206d
  1. 7
      src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs
  2. 4
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Globals.cs
  3. 12
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs
  4. 31
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionExtensibilityGlobals.cs
  5. 1
      src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs
  6. 10
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs
  7. 69
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionGlobalsTests.cs
  8. 16
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/SolutionHelper.cs

7
src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProjectService.cs

@ -81,6 +81,13 @@ namespace ICSharpCode.PackageManagement.Design @@ -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();

4
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Globals.cs

@ -11,13 +11,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -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);
}

12
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Solution.cs

@ -2,6 +2,7 @@ @@ -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 @@ -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 @@ -33,5 +34,14 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public Projects Projects { get; private set; }
public Globals Globals { get; private set; }
internal IList<SD.ProjectSection> Sections {
get { return solution.Sections; }
}
internal void Save()
{
projectService.Save(solution);
}
}
}

31
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/SolutionExtensibilityGlobals.cs

@ -11,11 +11,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -11,11 +11,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
public class SolutionExtensibilityGlobals
{
SD.Solution solution;
Solution solution;
const string ExtensibilityGlobalsSectionName = "ExtensibilityGlobals";
List<SD.SolutionItem> nonPersistedSolutionItems = new List<SD.SolutionItem>();
public SolutionExtensibilityGlobals(SD.Solution solution)
public SolutionExtensibilityGlobals(Solution solution)
{
this.solution = solution;
}
@ -29,7 +29,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -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 @@ -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 @@ -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 @@ -141,6 +159,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE
SD.ProjectSection section = GetExtensibilityGlobalsSection();
section.Items.Remove(item);
nonPersistedSolutionItems.Add(item);
solution.Save();
}
}
}

1
src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementProjectService.cs

@ -22,6 +22,7 @@ namespace ICSharpCode.PackageManagement @@ -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<IProject> GetOpenProjects();

10
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementProjectService.cs

@ -70,6 +70,16 @@ namespace ICSharpCode.PackageManagement @@ -70,6 +70,16 @@ namespace ICSharpCode.PackageManagement
}
}
public void Save(Solution solution)
{
if (WorkbenchSingleton.InvokeRequired) {
Action<Solution> action = Save;
WorkbenchSingleton.SafeThreadCall<Solution>(action, solution);
} else {
solution.Save();
}
}
public IProjectContent GetProjectContent(IProject project)
{
return ParserService.GetProjectContent(project);

69
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/SolutionGlobalsTests.cs

@ -389,5 +389,74 @@ namespace PackageManagement.Tests.EnvDTE @@ -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();
}
}
}

16
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/SolutionHelper.cs

@ -3,9 +3,9 @@ @@ -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 @@ -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 @@ -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);
}
}
}

Loading…
Cancel
Save