diff --git a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj index de01a2feb2..bee4bdcdae 100644 --- a/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj +++ b/src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj @@ -72,6 +72,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs index c21d61bebf..b8e6707ba2 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/Project.cs @@ -12,17 +12,24 @@ namespace ICSharpCode.PackageManagement.EnvDTE IPackageManagementProjectService projectService; public Project(MSBuildBasedProject project) - : this(project, new PackageManagementProjectService()) + : this( + project, + new PackageManagementProjectService(), + new PackageManagementFileService()) { } - public Project(MSBuildBasedProject project, IPackageManagementProjectService projectService) + public Project( + MSBuildBasedProject project, + IPackageManagementProjectService projectService, + IPackageManagementFileService fileService) { this.MSBuildProject = project; this.projectService = projectService; Object = new ProjectObject(this); Properties = new Properties(this); + ProjectItems = new ProjectItems(this, fileService); } public string Name { @@ -31,6 +38,7 @@ namespace ICSharpCode.PackageManagement.EnvDTE public ProjectObject Object { get; private set; } public Properties Properties { get; private set; } + public ProjectItems ProjectItems { get; private set; } internal MSBuildBasedProject MSBuildProject { get; private set; } @@ -54,5 +62,24 @@ namespace ICSharpCode.PackageManagement.EnvDTE { projectService.RemoveProjectItem(MSBuildProject, referenceItem); } + + internal void AddFile(string include) + { + var fileProjectItem = CreateFileProjectItem(include); + projectService.AddProjectItem(MSBuildProject, fileProjectItem); + } + + FileProjectItem CreateFileProjectItem(string include) + { + ItemType itemType = GetDefaultItemType(include); + var fileProjectItem = new FileProjectItem(MSBuildProject, itemType); + fileProjectItem.Include = include; + return fileProjectItem; + } + + ItemType GetDefaultItemType(string include) + { + return MSBuildProject.GetDefaultItemType(include); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs new file mode 100644 index 0000000000..d42a157518 --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItems.cs @@ -0,0 +1,40 @@ +// 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 System.IO; +using ICSharpCode.SharpDevelop.Project; + +namespace ICSharpCode.PackageManagement.EnvDTE +{ + public class ProjectItems + { + Project project; + IPackageManagementFileService fileService; + + public ProjectItems(Project project, IPackageManagementFileService fileService) + { + this.project = project; + this.fileService = fileService; + } + + public void AddFromFileCopy(string filePath) + { + string include = Path.GetFileName(filePath); + CopyFileIntoProject(filePath, include); + project.AddFile(include); + project.Save(); + } + + void CopyFileIntoProject(string oldFileName, string fileName) + { + string newFileName = GetFileNameInProject(fileName); + fileService.CopyFile(oldFileName, newFileName); + } + + string GetFileNameInProject(string fileName) + { + return Path.Combine(project.MSBuildProject.Directory, fileName); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementFileService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementFileService.cs index 3a091299a4..c5b36dd9f6 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementFileService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementFileService.cs @@ -10,5 +10,6 @@ namespace ICSharpCode.PackageManagement void RemoveFile(string path); void RemoveDirectory(string path); void OpenFile(string fileName); + void CopyFile(string oldFileName, string newFileName); } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementFileService.cs b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementFileService.cs index de89afd07a..628f30edfd 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementFileService.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementFileService.cs @@ -38,5 +38,15 @@ namespace ICSharpCode.PackageManagement FileService.OpenFile(fileName); } } + + public void CopyFile(string oldFileName, string newFileName) + { + if (WorkbenchSingleton.InvokeRequired) { + Action action = CopyFile; + WorkbenchSingleton.SafeThreadAsyncCall(action, oldFileName, newFileName); + } else { + FileService.CopyFile(oldFileName, newFileName, isDirectory: false, overwrite: false); + } + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj index 88de8ccfa7..78d6e4c7b0 100644 --- a/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj +++ b/src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj @@ -71,6 +71,7 @@ + diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs new file mode 100644 index 0000000000..5daad070ab --- /dev/null +++ b/src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/ProjectItemsTests.cs @@ -0,0 +1,108 @@ +// 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.Project; +using NUnit.Framework; +using PackageManagement.Tests.Helpers; + +namespace PackageManagement.Tests.EnvDTE +{ + [TestFixture] + public class ProjectItemsTests + { + TestableDTEProject project; + ProjectItems projectItems; + TestableProject msbuildProject; + FakeFileService fakeFileService; + + void CreateProjectItems() + { + project = new TestableDTEProject(); + msbuildProject = project.TestableProject; + projectItems = project.ProjectItems; + fakeFileService = project.FakeFileService; + } + + [Test] + public void AddFromFileCopy_AddFileNameOutsideProjectFolder_FileIsIncludedInProjectInProjectFolder() + { + CreateProjectItems(); + msbuildProject.FileName = @"d:\projects\myproject\myproject\myproject.csproj"; + string fileName = @"d:\projects\myproject\packages\tools\test.cs"; + + projectItems.AddFromFileCopy(fileName); + + var fileItem = msbuildProject.Items[0] as FileProjectItem; + + Assert.AreEqual("test.cs", fileItem.Include); + } + + [Test] + public void AddFromFileCopy_AddFileNameOutsideProjectFolder_FileItemTypeTakenFromProject() + { + CreateProjectItems(); + msbuildProject.FileName = @"d:\projects\myproject\myproject\myproject.csproj"; + string fileName = @"d:\projects\myproject\packages\tools\test.cs"; + + msbuildProject.ItemTypeToReturnFromGetDefaultItemType = ItemType.Page; + projectItems.AddFromFileCopy(fileName); + + var fileItem = msbuildProject.Items[0] as FileProjectItem; + + Assert.AreEqual(ItemType.Page, fileItem.ItemType); + } + + [Test] + public void AddFromFileCopy_AddFileNameOutsideProjectFolder_FileNamePassedToDetermineFileItemType() + { + CreateProjectItems(); + msbuildProject.FileName = @"d:\projects\myproject\myproject\myproject.csproj"; + string fileName = @"d:\projects\myproject\packages\tools\test.cs"; + + msbuildProject.ItemTypeToReturnFromGetDefaultItemType = ItemType.Page; + projectItems.AddFromFileCopy(fileName); + + Assert.AreEqual("test.cs", msbuildProject.FileNamePassedToGetDefaultItemType); + } + + [Test] + public void AddFromFileCopy_AddFileNameOutsideProjectFolder_ProjectIsSaved() + { + CreateProjectItems(); + msbuildProject.FileName = @"d:\projects\myproject\myproject\myproject.csproj"; + string fileName = @"d:\projects\myproject\packages\tools\test.cs"; + + msbuildProject.ItemTypeToReturnFromGetDefaultItemType = ItemType.Page; + projectItems.AddFromFileCopy(fileName); + + bool saved = msbuildProject.IsSaved; + + Assert.IsTrue(saved); + } + + [Test] + public void AddFromFileCopy_AddFileNameOutsideProjectFolder_FileIsCopied() + { + CreateProjectItems(); + msbuildProject.FileName = @"d:\projects\myproject\myproject\myproject.csproj"; + string fileName = @"d:\projects\myproject\packages\tools\test.cs"; + + msbuildProject.ItemTypeToReturnFromGetDefaultItemType = ItemType.Page; + projectItems.AddFromFileCopy(fileName); + + string[] expectedFileNames = new string[] { + @"d:\projects\myproject\packages\tools\test.cs", + @"d:\projects\myproject\myproject\test.cs" + }; + + string[] actualFileNames = new string[] { + fakeFileService.OldFileNamePassedToCopyFile, + fakeFileService.NewFileNamePassedToCopyFile + }; + + CollectionAssert.AreEqual(expectedFileNames, actualFileNames); + } + } +} diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs index cefe219344..e6bf714156 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakeFileService.cs @@ -45,5 +45,14 @@ namespace PackageManagement.Tests.Helpers { FileNamePassedToOpenFile = fileName; } + + public string OldFileNamePassedToCopyFile; + public string NewFileNamePassedToCopyFile; + + public void CopyFile(string oldFileName, string newFileName) + { + OldFileNamePassedToCopyFile = oldFileName; + NewFileNamePassedToCopyFile = newFileName; + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableDTEProject.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableDTEProject.cs index 0c15be3233..6f0599b9d8 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableDTEProject.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableDTEProject.cs @@ -12,6 +12,7 @@ namespace PackageManagement.Tests.Helpers { public TestableProject TestableProject; public FakePackageManagementProjectService FakeProjectService; + public FakeFileService FakeFileService; public TestableDTEProject() : this(ProjectHelper.CreateTestProject()) @@ -19,15 +20,22 @@ namespace PackageManagement.Tests.Helpers } public TestableDTEProject(TestableProject project) - : this(project, new FakePackageManagementProjectService()) + : this( + project, + new FakePackageManagementProjectService(), + new FakeFileService(project)) { } - public TestableDTEProject(TestableProject project, FakePackageManagementProjectService projectService) - : base(project, projectService) + public TestableDTEProject( + TestableProject project, + FakePackageManagementProjectService projectService, + FakeFileService fileService) + : base(project, projectService, fileService) { this.TestableProject = project; this.FakeProjectService = projectService; + this.FakeFileService = fileService; } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProject.cs b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProject.cs index 39c0745b7f..3978db49c9 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProject.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/Helpers/TestableProject.cs @@ -25,8 +25,11 @@ namespace PackageManagement.Tests.Helpers ItemsWhenSaved = Items; } + public string FileNamePassedToGetDefaultItemType; + public override ItemType GetDefaultItemType(string fileName) { + FileNamePassedToGetDefaultItemType = fileName; return ItemTypeToReturnFromGetDefaultItemType; }