From 69ccf0af4549df80d7d658a0fa088a68d89f4af8 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Sun, 26 Aug 2012 19:55:48 +0100 Subject: [PATCH] Implement EnvDTE.Document.Saved When T4MVC is configured to always keep its template unsaved then it uses Document.Saved to false each time it is run. --- .../Project/Src/EnvDTE/Document.cs | 10 +++- .../Project/Src/EnvDTE/Project.cs | 6 +- .../Project/Src/EnvDTE/ProjectItem.cs | 6 +- .../Src/IPackageManagementFileService.cs | 3 +- .../Src/PackageManagementFileService.cs | 6 +- .../Test/PackageManagement.Tests.csproj | 1 + .../Test/Src/EnvDTE/DocumentTests.cs | 59 +++++++++++++++++++ .../Test/Src/EnvDTE/ProjectItemTests.cs | 43 +++++++++++++- .../Test/Src/Helpers/FakeFileService.cs | 13 ++-- 9 files changed, 129 insertions(+), 18 deletions(-) create mode 100644 src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/DocumentTests.cs diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Document.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Document.cs index 190567296b..68ca69601d 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Document.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Document.cs @@ -2,19 +2,23 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.PackageManagement.EnvDTE { public class Document { - public Document(string fileName) + IViewContent view; + + public Document(string fileName, IViewContent view) { this.FullName = fileName; + this.view = view; } public virtual bool Saved { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } + get { return !view.IsDirty; } + set { view.PrimaryFile.IsDirty = !value; } } public string FullName { get; private set; } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs index 0d879ef15b..5b2ae299cb 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs @@ -5,8 +5,10 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; + using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; using Microsoft.Build.Construction; using SD = ICSharpCode.SharpDevelop.Project; @@ -290,9 +292,9 @@ namespace ICSharpCode.PackageManagement.EnvDTE return null; } - internal bool IsFileOpen(string fileName) + internal IViewContent GetOpenFile(string fileName) { - return fileService.IsOpen(fileName); + return fileService.GetOpenFile(fileName); } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs index 8dd6455b33..c06af27178 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs @@ -7,6 +7,7 @@ using System.IO; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; using SD = ICSharpCode.SharpDevelop.Project; @@ -180,8 +181,9 @@ namespace ICSharpCode.PackageManagement.EnvDTE Document GetOpenDocument() { - if (ContainingProject.IsFileOpen(FileName)) { - return new Document(FileName); + IViewContent view = ContainingProject.GetOpenFile(FileName); + if (view != null) { + return new Document(FileName, view); } return null; } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementFileService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementFileService.cs index efce0ed11c..3dccaa8318 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementFileService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementFileService.cs @@ -3,6 +3,7 @@ using System; using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.PackageManagement { @@ -10,8 +11,8 @@ namespace ICSharpCode.PackageManagement { void RemoveFile(string path); void RemoveDirectory(string path); - bool IsOpen(string fileName); void OpenFile(string fileName); + IViewContent GetOpenFile(string fileName); void CopyFile(string oldFileName, string newFileName); bool FileExists(string fileName); string[] GetFiles(string path); diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementFileService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementFileService.cs index b65fd8ddf9..902c0b7a5f 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementFileService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementFileService.cs @@ -41,12 +41,12 @@ namespace ICSharpCode.PackageManagement } } - public bool IsOpen(string fileName) + public IViewContent GetOpenFile(string fileName) { if (WorkbenchSingleton.InvokeRequired) { - return WorkbenchSingleton.SafeThreadFunction(() => IsOpen(fileName)); + return WorkbenchSingleton.SafeThreadFunction(() => GetOpenFile(fileName)); } else { - return FileService.IsOpen(fileName); + return FileService.GetOpenFile(fileName); } } diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index f23b019105..9ea4866e47 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -95,6 +95,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/DocumentTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/DocumentTests.cs new file mode 100644 index 0000000000..0e85ea4dc0 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/DocumentTests.cs @@ -0,0 +1,59 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.PackageManagement.EnvDTE; +using ICSharpCode.SharpDevelop; +using ICSharpCode.SharpDevelop.Gui; +using NUnit.Framework; +using Rhino.Mocks; + +namespace PackageManagement.Tests.EnvDTE +{ + [TestFixture] + public class DocumentTests + { + IViewContent view; + Document document; + OpenedFile openedFile; + + [SetUp] + public void Init() + { + openedFile = MockRepository.GenerateStub(); + view = MockRepository.GenerateStub(); + view.Stub(v => v.PrimaryFile).Return(openedFile); + } + + void CreateDocument(string fileName) + { + document = new Document(fileName, view); + } + + void OpenFileIsDirty() + { + openedFile.IsDirty = true; + } + + [Test] + public void Saved_SetToTrue_OpenFileIsDirtySetToFalse() + { + CreateDocument(@"d:\projects\MyProject\program.cs"); + OpenFileIsDirty(); + + document.Saved = true; + + Assert.IsFalse(openedFile.IsDirty); + } + + [Test] + public void Saved_SetToFalse_OpenFileIsDirtySetToTrue() + { + CreateDocument(@"d:\projects\MyProject\program.cs"); + + document.Saved = false; + + Assert.IsTrue(openedFile.IsDirty); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemTests.cs index 309d0e601f..d0251dc2cf 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemTests.cs @@ -29,9 +29,20 @@ namespace PackageManagement.Tests.EnvDTE fakeFileService = project.FakeFileService; } - void OpenFileInSharpDevelop(string fileName) + void OpenSavedFileInSharpDevelop(string fileName) + { + OpenFileInSharpDevelop(fileName, dirty: false); + } + + void OpenUnsavedFileInSharpDevelop(string fileName) + { + OpenFileInSharpDevelop(fileName, dirty: true); + } + + void OpenFileInSharpDevelop(string fileName, bool dirty) { IViewContent view = MockRepository.GenerateStub(); + view.Stub(v => v.IsDirty).Return(dirty); fakeFileService.AddOpenView(view, fileName); } @@ -260,11 +271,39 @@ namespace PackageManagement.Tests.EnvDTE msbuildProject.AddFile(@"program.cs"); ProjectItem item = projectItems.Item("program.cs"); string projectItemFileName = @"d:\projects\MyProject\program.cs"; - OpenFileInSharpDevelop(projectItemFileName); + OpenSavedFileInSharpDevelop(projectItemFileName); Document document = item.Document; Assert.AreEqual(projectItemFileName, document.FullName); } + + [Test] + public void Document_ProjectItemOpenInSharpDevelopAndIsSaved_ReturnsOpenDocumentThatIsSaved() + { + CreateProjectItems(); + msbuildProject.FileName = @"d:\projects\MyProject\MyProject.csproj"; + msbuildProject.AddFile(@"program.cs"); + ProjectItem item = projectItems.Item("program.cs"); + OpenSavedFileInSharpDevelop(@"d:\projects\MyProject\program.cs"); + + Document document = item.Document; + + Assert.IsTrue(document.Saved); + } + + [Test] + public void Document_ProjectItemOpenInSharpDevelopAndIsUnsaved_ReturnsOpenDocumentThatIsNotSaved() + { + CreateProjectItems(); + msbuildProject.FileName = @"d:\projects\MyProject\MyProject.csproj"; + msbuildProject.AddFile(@"program.cs"); + ProjectItem item = projectItems.Item("program.cs"); + OpenUnsavedFileInSharpDevelop(@"d:\projects\MyProject\program.cs"); + + Document document = item.Document; + + Assert.IsFalse(document.Saved); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs index 1ff7a6430c..13dd5ef64a 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs @@ -126,16 +126,19 @@ namespace PackageManagement.Tests.Helpers return CompilationUnitToReturnFromGetCompilationUnit; } - public bool IsOpen(string fileName) - { - return openViews.ContainsKey(fileName); - } - Dictionary openViews = new Dictionary(); public void AddOpenView(IViewContent view, string fileName) { openViews.Add(fileName, view); } + + public IViewContent GetOpenFile(string fileName) + { + if (openViews.ContainsKey(fileName)) { + return openViews[fileName]; + } + return null; + } } }