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;
}