Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Ward <matt.ward@xamarin.com>2016-12-09 14:21:49 +0300
committerMatt Ward <matt.ward@xamarin.com>2016-12-09 15:46:41 +0300
commitfa94861909b1424b8be4f5bf2b523a6529da6908 (patch)
tree9c6d8513a37cd1df74f6141b10968adeee9a7d37
parent3a2a2d561966b5c96cadb94a7bf8678e1c9edead (diff)
parent5c063dc7831fdc27b45b28407236fda08a41ac78 (diff)
Merge branch 'nugetizer3000'
-rw-r--r--NuGet.config1
-rw-r--r--main/Main.sln51
-rw-r--r--main/src/addins/CSharpBinding/templates/AssemblyInfo.xft.xml5
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/AssemblyInfo.cs1
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs5
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.addin.xml2
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj6
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs4
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/GlobalPackagesExtractor.cs112
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IHasDotNetProject.cs35
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/INuGetAwareProject.cs45
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildNuGetImportGenerator.cs67
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopNuGetProjectFactory.cs4
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopSolutionManager.cs6
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetAwareProjectPackageRestoreManager.cs75
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs11
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs8
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateSourceRepositoryProvider.cs18
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreAndCheckForUpdatesAction.cs26
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreNuGetPackagesAction.cs19
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreNuGetPackagesInNuGetAwareProjectAction.cs80
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/AddPlatformImplementationDialog.UI.cs89
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/AddPlatformImplementationDialog.cs94
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.cs191
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs175
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkPackagingProjectTemplateWizardPageWidget.cs161
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.UI.cs66
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.cs84
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkReferenceAssembliesOptionsPanelWidget.UI.cs131
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkReferenceAssembliesOptionsPanelWidget.cs160
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/NuGetPackageMetadataOptionsPanel.cs67
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/ProjectNuGetBuildOptionsPanel.cs67
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/ReferenceAssembliesOptionsPanel.cs57
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/CrossPlatformLibraryTemplateWizard.cs92
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/CrossPlatformLibraryTemplateWizardPage.cs215
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/PackagingProjectTemplateWizard.cs66
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/PackagingProjectTemplateWizardPage.cs172
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests.csproj85
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/AddPlatformImplementationTests.cs404
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/ProjectTemplateTests.cs209
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/TestableAddPlatformImplementationViewModel.cs41
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/TestableCrossPlatformLibraryTemplateWizard.cs43
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/Properties/AssemblyInfo.cs6
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.addin.xml150
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.csproj211
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/AddPlatformImplementationHandler.cs72
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/AddPlatformImplementationViewModel.cs336
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/CreateNuGetPackageBuildTarget.cs115
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/CreateNuGetPackageHandler.cs46
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/DotNetProjectExtensions.cs89
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/DotNetProjectPackagingExtension.cs117
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/MSBuildGlobalPropertyProvider.cs55
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/MSBuildProjectExtensions.cs104
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetFileDescriptor.cs64
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetFilePropertyProvider.cs45
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetPackageMetadata.cs159
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetProjectReferencePropertyDescriptor.cs63
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetProjectReferencePropertyProvider.cs44
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackageReference.cs61
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackageReferenceCollection.cs37
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingCompilerParameters.cs35
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingNuGetProject.cs158
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingProject.cs378
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingProjectFlavor.cs51
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectFileMigrator.cs73
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectHasNuGetMetadataCondition.cs52
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectIsDotNetProjectOnlyCondition.cs51
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ReferenceAssemblyFramework.cs49
-rw-r--r--main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ReferenceAssemblyFrameworkCollection.cs36
-rw-r--r--main/src/addins/MonoDevelop.Packaging/PostBuild.proj12
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Properties/AddinInfo.cs16
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Properties/AssemblyInfo.cs9
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Targets/NuGet.Packaging.Authoring.props23
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Targets/NuGet.Packaging.Authoring.targets23
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Templates/CrossPlatformLibrary.xpt.xml88
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library.pngbin0 -> 4888 bytes
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library@2x.pngbin0 -> 10748 bytes
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library~dark.pngbin0 -> 4819 bytes
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library~dark@2x.pngbin0 -> 10727 bytes
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget.pngbin0 -> 4640 bytes
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget@2x.pngbin0 -> 10072 bytes
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget~dark.pngbin0 -> 4532 bytes
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget~dark@2x.pngbin0 -> 10022 bytes
-rw-r--r--main/src/addins/MonoDevelop.Packaging/Templates/PackagingProject.xpt.xml30
-rw-r--r--main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.cs448
-rw-r--r--main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget.cs582
-rw-r--r--main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkPackagingProjectTemplateWizardPageWidget.cs235
-rw-r--r--main/src/addins/MonoDevelop.Packaging/gtk-gui/generated.cs88
-rw-r--r--main/src/addins/MonoDevelop.Packaging/gtk-gui/gui.stetic1794
-rw-r--r--main/src/addins/MonoDevelop.Packaging/packages.config4
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntime.cs28
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MsNetTargetRuntime.cs12
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/TargetRuntime.cs7
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvaluationContext.cs9
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildProjectService.cs29
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs13
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs12
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs15
-rw-r--r--main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectExtension.cs10
-rw-r--r--main/src/core/MonoDevelop.Ide/AssemblyInfo.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/ExtensionModel/StockIcons.addin.xml1
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectDescriptor.cs2
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplatePackageReference.cs89
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj24
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16.pngbin0 -> 131 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16@2x.pngbin0 -> 159 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark.pngbin0 -> 131 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark@2x.pngbin0 -> 159 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark~sel.pngbin0 -> 131 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark~sel@2x.pngbin0 -> 159 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~sel.pngbin0 -> 131 bytes
-rw-r--r--main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~sel@2x.pngbin0 -> 159 bytes
-rw-r--r--main/tests/Makefile.am1
113 files changed, 9445 insertions, 68 deletions
diff --git a/NuGet.config b/NuGet.config
index c616c8e4f7..673a29f0e9 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -2,5 +2,6 @@
<configuration>
<packageSources>
<add key="Nuget Official" value ="https://www.nuget.org/api/v2/" />
+ <add key="NuGetizer3000" value="https://ci.appveyor.com/nuget/nugetizer3000" />
</packageSources>
</configuration>
diff --git a/main/Main.sln b/main/Main.sln
index 0d9eb37b45..03512759a0 100644
--- a/main/Main.sln
+++ b/main/Main.sln
@@ -312,6 +312,12 @@ Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "MonoDevelop.FSharpInteracti
EndProject
Project("{f2a71f9b-5d33-465a-a702-920d77279786}") = "MonoDevelop.FSharp.Tests", "external\fsharpbinding\MonoDevelop.FSharp.Tests\MonoDevelop.FSharp.Tests.fsproj", "{A1A45375-7FB8-4F2A-850F-FBCC67739927}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MonoDevelop.Packaging", "MonoDevelop.Packaging", "{07BADCA3-CE39-42D4-8EFB-B1E5573FF2BD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.Packaging", "src\addins\MonoDevelop.Packaging\MonoDevelop.Packaging.csproj", "{443311BF-766D-4863-B5A1-AFAA7F41DBDA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.Packaging.Tests", "src\addins\MonoDevelop.Packaging\MonoDevelop.Packaging.Tests\MonoDevelop.Packaging.Tests.csproj", "{25FBDD35-1CA0-4BED-93F6-927FAF33F96B}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.1", "src\core\MonoDevelop.Projects.Formats.MSBuild\MonoDevelop.Projects.Formats.MSBuild.dotnet.v14.1.csproj", "{7F5B649A-3572-4713-83FD-C28A6AA70445}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PerformanceDiagnostics", "PerformanceDiagnostics", "{19C4CC37-7050-4944-B11F-60F52121B24C}"
@@ -2091,7 +2097,47 @@ Global
{A1A45375-7FB8-4F2A-850F-FBCC67739927}.Debug|x86.ActiveCfg = Debug|Any CPU
{A1A45375-7FB8-4F2A-850F-FBCC67739927}.Debug|x86.Build.0 = Debug|Any CPU
{A1A45375-7FB8-4F2A-850F-FBCC67739927}.Release|x86.ActiveCfg = Release|Any CPU
- {A1A45375-7FB8-4F2A-850F-FBCC67739927}.Release|x86.Build.0 = Release|Any CPU
+ {A1A45375-7FB8-4F2A-850F-FBCC67739927}.Release|x86.Build.0 = Release|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.Debug|x86.Build.0 = Debug|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.Release|x86.ActiveCfg = Release|Any CPU
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA}.Release|x86.Build.0 = Release|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.DebugMac|Any CPU.ActiveCfg = Debug|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.DebugMac|Any CPU.Build.0 = Debug|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.DebugWin32|Any CPU.ActiveCfg = Debug|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.DebugWin32|Any CPU.Build.0 = Debug|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.DebugGnome|Any CPU.ActiveCfg = Debug|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.DebugGnome|Any CPU.Build.0 = Debug|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.ReleaseMac|Any CPU.ActiveCfg = Release|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.ReleaseMac|Any CPU.Build.0 = Release|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.ReleaseWin32|Any CPU.ActiveCfg = Release|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.ReleaseWin32|Any CPU.Build.0 = Release|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.ReleaseGnome|Any CPU.ActiveCfg = Release|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.ReleaseGnome|Any CPU.Build.0 = Release|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.Debug|x86.Build.0 = Debug|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.Release|x86.ActiveCfg = Release|Any CPU
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B}.Release|x86.Build.0 = Release|Any CPU
{7F5B649A-3572-4713-83FD-C28A6AA70445}.Debug|Any CPU.ActiveCfg = Debug|x86
{7F5B649A-3572-4713-83FD-C28A6AA70445}.Debug|Any CPU.Build.0 = Debug|x86
{7F5B649A-3572-4713-83FD-C28A6AA70445}.DebugMac|Any CPU.ActiveCfg = Debug|x86
@@ -2287,6 +2333,9 @@ Global
{FD0D1033-9145-48E5-8ED8-E2365252878C} = {4804F98F-A891-463C-893D-7134D66C234F}
{20D6EC2C-B62E-49D1-B685-90D8967A5B5D} = {4804F98F-A891-463C-893D-7134D66C234F}
{A1A45375-7FB8-4F2A-850F-FBCC67739927} = {78C10DAE-D3D7-44FC-93DF-831D8D54ECF9}
+ {07BADCA3-CE39-42D4-8EFB-B1E5573FF2BD} = {D417E929-2B3A-46AC-BBE8-027ADB63A790}
+ {443311BF-766D-4863-B5A1-AFAA7F41DBDA} = {07BADCA3-CE39-42D4-8EFB-B1E5573FF2BD}
+ {25FBDD35-1CA0-4BED-93F6-927FAF33F96B} = {07BADCA3-CE39-42D4-8EFB-B1E5573FF2BD}
{7F5B649A-3572-4713-83FD-C28A6AA70445} = {8F48ECA6-CFFF-4EBF-BC92-817199EDE9AF}
{19C4CC37-7050-4944-B11F-60F52121B24C} = {D417E929-2B3A-46AC-BBE8-027ADB63A790}
{DD14AD77-6FBB-4F0D-8083-CEC28A9D0BBD} = {19C4CC37-7050-4944-B11F-60F52121B24C}
diff --git a/main/src/addins/CSharpBinding/templates/AssemblyInfo.xft.xml b/main/src/addins/CSharpBinding/templates/AssemblyInfo.xft.xml
index e63409d17b..3afcbeed26 100644
--- a/main/src/addins/CSharpBinding/templates/AssemblyInfo.xft.xml
+++ b/main/src/addins/CSharpBinding/templates/AssemblyInfo.xft.xml
@@ -40,8 +40,9 @@ using System.Runtime.CompilerServices;
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
-[assembly: AssemblyVersion("1.0.*")]
-
+$if$ ($UseCustomAssemblyInfoVersion$ == true)[assembly: AssemblyVersion("${AssemblyInfoVersion}")]
+$else$[assembly: AssemblyVersion("1.0.*")]
+$endif$
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
diff --git a/main/src/addins/MonoDevelop.PackageManagement/AssemblyInfo.cs b/main/src/addins/MonoDevelop.PackageManagement/AssemblyInfo.cs
index 77a9a55cea..c98b3a2f72 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/AssemblyInfo.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/AssemblyInfo.cs
@@ -10,3 +10,4 @@ using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo ("MonoDevelop.PackageManagement.Cmdlets")]
[assembly: InternalsVisibleTo ("MonoDevelop.PackageManagement.Extensions")]
[assembly: InternalsVisibleTo ("MonoDevelop.PackageManagement.Tests")]
+[assembly: InternalsVisibleTo ("MonoDevelop.Packaging")]
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs
index ff38f5e27e..aca0efb247 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Commands/RestorePackagesInProjectHandler.cs
@@ -64,6 +64,11 @@ namespace MonoDevelop.PackageManagement.Commands
return new RestoreNuGetPackagesInNuGetIntegratedProject (project, buildIntegratedProject, solutionManager);
}
+ var nugetAwareProject = project as INuGetAwareProject;
+ if (nugetAwareProject != null) {
+ return new RestoreNuGetPackagesInNuGetAwareProjectAction (project, solutionManager);
+ }
+
return new RestoreNuGetPackagesInProjectAction (project, nugetProject, solutionManager);
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.addin.xml b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.addin.xml
index 334dac6679..3793a4ca55 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.addin.xml
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.addin.xml
@@ -4,6 +4,8 @@
<Import assembly="MonoDevelop.PackageManagement.dll" />
<Import assembly="Microsoft.Web.XmlTransform.dll" />
<Import assembly="NuGet.Core.dll" />
+ <Import assembly="NuGet.Packaging.Core.Types.dll" />
+ <Import assembly="NuGet.Packaging.dll" />
</Runtime>
<Extension path = "/MonoDevelop/Ide/Commands">
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
index c65530a29c..64183927a3 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.csproj
@@ -399,6 +399,12 @@
<Compile Include="MonoDevelop.PackageManagement\MonoDevelopPackageRestoreManager.cs" />
<Compile Include="MonoDevelop.PackageManagement\BackgroundDispatcher.cs" />
<Compile Include="MonoDevelop.PackageManagement\PackageRestoreTask.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\INuGetAwareProject.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\MSBuildNuGetImportGenerator.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\GlobalPackagesExtractor.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\RestoreNuGetPackagesInNuGetAwareProjectAction.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\NuGetAwareProjectPackageRestoreManager.cs" />
+ <Compile Include="MonoDevelop.PackageManagement\IHasDotNetProject.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="MonoDevelop.PackageManagement.addin.xml" />
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
index 558440fe3a..b83fd3c502 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetProjectExtensions.cs
@@ -72,6 +72,10 @@ namespace MonoDevelop.PackageManagement
public static bool HasPackages (this DotNetProject project)
{
+ var nugetAwareProject = project as INuGetAwareProject;
+ if (nugetAwareProject != null)
+ return nugetAwareProject.HasPackages ();
+
return HasPackages (project.BaseDirectory, project.Name);
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/GlobalPackagesExtractor.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/GlobalPackagesExtractor.cs
new file mode 100644
index 0000000000..aa84604091
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/GlobalPackagesExtractor.cs
@@ -0,0 +1,112 @@
+//
+// GlobalPackagesExtractor.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using MonoDevelop.Core;
+using MonoDevelop.Projects;
+using NuGet.Common;
+using NuGet.Configuration;
+using NuGet.PackageManagement;
+using NuGet.Packaging;
+using NuGet.Packaging.Core;
+using NuGet.Packaging.PackageExtraction;
+using NuGet.ProjectManagement;
+using NuGet.Protocol.Core.Types;
+
+namespace MonoDevelop.PackageManagement
+{
+ internal static class GlobalPackagesExtractor
+ {
+ const int BufferSize = 8192;
+
+ public static async Task Extract (
+ Solution solution,
+ PackageIdentity packageIdentity,
+ DownloadResourceResult downloadResult,
+ CancellationToken token)
+ {
+ string globalPackagesFolder = await GetPackagesDirectory (solution);
+
+ var defaultPackagePathResolver = new VersionFolderPathResolver (globalPackagesFolder);
+
+ string hashPath = defaultPackagePathResolver.GetHashPath (packageIdentity.Id, packageIdentity.Version);
+
+ if (File.Exists (hashPath))
+ return;
+
+ var versionFolderPathContext = new VersionFolderPathContext (
+ packageIdentity,
+ globalPackagesFolder,
+ NullLogger.Instance,
+ PackageSaveMode.Defaultv3,
+ PackageExtractionBehavior.XmlDocFileSaveMode);
+
+ downloadResult.PackageStream.Position = 0;
+ await PackageExtractor.InstallFromSourceAsync (
+ stream => downloadResult.PackageStream.CopyToAsync (stream, BufferSize, token),
+ versionFolderPathContext,
+ token);
+ }
+
+ static Task<string> GetPackagesDirectory (Solution solution)
+ {
+ return Runtime.RunInMainThread (() => {
+ return MSBuildNuGetImportGenerator.GetPackagesRootDirectory (solution);
+ });
+ }
+
+ public static async Task Download (
+ IMonoDevelopSolutionManager solutionManager,
+ PackageIdentity packageIdentity,
+ INuGetProjectContext context,
+ CancellationToken token)
+ {
+ if (!IsMissing (solutionManager, packageIdentity))
+ return;
+
+ await PackageDownloader.GetDownloadResourceResultAsync (
+ solutionManager.CreateSourceRepositoryProvider ().GetRepositories (),
+ packageIdentity,
+ solutionManager.Settings,
+ new LoggerAdapter (context),
+ token);
+ }
+
+ public static bool IsMissing (
+ IMonoDevelopSolutionManager solutionManager,
+ PackageIdentity packageIdentity)
+ {
+ string globalPackagesFolder = SettingsUtility.GetGlobalPackagesFolder (solutionManager.Settings);
+ var defaultPackagePathResolver = new VersionFolderPathResolver (globalPackagesFolder);
+
+ string hashPath = defaultPackagePathResolver.GetHashPath (packageIdentity.Id, packageIdentity.Version);
+
+ return !File.Exists (hashPath);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IHasDotNetProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IHasDotNetProject.cs
new file mode 100644
index 0000000000..531dee8963
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/IHasDotNetProject.cs
@@ -0,0 +1,35 @@
+//
+// IHasDotNetProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.Threading.Tasks;
+
+namespace MonoDevelop.PackageManagement
+{
+ interface IHasDotNetProject
+ {
+ Task SaveProject ();
+ }
+} \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/INuGetAwareProject.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/INuGetAwareProject.cs
new file mode 100644
index 0000000000..9eb1cb1d8f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/INuGetAwareProject.cs
@@ -0,0 +1,45 @@
+//
+// INuGetAwareProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.Threading;
+using System.Threading.Tasks;
+using NuGet.ProjectManagement;
+
+namespace MonoDevelop.PackageManagement
+{
+ internal interface INuGetAwareProject
+ {
+ NuGetProject CreateNuGetProject ();
+ bool HasPackages ();
+ Task<bool> HasMissingPackages (IMonoDevelopSolutionManager solutionManager);
+
+ Task RestorePackagesAsync (
+ IMonoDevelopSolutionManager solutionManager,
+ INuGetProjectContext context,
+ CancellationToken token);
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildNuGetImportGenerator.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildNuGetImportGenerator.cs
new file mode 100644
index 0000000000..be30ab88bf
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MSBuildNuGetImportGenerator.cs
@@ -0,0 +1,67 @@
+//
+// MSBuildNuGetImportGenerator.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.IO;
+using MonoDevelop.Core;
+using MonoDevelop.Projects;
+using NuGet.Commands;
+using NuGet.Common;
+using NuGet.Configuration;
+
+namespace MonoDevelop.PackageManagement
+{
+ internal static class MSBuildNuGetImportGenerator
+ {
+ public static void CreateImports (DotNetProject project, string prop, string target)
+ {
+ string repositoryRoot = GetPackagesRootDirectory (project);
+ prop = Path.Combine (repositoryRoot, prop);
+ target = Path.Combine (repositoryRoot, target);
+
+ var restoreResult = new MSBuildRestoreResult (
+ project.Name,
+ project.BaseDirectory,
+ repositoryRoot,
+ new [] { prop },
+ new [] { target });
+
+ restoreResult.Commit (NullLogger.Instance);
+ }
+
+ static string GetPackagesRootDirectory (DotNetProject project)
+ {
+ return GetPackagesRootDirectory (project.ParentSolution);
+ }
+
+ public static string GetPackagesRootDirectory (Solution solution)
+ {
+ var solutionManager = PackageManagementServices.Workspace.GetSolutionManager (solution);
+ string globalPackagesPath = SettingsUtility.GetGlobalPackagesFolder (solutionManager.Settings);
+
+ return new FilePath (globalPackagesPath).FullPath;
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopNuGetProjectFactory.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopNuGetProjectFactory.cs
index ff8f81b2a9..d3842a6746 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopNuGetProjectFactory.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopNuGetProjectFactory.cs
@@ -68,6 +68,10 @@ namespace MonoDevelop.PackageManagement
{
Runtime.AssertMainThread ();
+ var nugetAwareProject = project as INuGetAwareProject;
+ if (nugetAwareProject != null)
+ return nugetAwareProject.CreateNuGetProject ();
+
var projectSystem = new MonoDevelopMSBuildNuGetProjectSystem (project, context);
string projectJsonPath = ProjectJsonPathUtilities.GetProjectConfigPath (project.BaseDirectory, project.Name);
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopSolutionManager.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopSolutionManager.cs
index 1651090be2..cc791a381f 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopSolutionManager.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopSolutionManager.cs
@@ -162,6 +162,12 @@ namespace MonoDevelop.PackageManagement
return;
}
+ var hasProject = nuGetProject as IHasDotNetProject;
+ if (hasProject != null) {
+ hasProject.SaveProject ().Wait ();
+ return;
+ }
+
throw new ApplicationException (string.Format ("Unsupported NuGetProject type: {0}", nuGetProject.GetType ().FullName));
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetAwareProjectPackageRestoreManager.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetAwareProjectPackageRestoreManager.cs
new file mode 100644
index 0000000000..5f295a54fa
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/NuGetAwareProjectPackageRestoreManager.cs
@@ -0,0 +1,75 @@
+//
+// NuGetAwareProjectPackageRestoreManager.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using System.Threading;
+using NuGet.ProjectManagement;
+
+namespace MonoDevelop.PackageManagement
+{
+ class NuGetAwareProjectPackageRestoreManager
+ {
+ IMonoDevelopSolutionManager solutionManager;
+
+ public NuGetAwareProjectPackageRestoreManager (
+ IMonoDevelopSolutionManager solutionManager)
+ {
+ this.solutionManager = solutionManager;
+ }
+
+ public Task RestoreMissingPackagesAsync (
+ INuGetAwareProject project,
+ INuGetProjectContext context,
+ CancellationToken token)
+ {
+ return project.RestorePackagesAsync (solutionManager, context, token);
+ }
+
+ public async Task RestoreMissingPackagesAsync (
+ IEnumerable<INuGetAwareProject> projects,
+ NuGetProjectContext context,
+ CancellationToken token)
+ {
+ foreach (INuGetAwareProject project in projects) {
+ await RestoreMissingPackagesAsync (project, context, token);
+ }
+ }
+
+ public async Task<IEnumerable<INuGetAwareProject>> GetProjectsRequiringRestore (
+ IEnumerable<INuGetAwareProject> projects)
+ {
+ var projectsToBeRestored = new List<INuGetAwareProject> ();
+
+ foreach (INuGetAwareProject project in projects) {
+ if (await project.HasMissingPackages (solutionManager))
+ projectsToBeRestored.Add (project);
+ }
+
+ return projectsToBeRestored;
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs
index b488b2cb46..6f0a0cac78 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageManagementProjectOperations.cs
@@ -129,6 +129,17 @@ namespace MonoDevelop.PackageManagement
backgroundActionRunner.Run (progressMessage, actions);
}
+ internal IEnumerable<INuGetPackageAction> CreateInstallActions (
+ string packageSourceUrl,
+ Project project,
+ IEnumerable<PackageManagementPackageReference> packages)
+ {
+ var repositoryProvider = SourceRepositoryProviderFactory.CreateSourceRepositoryProvider ();
+ var repository = repositoryProvider.CreateRepository (new PackageSource (packageSourceUrl));
+
+ return CreateInstallActions (new [] { repository }, project, packages, false);
+ }
+
IEnumerable<INuGetPackageAction> CreateInstallActions (
IEnumerable<SourceRepository> repositories,
Project project,
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs
index 21a53fcf10..014efdedd1 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateNuGetPackageInstaller.cs
@@ -103,8 +103,8 @@ namespace MonoDevelop.PackageManagement
ProjectTemplateSourceRepositoryProvider repositoryProvider,
ProjectTemplatePackageReference packageReference)
{
- var primaryRepositories = repositoryProvider.GetRepositories (packageReference.IsLocalPackage);
- var secondaryRepositories = GetSecondaryRepositories (primaryRepositories, packageReference.IsLocalPackage);
+ var primaryRepositories = repositoryProvider.GetRepositories (packageReference).ToList ();
+ var secondaryRepositories = GetSecondaryRepositories (primaryRepositories, packageReference);
return new InstallNuGetPackageAction (
primaryRepositories,
@@ -120,9 +120,9 @@ namespace MonoDevelop.PackageManagement
/// Returning null allows all enabled package sources to be used when resolving dependencies.
/// </summary>
static IEnumerable<SourceRepository> GetSecondaryRepositories (
- IEnumerable<SourceRepository> primaryRepositories, bool local)
+ IEnumerable<SourceRepository> primaryRepositories, ProjectTemplatePackageReference packageReference)
{
- if (local) {
+ if (packageReference.IsLocalPackage || packageReference.Directory.IsNotNull) {
return primaryRepositories;
}
return null;
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateSourceRepositoryProvider.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateSourceRepositoryProvider.cs
index f916a1248a..cc371e9020 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateSourceRepositoryProvider.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/ProjectTemplateSourceRepositoryProvider.cs
@@ -27,6 +27,7 @@
using System.Collections.Generic;
using System.Linq;
using Mono.Addins;
+using MonoDevelop.Core;
using MonoDevelop.Ide.Templates;
using NuGet.Configuration;
using NuGet.Protocol.Core.Types;
@@ -46,15 +47,20 @@ namespace MonoDevelop.PackageManagement
nugetSourceRepository = provider.CreateRepository (packageSource);
}
- public IEnumerable<SourceRepository> GetRepositories (bool local = false)
+ public IEnumerable<SourceRepository> GetRepositories (ProjectTemplatePackageReference packageReference)
{
+ if (packageReference.Directory.IsNotNull) {
+ yield return CreateRepository (packageReference.Directory);
+ yield break;
+ }
+
foreach (SourceRepository sourceRepository in GetProjectTemplateRepositories ()) {
- if (!local || sourceRepository.PackageSource.IsLocal) {
+ if (!packageReference.IsLocalPackage || sourceRepository.PackageSource.IsLocal) {
yield return sourceRepository;
}
}
- if (!local) {
+ if (!packageReference.IsLocalPackage) {
yield return nugetSourceRepository;
}
}
@@ -80,6 +86,12 @@ namespace MonoDevelop.PackageManagement
return packageSources;
}
+
+ SourceRepository CreateRepository (FilePath directory)
+ {
+ var source = new PackageSource (directory);
+ return provider.CreateRepository (source);
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreAndCheckForUpdatesAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreAndCheckForUpdatesAction.cs
index fd8dc29532..74a6dc39d1 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreAndCheckForUpdatesAction.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreAndCheckForUpdatesAction.cs
@@ -42,11 +42,14 @@ namespace MonoDevelop.PackageManagement
List<PackageRestoreData> packagesToRestore;
IPackageRestoreManager restoreManager;
MonoDevelopBuildIntegratedRestorer buildIntegratedRestorer;
+ NuGetAwareProjectPackageRestoreManager nugetAwareRestorer;
IMonoDevelopSolutionManager solutionManager;
IPackageManagementEvents packageManagementEvents;
Solution solution;
List<NuGetProject> nugetProjects;
List<BuildIntegratedNuGetProject> buildIntegratedProjectsToBeRestored;
+ List<INuGetAwareProject> nugetAwareProjectsToBeRestored;
+ List<INuGetAwareProject> nugetAwareProjects;
public RestoreAndCheckForUpdatesAction (Solution solution)
{
@@ -69,6 +72,10 @@ namespace MonoDevelop.PackageManagement
solutionManager.CreateSourceRepositoryProvider (),
solutionManager.Settings);
}
+
+ if (AnyNuGetAwareProjects ()) {
+ nugetAwareRestorer = new NuGetAwareProjectPackageRestoreManager (solutionManager);
+ }
}
bool AnyProjectsUsingPackagesConfig ()
@@ -86,6 +93,12 @@ namespace MonoDevelop.PackageManagement
return nugetProjects.OfType<BuildIntegratedNuGetProject> ();
}
+ bool AnyNuGetAwareProjects ()
+ {
+ nugetAwareProjects = solution.GetAllProjects ().OfType<INuGetAwareProject> ().ToList ();
+ return nugetAwareProjects.Any ();
+ }
+
public bool CheckForUpdatesAfterRestore { get; set; }
public async Task<bool> HasMissingPackages (CancellationToken cancellationToken = default(CancellationToken))
@@ -107,6 +120,12 @@ namespace MonoDevelop.PackageManagement
return buildIntegratedProjectsToBeRestored.Any ();
}
+ if (nugetAwareRestorer != null) {
+ var projects = await nugetAwareRestorer.GetProjectsRequiringRestore (nugetAwareProjects);
+ nugetAwareProjectsToBeRestored = projects.ToList ();
+ return nugetAwareProjectsToBeRestored.Any ();
+ }
+
return false;
}
@@ -156,6 +175,13 @@ namespace MonoDevelop.PackageManagement
await buildIntegratedRestorer.RestorePackages (buildIntegratedProjectsToBeRestored, cancellationToken);
}
+ if (nugetAwareRestorer != null) {
+ await nugetAwareRestorer.RestoreMissingPackagesAsync (
+ nugetAwareProjectsToBeRestored,
+ new NuGetProjectContext (),
+ cancellationToken);
+ }
+
await Runtime.RunInMainThread (() => RefreshProjectReferences ());
packageManagementEvents.OnPackagesRestored ();
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreNuGetPackagesAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreNuGetPackagesAction.cs
index ff11a128ea..04665f67ea 100644
--- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreNuGetPackagesAction.cs
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreNuGetPackagesAction.cs
@@ -40,10 +40,12 @@ namespace MonoDevelop.PackageManagement
{
IPackageRestoreManager restoreManager;
MonoDevelopBuildIntegratedRestorer buildIntegratedRestorer;
+ NuGetAwareProjectPackageRestoreManager nugetAwareRestorer;
IMonoDevelopSolutionManager solutionManager;
IPackageManagementEvents packageManagementEvents;
Solution solution;
List<NuGetProject> nugetProjects;
+ List<INuGetAwareProject> nugetAwareProjects;
public RestoreNuGetPackagesAction (Solution solution)
{
@@ -67,6 +69,10 @@ namespace MonoDevelop.PackageManagement
solutionManager.CreateSourceRepositoryProvider (),
solutionManager.Settings);
}
+
+ if (AnyNuGetAwareProjects ()) {
+ nugetAwareRestorer = new NuGetAwareProjectPackageRestoreManager (solutionManager);
+ }
}
@@ -84,6 +90,12 @@ namespace MonoDevelop.PackageManagement
{
return nugetProjects.OfType<BuildIntegratedNuGetProject> ();
}
+
+ bool AnyNuGetAwareProjects ()
+ {
+ nugetAwareProjects = solution.GetAllProjects ().OfType<INuGetAwareProject> ().ToList ();
+ return nugetAwareProjects.Any ();
+ }
public void Execute ()
{
@@ -120,6 +132,13 @@ namespace MonoDevelop.PackageManagement
cancellationToken);
}
+ if (nugetAwareRestorer != null) {
+ await nugetAwareRestorer.RestoreMissingPackagesAsync (
+ nugetAwareProjects,
+ new NuGetProjectContext (),
+ cancellationToken);
+ }
+
await Runtime.RunInMainThread (() => RefreshProjectReferences ());
packageManagementEvents.OnPackagesRestored ();
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreNuGetPackagesInNuGetAwareProjectAction.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreNuGetPackagesInNuGetAwareProjectAction.cs
new file mode 100644
index 0000000000..de5312c0d9
--- /dev/null
+++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/RestoreNuGetPackagesInNuGetAwareProjectAction.cs
@@ -0,0 +1,80 @@
+//
+// RestoreNuGetPackagesInNuGetAwareProjectAction.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.Threading;
+using System.Threading.Tasks;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.PackageManagement
+{
+ internal class RestoreNuGetPackagesInNuGetAwareProjectAction : IPackageAction
+ {
+ IPackageManagementEvents packageManagementEvents;
+ NuGetAwareProjectPackageRestoreManager restoreManager;
+ INuGetAwareProject nugetAwareProject;
+
+ public RestoreNuGetPackagesInNuGetAwareProjectAction (
+ DotNetProject project,
+ IMonoDevelopSolutionManager solutionManager)
+ {
+ nugetAwareProject = (INuGetAwareProject)project;
+
+ packageManagementEvents = PackageManagementServices.PackageManagementEvents;
+
+ restoreManager = new NuGetAwareProjectPackageRestoreManager (
+ solutionManager
+ );
+ }
+
+ public void Execute ()
+ {
+ Execute (CancellationToken.None);
+ }
+
+ public void Execute (CancellationToken cancellationToken)
+ {
+ Task task = ExecuteAsync (cancellationToken);
+ using (var restoreTask = new PackageRestoreTask (task)) {
+ task.Wait ();
+ }
+ }
+
+ public bool HasPackageScriptsToRun ()
+ {
+ return false;
+ }
+
+ async Task ExecuteAsync (CancellationToken cancellationToken)
+ {
+ await restoreManager.RestoreMissingPackagesAsync (
+ nugetAwareProject,
+ new NuGetProjectContext (),
+ cancellationToken);
+
+ packageManagementEvents.OnPackagesRestored ();
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/AddPlatformImplementationDialog.UI.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/AddPlatformImplementationDialog.UI.cs
new file mode 100644
index 0000000000..80ffdffca2
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/AddPlatformImplementationDialog.UI.cs
@@ -0,0 +1,89 @@
+//
+// AddPlatformImplementationDialog.UI.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using Xwt;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.Packaging.Gui
+{
+ partial class AddPlatformImplementationDialog : Dialog
+ {
+ DialogButton okButton;
+ CheckBox androidCheckBox;
+ CheckBox iosCheckBox;
+ CheckBox useSharedProjectCheckBox;
+
+ void Build ()
+ {
+ Title = GettextCatalog.GetString ("Add Platform Implementation");
+ Width = 420;
+ Height = 220;
+ Padding = new WidgetSpacing (20, 20, 20, 20);
+
+ var mainVBox = new VBox ();
+ Content = mainVBox;
+
+ // Platforms selection.
+ var platformsVBox = new VBox ();
+ platformsVBox.Spacing = 0;
+ mainVBox.PackStart (platformsVBox);
+
+ var platformsLabel = new Label ();
+ platformsLabel.Text = GettextCatalog.GetString ("Select the platform implementations you would like to add:");
+ platformsLabel.MarginBottom = 6;
+ platformsVBox.PackStart (platformsLabel);
+
+ androidCheckBox = new CheckBox ();
+ androidCheckBox.Label = "Android";
+ platformsVBox.PackStart (androidCheckBox);
+
+ iosCheckBox = new CheckBox ();
+ iosCheckBox.Label = "iOS";
+ platformsVBox.PackStart (iosCheckBox);
+
+ // Use shared project.
+ var sharedProjectVBox = new VBox ();
+ sharedProjectVBox.Spacing = 0;
+ sharedProjectVBox.MarginTop = 20;
+ mainVBox.PackStart (sharedProjectVBox);
+
+ var useSharedProjectLabel = new Label ();
+ useSharedProjectLabel.Text = GettextCatalog.GetString ("Create a Shared Project from the Portable Class Library:");
+ useSharedProjectLabel.MarginBottom = 6;
+ sharedProjectVBox.PackStart (useSharedProjectLabel);
+
+ useSharedProjectCheckBox = new CheckBox ();
+ useSharedProjectCheckBox.Label = GettextCatalog.GetString ("Create Shared Project");
+ sharedProjectVBox.PackStart (useSharedProjectCheckBox);
+
+ var cancelButton = new DialogButton (Command.Cancel);
+ Buttons.Add (cancelButton);
+
+ okButton = new DialogButton (Command.Ok);
+ Buttons.Add (okButton);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/AddPlatformImplementationDialog.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/AddPlatformImplementationDialog.cs
new file mode 100644
index 0000000000..a1bc09ee42
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/AddPlatformImplementationDialog.cs
@@ -0,0 +1,94 @@
+//
+// AddPlatformImplementationDialog.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.Ide;
+using Xwt;
+
+namespace MonoDevelop.Packaging.Gui
+{
+ partial class AddPlatformImplementationDialog
+ {
+ AddPlatformImplementationViewModel viewModel;
+
+ public AddPlatformImplementationDialog (AddPlatformImplementationViewModel viewModel)
+ {
+ this.viewModel = viewModel;
+
+ Build ();
+
+ androidCheckBox.Active = viewModel.CreateAndroidProject;
+ androidCheckBox.Sensitive = viewModel.IsCreateAndroidProjectEnabled;
+
+ iosCheckBox.Active = viewModel.CreateIOSProject;
+ iosCheckBox.Sensitive = viewModel.IsCreateIOSProjectEnabled;
+
+ useSharedProjectCheckBox.Active = viewModel.CreateSharedProject;
+ useSharedProjectCheckBox.Sensitive = viewModel.IsCreateSharedProjectEnabled;
+
+ UpdateOkButton ();
+
+ androidCheckBox.Clicked += AndroidCheckBoxClicked;
+ iosCheckBox.Clicked += IOSCheckBoxClicked;
+ useSharedProjectCheckBox.Clicked += UseSharedProjectCheckBoxClicked;
+ okButton.Clicked += OkButtonClicked;
+ }
+
+ public Command ShowWithParent ()
+ {
+ WindowFrame parent = Toolkit.CurrentEngine.WrapWindow (IdeApp.Workbench.RootWindow);
+ return Run (parent);
+ }
+
+ void UpdateOkButton ()
+ {
+ okButton.Sensitive = viewModel.AnyItemsToCreate ();
+ }
+
+ void OkButtonClicked (object sender, EventArgs e)
+ {
+ Close ();
+ }
+
+ void AndroidCheckBoxClicked (object sender, EventArgs e)
+ {
+ viewModel.CreateAndroidProject = androidCheckBox.Active;
+ UpdateOkButton ();
+ }
+
+ void IOSCheckBoxClicked (object sender, EventArgs e)
+ {
+ viewModel.CreateIOSProject = iosCheckBox.Active;
+ UpdateOkButton ();
+ }
+
+ void UseSharedProjectCheckBoxClicked (object sender, EventArgs e)
+ {
+ viewModel.CreateSharedProject = useSharedProjectCheckBox.Active;
+ UpdateOkButton ();
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.cs
new file mode 100644
index 0000000000..ac073b22f0
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.cs
@@ -0,0 +1,191 @@
+//
+// GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using Gdk;
+using Gtk;
+using MonoDevelop.Components;
+using MonoDevelop.Ide;
+using MonoDevelop.Ide.Gui;
+using MonoDevelop.Ide.Tasks;
+using MonoDevelop.Packaging.Templating;
+
+namespace MonoDevelop.Packaging.Gui
+{
+ [System.ComponentModel.ToolboxItem (true)]
+ public partial class GtkCrossPlatformLibraryProjectTemplateWizardPageWidget : Gtk.Bin
+ {
+ CrossPlatformLibraryTemplateWizardPage wizardPage;
+ Color backgroundColor;
+ EventBoxTooltip nameTooltip;
+ ImageView backgroundImageView;
+ Xwt.Drawing.Image backgroundImage;
+
+ public GtkCrossPlatformLibraryProjectTemplateWizardPageWidget ()
+ {
+ this.Build ();
+
+ backgroundImage = Xwt.Drawing.Image.FromResource ("preview-multiplatform-library.png");
+ backgroundImageView = new ImageView (backgroundImage);
+ backgroundImageView.Xalign = 1.0f;
+ backgroundImageView.Yalign = 0.5f;
+ backgroundLargeImageVBox.PackStart (backgroundImageView, true, true, 0);
+
+ var separatorColor = Styles.NewProjectDialog.ProjectConfigurationSeparatorColor.ToGdkColor ();
+ targetPlatformsSeparator.ModifyBg (StateType.Normal, separatorColor);
+ sharedCodeSeparator.ModifyBg (StateType.Normal, separatorColor);
+
+ backgroundColor = Styles.NewProjectDialog.ProjectConfigurationLeftHandBackgroundColor.ToGdkColor ();
+ leftBorderEventBox.ModifyBg (StateType.Normal, backgroundColor);
+ configurationTopEventBox.ModifyBg (StateType.Normal, backgroundColor);
+ configurationTableEventBox.ModifyBg (StateType.Normal, backgroundColor);
+ configurationBottomEventBox.ModifyBg (StateType.Normal, backgroundColor);
+ backgroundLargeImageEventBox.ModifyBg (StateType.Normal, backgroundColor);
+ }
+
+ internal GtkCrossPlatformLibraryProjectTemplateWizardPageWidget (CrossPlatformLibraryTemplateWizardPage wizardPage)
+ : this ()
+ {
+ this.wizardPage = wizardPage;
+
+ nameTextBox.TextInserted += NameTextInserted;
+ nameTextBox.Changed += NameTextChanged;
+
+ descriptionTextBox.Text = wizardPage.Description;
+ descriptionTextBox.Changed += DescriptionTextChanged;
+
+ nameTextBox.ActivatesDefault = true;
+ descriptionTextBox.ActivatesDefault = true;
+
+ nameTextBox.TruncateMultiline = true;
+ descriptionTextBox.TruncateMultiline = true;
+
+ androidCheckButton.Active = wizardPage.IsAndroidChecked;
+ androidCheckButton.Sensitive = wizardPage.IsAndroidEnabled;
+ androidCheckButton.Toggled += AndroidCheckButtonToggled;
+
+ iOSCheckButton.Active = wizardPage.IsIOSChecked;
+ iOSCheckButton.Sensitive = wizardPage.IsIOSEnabled;
+ iOSCheckButton.Toggled += IOSCheckButtonToggled;
+
+ portableClassLibraryRadioButton.Active = wizardPage.IsPortableClassLibrarySelected;
+ portableClassLibraryRadioButton.Toggled += PortableClassLibraryRadioButtonToggled;
+
+ targetPlatformsVBox.Sensitive = !wizardPage.IsPortableClassLibrarySelected;
+
+ sharedProjectRadioButton.Active = wizardPage.IsSharedProjectSelected;
+ sharedProjectRadioButton.Toggled += SharedProjectRadioButtonToggled;
+ }
+
+ protected override void OnFocusGrabbed ()
+ {
+ nameTextBox.GrabFocus ();
+ }
+
+ void NameTextInserted (object o, TextInsertedArgs args)
+ {
+ if (args.Text.IndexOf ('\r') >= 0) {
+ var textBox = (Entry)o;
+ textBox.Text = textBox.Text.Replace ("\r", string.Empty);
+ }
+ }
+
+ void NameTextChanged (object sender, EventArgs e)
+ {
+ wizardPage.LibraryName = nameTextBox.Text;
+
+ if (wizardPage.HasLibraryNameError ()) {
+ if (nameTooltip == null) {
+ nameTooltip = ShowErrorTooltip (nameEventBox, wizardPage.LibraryNameError);
+ }
+ } else {
+ if (nameTooltip != null) {
+ HideTooltip (nameEventBox, nameTooltip);
+ nameTooltip = null;
+ }
+ }
+ }
+
+ void DescriptionTextChanged (object sender, EventArgs e)
+ {
+ wizardPage.Description = descriptionTextBox.Text;
+ }
+
+ void AndroidCheckButtonToggled (object sender, EventArgs e)
+ {
+ wizardPage.IsAndroidChecked = androidCheckButton.Active;
+ }
+
+ void IOSCheckButtonToggled (object sender, EventArgs e)
+ {
+ wizardPage.IsIOSChecked = iOSCheckButton.Active;
+ }
+
+ void PortableClassLibraryRadioButtonToggled (object sender, EventArgs e)
+ {
+ wizardPage.IsPortableClassLibrarySelected = portableClassLibraryRadioButton.Active;
+ targetPlatformsVBox.Sensitive = !wizardPage.IsPortableClassLibrarySelected;
+ }
+
+ void SharedProjectRadioButtonToggled (object sender, EventArgs e)
+ {
+ wizardPage.IsSharedProjectSelected = sharedProjectRadioButton.Active;
+ }
+
+ public override void Dispose ()
+ {
+ Dispose (nameTooltip);
+ Dispose (backgroundImage);
+ }
+
+ void Dispose (IDisposable disposable)
+ {
+ if (disposable != null) {
+ disposable.Dispose ();
+ }
+ }
+
+ EventBoxTooltip ShowErrorTooltip (EventBox eventBox, string tooltipText)
+ {
+ eventBox.ModifyBg (StateType.Normal, backgroundColor);
+ Xwt.Drawing.Image image = ImageService.GetIcon ("md-error", IconSize.Menu);
+
+ eventBox.Add (new ImageView (image));
+ eventBox.ShowAll ();
+
+ return new EventBoxTooltip (eventBox) {
+ ToolTip = tooltipText,
+ Severity = TaskSeverity.Error
+ };
+ }
+
+ void HideTooltip (EventBox eventBox, EventBoxTooltip tooltip)
+ {
+ Dispose (tooltip);
+ eventBox.Foreach (eventBox.Remove);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs
new file mode 100644
index 0000000000..6ade8ad23e
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkNuGetPackageMetadataOptionsPanelWidget.cs
@@ -0,0 +1,175 @@
+
+//
+// GtkNuGetPackageMetadataOptionsPanelWidget.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using Gtk;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging.Gui
+{
+ [System.ComponentModel.ToolboxItem (true)]
+ public partial class GtkNuGetPackageMetadataOptionsPanelWidget : Gtk.Bin
+ {
+ NuGetPackageMetadata metadata;
+ bool projectOriginallyHadMetadata;
+ bool hasPackageId;
+
+ public GtkNuGetPackageMetadataOptionsPanelWidget ()
+ {
+ this.Build ();
+
+ PopulateLanguages ();
+ }
+
+ internal static System.Action<bool> OnProjectHasMetadataChanged;
+
+ internal void Load (PackagingProject project)
+ {
+ metadata = project.GetPackageMetadata ();
+ LoadMetadata ();
+ }
+
+ internal void Load (DotNetProject project)
+ {
+ metadata = new NuGetPackageMetadata ();
+ metadata.Load (project);
+ LoadMetadata ();
+
+ projectOriginallyHadMetadata = ProjectHasMetadata ();
+ hasPackageId = projectOriginallyHadMetadata;
+ packageIdTextBox.Changed += PackageIdTextBoxChanged;
+ }
+
+ void LoadMetadata ()
+ {
+ packageIdTextBox.Text = GetTextBoxText (metadata.Id);
+ packageVersionTextBox.Text = GetTextBoxText (metadata.Version);
+ packageAuthorsTextBox.Text = GetTextBoxText (metadata.Authors);
+ packageDescriptionTextView.Buffer.Text = GetTextBoxText (metadata.Description);
+
+ packageCopyrightTextBox.Text = GetTextBoxText (metadata.Copyright);
+ packageDevelopmentDependencyCheckBox.Active = metadata.DevelopmentDependency;
+ packageIconUrlTextBox.Text = GetTextBoxText (metadata.IconUrl);
+ packageLanguageComboBox.Entry.Text = GetTextBoxText (metadata.Language);
+ packageLicenseUrlTextBox.Text = GetTextBoxText (metadata.LicenseUrl);
+ packageOwnersTextBox.Text = GetTextBoxText (metadata.Owners);
+ packageProjectUrlTextBox.Text = GetTextBoxText (metadata.ProjectUrl);
+ packageReleaseNotesTextView.Buffer.Text = GetTextBoxText (metadata.ReleaseNotes);
+ packageRequireLicenseAcceptanceCheckBox.Active = metadata.RequireLicenseAcceptance;
+ packageSummaryTextBox.Text = GetTextBoxText (metadata.Summary);
+ packageTagsTextBox.Text = GetTextBoxText (metadata.Tags);
+ packageTitleTextBox.Text = GetTextBoxText (metadata.Title);
+ }
+
+ static string GetTextBoxText (string text)
+ {
+ return text ?? string.Empty;
+ }
+
+ internal void Save (PackagingProject project)
+ {
+ UpdateMetadata ();
+ project.UpdatePackageMetadata (metadata);
+ }
+
+ internal void Save (DotNetProject project)
+ {
+ UpdateMetadata ();
+ metadata.UpdateProject (project);
+
+ if (!projectOriginallyHadMetadata && ProjectHasMetadata ()) {
+ project.ReloadProjectBuilder ();
+
+ EnsureBuildPackagingNuGetPackageIsInstalled (project);
+ }
+ }
+
+ void EnsureBuildPackagingNuGetPackageIsInstalled (DotNetProject project)
+ {
+ if (!project.IsBuildPackagingNuGetPackageInstalled ()) {
+ var extension = project.GetFlavor<DotNetProjectPackagingExtension> ();
+ extension.InstallBuildPackagingNuGetAfterWrite = true;
+ }
+ }
+
+ void UpdateMetadata ()
+ {
+ metadata.Id = packageIdTextBox.Text;
+ metadata.Version = packageVersionTextBox.Text;
+ metadata.Authors = packageAuthorsTextBox.Text;
+ metadata.Description = packageDescriptionTextView.Buffer.Text;
+
+ metadata.Copyright = packageCopyrightTextBox.Text;
+ metadata.DevelopmentDependency = packageDevelopmentDependencyCheckBox.Active;
+ metadata.IconUrl = packageIconUrlTextBox.Text;
+ metadata.Language = packageLanguageComboBox.Entry.Text;
+ metadata.LicenseUrl = packageLicenseUrlTextBox.Text;
+ metadata.Owners = packageOwnersTextBox.Text;
+ metadata.ProjectUrl = packageProjectUrlTextBox.Text;
+ metadata.ReleaseNotes = packageReleaseNotesTextView.Buffer.Text;
+ metadata.RequireLicenseAcceptance = packageRequireLicenseAcceptanceCheckBox.Active;
+ metadata.Summary = packageSummaryTextBox.Text;
+ metadata.Tags = packageTagsTextBox.Text;
+ metadata.Title = packageTitleTextBox.Text;
+ }
+
+ void PopulateLanguages ()
+ {
+ var languagesListStore = new ListStore (typeof (string));
+ packageLanguageComboBox.Model = languagesListStore;
+
+ List<string> languages = CultureInfo.GetCultures(CultureTypes.AllCultures)
+ .Select (c => c.Name)
+ .ToList ();
+
+ languages.Sort ();
+
+ foreach (string language in languages) {
+ languagesListStore.AppendValues (language);
+ }
+ }
+
+ bool ProjectHasMetadata ()
+ {
+ return !string.IsNullOrEmpty (metadata.Id);
+ }
+
+ void PackageIdTextBoxChanged (object sender, EventArgs e)
+ {
+ bool anyPackageIdText = !string.IsNullOrEmpty (packageIdTextBox.Text);
+
+ if (anyPackageIdText != hasPackageId) {
+ hasPackageId = anyPackageIdText;
+ OnProjectHasMetadataChanged?.Invoke (hasPackageId);
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkPackagingProjectTemplateWizardPageWidget.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkPackagingProjectTemplateWizardPageWidget.cs
new file mode 100644
index 0000000000..926f71d3db
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkPackagingProjectTemplateWizardPageWidget.cs
@@ -0,0 +1,161 @@
+//
+// GtkPackagingProjectTemplateWizardPageWidget.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using Gdk;
+using Gtk;
+using MonoDevelop.Components;
+using MonoDevelop.Ide;
+using MonoDevelop.Ide.Gui;
+using MonoDevelop.Ide.Tasks;
+using MonoDevelop.Packaging.Templating;
+
+namespace MonoDevelop.Packaging.Gui
+{
+ [System.ComponentModel.ToolboxItem (true)]
+ public partial class GtkPackagingProjectTemplateWizardPageWidget : Gtk.Bin
+ {
+ PackagingProjectTemplateWizardPage wizardPage;
+ Color backgroundColor;
+ EventBoxTooltip idTooltip;
+ ImageView backgroundImageView;
+ Xwt.Drawing.Image backgroundImage;
+
+ public GtkPackagingProjectTemplateWizardPageWidget ()
+ {
+ this.Build ();
+
+ backgroundImage = Xwt.Drawing.Image.FromResource ("preview-nuget.png");
+ backgroundImageView = new ImageView (backgroundImage);
+ backgroundImageView.Xalign = 1.0f;
+ backgroundImageView.Yalign = 0.5f;
+ backgroundLargeImageVBox.PackStart (backgroundImageView, true, true, 0);
+
+ var separatorColor = Styles.NewProjectDialog.ProjectConfigurationSeparatorColor.ToGdkColor ();
+ separator.ModifyBg (StateType.Normal, separatorColor);
+
+ backgroundColor = Styles.NewProjectDialog.ProjectConfigurationLeftHandBackgroundColor.ToGdkColor ();
+ leftBorderEventBox.ModifyBg (StateType.Normal, backgroundColor);
+ configurationTopEventBox.ModifyBg (StateType.Normal, backgroundColor);
+ configurationTableEventBox.ModifyBg (StateType.Normal, backgroundColor);
+ configurationBottomEventBox.ModifyBg (StateType.Normal, backgroundColor);
+ backgroundLargeImageEventBox.ModifyBg (StateType.Normal, backgroundColor);
+ }
+
+ internal GtkPackagingProjectTemplateWizardPageWidget (PackagingProjectTemplateWizardPage wizardPage)
+ : this ()
+ {
+ this.wizardPage = wizardPage;
+
+ packageAuthorsTextBox.Text = wizardPage.Authors;
+
+ packageIdTextBox.TextInserted += PackageIdTextInserted;
+ packageIdTextBox.Changed += PackageIdTextBoxChanged;
+ packageAuthorsTextBox.Changed += PackageAuthorsTextBoxChanged;
+ packageDescriptionTextBox.Changed += PackageDescriptionTextChanged;
+
+ packageIdTextBox.ActivatesDefault = true;
+ packageAuthorsTextBox.ActivatesDefault = true;
+ packageDescriptionTextBox.ActivatesDefault = true;
+
+ packageIdTextBox.TruncateMultiline = true;
+ packageAuthorsTextBox.TruncateMultiline = true;
+ packageDescriptionTextBox.TruncateMultiline = true;
+ }
+
+ protected override void OnFocusGrabbed ()
+ {
+ packageIdTextBox.GrabFocus ();
+ }
+
+ void PackageIdTextInserted (object o, TextInsertedArgs args)
+ {
+ if (args.Text.IndexOf ('\r') >= 0) {
+ var textBox = (Entry)o;
+ textBox.Text = textBox.Text.Replace ("\r", string.Empty);
+ }
+ }
+
+ void PackageIdTextBoxChanged (object sender, EventArgs e)
+ {
+ wizardPage.Id = packageIdTextBox.Text;
+
+ if (wizardPage.HasIdError ()) {
+ if (idTooltip == null) {
+ idTooltip = ShowErrorTooltip (idEventBox, wizardPage.IdError);
+ }
+ } else {
+ if (idTooltip != null) {
+ HideTooltip (idEventBox, idTooltip);
+ idTooltip = null;
+ }
+ }
+ }
+
+ void PackageAuthorsTextBoxChanged (object sender, EventArgs e)
+ {
+ wizardPage.Authors = packageAuthorsTextBox.Text;
+ }
+
+ void PackageDescriptionTextChanged (object sender, EventArgs e)
+ {
+ wizardPage.Description = packageDescriptionTextBox.Text;
+ }
+
+ public override void Dispose ()
+ {
+ Dispose (idTooltip);
+ Dispose (backgroundImage);
+ }
+
+ void Dispose (IDisposable disposable)
+ {
+ if (disposable != null) {
+ disposable.Dispose ();
+ }
+ }
+
+ EventBoxTooltip ShowErrorTooltip (EventBox eventBox, string tooltipText)
+ {
+ eventBox.ModifyBg (StateType.Normal, backgroundColor);
+ Xwt.Drawing.Image image = ImageService.GetIcon ("md-error", IconSize.Menu);
+
+ eventBox.Add (new ImageView (image));
+ eventBox.ShowAll ();
+
+ return new EventBoxTooltip (eventBox) {
+ ToolTip = tooltipText,
+ Severity = TaskSeverity.Error
+ };
+ }
+
+ void HideTooltip (EventBox eventBox, EventBoxTooltip tooltip)
+ {
+ Dispose (tooltip);
+ eventBox.Foreach (eventBox.Remove);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.UI.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.UI.cs
new file mode 100644
index 0000000000..c44baf570e
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.UI.cs
@@ -0,0 +1,66 @@
+//
+// GtkProjectNuGetBuildOptions.UI.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using Gtk;
+using MonoDevelop.Core;
+
+namespace MonoDevelop.Packaging.Gui
+{
+ partial class GtkProjectNuGetBuildOptionsPanelWidget : Gtk.Bin
+ {
+ CheckButton packOnBuildButton;
+ Label missingMetadataLabel;
+
+ void Build ()
+ {
+ Stetic.Gui.Initialize (this);
+ Stetic.BinContainer.Attach (this);
+
+ var vbox = new VBox ();
+ vbox.Spacing = 6;
+
+ packOnBuildButton = new CheckButton ();
+ packOnBuildButton.Label = GettextCatalog.GetString ("Create a NuGet Package when building the project.");
+
+ vbox.PackStart (packOnBuildButton, false, false, 10);
+
+ missingMetadataLabel = new Label ();
+ missingMetadataLabel.LineWrapMode = Pango.WrapMode.Word;
+ missingMetadataLabel.Wrap = true;
+ missingMetadataLabel.Xalign = 0;
+ missingMetadataLabel.Yalign = 0;
+ missingMetadataLabel.Xpad = 20;
+ missingMetadataLabel.WidthRequest = 600;
+ missingMetadataLabel.Text = GettextCatalog.GetString ("The project does not have NuGet package metadata so a NuGet package will not be created. NuGet package metadata can be specified in the Metadata section in Project Options");
+
+ vbox.PackStart (missingMetadataLabel);
+
+ Add (vbox);
+
+ ShowAll ();
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.cs
new file mode 100644
index 0000000000..6e41b7485c
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkProjectNuGetBuildOptionsPanelWidget.cs
@@ -0,0 +1,84 @@
+//
+// GtkProjectNuGetBuildOptionsPanelWidget.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace MonoDevelop.Packaging.Gui
+{
+ partial class GtkProjectNuGetBuildOptionsPanelWidget
+ {
+ bool projectHasMetadata;
+
+ public GtkProjectNuGetBuildOptionsPanelWidget ()
+ {
+ Build ();
+ UpdateMissingMetadataLabelVisibility ();
+ packOnBuildButton.Toggled += PackOnBuildButtonToggled;
+ GtkNuGetPackageMetadataOptionsPanelWidget.OnProjectHasMetadataChanged = OnProjectHasMetadataChanged;
+ }
+
+ public bool PackOnBuild {
+ get { return packOnBuildButton.Active; }
+ set {
+ packOnBuildButton.Active = value;
+ UpdateMissingMetadataLabelVisibility ();
+ }
+ }
+
+ public bool ProjectHasMetadata {
+ get { return projectHasMetadata; }
+ set {
+ projectHasMetadata = value;
+ UpdateMissingMetadataLabelVisibility ();
+ }
+ }
+
+ void PackOnBuildButtonToggled (object sender, EventArgs e)
+ {
+ UpdateMissingMetadataLabelVisibility ();
+ }
+
+ void UpdateMissingMetadataLabelVisibility ()
+ {
+ if (packOnBuildButton.Active) {
+ missingMetadataLabel.Visible = !ProjectHasMetadata;
+ } else {
+ missingMetadataLabel.Visible = false;
+ }
+ }
+
+ void OnProjectHasMetadataChanged (bool hasMetadata)
+ {
+ ProjectHasMetadata = hasMetadata;
+ }
+
+ public override void Destroy ()
+ {
+ GtkNuGetPackageMetadataOptionsPanelWidget.OnProjectHasMetadataChanged = null;
+ base.Destroy ();
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkReferenceAssembliesOptionsPanelWidget.UI.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkReferenceAssembliesOptionsPanelWidget.UI.cs
new file mode 100644
index 0000000000..3112f84274
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkReferenceAssembliesOptionsPanelWidget.UI.cs
@@ -0,0 +1,131 @@
+//
+// GtkReferenceAssembliesOptionsPanelWidget.UI.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using Gtk;
+using MonoDevelop.Components;
+using MonoDevelop.Core;
+using MonoDevelop.Ide;
+
+namespace MonoDevelop.Packaging.Gui
+{
+ partial class GtkReferenceAssembliesOptionsPanelWidget : Gtk.Bin
+ {
+ const int IsEnabledCheckBoxColumn = 0;
+
+ ListStore pclProfilesStore;
+ TreeView pclProfilesTreeView;
+
+ void Build ()
+ {
+ Stetic.Gui.Initialize (this);
+ Stetic.BinContainer.Attach (this);
+
+ var vbox = new VBox ();
+ vbox.Spacing = 6;
+
+ var referenceAssembliesLabelHBox = new HBox ();
+ referenceAssembliesLabelHBox.Spacing = 6;
+
+ var referenceAssembliesLabel = new Label ();
+ referenceAssembliesLabel.Markup = GetBoldMarkup (GettextCatalog.GetString ("Choose the reference assemblies for your NuGet package."));
+ referenceAssembliesLabel.UseMarkup = true;
+ referenceAssembliesLabel.Xalign = 0;
+ referenceAssembliesLabelHBox.PackStart (referenceAssembliesLabel, false, false, 0);
+
+ var learnMoreLabel = new Label ();
+ learnMoreLabel.Xalign = 0F;
+ learnMoreLabel.LabelProp = GettextCatalog.GetString ("<a href=\"https://docs.nuget.org\">Learn more</a>");
+ learnMoreLabel.UseMarkup = true;
+ learnMoreLabel.SetLinkHandler (DesktopService.ShowUrl);
+ referenceAssembliesLabelHBox.PackStart (learnMoreLabel, false, false, 0);
+
+ vbox.PackStart (referenceAssembliesLabelHBox, false, false, 5);
+
+
+ var scrolledWindow = new ScrolledWindow ();
+ scrolledWindow.ShadowType = ShadowType.In;
+ pclProfilesTreeView = new TreeView ();
+ pclProfilesTreeView.CanFocus = true;
+ pclProfilesTreeView.Name = "pclProfilesTreeView";
+ pclProfilesTreeView.HeadersVisible = true;
+ scrolledWindow.Add (pclProfilesTreeView);
+ pclProfilesTreeView.SearchColumn = -1; // disable the interactive search
+ pclProfilesTreeView.AppendColumn (CreateCheckBoxTreeViewColumn ());
+ pclProfilesTreeView.AppendColumn (CreateProfileTreeViewColumn ());
+ pclProfilesTreeView.AppendColumn (CreateProfileDescriptionTreeViewColumn ());
+
+ pclProfilesStore = new ListStore (typeof (bool), typeof (string), typeof (string), typeof (object));
+ pclProfilesTreeView.Model = pclProfilesStore;
+
+ vbox.PackStart (scrolledWindow);
+
+ Add (vbox);
+
+ ShowAll ();
+ }
+
+ static string GetBoldMarkup (string text)
+ {
+ return "<b>" + text + "</b>";
+ }
+
+ TreeViewColumn CreateCheckBoxTreeViewColumn ()
+ {
+ var column = new TreeViewColumn ();
+
+ var checkBoxRenderer = new CellRendererToggle ();
+ checkBoxRenderer.Toggled += PortableProfileCheckBoxToggled;
+ column.PackStart (checkBoxRenderer, false);
+ column.AddAttribute (checkBoxRenderer, "active", IsEnabledCheckBoxColumn);
+
+ return column;
+ }
+
+ TreeViewColumn CreateProfileTreeViewColumn ()
+ {
+ var column = new TreeViewColumn ();
+ column.Title = GettextCatalog.GetString ("Profile");
+
+ var textRenderer = new CellRendererText ();
+ column.PackStart (textRenderer, true);
+ column.AddAttribute (textRenderer, "text", column: 1);
+
+ return column;
+ }
+
+ TreeViewColumn CreateProfileDescriptionTreeViewColumn ()
+ {
+ var column = new TreeViewColumn ();
+ column.Title = GettextCatalog.GetString ("Description");
+
+ var textRenderer = new CellRendererText ();
+ column.PackStart (textRenderer, true);
+ column.AddAttribute (textRenderer, "text", column: 2);
+
+ return column;
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkReferenceAssembliesOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkReferenceAssembliesOptionsPanelWidget.cs
new file mode 100644
index 0000000000..707e391f5e
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Gui/GtkReferenceAssembliesOptionsPanelWidget.cs
@@ -0,0 +1,160 @@
+//
+// GtkReferenceAssembliesOptionsPanelWidget.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Gtk;
+using MonoDevelop.Components;
+using MonoDevelop.Core;
+using MonoDevelop.Core.Assemblies;
+
+namespace MonoDevelop.Packaging.Gui
+{
+ partial class GtkReferenceAssembliesOptionsPanelWidget
+ {
+ List<PortableProfileViewModel> pclProfiles;
+
+ public GtkReferenceAssembliesOptionsPanelWidget ()
+ {
+ Build ();
+ }
+
+ internal void Load (PackagingProject project)
+ {
+ AddPortableClassLibraryProfiles (project);
+ }
+
+ internal void Save (PackagingProject project)
+ {
+ var selectedProfiles = pclProfiles
+ .Where (profile => profile.IsEnabled)
+ .Select (profile => profile.Framework.Id);
+
+ project.UpdateReferenceAssemblyFrameworks (selectedProfiles);
+ }
+
+ void AddPortableClassLibraryProfiles (PackagingProject project)
+ {
+ var targetFrameworks = GetPortableTargetFrameworks (project).ToList ();
+ targetFrameworks.Sort (CompareFrameworks);
+
+ var selectedTargetFrameworks = project.GetReferenceAssemblyFrameworks ().ToList ();
+ pclProfiles = targetFrameworks.Select (fx => CreatePortableProfileViewModel (fx, selectedTargetFrameworks)).ToList ();
+
+ foreach (PortableProfileViewModel profile in pclProfiles) {
+ pclProfilesStore.AppendValues (profile.IsEnabled, profile.ProfileName, profile.GetProfileDescription (), profile);
+ }
+ }
+
+ static IEnumerable<TargetFramework> GetPortableTargetFrameworks (PackagingProject project)
+ {
+ return Runtime.SystemAssemblyService.GetTargetFrameworks ().Where (fx =>
+ !fx.Hidden &&
+ fx.Id.Identifier == ".NETPortable" &&
+ !string.IsNullOrEmpty (fx.Id.Profile) &&
+ project.TargetRuntime.IsInstalled (fx));
+ }
+
+ PortableProfileViewModel CreatePortableProfileViewModel (
+ TargetFramework fx,
+ IEnumerable<TargetFrameworkMoniker> selectedTargetFrameworks)
+ {
+ bool enabled = selectedTargetFrameworks.Contains (fx.Id);
+ return new PortableProfileViewModel (fx, enabled);
+ }
+
+ static int CompareFrameworks (TargetFramework x, TargetFramework y)
+ {
+ var p = CompareProfiles (x.Id.Profile, y.Id.Profile);
+ if (p != 0)
+ return p;
+ return string.Compare (x.Id.Version, y.Id.Version, StringComparison.Ordinal);
+ }
+
+ static int CompareProfiles (string x, string y)
+ {
+ int xn, yn;
+ if (TryParseProfileID (x, out xn)) {
+ if (TryParseProfileID (y, out yn))
+ return xn.CompareTo (yn);
+ return 1;
+ }
+ if (TryParseProfileID (y, out yn))
+ return -1;
+ return string.Compare (x, y, StringComparison.Ordinal);
+ }
+
+ static bool TryParseProfileID (string profile, out int id)
+ {
+ if (profile.StartsWith ("Profile", StringComparison.Ordinal))
+ return int.TryParse (profile.Substring ("Profile".Length), out id);
+ id = -1;
+ return false;
+ }
+
+ void PortableProfileCheckBoxToggled (object o, ToggledArgs args)
+ {
+ TreeIter iter;
+ pclProfilesStore.GetIterFromString (out iter, args.Path);
+ var viewModel = pclProfilesStore.GetValue (iter, 3) as PortableProfileViewModel;
+ viewModel.IsEnabled = !viewModel.IsEnabled;
+ pclProfilesStore.SetValue (iter, IsEnabledCheckBoxColumn, viewModel.IsEnabled);
+ }
+
+ class PortableProfileViewModel
+ {
+ public PortableProfileViewModel (TargetFramework framework, bool enabled)
+ {
+ Framework = framework;
+ IsEnabled = enabled;
+ }
+
+ public bool IsEnabled { get; set; }
+ public TargetFramework Framework { get; set; }
+
+ public string ProfileName {
+ get { return Framework.Id.Profile; }
+ }
+
+ public string GetProfileDescription ()
+ {
+ return GetSupportedFrameworksDisplayName ();
+ }
+
+ string GetSupportedFrameworksDisplayName ()
+ {
+ int openingBracket = Framework.Name.IndexOf ('(');
+ int closingBracket = Framework.Name.LastIndexOf (')');
+ if (openingBracket != -1 && closingBracket != -1 && openingBracket < closingBracket) {
+ return Framework.Name.Substring (openingBracket + 1, closingBracket - openingBracket - 1);
+ }
+
+ return Framework.Name;
+ }
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/NuGetPackageMetadataOptionsPanel.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/NuGetPackageMetadataOptionsPanel.cs
new file mode 100644
index 0000000000..b4f3e2c881
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/NuGetPackageMetadataOptionsPanel.cs
@@ -0,0 +1,67 @@
+//
+// NuGetPackageMetadataOptionsPanel.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Components;
+using MonoDevelop.Ide.Gui.Dialogs;
+using MonoDevelop.Packaging.Gui;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging.OptionPanels
+{
+ class NuGetPackageMetadataOptionsPanel : OptionsPanel
+ {
+ GtkNuGetPackageMetadataOptionsPanelWidget widget;
+ PackagingProject packagingProject;
+ DotNetProject project;
+
+ public override Control CreatePanelWidget ()
+ {
+ widget = new GtkNuGetPackageMetadataOptionsPanelWidget ();
+ if (packagingProject != null)
+ widget.Load (packagingProject);
+ else
+ widget.Load (project);
+
+ return widget;
+ }
+
+ public override void Initialize (OptionsDialog dialog, object dataObject)
+ {
+ packagingProject = dataObject as PackagingProject;
+ project = dataObject as DotNetProject;
+ base.Initialize (dialog, dataObject);
+ }
+
+ public override void ApplyChanges ()
+ {
+ if (packagingProject != null)
+ widget.Save (packagingProject);
+ else
+ widget.Save (project);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/ProjectNuGetBuildOptionsPanel.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/ProjectNuGetBuildOptionsPanel.cs
new file mode 100644
index 0000000000..e91ed1a017
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/ProjectNuGetBuildOptionsPanel.cs
@@ -0,0 +1,67 @@
+//
+// ProjectNuGetBuildOptionsPanel.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Components;
+using MonoDevelop.Ide.Gui.Dialogs;
+using MonoDevelop.Packaging.Gui;
+using MonoDevelop.Projects;
+using MonoDevelop.Projects.MSBuild;
+
+namespace MonoDevelop.Packaging.OptionPanels
+{
+ public class ProjectNuGetBuildOptionsPanel : OptionsPanel
+ {
+ GtkProjectNuGetBuildOptionsPanelWidget widget;
+ DotNetProject project;
+ MSBuildPropertyGroup propertyGroup;
+ bool packOnBuild;
+
+ public override Control CreatePanelWidget ()
+ {
+ widget = new GtkProjectNuGetBuildOptionsPanelWidget ();
+ widget.PackOnBuild = packOnBuild;
+ widget.ProjectHasMetadata = project.HasNuGetMetadata ();
+
+ return widget;
+ }
+
+ public override void Initialize (OptionsDialog dialog, object dataObject)
+ {
+ project = dataObject as DotNetProject;
+ propertyGroup = project.MSBuildProject.GetNuGetMetadataPropertyGroup ();
+ packOnBuild = propertyGroup.GetValue ("PackOnBuild", false);
+
+ base.Initialize (dialog, dataObject);
+ }
+
+ public override void ApplyChanges ()
+ {
+ if (widget.PackOnBuild != packOnBuild) {
+ propertyGroup.SetValue ("PackOnBuild", widget.PackOnBuild, false);
+ }
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/ReferenceAssembliesOptionsPanel.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/ReferenceAssembliesOptionsPanel.cs
new file mode 100644
index 0000000000..ca8d96ff36
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.OptionPanels/ReferenceAssembliesOptionsPanel.cs
@@ -0,0 +1,57 @@
+//
+// ReferenceAssembliesOptionsPanel.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Components;
+using MonoDevelop.Ide.Gui.Dialogs;
+using MonoDevelop.Packaging.Gui;
+
+namespace MonoDevelop.Packaging.OptionPanels
+{
+ class ReferenceAssembliesOptionsPanel : OptionsPanel
+ {
+ GtkReferenceAssembliesOptionsPanelWidget widget;
+ PackagingProject project;
+
+ public override Control CreatePanelWidget ()
+ {
+ widget = new GtkReferenceAssembliesOptionsPanelWidget ();
+ widget.Load (project);
+
+ return widget;
+ }
+
+ public override void Initialize (OptionsDialog dialog, object dataObject)
+ {
+ project = dataObject as PackagingProject;
+ base.Initialize (dialog, dataObject);
+ }
+
+ public override void ApplyChanges ()
+ {
+ widget.Save (project);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/CrossPlatformLibraryTemplateWizard.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/CrossPlatformLibraryTemplateWizard.cs
new file mode 100644
index 0000000000..23bb88fcd6
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/CrossPlatformLibraryTemplateWizard.cs
@@ -0,0 +1,92 @@
+//
+// CrossPlatformLibraryTemplateWizard.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.Collections.Generic;
+using System.Linq;
+using MonoDevelop.Core.StringParsing;
+using MonoDevelop.Ide;
+using MonoDevelop.Ide.Templates;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging.Templating
+{
+ class CrossPlatformLibraryTemplateWizard : TemplateWizard
+ {
+ public override string Id {
+ get { return "MonoDevelop.Packaging.CrossPlatformLibraryTemplateWizard"; }
+ }
+
+ public override WizardPage GetPage (int pageNumber)
+ {
+ return new CrossPlatformLibraryTemplateWizardPage (this);
+ }
+
+ public override void ItemsCreated (IEnumerable<IWorkspaceFileObject> items)
+ {
+ string projectName = Parameters["ProjectName"];
+ var libraryProjects = GetLibraryProjects (items).ToList ();
+
+ foreach (DotNetProject project in libraryProjects) {
+ project.SetOutputAssemblyName (projectName);
+ }
+
+ if (Parameters.GetBoolValue ("CreatePortableProject")) {
+ AddNuGetPackageMetadataToPclProject (libraryProjects);
+ }
+
+ SaveAsync (libraryProjects);
+ }
+
+ IEnumerable<DotNetProject> GetLibraryProjects (IEnumerable<IWorkspaceFileObject> items)
+ {
+ Solution solution = items.OfType<Solution> ().FirstOrDefault ();
+ if (solution != null) {
+ return GetLibraryProjects (solution.GetAllProjects ());
+ }
+
+ return items.OfType<DotNetProject> ().Where (p => !(p is PackagingProject));
+ }
+
+ void AddNuGetPackageMetadataToPclProject (IEnumerable<DotNetProject> projects)
+ {
+ var pclProject = projects.FirstOrDefault (p => p.IsPortableLibrary);
+ if (pclProject != null) {
+ var metadata = new NuGetPackageMetadata ();
+ metadata.Id = Parameters["PackageId"];
+ metadata.Description = Parameters["PackageDescription"];
+ metadata.Version = Parameters["PackageVersion"];
+ metadata.Authors = Parameters["PackageAuthors"];
+
+ metadata.UpdateProject (pclProject);
+ }
+ }
+
+ protected virtual void SaveAsync (IEnumerable<SolutionItem> projects)
+ {
+ IdeApp.ProjectOperations.SaveAsync (projects);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/CrossPlatformLibraryTemplateWizardPage.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/CrossPlatformLibraryTemplateWizardPage.cs
new file mode 100644
index 0000000000..ed4b6aef22
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/CrossPlatformLibraryTemplateWizardPage.cs
@@ -0,0 +1,215 @@
+//
+// CrossPlatformLibraryTemplateWizardPage.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Core;
+using MonoDevelop.Ide.Projects;
+using MonoDevelop.Ide.Templates;
+using MonoDevelop.Packaging.Gui;
+using MonoDevelop.Projects;
+using NuGet.Packaging;
+
+namespace MonoDevelop.Packaging.Templating
+{
+ class CrossPlatformLibraryTemplateWizardPage : WizardPage
+ {
+ readonly string title = GettextCatalog.GetString ("Configure your Multiplatform Library");
+ readonly CrossPlatformLibraryTemplateWizard wizard;
+ GtkCrossPlatformLibraryProjectTemplateWizardPageWidget view;
+ string libraryName = string.Empty;
+ string description = string.Empty;
+ bool isAndroidChecked;
+ bool isIOSChecked;
+ bool isSharedProjectSelected;
+ bool isPortableClassLibrarySelected;
+ bool createNuGetProject;
+
+ public CrossPlatformLibraryTemplateWizardPage (CrossPlatformLibraryTemplateWizard wizard)
+ {
+ this.wizard = wizard;
+
+ wizard.Parameters["PackageAuthors"] = AuthorInformation.Default.Name;
+ wizard.Parameters["PackageVersion"] = "1.0.0";
+
+ IsAndroidEnabled = Services.ProjectService.CanCreateProject ("C#", "MonoDroid");
+ IsIOSEnabled = Services.ProjectService.CanCreateProject ("C#", "XamarinIOS");
+
+ IsAndroidChecked = true;
+ IsIOSChecked = true;
+ IsSharedProjectSelected = true;
+ IsPortableClassLibrarySelected = false;
+ CreateNuGetProject = true;
+ }
+
+ public override string Title {
+ get { return title; }
+ }
+
+ protected override object CreateNativeWidget<T> ()
+ {
+ if (view == null)
+ view = new GtkCrossPlatformLibraryProjectTemplateWizardPageWidget (this);
+
+ return view;
+ }
+
+ protected override void Dispose (bool disposing)
+ {
+ if (view != null) {
+ view.Dispose ();
+ view = null;
+ }
+ }
+
+ void UpdateCanMoveNext ()
+ {
+ CanMoveToNextPage = IsValidLibraryName () &&
+ !string.IsNullOrEmpty (description) &&
+ ValidPlatformsSelected ();
+ }
+
+ bool IsValidLibraryName ()
+ {
+ LibraryNameError = null;
+
+ if (string.IsNullOrEmpty (libraryName)) {
+ return false;
+ } else if (libraryName.Length > NuGetPackageMetadata.MaxPackageIdLength) {
+ LibraryNameError = GettextCatalog.GetString ("Library name must not exceed 100 characters.");
+ return false;
+ } else if (!PackageIdValidator.IsValidPackageId (libraryName)) {
+ LibraryNameError = GettextCatalog.GetString ("The library name contains invalid characters. Examples of valid library names include 'MyPackage' and 'MyPackage.Sample'.");
+ return false;
+ }
+
+ return true;
+ }
+
+ bool ValidPlatformsSelected ()
+ {
+ if (isSharedProjectSelected) {
+ return isAndroidChecked || isIOSChecked;
+ }
+
+ return true;
+ }
+
+ public string LibraryName {
+ get { return libraryName; }
+ set {
+ libraryName = value.Trim ();
+ wizard.Parameters ["PackageId"] = libraryName;
+ wizard.Parameters ["ProjectName"] = NewProjectConfiguration.GenerateValidProjectName (libraryName);
+ UpdateCanMoveNext ();
+ }
+ }
+
+ public string LibraryNameError { get; private set; }
+
+ public bool HasLibraryNameError ()
+ {
+ return !string.IsNullOrEmpty (LibraryNameError);
+ }
+
+ public string Description {
+ get { return description; }
+ set {
+ description = value.Trim ();
+ wizard.Parameters ["PackageDescription"] = description;
+ UpdateCanMoveNext ();
+ }
+ }
+
+ public bool IsIOSEnabled { get; private set; }
+
+ public bool IsIOSChecked {
+ get { return isIOSChecked; }
+ set {
+ isIOSChecked = value && IsIOSEnabled;
+ UpdateCreateIOSProjectParameter ();
+ UpdateCanMoveNext ();
+ }
+ }
+
+ void UpdateCreateIOSProjectParameter ()
+ {
+ wizard.Parameters ["CreateIOSProject"] = (isIOSChecked && !isPortableClassLibrarySelected).ToString ();
+ }
+
+ public bool IsAndroidEnabled { get; private set; }
+
+ public bool IsAndroidChecked {
+ get { return isAndroidChecked; }
+ set {
+ isAndroidChecked = value && IsAndroidEnabled;
+ UpdateCreateAndroidProjectParameter ();
+ UpdateCanMoveNext ();
+ }
+ }
+
+ void UpdateCreateAndroidProjectParameter ()
+ {
+ wizard.Parameters ["CreateAndroidProject"] = (isAndroidChecked && !isPortableClassLibrarySelected).ToString ();
+ }
+
+ public bool IsPortableClassLibrarySelected {
+ get { return isPortableClassLibrarySelected; }
+ set {
+ isPortableClassLibrarySelected = value;
+ CreateNuGetProject = !isPortableClassLibrarySelected;
+ isSharedProjectSelected = !isPortableClassLibrarySelected;
+ UpdateTemplateParameters ();
+ UpdateCanMoveNext ();
+ }
+ }
+
+ public bool IsSharedProjectSelected {
+ get { return isSharedProjectSelected; }
+ set {
+ isSharedProjectSelected = value;
+ isPortableClassLibrarySelected = !isSharedProjectSelected;
+ UpdateTemplateParameters ();
+ UpdateCanMoveNext ();
+ }
+ }
+
+ void UpdateTemplateParameters ()
+ {
+ wizard.Parameters ["CreateSharedProject"] = isSharedProjectSelected.ToString ();
+ wizard.Parameters ["CreatePortableProject"] = isPortableClassLibrarySelected.ToString ();
+
+ UpdateCreateAndroidProjectParameter ();
+ UpdateCreateIOSProjectParameter ();
+ }
+
+ bool CreateNuGetProject {
+ get { return createNuGetProject; }
+ set {
+ createNuGetProject = value;
+ wizard.Parameters ["CreateNuGetProject"] = createNuGetProject.ToString ();
+ }
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/PackagingProjectTemplateWizard.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/PackagingProjectTemplateWizard.cs
new file mode 100644
index 0000000000..27e9bf5108
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/PackagingProjectTemplateWizard.cs
@@ -0,0 +1,66 @@
+//
+// PackagingProjectTemplateWizard.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.Collections.Generic;
+using System.Linq;
+using MonoDevelop.Ide;
+using MonoDevelop.Ide.Templates;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging.Templating
+{
+ class PackagingProjectTemplateWizard : TemplateWizard
+ {
+ public override string Id {
+ get { return "MonoDevelop.Packaging.ProjectTemplateWizard"; }
+ }
+
+ public override WizardPage GetPage (int pageNumber)
+ {
+ return new PackagingProjectTemplateWizardPage (this);
+ }
+
+ public override void ItemsCreated (IEnumerable<IWorkspaceFileObject> items)
+ {
+ var project = GetPackagingProject (items);
+ var readmeFile = project.Files.FirstOrDefault (f => f.FilePath.FileName == "readme.txt");
+ readmeFile.Metadata.SetValue ("IncludeInPackage", true, false);
+
+ IdeApp.ProjectOperations.SaveAsync (project);
+ }
+
+ PackagingProject GetPackagingProject (IEnumerable<IWorkspaceFileObject> items)
+ {
+ Solution solution = items.OfType<Solution> ().FirstOrDefault ();
+ if (solution != null) {
+ return GetPackagingProject (solution.GetAllProjects ());
+ }
+
+ return items.OfType<PackagingProject> ().FirstOrDefault ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/PackagingProjectTemplateWizardPage.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/PackagingProjectTemplateWizardPage.cs
new file mode 100644
index 0000000000..5e47b6df8f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Templating/PackagingProjectTemplateWizardPage.cs
@@ -0,0 +1,172 @@
+//
+// PackagingProjectTemplateWizardPage.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Core;
+using MonoDevelop.Ide.Projects;
+using MonoDevelop.Ide.Templates;
+using MonoDevelop.Packaging.Gui;
+using MonoDevelop.Projects;
+using NuGet.Packaging;
+using NuGet.Versioning;
+
+namespace MonoDevelop.Packaging.Templating
+{
+ class PackagingProjectTemplateWizardPage : WizardPage
+ {
+ readonly string title = GettextCatalog.GetString ("Configure your NuGet package");
+ readonly PackagingProjectTemplateWizard wizard;
+ GtkPackagingProjectTemplateWizardPageWidget view;
+ string id = string.Empty;
+ string version = string.Empty;
+ string description = string.Empty;
+ string authors = string.Empty;
+ bool validId;
+ bool validVersion;
+
+ public PackagingProjectTemplateWizardPage (PackagingProjectTemplateWizard wizard)
+ {
+ this.wizard = wizard;
+
+ Authors = AuthorInformation.Default.Name;
+ Version = "1.0.0";
+ }
+
+ public override string Title {
+ get { return title; }
+ }
+
+ protected override object CreateNativeWidget<T> ()
+ {
+ if (view == null)
+ view = new GtkPackagingProjectTemplateWizardPageWidget (this);
+
+ return view;
+ }
+
+ protected override void Dispose (bool disposing)
+ {
+ if (view != null) {
+ view.Dispose ();
+ view = null;
+ }
+ }
+
+ void UpdateCanMoveNext ()
+ {
+ CanMoveToNextPage = validId &&
+ validVersion &&
+ !string.IsNullOrEmpty (description) &&
+ !string.IsNullOrEmpty (authors);
+ }
+
+ bool IsValidId ()
+ {
+ IdError = null;
+
+ if (string.IsNullOrEmpty (id)) {
+ return false;
+ } else if (id.Length > NuGetPackageMetadata.MaxPackageIdLength) {
+ IdError = GettextCatalog.GetString ("The package id must not exceed 100 characters.");
+ return false;
+ } else if (!PackageIdValidator.IsValidPackageId (id)) {
+ IdError = GettextCatalog.GetString ("The package id contains invalid characters. Examples of valid package ids include 'MyPackage' and 'MyPackage.Sample'.");
+ return false;
+ }
+
+ return true;
+ }
+
+ bool IsValidVersion ()
+ {
+ VersionError = null;
+
+ if (string.IsNullOrEmpty (version)) {
+ return false;
+ } else {
+ NuGetVersion nugetVersion = null;
+ if (!NuGetVersion.TryParse (version, out nugetVersion)) {
+ VersionError = GettextCatalog.GetString ("The package version contains invalid characters. Examples of valid version include '1.0.0' and '1.2.3-beta1'.");
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public string Id {
+ get { return id; }
+ set {
+ id = value.Trim ();
+ wizard.Parameters ["PackageId"] = id;
+ wizard.Parameters ["ProjectName"] = NewProjectConfiguration.GenerateValidProjectName (id);
+ validId = IsValidId ();
+ UpdateCanMoveNext ();
+ }
+ }
+
+ public string IdError { get; private set; }
+
+ public bool HasIdError ()
+ {
+ return !string.IsNullOrEmpty (IdError);
+ }
+
+ public string Version {
+ get { return version; }
+ set {
+ version = value.Trim ();
+ wizard.Parameters ["PackageVersion"] = version;
+ validVersion = IsValidVersion ();
+ UpdateCanMoveNext ();
+ }
+ }
+
+ public string VersionError { get; private set; }
+
+ public bool HasVersionError ()
+ {
+ return !string.IsNullOrEmpty (VersionError);
+ }
+
+ public string Description {
+ get { return description; }
+ set {
+ description = value.Trim ();
+ wizard.Parameters ["PackageDescription"] = description;
+ UpdateCanMoveNext ();
+ }
+ }
+
+ public string Authors {
+ get { return authors; }
+ set {
+ authors = value.Trim ();
+ wizard.Parameters ["PackageAuthors"] = authors;
+ UpdateCanMoveNext ();
+ }
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests.csproj b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests.csproj
new file mode 100644
index 0000000000..8f36b0aee2
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests.csproj
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.30703</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{25FBDD35-1CA0-4BED-93F6-927FAF33F96B}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <RootNamespace>MonoDevelop.Packaging.Tests</RootNamespace>
+ <AssemblyName>MonoDevelop.Packaging.Tests</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <TestRunnerCommand>..\..\..\..\build\bin\mdtool.exe</TestRunnerCommand>
+ <TestRunnerArgs>run-md-tests</TestRunnerArgs>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>..\..\..\..\build\tests</OutputPath>
+ <DefineConstants>DEBUG;</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <Optimize>true</Optimize>
+ <OutputPath>..\..\..\..\build\tests</OutputPath>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="NuGet.ProjectManagement">
+ <HintPath>..\..\..\..\external\nuget-binary\NuGet.ProjectManagement.dll</HintPath>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="MonoDevelop.Packaging.Tests\ProjectTemplateTests.cs" />
+ <Compile Include="MonoDevelop.Packaging.Tests\AddPlatformImplementationTests.cs" />
+ <Compile Include="MonoDevelop.Packaging.Tests\TestableAddPlatformImplementationViewModel.cs" />
+ <Compile Include="MonoDevelop.Packaging.Tests\TestableCrossPlatformLibraryTemplateWizard.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\..\core\MonoDevelop.Ide\MonoDevelop.Ide.csproj">
+ <Project>{27096E7F-C91C-4AC6-B289-6897A701DF21}</Project>
+ <Name>MonoDevelop.Ide</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ <ProjectReference Include="..\MonoDevelop.Packaging.csproj">
+ <Project>{443311BF-766D-4863-B5A1-AFAA7F41DBDA}</Project>
+ <Name>MonoDevelop.Packaging</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\core\MonoDevelop.Core\MonoDevelop.Core.csproj">
+ <Project>{7525BB88-6142-4A26-93B9-A30C6983390A}</Project>
+ <Name>MonoDevelop.Core</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\..\external\guiunit\src\framework\GuiUnit_NET_4_5.csproj">
+ <Project>{D12F0F7B-8DE3-43EC-BA49-41052D065A9B}</Project>
+ <Name>GuiUnit_NET_4_5</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\..\tests\UnitTests\UnitTests.csproj">
+ <Project>{1497D0A8-AFF1-4938-BC22-BE79B358BA5B}</Project>
+ <Name>UnitTests</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ <ProjectReference Include="..\..\MonoDevelop.PackageManagement\MonoDevelop.PackageManagement.csproj">
+ <Project>{F218643D-2E74-4309-820E-206A54B7133F}</Project>
+ <Name>MonoDevelop.PackageManagement</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ <ProjectReference Include="..\..\MonoDevelop.PackageManagement\MonoDevelop.PackageManagement.Tests\MonoDevelop.PackageManagement.Tests.csproj">
+ <Project>{2645C9F3-9ED5-4806-AB09-DAD9BE90C67B}</Project>
+ <Name>MonoDevelop.PackageManagement.Tests</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <Folder Include="MonoDevelop.Packaging.Tests\" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project> \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/AddPlatformImplementationTests.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/AddPlatformImplementationTests.cs
new file mode 100644
index 0000000000..8765e1a405
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/AddPlatformImplementationTests.cs
@@ -0,0 +1,404 @@
+//
+// AddPlatformImplementationTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using MonoDevelop.Ide.Templates;
+using MonoDevelop.Projects;
+using NUnit.Framework;
+using UnitTests;
+using MonoDevelop.Projects.SharedAssetsProjects;
+using MonoDevelop.Projects.MSBuild;
+
+namespace MonoDevelop.Packaging.Tests
+{
+ [TestFixture]
+ public class AddPlatformImplementationTests : TestBase
+ {
+ public AddPlatformImplementationTests ()
+ {
+ Simulate ();
+
+ #pragma warning disable 219
+ // Ensure NuGet.ProjectManagement assembly is loaded otherwise creating
+ // a PackagingProject will fail.
+ string binDirectory = NuGet.ProjectManagement.Constants.BinDirectory;
+ #pragma warning restore 219
+ }
+
+ [Test]
+ public async Task AddAndroidProjectForPCLProject ()
+ {
+ string templateId = "MonoDevelop.CSharp.PortableLibrary";
+ var template = ProjectTemplate.ProjectTemplates.FirstOrDefault (t => t.Id == templateId);
+ var dir = Util.CreateTmpDir ("AddAndroidProjectForPCLProject");
+ var cinfo = new ProjectCreateInformation {
+ ProjectBasePath = Path.Combine (dir, "MyProject"),
+ ProjectName = "MyProject",
+ SolutionName = "Solution",
+ SolutionPath = dir
+ };
+
+ var solution = template.CreateWorkspaceItem (cinfo) as Solution;
+ string solutionFileName = Path.Combine (dir, "Solution.sln");
+ await solution.SaveAsync (solutionFileName, Util.GetMonitor ());
+
+ var pclProject = solution.GetAllProjects ().OfType<DotNetProject> ().First ();
+
+ // Add NuGet package metadata to PCL project.
+ var metadata = new NuGetPackageMetadata ();
+ metadata.Load (pclProject);
+ metadata.Id = "MyPackage";
+ metadata.Authors = "Authors";
+ metadata.Owners = "Owners";
+ metadata.Version = "1.2.3";
+ metadata.UpdateProject (pclProject);
+ await pclProject.SaveAsync (Util.GetMonitor ());
+
+ // Add platform implementation.
+ var viewModel = new TestableAddPlatformImplementationViewModel (pclProject);
+ viewModel.CreateAndroidProject = true;
+ viewModel.CreateSharedProject = false;
+ viewModel.CreateIOSProject = false;
+
+ await viewModel.CreateProjects (Util.GetMonitor ());
+
+ // Verify projects created as expected.
+ solution = (Solution) await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solutionFileName);
+
+ pclProject = solution.GetAllProjects ().OfType<DotNetProject> ().FirstOrDefault (p => p.Name == "MyProject");
+
+ // Solution contains Android project.
+ var androidProject = solution.GetAllProjects ().FirstOrDefault (p => p.Name == "MyProject.Android");
+ Assert.That (androidProject.GetTypeTags (), Contains.Item ("MonoDroid"));
+ Assert.AreEqual ("MyProject.Android.csproj", androidProject.FileName.FileName);
+
+ // Solution contains NuGet packaging project.
+ var nugetProject = solution.GetAllProjects ().FirstOrDefault (p => p.Name == "MyProject.NuGet") as PackagingProject;
+ Assert.AreEqual ("MonoDevelop.Packaging.PackagingProject", nugetProject.GetType ().FullName);
+ Assert.AreEqual ("MyProject.NuGet.nuproj", nugetProject.FileName.FileName);
+
+ // NuGet packaging project references Android project.
+ var androidProjectReference = nugetProject.References.Single (r => r.ResolveProject (solution) == androidProject);
+ Assert.IsNotNull (androidProjectReference);
+
+ // NuGet packaging project references PCL project.
+ var projectReference = nugetProject.References.Single (r => r.ResolveProject (solution) == pclProject);
+ Assert.IsNotNull (projectReference);
+
+ // NuGet packaging project contains metadata from PCL project.
+ metadata = nugetProject.GetPackageMetadata ();
+ Assert.AreEqual ("MyPackage", metadata.Id);
+ Assert.AreEqual ("1.2.3", metadata.Version);
+ Assert.AreEqual ("Authors", metadata.Authors);
+ Assert.AreEqual ("Owners", metadata.Owners);
+
+ // NuGet packaging metadata is removed from PCL project.
+ metadata = new NuGetPackageMetadata ();
+ metadata.Load (pclProject);
+ Assert.IsTrue (metadata.IsEmpty ());
+
+ // Configurations created for Android and NuGet packaging project.
+ foreach (var config in solution.Configurations) {
+ Assert.That (androidProject.GetConfigurations (), Contains.Item (config.Id));
+ Assert.That (nugetProject.GetConfigurations (), Contains.Item (config.Id));
+ }
+
+ // DefaultNamespace is the same for all projects.
+ Assert.AreEqual ("MyProject", ((DotNetProject)androidProject).DefaultNamespace);
+ Assert.AreEqual ("MyProject", ((DotNetProject)pclProject).DefaultNamespace);
+ }
+
+ [Test]
+ [Platform (Exclude = "Win")]
+ public async Task AddIOSProjectForPCLProject ()
+ {
+ string templateId = "MonoDevelop.CSharp.PortableLibrary";
+ var template = ProjectTemplate.ProjectTemplates.FirstOrDefault (t => t.Id == templateId);
+ var dir = Util.CreateTmpDir ("AddIOSProjectForPCLProject");
+ var cinfo = new ProjectCreateInformation {
+ ProjectBasePath = Path.Combine (dir, "MyProject"),
+ ProjectName = "MyProject",
+ SolutionName = "Solution",
+ SolutionPath = dir
+ };
+
+ var solution = template.CreateWorkspaceItem (cinfo) as Solution;
+ string solutionFileName = Path.Combine (dir, "Solution.sln");
+ await solution.SaveAsync (solutionFileName, Util.GetMonitor ());
+
+ var pclProject = solution.GetAllProjects ().OfType<DotNetProject> ().First ();
+
+ // Add NuGet package metadata to PCL project.
+ var metadata = new NuGetPackageMetadata ();
+ metadata.Load (pclProject);
+ metadata.Id = "MyPackage";
+ metadata.Authors = "Authors";
+ metadata.Owners = "Owners";
+ metadata.Version = "1.2.3";
+ metadata.UpdateProject (pclProject);
+ await pclProject.SaveAsync (Util.GetMonitor ());
+
+ // Add platform implementation.
+ var viewModel = new TestableAddPlatformImplementationViewModel (pclProject);
+ viewModel.CreateAndroidProject = false;
+ viewModel.CreateSharedProject = false;
+ viewModel.CreateIOSProject = true;
+
+ await viewModel.CreateProjects (Util.GetMonitor ());
+
+ // Verify projects created as expected.
+ solution = (Solution) await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solutionFileName);
+
+ pclProject = solution.GetAllProjects ().OfType<DotNetProject> ().FirstOrDefault (p => p.Name == "MyProject");
+
+ // Solution contains Android project.
+ var iosProject = solution.GetAllProjects ().OfType<DotNetProject> ().FirstOrDefault (p => p.Name == "MyProject.iOS");
+ Assert.That (iosProject.GetTypeTags (), Contains.Item ("XamarinIOS"));
+ Assert.AreEqual ("MyProject.iOS.csproj", iosProject.FileName.FileName);
+ Assert.AreEqual (CompileTarget.Library, iosProject.CompileTarget);
+
+ // Solution contains NuGet packaging project.
+ var nugetProject = solution.GetAllProjects ().FirstOrDefault (p => p.Name == "MyProject.NuGet") as PackagingProject;
+ Assert.AreEqual ("MyProject.NuGet.nuproj", nugetProject.FileName.FileName);
+
+ // NuGet packaging project references iOS project.
+ var iosProjectReference = nugetProject.References.Single (r => r.ResolveProject (solution) == iosProject);
+ Assert.IsNotNull (iosProjectReference);
+
+ // NuGet packaging project references PCL project.
+ var projectReference = nugetProject.References.Single (r => r.ResolveProject (solution) == pclProject);
+ Assert.IsNotNull (projectReference);
+
+ // NuGet packaging project contains metadata from PCL project.
+ metadata = nugetProject.GetPackageMetadata ();
+ Assert.AreEqual ("MyPackage", metadata.Id);
+ Assert.AreEqual ("1.2.3", metadata.Version);
+ Assert.AreEqual ("Authors", metadata.Authors);
+ Assert.AreEqual ("Owners", metadata.Owners);
+
+ // NuGet packaging metadata is removed from PCL project.
+ metadata = new NuGetPackageMetadata ();
+ metadata.Load (pclProject);
+ Assert.IsTrue (metadata.IsEmpty ());
+
+ var assemblyInfoFile = iosProject.Items.OfType<ProjectFile> ().Single (file => file.FilePath.FileName == "AssemblyInfo.cs");
+ Assert.IsNotNull (assemblyInfoFile);
+
+ // DefaultNamespace is the same for all projects.
+ Assert.AreEqual ("MyProject", iosProject.DefaultNamespace);
+ Assert.AreEqual ("MyProject", pclProject.DefaultNamespace);
+ }
+
+ [Test]
+ [Platform (Exclude = "Win")]
+ public async Task AddSharedProjectForPCLProject ()
+ {
+ string templateId = "MonoDevelop.CSharp.PortableLibrary";
+ var template = ProjectTemplate.ProjectTemplates.FirstOrDefault (t => t.Id == templateId);
+ var dir = Util.CreateTmpDir ("AddSharedProjectForPCLProject");
+ var cinfo = new ProjectCreateInformation {
+ ProjectBasePath = Path.Combine (dir, "MyProject"),
+ ProjectName = "MyProject",
+ SolutionName = "Solution",
+ SolutionPath = dir
+ };
+
+ var solution = template.CreateWorkspaceItem (cinfo) as Solution;
+ string solutionFileName = Path.Combine (dir, "Solution.sln");
+ await solution.SaveAsync (solutionFileName, Util.GetMonitor ());
+
+ var pclProject = solution.GetAllProjects ().OfType<DotNetProject> ().First ();
+
+ // Add NuGet package metadata to PCL project.
+ var metadata = new NuGetPackageMetadata ();
+ metadata.Load (pclProject);
+ metadata.Id = "MyPackage";
+ metadata.Authors = "Authors";
+ metadata.Owners = "Owners";
+ metadata.Version = "1.2.3";
+ metadata.UpdateProject (pclProject);
+
+ // Add another csharp file to the pclProject in a subdirectory.
+ string anotherCSharpFileName = pclProject.BaseDirectory.Combine ("src", "AnotherClass.cs");
+ Directory.CreateDirectory (Path.GetDirectoryName (anotherCSharpFileName));
+ File.WriteAllText (anotherCSharpFileName, "class AnotherClass {}");
+ pclProject.AddFile (anotherCSharpFileName);
+ await pclProject.SaveAsync (Util.GetMonitor ());
+
+ // Add platform implementation.
+ var viewModel = new TestableAddPlatformImplementationViewModel (pclProject);
+ viewModel.CreateAndroidProject = true;
+ viewModel.CreateSharedProject = true;
+ viewModel.CreateIOSProject = true;
+
+ await viewModel.CreateProjects (Util.GetMonitor ());
+
+ // Verify projects created as expected.
+ solution = (Solution) await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solutionFileName);
+
+ pclProject = solution.GetAllProjects ().OfType<DotNetProject> ().FirstOrDefault (p => p.Name == "MyProject");
+
+ // Solution contains Shared project.
+ var sharedProject = solution.GetAllProjects ().OfType<SharedAssetsProject> ().FirstOrDefault (p => p.Name == "MyProject.Shared");
+ Assert.AreEqual ("MyProject.Shared.shproj", sharedProject.FileName.FileName);
+
+ // PCL project references the Shared project.
+ var projectReference = pclProject.References.Single (r => r.ResolveProject (solution) == sharedProject);
+ Assert.IsNotNull (projectReference);
+
+ // Solution contains NuGet packaging project.
+ var nugetProject = solution.GetAllProjects ().FirstOrDefault (p => p.Name == "MyProject.NuGet") as PackagingProject;
+ Assert.AreEqual ("MyProject.NuGet.nuproj", nugetProject.FileName.FileName);
+
+ // NuGet packaging project references PCL project.
+ projectReference = nugetProject.References.Single (r => r.ResolveProject (solution) == pclProject);
+ Assert.IsNotNull (projectReference);
+
+ // Android project references shared project
+ var androidProject = solution.GetAllProjects ().OfType<DotNetProject> ().FirstOrDefault (p => p.Name == "MyProject.Android");
+ projectReference = androidProject.References.Single (r => r.ResolveProject (solution) == sharedProject);
+ Assert.IsNotNull (projectReference);
+
+ // iOS project references shared project
+ var iosProject = solution.GetAllProjects ().OfType<DotNetProject> ().FirstOrDefault (p => p.Name == "MyProject.iOS");
+ projectReference = iosProject.References.Single (r => r.ResolveProject (solution) == sharedProject);
+ Assert.IsNotNull (projectReference);
+
+ // NuGet packaging project contains metadata from PCL project.
+ metadata = nugetProject.GetPackageMetadata ();
+ Assert.AreEqual ("MyPackage", metadata.Id);
+ Assert.AreEqual ("1.2.3", metadata.Version);
+ Assert.AreEqual ("Authors", metadata.Authors);
+ Assert.AreEqual ("Owners", metadata.Owners);
+
+ // NuGet packaging metadata is removed from PCL project.
+ metadata = new NuGetPackageMetadata ();
+ metadata.Load (pclProject);
+ Assert.IsTrue (metadata.IsEmpty ());
+
+ // PCL project should only have the assembly info file directly in the project.
+ Assert.IsTrue (pclProject.MSBuildProject.GetAllItems ().Any (item => item.Include.Contains ("AssemblyInfo.cs")));
+ Assert.IsFalse (pclProject.MSBuildProject.GetAllItems ().Any (item => item.Include.Contains ("MyClass.cs")));
+ Assert.IsFalse (pclProject.MSBuildProject.GetAllItems ().Any (item => item.Include.Contains ("AnotherClass.cs")));
+ string assemblyInfoFileName = pclProject.BaseDirectory.Combine ("Properties", "AssemblyInfo.cs");
+ Assert.IsTrue (File.Exists (assemblyInfoFileName));
+ string csharpFileName = pclProject.BaseDirectory.Combine ("MyClass.cs");
+ Assert.IsFalse (File.Exists (csharpFileName));
+ Assert.IsFalse (File.Exists (anotherCSharpFileName));
+
+ // Shared project should have files from PCL project.
+ string copiedCSharpFileName = sharedProject.BaseDirectory.Combine ("MyClass.cs");
+ Assert.That (sharedProject.Files.Select (f => f.FilePath.ToString ()), Contains.Item (copiedCSharpFileName));
+ Assert.IsTrue (File.Exists (copiedCSharpFileName));
+ string copiedAnotherCSharpFileName = sharedProject.BaseDirectory.Combine ("src", "AnotherClass.cs");
+ Assert.That (sharedProject.Files.Select (f => f.FilePath.ToString ()), Contains.Item (copiedAnotherCSharpFileName));
+ Assert.IsTrue (File.Exists (copiedAnotherCSharpFileName));
+ string copiedAssemblyInfoFileName = sharedProject.BaseDirectory.Combine ("Properties", "AssemblyInfo.cs");
+ Assert.That (sharedProject.Files.Select (f => f.FilePath.ToString ()), Has.No.Member (copiedAssemblyInfoFileName));
+ Assert.IsFalse (File.Exists (copiedAssemblyInfoFileName));
+
+ var expectedBaseDirectory = pclProject.BaseDirectory.ParentDirectory;
+ Assert.AreEqual (expectedBaseDirectory.Combine ("MyProject.Android", "MyProject.Android.csproj"), androidProject.FileName);
+ Assert.AreEqual (expectedBaseDirectory.Combine ("MyProject.iOS", "MyProject.iOS.csproj"), iosProject.FileName);
+ Assert.AreEqual (expectedBaseDirectory.Combine ("MyProject.NuGet", "MyProject.NuGet.nuproj"), nugetProject.FileName);
+ Assert.AreEqual (expectedBaseDirectory.Combine ("MyProject.Shared", "MyProject.Shared.shproj"), sharedProject.FileName);
+
+ // DefaultNamespace is the same for all projects.
+ Assert.AreEqual ("MyProject", androidProject.DefaultNamespace);
+ Assert.AreEqual ("MyProject", iosProject.DefaultNamespace);
+ Assert.AreEqual ("MyProject", pclProject.DefaultNamespace);
+ Assert.AreEqual ("MyProject", sharedProject.DefaultNamespace);
+
+ // OutputAssemblyName is the same for PCL, iOS and Android project.
+ Assert.IsTrue (androidProject.Configurations.OfType<DotNetProjectConfiguration> ().All (config => config.OutputAssembly == "MyProject"));
+ Assert.IsTrue (iosProject.Configurations.OfType<DotNetProjectConfiguration> ().All (config => config.OutputAssembly == "MyProject"));
+ Assert.IsTrue (pclProject.Configurations.OfType<DotNetProjectConfiguration> ().All (config => config.OutputAssembly == "MyProject"));
+
+ // iOS and Android project should have an AssemblyInfo file.
+ Assert.IsTrue (androidProject.MSBuildProject.GetAllItems ().Any (item => item.Include.Contains ("AssemblyInfo.cs")));
+ Assert.IsTrue (iosProject.MSBuildProject.GetAllItems ().Any (item => item.Include.Contains ("AssemblyInfo.cs")));
+ }
+
+ [Test]
+ [Platform (Exclude = "Win")]
+ public async Task PCLProjectInSameDirectoryAsSolution ()
+ {
+ string templateId = "MonoDevelop.CSharp.PortableLibrary";
+ var template = ProjectTemplate.ProjectTemplates.FirstOrDefault (t => t.Id == templateId);
+ var dir = Util.CreateTmpDir ("AddAndroidProjectForPCLProjectInSameDirectoryAsSolution");
+ var cinfo = new ProjectCreateInformation {
+ ProjectBasePath = dir,
+ ProjectName = "MyProject",
+ SolutionName = "Solution",
+ SolutionPath = dir
+ };
+
+ var solution = template.CreateWorkspaceItem (cinfo) as Solution;
+ string solutionFileName = Path.Combine (dir, "Solution.sln");
+ await solution.SaveAsync (solutionFileName, Util.GetMonitor ());
+
+ var pclProject = solution.GetAllProjects ().OfType<DotNetProject> ().First ();
+
+ // Add NuGet package metadata to PCL project.
+ var metadata = new NuGetPackageMetadata ();
+ metadata.Load (pclProject);
+ metadata.Id = "MyPackage";
+ metadata.Authors = "Authors";
+ metadata.Owners = "Owners";
+ metadata.Version = "1.2.3";
+ metadata.UpdateProject (pclProject);
+ await pclProject.SaveAsync (Util.GetMonitor ());
+
+ // Add platform implementation.
+ var viewModel = new TestableAddPlatformImplementationViewModel (pclProject);
+ viewModel.CreateAndroidProject = true;
+ viewModel.CreateSharedProject = true;
+ viewModel.CreateIOSProject = true;
+
+ await viewModel.CreateProjects (Util.GetMonitor ());
+
+ // Verify projects created as expected.
+ solution = (Solution) await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solutionFileName);
+
+ var androidProject = solution.GetAllProjects ().FirstOrDefault (p => p.Name == "MyProject.Android");
+ var nugetProject = solution.GetAllProjects ().FirstOrDefault (p => p.Name == "MyProject.NuGet");
+ var iosProject = solution.GetAllProjects ().FirstOrDefault (p => p.Name == "MyProject.iOS");
+ var sharedProject = solution.GetAllProjects ().FirstOrDefault (p => p.Name == "MyProject.Shared");
+
+ var expectedBaseDirectory = solution.BaseDirectory;
+ Assert.AreEqual (expectedBaseDirectory.Combine ("MyProject.Android", "MyProject.Android.csproj"), androidProject.FileName);
+ Assert.AreEqual (expectedBaseDirectory.Combine ("MyProject.iOS", "MyProject.iOS.csproj"), iosProject.FileName);
+ Assert.AreEqual (expectedBaseDirectory.Combine ("MyProject.NuGet", "MyProject.NuGet.nuproj"), nugetProject.FileName);
+ Assert.AreEqual (expectedBaseDirectory.Combine ("MyProject.Shared", "MyProject.Shared.shproj"), sharedProject.FileName);
+
+ Assert.IsTrue (androidProject.GetFlavor<DotNetProjectPackagingExtension> ().GetRequiresMSBuild ());
+ Assert.IsTrue (nugetProject.GetFlavor<DotNetProjectPackagingExtension> ().GetRequiresMSBuild ());
+ Assert.IsTrue (iosProject.GetFlavor<DotNetProjectPackagingExtension> ().GetRequiresMSBuild ());
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/ProjectTemplateTests.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/ProjectTemplateTests.cs
new file mode 100644
index 0000000000..3bdf57e1f1
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/ProjectTemplateTests.cs
@@ -0,0 +1,209 @@
+//
+// ProjectTemplateTests.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using MonoDevelop.Ide.Templates;
+using MonoDevelop.PackageManagement.Tests.Helpers;
+using MonoDevelop.Packaging.Templating;
+using MonoDevelop.Projects;
+using MonoDevelop.Projects.MSBuild;
+using MonoDevelop.Projects.SharedAssetsProjects;
+using NUnit.Framework;
+using UnitTests;
+
+namespace MonoDevelop.Packaging.Tests
+{
+ [TestFixture]
+ public class ProjectTemplateTests : TestBase
+ {
+ public ProjectTemplateTests ()
+ {
+ Simulate ();
+
+ #pragma warning disable 219
+ // Ensure NuGet.ProjectManagement assembly is loaded otherwise creating
+ // a PackagingProject will fail.
+ string binDirectory = NuGet.ProjectManagement.Constants.BinDirectory;
+ #pragma warning restore 219
+ }
+
+ [Test]
+ public async Task CreatePackagingProjectFromTemplate ()
+ {
+ string templateId = "MonoDevelop.Packaging.Project";
+ var template = ProjectTemplate.ProjectTemplates.FirstOrDefault (t => t.Id == templateId);
+ var dir = Util.CreateTmpDir (template.Id);
+ var cinfo = new ProjectCreateInformation {
+ ProjectBasePath = dir,
+ ProjectName = "ProjectName",
+ SolutionName = "SolutionName",
+ SolutionPath = dir
+ };
+
+ var workspaceItem = template.CreateWorkspaceItem (cinfo);
+ string solutionFileName = Path.Combine (dir, "SolutionName.sln");
+ await workspaceItem.SaveAsync (solutionFileName, Util.GetMonitor ());
+
+ string projectFileName = Path.Combine (dir, "ProjectName.nuproj");
+ var project = await MSBuildProject.LoadAsync (projectFileName);
+
+ // First element is NuGet.Packaging.props
+ var import = project.GetAllObjects ().FirstOrDefault () as MSBuildImport;
+ Assert.AreEqual (import.Project, @"$(NuGetAuthoringPath)\NuGet.Packaging.Authoring.props");
+
+ // NuGet.Packaging.targets exists.
+ import = project.Imports.LastOrDefault () as MSBuildImport;
+ Assert.AreEqual (import.Project, @"$(NuGetAuthoringPath)\NuGet.Packaging.Authoring.targets");
+
+ int count = project.Imports.Count ();
+ import = project.Imports.Skip (count - 2).FirstOrDefault ();
+ Assert.AreEqual (import.Project, @"$(MSBuildBinPath)\Microsoft.Common.targets");
+ }
+
+ [Test]
+ [Ignore ("Build does not work with project.json on Mono")]
+ public async Task BuildPackagingProjectFromTemplate ()
+ {
+ string templateId = "MonoDevelop.Packaging.Project";
+ var template = ProjectTemplate.ProjectTemplates.FirstOrDefault (t => t.Id == templateId);
+ var dir = Util.CreateTmpDir (template.Id);
+ var cinfo = new ProjectCreateInformation {
+ ProjectBasePath = dir,
+ ProjectName = "ProjectName",
+ SolutionName = "SolutionName",
+ SolutionPath = dir
+ };
+ cinfo.Parameters["PackageAuthors"] = "authors";
+ cinfo.Parameters["PackageId"] = "ProjectName";
+ cinfo.Parameters["PackageDescription"] = "Description";
+ cinfo.Parameters["PackageVersion"] = "1.0.0";
+
+ var workspaceItem = template.CreateWorkspaceItem (cinfo);
+ string solutionFileName = Path.Combine (dir, "SolutionName.sln");
+ await workspaceItem.SaveAsync (solutionFileName, Util.GetMonitor ());
+
+ await NuGetPackageInstaller.InstallPackages ((Solution)workspaceItem, template.PackageReferencesForCreatedProjects);
+
+ var solution = (Solution)await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solutionFileName);
+
+ BuildResult cr = await solution.Build (Util.GetMonitor (), "Debug");
+ Assert.IsNotNull (cr);
+ Assert.AreEqual (0, cr.ErrorCount);
+ Assert.AreEqual (0, cr.WarningCount);
+
+ string packageFileName = Path.Combine (dir, "bin", "Debug", "ProjectName.1.0.0.nupkg");
+ bool packageCreated = File.Exists (packageFileName);
+ Assert.IsTrue (packageCreated, "NuGet package not created.");
+ }
+
+ [Test]
+ public async Task CreateMultiPlatformProjectFromTemplateWithAndroidOnly ()
+ {
+ string templateId = "MonoDevelop.Packaging.CrossPlatformLibrary";
+ var template = ProjectTemplate.ProjectTemplates.FirstOrDefault (t => t.Id == templateId);
+ var dir = Util.CreateTmpDir (template.Id);
+ var cinfo = new ProjectCreateInformation {
+ ProjectBasePath = dir,
+ ProjectName = "ProjectName",
+ SolutionName = "SolutionName",
+ SolutionPath = dir
+ };
+ cinfo.Parameters["CreateAndroidProject"] = bool.TrueString;
+ cinfo.Parameters["CreateSharedProject"] = bool.TrueString;
+ cinfo.Parameters["CreateNuGetProject"] = bool.TrueString;
+
+ var workspaceItem = template.CreateWorkspaceItem (cinfo);
+ string solutionFileName = Path.Combine (dir, "SolutionName.sln");
+ await workspaceItem.SaveAsync (solutionFileName, Util.GetMonitor ());
+
+ var solution = (Solution) await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solutionFileName);
+
+ var project = solution.GetAllProjects ().OfType<DotNetProject> ().FirstOrDefault (p => p.FileName.FileName == "ProjectName.NuGet.nuproj");
+ Assert.IsNotNull (project);
+ Assert.IsTrue (project.GetFlavor<DotNetProjectPackagingExtension> ().GetRequiresMSBuild ());
+
+ var androidProject = solution.GetAllProjects ().OfType<DotNetProject> ().FirstOrDefault (p => p.FileName.FileName == "ProjectName.Android.csproj");
+ Assert.IsNotNull (androidProject);
+ Assert.IsTrue (androidProject.GetFlavor<DotNetProjectPackagingExtension> ().GetRequiresMSBuild ());
+
+ var sharedProject = solution.GetAllProjects ().OfType<SharedAssetsProject> ().FirstOrDefault (p => p.FileName.FileName == "ProjectName.Shared.shproj");
+ Assert.IsNotNull (sharedProject);
+
+ var projectReference = project.References.FirstOrDefault (r => r.ReferenceType == ReferenceType.Project);
+ Assert.AreEqual (androidProject, projectReference.ResolveProject (solution));
+
+ projectReference = androidProject.References.FirstOrDefault (r => r.ReferenceType == ReferenceType.Project);
+ Assert.AreEqual (sharedProject, projectReference.ResolveProject (solution));
+ }
+
+ [Test]
+ public async Task CreateMultiPlatformProjectFromTemplateWithPCLOnly ()
+ {
+ string templateId = "MonoDevelop.Packaging.CrossPlatformLibrary";
+ var template = ProjectTemplate.ProjectTemplates.FirstOrDefault (t => t.Id == templateId);
+ var dir = Util.CreateTmpDir (template.Id);
+ var cinfo = new ProjectCreateInformation {
+ ProjectBasePath = dir,
+ ProjectName = "ProjectName",
+ SolutionName = "SolutionName",
+ SolutionPath = dir
+ };
+ cinfo.Parameters["ProjectName"] = cinfo.ProjectName;
+ cinfo.Parameters["CreatePortableProject"] = bool.TrueString;
+ cinfo.Parameters["PackageAuthors"] = "authors";
+ cinfo.Parameters["PackageId"] = "ProjectName";
+ cinfo.Parameters["PackageDescription"] = "Description";
+ cinfo.Parameters["PackageVersion"] = "1.0.0";
+
+ var workspaceItem = template.CreateWorkspaceItem (cinfo);
+
+ var wizard = new TestableCrossPlatformLibraryTemplateWizard ();
+ wizard.Parameters = cinfo.Parameters;
+ wizard.ItemsCreated (new [] { workspaceItem });
+
+ var project = ((Solution)workspaceItem).GetAllProjects ().First ();
+ project.MSBuildProject.GetGlobalPropertyGroup ().SetValue ("PackOnBuild", "true");
+ string solutionFileName = Path.Combine (dir, "SolutionName.sln");
+ await workspaceItem.SaveAsync (solutionFileName, Util.GetMonitor ());
+
+ await NuGetPackageInstaller.InstallPackages ((Solution)workspaceItem, template.PackageReferencesForCreatedProjects);
+
+ var solution = (Solution)await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solutionFileName);
+ project = solution.GetAllProjects ().First ();
+ BuildResult cr = await solution.Build (Util.GetMonitor (), "Debug");
+ Assert.IsNotNull (cr);
+ Assert.AreEqual (0, cr.ErrorCount);
+ Assert.AreEqual (0, cr.WarningCount);
+
+ string packageFileName = Path.Combine (dir, "bin", "Debug", "ProjectName.1.0.0.nupkg");
+ bool packageCreated = File.Exists (packageFileName);
+ Assert.IsTrue (packageCreated, "NuGet package not created.");
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/TestableAddPlatformImplementationViewModel.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/TestableAddPlatformImplementationViewModel.cs
new file mode 100644
index 0000000000..289569bd24
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/TestableAddPlatformImplementationViewModel.cs
@@ -0,0 +1,41 @@
+//
+// TestableAddPlatformImplementationViewModel.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging.Tests
+{
+ class TestableAddPlatformImplementationViewModel : AddPlatformImplementationViewModel
+ {
+ public TestableAddPlatformImplementationViewModel (DotNetProject project)
+ : base (project)
+ {
+ }
+
+ protected override void AddNuGetPackages ()
+ {
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/TestableCrossPlatformLibraryTemplateWizard.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/TestableCrossPlatformLibraryTemplateWizard.cs
new file mode 100644
index 0000000000..95116c5bce
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/MonoDevelop.Packaging.Tests/TestableCrossPlatformLibraryTemplateWizard.cs
@@ -0,0 +1,43 @@
+//
+// TestableCrossPlatformLibraryTemplateWizard.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.Collections.Generic;
+using MonoDevelop.Core;
+using MonoDevelop.Packaging.Templating;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging.Tests
+{
+ class TestableCrossPlatformLibraryTemplateWizard : CrossPlatformLibraryTemplateWizard
+ {
+ protected override void SaveAsync (IEnumerable<SolutionItem> projects)
+ {
+ foreach (var project in projects) {
+ project.SaveAsync (new ProgressMonitor ());
+ }
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/Properties/AssemblyInfo.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..8ec343922f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.Tests/Properties/AssemblyInfo.cs
@@ -0,0 +1,6 @@
+
+using System.Reflection;
+
+[assembly: AssemblyTitle ("MonoDevelop.Packaging.Tests")]
+[assembly: AssemblyVersion ("1.0")]
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.addin.xml b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.addin.xml
new file mode 100644
index 0000000000..8ae4e4114a
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.addin.xml
@@ -0,0 +1,150 @@
+<ExtensionModel>
+
+ <Runtime>
+ <Import assembly="MonoDevelop.Packaging.dll" />
+
+ <Import file="Templates/CrossPlatformLibrary.xpt.xml" />
+ <Import file="Templates/PackagingProject.xpt.xml" />
+ </Runtime>
+
+ <ConditionType id="ProjectHasNuGetMetadata" type="MonoDevelop.Packaging.ProjectHasNuGetMetadataCondition" />
+ <ConditionType id="IsDotNetProjectOnly" type="MonoDevelop.Packaging.ProjectIsDotNetProjectOnlyCondition" />
+
+ <Extension path="/MonoDevelop/ProjectModel/MSBuildItemTypes">
+ <DotNetProjectType
+ language="NuGet.Packaging"
+ extension="nuproj"
+ guid="{5DD5E4FA-CB73-4610-85AB-557B54E96AA9}"
+ type="MonoDevelop.Packaging.PackagingProject"
+ alias="NuGetPackaging"
+ msbuildSupport="Required" />
+ </Extension>
+
+ <Extension path="/MonoDevelop/ProjectModel/ProjectModelExtensions">
+ <ProjectFlavor
+ id="MonoDevelop.Packaging.PackagingProjectFlavor"
+ guid="{5DD5E4FA-CB73-4610-85AB-557B54E96AA9}"
+ type="MonoDevelop.Packaging.PackagingProjectFlavor"
+ alias="NuGetPackaging">
+ </ProjectFlavor>
+ <Class class="MonoDevelop.Packaging.DotNetProjectPackagingExtension" />
+ </Extension>
+
+ <!--
+ Need to define a language binding otherwise it is not possible to
+ open a .nuproj since the DotNetProject.SupportsPartialTypes is called
+ when initializing a project and it requires a non-null language binding.
+ -->
+ <Extension path="/MonoDevelop/ProjectModel/LanguageBindings">
+ <LanguageBinding
+ id="NuGet.Packaging"
+ extensions=".nuproj" />
+ </Extension>
+
+ <Extension path="/MonoDevelop/ProjectModel/MSBuildGlobalPropertyProviders">
+ <Type
+ id="NuGetPackagingMSBuildPropertyProvider"
+ class="MonoDevelop.Packaging.MSBuildGlobalPropertyProvider" />
+ </Extension>
+
+ <Extension path="/MonoDevelop/Ide/ProjectTemplates">
+ <ProjectTemplate id="MonoDevelop.Packaging.Project" file="Templates/PackagingProject.xpt.xml"/>
+ <ProjectTemplate id="MonoDevelop.Packaging.CrossPlatformLibrary" file="Templates/CrossPlatformLibrary.xpt.xml"/>
+ </Extension>
+
+ <Extension path="/MonoDevelop/Ide/ProjectTemplateWizards">
+ <Class id="MonoDevelop.Packaging.ProjectTemplateWizard" class="MonoDevelop.Packaging.Templating.PackagingProjectTemplateWizard" />
+ <Class id="MonoDevelop.Packaging.CrossPlatformLibraryTemplateWizard" class="MonoDevelop.Packaging.Templating.CrossPlatformLibraryTemplateWizard" />
+ </Extension>
+
+ <Extension path="/MonoDevelop/ProjectModel/Gui/ItemOptionPanels">
+ <Section id="NuGetPackage" _label="NuGet Package">
+ <Condition id="IsDotNetProjectOnly">
+ <Section
+ id="Build"
+ _label="Build"
+ fill="true"
+ class="MonoDevelop.Packaging.OptionPanels.ProjectNuGetBuildOptionsPanel" />
+ </Condition>
+ <Condition id="ItemType" value="MonoDevelop.Packaging.PackagingProject|DotNetProject">
+ <Section
+ id="Metadata"
+ _label="Metadata"
+ icon="md-prefs-metadata"
+ fill="true"
+ class="MonoDevelop.Packaging.OptionPanels.NuGetPackageMetadataOptionsPanel" />
+ </Condition>
+ <Condition id="ItemType" value="MonoDevelop.Packaging.PackagingProject">
+ <Section
+ id="ReferenceAssemblies"
+ _label="Reference Assemblies"
+ icon="md-prefs-package"
+ fill="true"
+ class="MonoDevelop.Packaging.OptionPanels.ReferenceAssembliesOptionsPanel" />
+ </Condition>
+ </Section>
+ </Extension>
+
+ <Extension path="/MonoDevelop/Ide/Commands">
+ <Category _name="NuGet" id="NuGet">
+ <Command
+ id="MonoDevelop.Packaging.Commands.CreateNuGetPackage"
+ _description="Creates a NuGet package"
+ _label="Create NuGet _Package"
+ defaultHandler="MonoDevelop.Packaging.CreateNuGetPackageHandler" />
+ <Command
+ id="MonoDevelop.Packaging.Commands.AddPlatformImplementation"
+ _description="Adds platform specific implementation for a cross platform project"
+ _label="Add _Platform Implementation..."
+ defaultHandler="MonoDevelop.Packaging.AddPlatformImplementationHandler" />
+ </Category>
+ </Extension>
+
+ <Extension path="/MonoDevelop/Ide/MainMenu/Build">
+ <Condition id="ProjectHasNuGetMetadata">
+ <SeparatorItem
+ id="CreateNuGetPackageSeparator"
+ insertafter="MonoDevelop.Ide.Commands.ProjectCommands.Clean"
+ insertbefore="Separator1" />
+ <CommandItem
+ id="MonoDevelop.Packaging.Commands.CreateNuGetPackage"
+ insertafter="CreateNuGetPackageSeparator"
+ insertbefore="Separator1" />
+ </Condition>
+ </Extension>
+
+ <Extension path="/MonoDevelop/Ide/ContextMenu/ProjectPad">
+ <ComplexCondition>
+ <And>
+ <Condition id="ItemType" value="DotNetProject|MonoDevelop.Packaging.PackagingProject" />
+ <Condition id="ProjectHasNuGetMetadata" />
+ </And>
+ <SeparatorItem
+ id="CreateNuGetPackageSeparator"
+ insertafter="MonoDevelop.Ide.Commands.ProjectCommands.Unload"
+ insertbefore="MonoDevelop.Ide.Commands.ProjectCommands.CustomCommandList" />
+ <CommandItem
+ id="MonoDevelop.Packaging.Commands.CreateNuGetPackage"
+ insertafter="CreateNuGetPackageSeparator"
+ insertbefore="MonoDevelop.Ide.Commands.ProjectCommands.CustomCommandList" />
+ </ComplexCondition>
+ </Extension>
+
+ <Extension path="/MonoDevelop/Ide/ContextMenu/ProjectPad/Add">
+ <ComplexCondition>
+ <And>
+ <Condition id="ItemType" value="DotNetProject" />
+ <Condition id="ProjectHasNuGetMetadata" />
+ </And>
+ <CommandItem
+ id="MonoDevelop.Packaging.Commands.AddPlatformImplementation"
+ insertafter="MonoDevelop.PackageManagement.Commands.AddPackages"
+ insertbefore="MonoDevelop.WebReferences.WebReferenceCommands.Add" />
+ </ComplexCondition>
+ </Extension>
+
+ <Extension path="/MonoDevelop/DesignerSupport/PropertyProviders">
+ <Class class="MonoDevelop.Packaging.NuGetFilePropertyProvider" />
+ <Class class="MonoDevelop.Packaging.NuGetProjectReferencePropertyProvider" />
+ </Extension>
+</ExtensionModel>
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.csproj b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.csproj
new file mode 100644
index 0000000000..a36d478cec
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging.csproj
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.30703</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{443311BF-766D-4863-B5A1-AFAA7F41DBDA}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <RootNamespace>MonoDevelop.Packaging</RootNamespace>
+ <AssemblyName>MonoDevelop.Packaging</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>..\..\..\build\AddIns\MonoDevelop.Packaging</OutputPath>
+ <DefineConstants>DEBUG;</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <Optimize>true</Optimize>
+ <OutputPath>..\..\..\build\AddIns\MonoDevelop.Packaging</OutputPath>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Xml" />
+ <Reference Include="gtk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ <Reference Include="glib-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ <Reference Include="atk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ <Reference Include="gdk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ <Reference Include="Mono.Posix" />
+ <Reference Include="NuGet.ProjectManagement">
+ <HintPath>..\..\..\external\nuget-binary\NuGet.ProjectManagement.dll</HintPath>
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="NuGet.Protocol.Core.Types">
+ <HintPath>..\..\..\external\nuget-binary\NuGet.Protocol.Core.Types.dll</HintPath>
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="NuGet.Packaging.Core.Types">
+ <HintPath>..\..\..\external\nuget-binary\NuGet.Packaging.Core.Types.dll</HintPath>
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="NuGet.Packaging">
+ <HintPath>..\..\..\external\nuget-binary\NuGet.Packaging.dll</HintPath>
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="NuGet.Frameworks">
+ <HintPath>..\..\..\external\nuget-binary\NuGet.Frameworks.dll</HintPath>
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="NuGet.Versioning">
+ <HintPath>..\..\..\external\nuget-binary\NuGet.Versioning.dll</HintPath>
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="pango-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ <Reference Include="Mono.Cairo" />
+ <Reference Include="NuGet.PackageManagement">
+ <HintPath>..\..\..\external\nuget-binary\NuGet.PackageManagement.dll</HintPath>
+ <Private>False</Private>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Properties\AddinInfo.cs" />
+ <Compile Include="MonoDevelop.Packaging\PackagingProjectFlavor.cs" />
+ <Compile Include="MonoDevelop.Packaging\PackagingProject.cs" />
+ <Compile Include="MonoDevelop.Packaging\PackagingCompilerParameters.cs" />
+ <Compile Include="MonoDevelop.Packaging\MSBuildGlobalPropertyProvider.cs" />
+ <Compile Include="gtk-gui\generated.cs" />
+ <Compile Include="MonoDevelop.Packaging.Templating\PackagingProjectTemplateWizard.cs" />
+ <Compile Include="MonoDevelop.Packaging.Templating\PackagingProjectTemplateWizardPage.cs" />
+ <Compile Include="MonoDevelop.Packaging.Gui\GtkPackagingProjectTemplateWizardPageWidget.cs" />
+ <Compile Include="gtk-gui\MonoDevelop.Packaging.Gui.GtkPackagingProjectTemplateWizardPageWidget.cs" />
+ <Compile Include="MonoDevelop.Packaging.OptionPanels\NuGetPackageMetadataOptionsPanel.cs" />
+ <Compile Include="MonoDevelop.Packaging.Gui\GtkNuGetPackageMetadataOptionsPanelWidget.cs" />
+ <Compile Include="gtk-gui\MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget.cs" />
+ <Compile Include="MonoDevelop.Packaging\NuGetPackageMetadata.cs" />
+ <Compile Include="MonoDevelop.Packaging\MSBuildProjectExtensions.cs" />
+ <Compile Include="MonoDevelop.Packaging\DotNetProjectExtensions.cs" />
+ <Compile Include="MonoDevelop.Packaging\CreateNuGetPackageHandler.cs" />
+ <Compile Include="MonoDevelop.Packaging\ProjectHasNuGetMetadataCondition.cs" />
+ <Compile Include="MonoDevelop.Packaging\NuGetFilePropertyProvider.cs" />
+ <Compile Include="MonoDevelop.Packaging\NuGetFileDescriptor.cs" />
+ <Compile Include="MonoDevelop.Packaging\PackagingNuGetProject.cs" />
+ <Compile Include="MonoDevelop.Packaging\PackageReference.cs" />
+ <Compile Include="MonoDevelop.Packaging\PackageReferenceCollection.cs" />
+ <Compile Include="MonoDevelop.Packaging\AddPlatformImplementationHandler.cs" />
+ <Compile Include="MonoDevelop.Packaging.Gui\AddPlatformImplementationDialog.cs" />
+ <Compile Include="MonoDevelop.Packaging.Gui\AddPlatformImplementationDialog.UI.cs">
+ <DependentUpon>AddPlatformImplementationDialog.cs</DependentUpon>
+ </Compile>
+ <Compile Include="MonoDevelop.Packaging\AddPlatformImplementationViewModel.cs" />
+ <Compile Include="MonoDevelop.Packaging\ProjectFileMigrator.cs" />
+ <Compile Include="MonoDevelop.Packaging.Templating\CrossPlatformLibraryTemplateWizard.cs" />
+ <Compile Include="MonoDevelop.Packaging.Gui\GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.cs" />
+ <Compile Include="gtk-gui\MonoDevelop.Packaging.Gui.GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.cs" />
+ <Compile Include="MonoDevelop.Packaging.Templating\CrossPlatformLibraryTemplateWizardPage.cs" />
+ <Compile Include="MonoDevelop.Packaging.OptionPanels\ReferenceAssembliesOptionsPanel.cs" />
+ <Compile Include="MonoDevelop.Packaging.Gui\GtkReferenceAssembliesOptionsPanelWidget.cs" />
+ <Compile Include="MonoDevelop.Packaging.Gui\GtkReferenceAssembliesOptionsPanelWidget.UI.cs">
+ <DependentUpon>GtkReferenceAssembliesOptionsPanelWidget.cs</DependentUpon>
+ </Compile>
+ <Compile Include="MonoDevelop.Packaging\ReferenceAssemblyFrameworkCollection.cs" />
+ <Compile Include="MonoDevelop.Packaging\ReferenceAssemblyFramework.cs" />
+ <Compile Include="MonoDevelop.Packaging\NuGetProjectReferencePropertyProvider.cs" />
+ <Compile Include="MonoDevelop.Packaging\NuGetProjectReferencePropertyDescriptor.cs" />
+ <Compile Include="MonoDevelop.Packaging\DotNetProjectPackagingExtension.cs" />
+ <Compile Include="MonoDevelop.Packaging\CreateNuGetPackageBuildTarget.cs" />
+ <Compile Include="MonoDevelop.Packaging.Gui\GtkProjectNuGetBuildOptionsPanelWidget.cs" />
+ <Compile Include="MonoDevelop.Packaging.Gui\GtkProjectNuGetBuildOptionsPanelWidget.UI.cs">
+ <DependentUpon>GtkProjectNuGetBuildOptionsPanelWidget.cs</DependentUpon>
+ </Compile>
+ <Compile Include="MonoDevelop.Packaging.OptionPanels\ProjectNuGetBuildOptionsPanel.cs" />
+ <Compile Include="MonoDevelop.Packaging\ProjectIsDotNetProjectOnlyCondition.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\core\MonoDevelop.Core\MonoDevelop.Core.csproj">
+ <Project>{7525BB88-6142-4A26-93B9-A30C6983390A}</Project>
+ <Name>MonoDevelop.Core</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ <ProjectReference Include="..\..\core\MonoDevelop.Ide\MonoDevelop.Ide.csproj">
+ <Project>{27096E7F-C91C-4AC6-B289-6897A701DF21}</Project>
+ <Name>MonoDevelop.Ide</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\external\mono-addins\Mono.Addins\Mono.Addins.csproj">
+ <Project>{91DD5A2D-9FE3-4C3C-9253-876141874DAD}</Project>
+ <Name>Mono.Addins</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ <ProjectReference Include="..\MonoDevelop.DesignerSupport\MonoDevelop.DesignerSupport.csproj">
+ <Project>{2C24D515-4A2C-445C-8419-C09231913CFA}</Project>
+ <Name>MonoDevelop.DesignerSupport</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ <ProjectReference Include="..\MonoDevelop.PackageManagement\MonoDevelop.PackageManagement.csproj">
+ <Project>{F218643D-2E74-4309-820E-206A54B7133F}</Project>
+ <Name>MonoDevelop.PackageManagement</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ <ProjectReference Include="..\..\..\external\xwt\Xwt\Xwt.csproj">
+ <Project>{92494904-35FA-4DC9-BDE9-3A3E87AC49D3}</Project>
+ <Name>Xwt</Name>
+ <Private>False</Private>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="MonoDevelop.Packaging.addin.xml">
+ <LogicalName>MonoDevelop.Packaging.addin.xml</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="gtk-gui\gui.stetic">
+ <LogicalName>gui.stetic</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Templates\Images\preview-multiplatform-library.png">
+ <LogicalName>preview-multiplatform-library.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Templates\Images\preview-multiplatform-library%402x.png">
+ <LogicalName>preview-multiplatform-library@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Templates\Images\preview-multiplatform-library~dark.png">
+ <LogicalName>preview-multiplatform-library~dark.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Templates\Images\preview-multiplatform-library~dark%402x.png">
+ <LogicalName>preview-multiplatform-library~dark@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Templates\Images\preview-nuget.png">
+ <LogicalName>preview-nuget.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Templates\Images\preview-nuget%402x.png">
+ <LogicalName>preview-nuget@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Templates\Images\preview-nuget~dark.png">
+ <LogicalName>preview-nuget~dark.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Templates\Images\preview-nuget~dark%402x.png">
+ <LogicalName>preview-nuget~dark@2x.png</LogicalName>
+ </EmbeddedResource>
+ </ItemGroup>
+ <ItemGroup>
+ <Folder Include="Templates\" />
+ <Folder Include="MonoDevelop.Packaging.Templating\" />
+ <Folder Include="MonoDevelop.Packaging.Gui\" />
+ <Folder Include="MonoDevelop.Packaging.OptionPanels\" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="packages.config" />
+ <None Include="Targets\NuGet.Packaging.Authoring.props">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="Targets\NuGet.Packaging.Authoring.targets">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="Templates\CrossPlatformLibrary.xpt.xml">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ <None Include="Templates\PackagingProject.xpt.xml">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <Import Project="PostBuild.proj" />
+</Project> \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/AddPlatformImplementationHandler.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/AddPlatformImplementationHandler.cs
new file mode 100644
index 0000000000..08bc792157
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/AddPlatformImplementationHandler.cs
@@ -0,0 +1,72 @@
+//
+// AddPlatformImplementationHandler.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Components.Commands;
+using MonoDevelop.Core;
+using MonoDevelop.Ide;
+using MonoDevelop.Ide.Gui;
+using MonoDevelop.Packaging.Gui;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ class AddPlatformImplementationHandler : CommandHandler
+ {
+ protected override void Update (CommandInfo info)
+ {
+ var project = IdeApp.ProjectOperations.CurrentSelectedProject as DotNetProject;
+ info.Visible = project?.IsPortableLibrary == true;
+ }
+
+ protected override async void Run ()
+ {
+ var project = IdeApp.ProjectOperations.CurrentSelectedProject as DotNetProject;
+ if (project == null || !project.IsPortableLibrary)
+ return;
+
+ var viewModel = new AddPlatformImplementationViewModel (project);
+ using (var dialog = new AddPlatformImplementationDialog (viewModel)) {
+ if (dialog.ShowWithParent () == Xwt.Command.Ok) {
+ using (ProgressMonitor monitor = CreateProgressMonitor ()) {
+ await viewModel.CreateProjects (monitor);
+ }
+ }
+ }
+ }
+
+ ProgressMonitor CreateProgressMonitor ()
+ {
+ return IdeApp.Workbench.ProgressMonitors.GetStatusProgressMonitor (
+ GettextCatalog.GetString ("Adding platform implementation..."),
+ Stock.StatusSolutionOperation,
+ false,
+ false,
+ false,
+ null,
+ false);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/AddPlatformImplementationViewModel.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/AddPlatformImplementationViewModel.cs
new file mode 100644
index 0000000000..70f4be5087
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/AddPlatformImplementationViewModel.cs
@@ -0,0 +1,336 @@
+//
+// AddPlatformImplementationViewModel.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Xml;
+using MonoDevelop.Core;
+using MonoDevelop.Core.Assemblies;
+using MonoDevelop.Ide.Templates;
+using MonoDevelop.PackageManagement;
+using MonoDevelop.Projects;
+using MonoDevelop.Projects.SharedAssetsProjects;
+
+namespace MonoDevelop.Packaging
+{
+ class AddPlatformImplementationViewModel
+ {
+ public bool CreateAndroidProject { get; set; }
+ public bool CreateIOSProject { get; set; }
+ public bool CreateSharedProject { get; set; }
+
+ public bool IsCreateAndroidProjectEnabled { get; set; }
+ public bool IsCreateIOSProjectEnabled { get; set; }
+ public bool IsCreateSharedProjectEnabled { get; set; }
+
+ public DotNetProject Project { get; set; }
+
+ SharedAssetsProject sharedProject;
+ DotNetProject androidProject;
+ DotNetProject iosProject;
+ PackagingProject packagingProject;
+
+ FilePath projectsBaseDirectory;
+
+ public AddPlatformImplementationViewModel (DotNetProject project)
+ {
+ Project = project;
+
+ ConfigureSettings ();
+ }
+
+ void ConfigureSettings ()
+ {
+ IsCreateAndroidProjectEnabled = Services.ProjectService.CanCreateProject ("C#", "MonoDroid");
+ IsCreateIOSProjectEnabled = Services.ProjectService.CanCreateProject ("C#", "XamarinIOS");
+ IsCreateSharedProjectEnabled = Services.ProjectService.CanCreateProject ("SharedAssetsProject");
+ }
+
+ public bool AnyItemsToCreate ()
+ {
+ return CreateAndroidProject || CreateIOSProject || CreateSharedProject;
+ }
+
+ public async Task CreateProjects (ProgressMonitor monitor)
+ {
+ if (CreateSharedProject) {
+ await CreateNewSharedProject (monitor);
+ }
+
+ if (CreateAndroidProject) {
+ await CreateNewAndroidProject (monitor);
+ }
+
+ if (CreateIOSProject) {
+ await CreateNewIOSProject (monitor);
+ }
+
+ await CreateNuGetPackagingProject (monitor);
+
+ if (CreateSharedProject) {
+ await MigrateFiles (monitor);
+ }
+
+ await Project.ParentSolution.SaveAsync (monitor);
+
+ AddNuGetPackages ();
+ }
+
+ async Task CreateNewSharedProject (ProgressMonitor monitor)
+ {
+ sharedProject = new SharedAssetsProject ("C#");
+ sharedProject.FileName = GetNewProjectFileName ("SharedAssetsProject");
+ sharedProject.DefaultNamespace = Project.DefaultNamespace;
+ Project.ParentFolder.AddItem (sharedProject);
+
+ await SaveProject (monitor, sharedProject);
+
+ await Project.ParentSolution.SaveAsync (monitor);
+
+ AddProjectReference (Project, sharedProject);
+
+ await Project.SaveAsync (monitor);
+ }
+
+ async Task CreateNewAndroidProject (ProgressMonitor monitor)
+ {
+ androidProject = await CreateNewProject (monitor, "MonoDroid", true) as DotNetProject;
+
+ if (sharedProject != null)
+ AddProjectReference (androidProject, sharedProject);
+ }
+
+ async Task CreateNewIOSProject (ProgressMonitor monitor)
+ {
+ iosProject = await CreateNewProject (monitor, "XamarinIOS", true) as DotNetProject;
+
+ if (sharedProject != null)
+ AddProjectReference (iosProject, sharedProject);
+ }
+
+ async Task MigrateFiles (ProgressMonitor monitor)
+ {
+ var migrator = new ProjectFileMigrator ();
+ migrator.MigrateFiles (Project, sharedProject);
+
+ await SaveProject (monitor, Project);
+ await SaveProject (monitor, sharedProject);
+ }
+
+ async Task<DotNetProject> CreateNewProject (ProgressMonitor monitor, string projectType, bool addAssemblyInfo = false)
+ {
+ FilePath projectFileName = GetNewProjectFileName (projectType);
+ var createInfo = CreateProjectCreateInformation (projectFileName);
+ var options = CreateProjectOptions ();
+
+ var newProject = Services.ProjectService.CreateProject ("C#", createInfo, options, projectType) as DotNetProject;
+
+ newProject.FileName = projectFileName;
+ newProject.DefaultNamespace = Project.DefaultNamespace;
+ newProject.SetOutputAssemblyName (GetOutputAssemblyName ());
+
+ if (addAssemblyInfo)
+ AddAssemblyInfoFile (newProject);
+
+ Project.ParentFolder.AddItem (newProject);
+
+ await SaveProject (monitor, newProject);
+
+ return newProject;
+ }
+
+ string GetOutputAssemblyName ()
+ {
+ var config = Project.Configurations.OfType<DotNetProjectConfiguration> ().FirstOrDefault ();
+ if (config != null) {
+ return config.OutputAssembly;
+ }
+
+ return Project.Name;
+ }
+
+ ProjectCreateInformation CreateProjectCreateInformation (FilePath projectFileName)
+ {
+ return new ProjectCreateInformation {
+ ProjectBasePath = projectFileName.ParentDirectory,
+ SolutionPath = Project.ParentSolution.BaseDirectory,
+ ProjectName = projectFileName.FileNameWithoutExtension
+ };
+ }
+
+ XmlElement CreateProjectOptions ()
+ {
+ var doc = new XmlDocument ();
+ doc.LoadXml ("<Options Target='Library' HideGettingStarted='true' />");
+ return doc.DocumentElement;
+ }
+
+ void AddAssemblyInfoFile (Project project)
+ {
+ var doc = new XmlDocument ();
+ doc.LoadXml ("<FileTemplateReference TemplateID='CSharpAssemblyInfo' name='AssemblyInfo.cs' />");
+ var fileTemplate = new FileTemplateReference ();
+ fileTemplate.Load (doc.DocumentElement, null);
+
+ var parameters = new ProjectCreateParameters();
+ parameters["UseCustomAssemblyInfoVersion"] = "true";
+ parameters["AssemblyInfoVersion"] = "1.0.0.0";
+
+ fileTemplate.SetProjectTagModel(parameters);
+ fileTemplate.AddToProject (project.ParentFolder, project, "C#", project.BaseDirectory, "");
+ fileTemplate.SetProjectTagModel(null);
+ }
+
+ Task SaveProject (ProgressMonitor monitor, Project project)
+ {
+ Directory.CreateDirectory (project.BaseDirectory);
+ return project.SaveAsync (monitor);
+ }
+
+ FilePath GetNewProjectFileName (string projectType)
+ {
+ string projectNameSuffix = GetProjectNameSuffix (projectType);
+ string fileExtension = GetProjectFileExtension (projectType);
+ FilePath projectDirectory = ProjectsBaseDirectory.Combine (Project.Name + "." + projectNameSuffix);
+ return projectDirectory.Combine (string.Format ("{0}.{1}{2}", Project.Name, projectNameSuffix, fileExtension));
+ }
+
+ FilePath ProjectsBaseDirectory {
+ get {
+ if (projectsBaseDirectory.IsNull) {
+ if (Project.BaseDirectory == Project.ParentSolution.BaseDirectory)
+ projectsBaseDirectory = Project.ParentSolution.BaseDirectory;
+ else
+ projectsBaseDirectory = Project.BaseDirectory.ParentDirectory;
+ }
+
+ return projectsBaseDirectory;
+ }
+ }
+
+ static string GetProjectNameSuffix (string projectType)
+ {
+ switch (projectType) {
+ case "MonoDroid":
+ return "Android";
+
+ case "XamarinIOS":
+ return "iOS";
+
+ case "SharedAssetsProject":
+ return "Shared";
+
+ case "NuGetPackaging":
+ return "NuGet";
+
+ default:
+ return projectType;
+ }
+ }
+
+ static string GetProjectFileExtension (string projectType)
+ {
+ if (projectType == "SharedAssetsProject")
+ return ".shproj";
+
+ if (projectType == "NuGetPackaging")
+ return ".nuproj";
+
+ return ".csproj";
+ }
+
+ async Task CreateNuGetPackagingProject (ProgressMonitor monitor)
+ {
+ FilePath projectFileName = GetNewProjectFileName ("NuGetPackaging");
+ packagingProject = Services.ProjectService.CreateProject ("NuGetPackaging") as PackagingProject;
+ packagingProject.FileName = projectFileName;
+
+ var createInfo = CreateProjectCreateInformation (projectFileName);
+ packagingProject.InitializeFromTemplate (createInfo, CreateProjectOptions ());
+
+ var moniker = new TargetFrameworkMoniker (TargetFrameworkMoniker.ID_NET_FRAMEWORK, "4.5", null);
+ packagingProject.TargetFramework = Runtime.SystemAssemblyService.GetTargetFramework (moniker);
+
+ MoveNuGetPackageMetadataToPackagingProject ();
+
+ await Project.SaveAsync (monitor);
+
+ Project.ParentFolder.AddItem (packagingProject);
+ AddNuGetPackagingProjectReferences ();
+
+ await SaveProject (monitor, packagingProject);
+ }
+
+ void AddNuGetPackagingProjectReferences ()
+ {
+ AddProjectReference (packagingProject, Project);
+
+ if (androidProject != null)
+ AddProjectReference (packagingProject, androidProject);
+
+ if (iosProject != null)
+ AddProjectReference (packagingProject, iosProject);
+ }
+
+ void AddProjectReference (DotNetProject project, Project projectToBeReferenced)
+ {
+ project.References.Add (ProjectReference.CreateProjectReference (projectToBeReferenced));
+ }
+
+ string GetAddinFolder ()
+ {
+ return Path.GetDirectoryName (typeof(AddPlatformImplementationViewModel).Assembly.Location);
+ }
+
+ void MoveNuGetPackageMetadataToPackagingProject ()
+ {
+ var metadata = new NuGetPackageMetadata ();
+ metadata.Load (Project);
+ packagingProject.UpdatePackageMetadata (metadata);
+
+ // Remove NuGet package metadata from original project.
+ metadata = new NuGetPackageMetadata ();
+ metadata.UpdateProject (Project);
+ }
+
+ protected virtual void AddNuGetPackages ()
+ {
+ var projects = new List<DotNetProject> ();
+
+ if (iosProject != null)
+ projects.Add (iosProject);
+
+ if (androidProject != null)
+ projects.Add (androidProject);
+
+ projects.Add (packagingProject);
+
+ DotNetProjectExtensions.InstallBuildPackagingNuGetPackage (projects);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/CreateNuGetPackageBuildTarget.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/CreateNuGetPackageBuildTarget.cs
new file mode 100644
index 0000000000..85df6eeaba
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/CreateNuGetPackageBuildTarget.cs
@@ -0,0 +1,115 @@
+//
+// CreateNuGetPackageBuildTarget.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using MonoDevelop.Core;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ class CreateNuGetPackageBuildTarget : IBuildTarget
+ {
+ DotNetProject project;
+
+ public CreateNuGetPackageBuildTarget (DotNetProject project)
+ {
+ this.project = project;
+ }
+
+ public string Name {
+ get { return project.Name; }
+ }
+
+ /// <summary>
+ /// If the project is a NuGet packaging project then just use the normal build target.
+ /// This ensures that the dependent projects are built.
+ ///
+ /// Otherwise the Pack target is called.
+ /// </summary>
+ public async Task<BuildResult> Build (ProgressMonitor monitor, ConfigurationSelector configuration, bool buildReferencedTargets = false, OperationContext operationContext = null)
+ {
+ if (project is PackagingProject) {
+ return await project.Build (monitor, configuration, buildReferencedTargets, new TargetEvaluationContext (operationContext));
+ } else {
+ return await Pack (monitor, configuration, buildReferencedTargets, operationContext);
+ }
+ }
+
+ async Task<BuildResult> Pack (ProgressMonitor monitor, ConfigurationSelector configuration, bool buildReferencedTargets, OperationContext operationContext)
+ {
+ var result = new BuildResult ();
+
+ // Build the project and any dependencies first.
+ if (buildReferencedTargets && project.GetReferencedItems (configuration).Any ()) {
+ result = await project.Build (monitor, configuration, buildReferencedTargets, operationContext);
+ if (result.Failed)
+ return result;
+ }
+
+ // Generate the NuGet package by calling the Pack target.
+ var packResult = (await project.RunTarget (monitor, "Pack", configuration, new TargetEvaluationContext (operationContext))).BuildResult;
+ return result.Append (packResult);
+ }
+
+ public bool CanBuild (ConfigurationSelector configuration)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public bool CanExecute (ExecutionContext context, ConfigurationSelector configuration)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public Task<BuildResult> Clean (ProgressMonitor monitor, ConfigurationSelector configuration, OperationContext operationContext = null)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public Task Execute (ProgressMonitor monitor, ExecutionContext context, ConfigurationSelector configuration)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public IEnumerable<IBuildTarget> GetExecutionDependencies ()
+ {
+ throw new NotImplementedException ();
+ }
+
+ public bool NeedsBuilding (ConfigurationSelector configuration)
+ {
+ throw new NotImplementedException ();
+ }
+
+ public Task PrepareExecution (ProgressMonitor monitor, ExecutionContext context, ConfigurationSelector configuration)
+ {
+ throw new NotImplementedException ();
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/CreateNuGetPackageHandler.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/CreateNuGetPackageHandler.cs
new file mode 100644
index 0000000000..0b80f3d346
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/CreateNuGetPackageHandler.cs
@@ -0,0 +1,46 @@
+//
+// CreateNuGetPackageHandler.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Components.Commands;
+using MonoDevelop.Ide;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ class CreateNuGetPackageHandler : CommandHandler
+ {
+ protected override void Run ()
+ {
+ var project = IdeApp.ProjectOperations.CurrentSelectedProject as DotNetProject;
+ if (project == null)
+ return;
+
+ var buildTarget = new CreateNuGetPackageBuildTarget (project);
+ IdeApp.ProjectOperations.Build (buildTarget);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/DotNetProjectExtensions.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/DotNetProjectExtensions.cs
new file mode 100644
index 0000000000..9fcdcee220
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/DotNetProjectExtensions.cs
@@ -0,0 +1,89 @@
+//
+// DotNetProjectExtensions.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using MonoDevelop.PackageManagement;
+using MonoDevelop.Projects;
+using MonoDevelop.Projects.MSBuild;
+
+namespace MonoDevelop.Packaging
+{
+ static class DotNetProjectExtensions
+ {
+ public static bool HasNuGetMetadata (this DotNetProject project)
+ {
+ MSBuildPropertyGroup propertyGroup = project.MSBuildProject.GetNuGetMetadataPropertyGroup ();
+ return propertyGroup.HasProperty ("PackageId");
+ }
+
+ public static void SetOutputAssemblyName (this DotNetProject project, string name)
+ {
+ foreach (var configuration in project.Configurations.OfType<DotNetProjectConfiguration> ()) {
+ configuration.OutputAssembly = name;
+ }
+ }
+
+ public static bool IsBuildPackagingNuGetPackageInstalled (this DotNetProject project)
+ {
+ return PackageManagementServices.ProjectOperations.GetInstalledPackages (project)
+ .Any (package => string.Equals ("NuGet.Build.Packaging", package.Id, StringComparison.OrdinalIgnoreCase));
+ }
+
+ public static void InstallBuildPackagingNuGetPackage (this Project project)
+ {
+ InstallBuildPackagingNuGetPackage (new [] { project });
+ }
+
+ static string GetPackagesFolder ()
+ {
+ return Path.Combine (
+ Path.GetDirectoryName (typeof (DotNetProjectExtensions).Assembly.Location),
+ "packages");
+ }
+
+ public static void InstallBuildPackagingNuGetPackage (IEnumerable<Project> projects)
+ {
+ string packagesFolder = GetPackagesFolder ();
+ var packageReference = new PackageManagementPackageReference ("NuGet.Build.Packaging", "0.1.157-dev");
+
+ var packageReferences = new [] { packageReference };
+
+ var projectOperations = PackageManagementServices.ProjectOperations as PackageManagementProjectOperations;
+
+ var actions = new List<INuGetPackageAction> ();
+ foreach (Project project in projects) {
+ actions.AddRange (projectOperations.CreateInstallActions (packagesFolder, project, packageReferences));
+ }
+
+ var message = ProgressMonitorStatusMessageFactory.CreateInstallingProjectTemplatePackagesMessage ();
+ PackageManagementServices.BackgroundPackageActionRunner.Run (message, actions);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/DotNetProjectPackagingExtension.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/DotNetProjectPackagingExtension.cs
new file mode 100644
index 0000000000..5ecb927df0
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/DotNetProjectPackagingExtension.cs
@@ -0,0 +1,117 @@
+//
+// DotNetProjectPackagingExtension.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Linq;
+using MonoDevelop.Core;
+using MonoDevelop.Projects;
+using MonoDevelop.Projects.MSBuild;
+
+namespace MonoDevelop.Packaging
+{
+ class DotNetProjectPackagingExtension : DotNetProjectExtension
+ {
+ public bool InstallBuildPackagingNuGetAfterWrite { get; set; }
+
+ // Used by unit tests only.
+ internal bool GetRequiresMSBuild ()
+ {
+ return RequiresMicrosoftBuild;
+ }
+
+ protected override void OnReadProjectHeader (ProgressMonitor monitor, MSBuildProject msproject)
+ {
+ base.OnReadProjectHeader (monitor, msproject);
+
+ UpdateRequiresMSBuildSetting (msproject);
+ }
+
+ protected override void OnWriteProject (ProgressMonitor monitor, MSBuildProject msproject)
+ {
+ base.OnWriteProject (monitor, msproject);
+
+ UpdateRequiresMSBuildSetting (msproject, true);
+
+ if (InstallBuildPackagingNuGetAfterWrite) {
+ InstallBuildPackagingNuGetAfterWrite = false;
+ Project.InstallBuildPackagingNuGetPackage ();
+ }
+ }
+
+ void UpdateRequiresMSBuildSetting (MSBuildProject msproject, bool reloadProjectBuilder = false)
+ {
+ if (!RequiresMicrosoftBuild) {
+ RequiresMicrosoftBuild = msproject.HasNuGetMetadata ();
+ if (reloadProjectBuilder && RequiresMicrosoftBuild) {
+ Project.ReloadProjectBuilder ();
+ EnsureReferencedProjectsRequireMSBuild (reloadProjectBuilder);
+ }
+ }
+ }
+
+ protected override void OnReferenceAddedToProject (ProjectReferenceEventArgs e)
+ {
+ base.OnReferenceAddedToProject (e);
+
+ if (Project.Loading)
+ return;
+
+ if (RequiresMicrosoftBuild && e.ProjectReference.ReferenceType == ReferenceType.Project) {
+ EnsureReferencedProjectsRequireMSBuild (true);
+ }
+ }
+
+ protected override void OnItemReady ()
+ {
+ if (RequiresMicrosoftBuild) {
+ EnsureReferencedProjectsRequireMSBuild ();
+ }
+ }
+
+ internal void EnsureReferencedProjectsRequireMSBuild (bool reloadProjectBuilder = false)
+ {
+ if (Project.ParentSolution == null)
+ return;
+
+ try {
+ foreach (var reference in Project.References.Where (projectReference => projectReference.ReferenceType == ReferenceType.Project)) {
+ var referencedProject = reference.ResolveProject (Project.ParentSolution);
+ if (referencedProject != null) {
+ var flavor = referencedProject.GetFlavor<DotNetProjectPackagingExtension> ();
+ if (flavor?.RequiresMicrosoftBuild == false) {
+ flavor.RequiresMicrosoftBuild = true;
+ flavor.EnsureReferencedProjectsRequireMSBuild (reloadProjectBuilder);
+ if (reloadProjectBuilder)
+ referencedProject.ReloadProjectBuilder ();
+ }
+ }
+ }
+ } catch (Exception ex) {
+ LoggingService.LogError ("Unable to update RequiresMicrosoftBuild.", ex);
+ }
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/MSBuildGlobalPropertyProvider.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/MSBuildGlobalPropertyProvider.cs
new file mode 100644
index 0000000000..a8d71b8ddf
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/MSBuildGlobalPropertyProvider.cs
@@ -0,0 +1,55 @@
+//
+// MSBuildGlobalPropertyProvider.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using MonoDevelop.Projects.MSBuild;
+
+namespace MonoDevelop.Packaging
+{
+ class MSBuildGlobalPropertyProvider : IMSBuildGlobalPropertyProvider
+ {
+ Dictionary<string, string> properties;
+
+ #pragma warning disable 67
+ public event EventHandler GlobalPropertiesChanged;
+ #pragma warning restore 67
+
+ public IDictionary<string, string> GetGlobalProperties ()
+ {
+ if (properties == null) {
+ string addinDirectory = Path.GetDirectoryName (GetType ().Assembly.Location);
+ string targetsDirectory = Path.Combine (addinDirectory, "Targets");
+
+ properties = new Dictionary<string, string> ();
+ properties.Add ("NuGetAuthoringPath", targetsDirectory);
+ }
+ return properties;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/MSBuildProjectExtensions.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/MSBuildProjectExtensions.cs
new file mode 100644
index 0000000000..018dc81eab
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/MSBuildProjectExtensions.cs
@@ -0,0 +1,104 @@
+//
+// MSBuildProjectExtensions.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+
+using System.Linq;
+using MonoDevelop.Projects.MSBuild;
+
+namespace MonoDevelop.Packaging
+{
+ internal static class MSBuildProjectExtensions
+ {
+ public static void AddImportIfMissing (
+ this MSBuildProject project,
+ string importedProjectFile,
+ bool importAtTop,
+ string condition)
+ {
+ if (project.ImportExists (importedProjectFile))
+ return;
+
+ project.AddImport (importedProjectFile, importAtTop, condition);
+ }
+
+ public static void AddImport (
+ this MSBuildProject project,
+ string importedProjectFile,
+ bool importAtTop,
+ string condition)
+ {
+ MSBuildObject before = GetInsertBeforeObject (project, importAtTop);
+ project.AddNewImport (importedProjectFile, condition, before);
+ }
+
+ static MSBuildObject GetInsertBeforeObject (MSBuildProject project, bool importAtTop)
+ {
+ if (importAtTop) {
+ return project.GetAllObjects ().FirstOrDefault ();
+ }
+
+ // Return an unknown MSBuildItem instead of null so the MSBuildProject adds the import as the last
+ // child in the project.
+ return new MSBuildItem ();
+ }
+
+ public static void RemoveImportIfExists (this MSBuildProject project, string importedProjectFile)
+ {
+ project.RemoveImport (importedProjectFile);
+ }
+
+ public static bool ImportExists (this MSBuildProject project, string importedProjectFile)
+ {
+ return project.GetImport (importedProjectFile) != null;
+ }
+
+ public static MSBuildPropertyGroup GetNuGetMetadataPropertyGroup (this MSBuildProject project)
+ {
+ MSBuildPropertyGroup propertyGroup = project.GetExistingNuGetMetadataPropertyGroup ();
+ if (propertyGroup != null)
+ return propertyGroup;
+
+ return project.GetGlobalPropertyGroup ();
+ }
+
+ static MSBuildPropertyGroup GetExistingNuGetMetadataPropertyGroup (this MSBuildProject project)
+ {
+ foreach (MSBuildPropertyGroup propertyGroup in project.PropertyGroups) {
+ if (propertyGroup.HasProperty (NuGetPackageMetadata.PackageIdPropertyName))
+ return propertyGroup;
+ }
+
+ return null;
+ }
+
+ public static bool HasNuGetMetadata (this MSBuildProject project)
+ {
+ return project.GetExistingNuGetMetadataPropertyGroup () != null;
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetFileDescriptor.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetFileDescriptor.cs
new file mode 100644
index 0000000000..80f430e04d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetFileDescriptor.cs
@@ -0,0 +1,64 @@
+//
+// NuGetFileDescriptor.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Core;
+using MonoDevelop.DesignerSupport;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ class NuGetFileDescriptor : CustomDescriptor
+ {
+ ProjectFile projectFile;
+
+ public NuGetFileDescriptor (ProjectFile file)
+ {
+ projectFile = file;
+ }
+
+ [LocalizedCategory ("NuGet")]
+ [LocalizedDescription ("Specifies whether the file will be included in the package. Supported for None items only.")]
+ [LocalizedDisplayName ("Include in Package")]
+ public bool IncludeInPackage {
+ get {
+ return projectFile.Metadata.GetValue<bool> (nameof (IncludeInPackage), false);
+ }
+ set {
+ if (value) {
+ projectFile.Metadata.SetValue (nameof (IncludeInPackage), value, false);
+ } else {
+ // HACK: Removing the property does not seem to work. Nor does setting the
+ // value back to its default value of false work which also removes the
+ // property. The saved project file still has the property. For now
+ // working around this by setting it to false but changing the default value to
+ // true so the property is not removed.
+ projectFile.Metadata.SetValue (nameof (IncludeInPackage), value, true);
+ }
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetFilePropertyProvider.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetFilePropertyProvider.cs
new file mode 100644
index 0000000000..0134ce7f91
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetFilePropertyProvider.cs
@@ -0,0 +1,45 @@
+//
+// NuGetFilePropertyProvider.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.DesignerSupport;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ class NuGetFilePropertyProvider : IPropertyProvider
+ {
+ public object CreateProvider (object obj)
+ {
+ return new NuGetFileDescriptor ((ProjectFile)obj);
+ }
+
+ public bool SupportsObject (object obj)
+ {
+ return obj is ProjectFile;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetPackageMetadata.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetPackageMetadata.cs
new file mode 100644
index 0000000000..572ef2910a
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetPackageMetadata.cs
@@ -0,0 +1,159 @@
+//
+// NuGetPackageMetadata.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Projects;
+using MonoDevelop.Projects.MSBuild;
+
+namespace MonoDevelop.Packaging
+{
+ class NuGetPackageMetadata
+ {
+ public const int MaxPackageIdLength = 100;
+ public const string PackageIdPropertyName = "PackageId";
+
+ public string Id { get; set; }
+ public string Version { get; set; }
+ public string Authors { get; set; }
+ public string Description { get; set; }
+
+ public string Copyright { get; set; }
+ public bool DevelopmentDependency { get; set; }
+ public string IconUrl { get; set; }
+ public string Language { get; set; }
+ public string LicenseUrl { get; set; }
+ public string Owners { get; set; }
+ public string ProjectUrl { get; set; }
+ public string ReleaseNotes { get; set; }
+ public bool RequireLicenseAcceptance { get; set; }
+ public string Summary { get; set; }
+ public string Tags { get; set; }
+ public string Title { get; set; }
+
+ public void Load (DotNetProject project)
+ {
+ Description = project.Description;
+ Load (project.MSBuildProject);
+ }
+
+ public void UpdateProject (DotNetProject project)
+ {
+ project.Description = Description;
+ Update (project.MSBuildProject);
+ }
+
+ void Load (MSBuildProject project)
+ {
+ MSBuildPropertyGroup propertyGroup = project.GetNuGetMetadataPropertyGroup ();
+ Id = GetProperty (propertyGroup, PackageIdPropertyName);
+ Version = GetProperty (propertyGroup, "PackageVersion");
+ Authors = GetProperty (propertyGroup, "Authors");
+ DevelopmentDependency = GetProperty (propertyGroup, "DevelopmentDependency", false);
+ IconUrl = GetProperty (propertyGroup, "PackageIconUrl");
+ Language = GetProperty (propertyGroup, "NeutralLanguage");
+ LicenseUrl = GetProperty (propertyGroup, "PackageLicenseUrl");
+ Owners = GetProperty (propertyGroup, "Owners");
+ ProjectUrl = GetProperty (propertyGroup, "PackageProjectUrl");
+ ReleaseNotes = GetProperty (propertyGroup, "PackageReleaseNotes");
+ RequireLicenseAcceptance = GetProperty (propertyGroup, "PackageRequireLicenseAcceptance", false);
+ Summary = GetProperty (propertyGroup, "Summary");
+ Tags = GetProperty (propertyGroup, "PackageTags");
+ Title = GetProperty (propertyGroup, "Title");
+ }
+
+ string GetProperty (MSBuildPropertyGroup propertyGroup, string name)
+ {
+ return propertyGroup.GetProperty (name)?.Value;
+ }
+
+ bool GetProperty (MSBuildPropertyGroup propertyGroup, string name, bool defaultValue)
+ {
+ string value = GetProperty (propertyGroup, name);
+ if (string.IsNullOrEmpty (value))
+ return defaultValue;
+
+ bool result = false;
+ if (bool.TryParse (value, out result))
+ return result;
+
+ return defaultValue;
+ }
+
+ void Update (MSBuildProject project)
+ {
+ MSBuildPropertyGroup propertyGroup = project.GetNuGetMetadataPropertyGroup ();
+ SetProperty (propertyGroup, PackageIdPropertyName, Id);
+ SetProperty (propertyGroup, "PackageVersion", Version);
+ SetProperty (propertyGroup, "Authors", Authors);
+ SetProperty (propertyGroup, "DevelopmentDependency", DevelopmentDependency);
+ SetProperty (propertyGroup, "PackageIconUrl", IconUrl);
+ SetProperty (propertyGroup, "NeutralLanguage", Language);
+ SetProperty (propertyGroup, "PackageLicenseUrl", LicenseUrl);
+ SetProperty (propertyGroup, "PackageRequireLicenseAcceptance", RequireLicenseAcceptance);
+ SetProperty (propertyGroup, "Owners", Owners);
+ SetProperty (propertyGroup, "PackageProjectUrl", ProjectUrl);
+ SetProperty (propertyGroup, "PackageReleaseNotes", ReleaseNotes);
+ SetProperty (propertyGroup, "Summary", Summary);
+ SetProperty (propertyGroup, "PackageTags", Tags);
+ SetProperty (propertyGroup, "Title", Title);
+ }
+
+ void SetProperty (MSBuildPropertyGroup propertyGroup, string name, string value)
+ {
+ if (string.IsNullOrEmpty (value))
+ propertyGroup.RemoveProperty (name);
+ else
+ propertyGroup.SetValue (name, value);
+ }
+
+ void SetProperty (MSBuildPropertyGroup propertyGroup, string name, bool value)
+ {
+ if (value)
+ propertyGroup.SetValue (name, value);
+ else
+ propertyGroup.RemoveProperty (name);
+ }
+
+ public bool IsEmpty ()
+ {
+ return string.IsNullOrEmpty (Id) &&
+ string.IsNullOrEmpty (Version) &&
+ string.IsNullOrEmpty (Authors) &&
+ string.IsNullOrEmpty (Copyright) &&
+ string.IsNullOrEmpty (Description) &&
+ !DevelopmentDependency &&
+ string.IsNullOrEmpty (IconUrl) &&
+ string.IsNullOrEmpty (Language) &&
+ string.IsNullOrEmpty (Owners) &&
+ string.IsNullOrEmpty (ProjectUrl) &&
+ string.IsNullOrEmpty (ReleaseNotes) &&
+ !RequireLicenseAcceptance &&
+ string.IsNullOrEmpty (Summary) &&
+ string.IsNullOrEmpty (Tags) &&
+ string.IsNullOrEmpty (Title);
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetProjectReferencePropertyDescriptor.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetProjectReferencePropertyDescriptor.cs
new file mode 100644
index 0000000000..b58369eb00
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetProjectReferencePropertyDescriptor.cs
@@ -0,0 +1,63 @@
+//
+// NuGetProjectReferencePropertyDescriptor.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Core;
+using MonoDevelop.DesignerSupport;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ public class NuGetProjectReferencePropertyDescriptor : CustomDescriptor
+ {
+ ProjectReference projectReference;
+
+ public NuGetProjectReferencePropertyDescriptor (ProjectReference projectReference)
+ {
+ this.projectReference = projectReference;
+ }
+
+ [LocalizedCategory ("NuGet")]
+ [LocalizedDescription ("Specifies whether the referenced project will be included in the package.")]
+ [LocalizedDisplayName ("Include in Package")]
+ public bool IncludeInPackage {
+ get {
+ return projectReference.Metadata.GetValue<bool> (nameof (IncludeInPackage), true);
+ }
+ set {
+ if (value) {
+ projectReference.Metadata.SetValue (nameof (IncludeInPackage), value, false);
+ } else {
+ // HACK: Removing the property does not seem to work. Nor does setting the
+ // value back to its default value of false work which also removes the
+ // property. The saved project file still has the property. For now
+ // working around this by setting it to false but changing the default value to
+ // true so the property is not removed.
+ projectReference.Metadata.SetValue (nameof (IncludeInPackage), value, true);
+ }
+ }
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetProjectReferencePropertyProvider.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetProjectReferencePropertyProvider.cs
new file mode 100644
index 0000000000..a6fa781adb
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/NuGetProjectReferencePropertyProvider.cs
@@ -0,0 +1,44 @@
+//
+// NuGetProjectReferencePropertyProvider.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.DesignerSupport;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ public class NuGetProjectReferencePropertyProvider : IPropertyProvider
+ {
+ public object CreateProvider (object obj)
+ {
+ return new NuGetProjectReferencePropertyDescriptor ((ProjectReference)obj);
+ }
+
+ public bool SupportsObject (object obj)
+ {
+ return obj is ProjectReference;
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackageReference.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackageReference.cs
new file mode 100644
index 0000000000..5660ce1187
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackageReference.cs
@@ -0,0 +1,61 @@
+//
+// PackageReference.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Core.Serialization;
+using MonoDevelop.Projects;
+using NuGet.Frameworks;
+using NuGet.Packaging.Core;
+using NuGet.Versioning;
+
+namespace MonoDevelop.Packaging
+{
+ [ExportProjectItemType ("PackageReference")]
+ class PackageReference : ProjectItem
+ {
+ internal PackageReference (PackageIdentity packageIdentity)
+ {
+ Include = packageIdentity.Id;
+ Version = packageIdentity.Version.ToString ();
+ }
+
+ public PackageReference ()
+ {
+ }
+
+ [ItemProperty ("Version")]
+ public string Version { get; set; }
+
+ [ItemProperty ("PrivateAssets")]
+ public string PrivateAssets { get; set; }
+
+ internal NuGet.Packaging.PackageReference ToNuGetPackageReference ()
+ {
+ var identity = new PackageIdentity (Include, new NuGetVersion (Version));
+ return new NuGet.Packaging.PackageReference (identity, NuGetFramework.Parse ("any"));
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackageReferenceCollection.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackageReferenceCollection.cs
new file mode 100644
index 0000000000..f3262a7bc0
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackageReferenceCollection.cs
@@ -0,0 +1,37 @@
+//
+// PackageReferenceCollection.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ [Serializable]
+ class PackageReferenceCollection : ProjectItemCollection<PackageReference>
+ {
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingCompilerParameters.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingCompilerParameters.cs
new file mode 100644
index 0000000000..c5d3299cce
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingCompilerParameters.cs
@@ -0,0 +1,35 @@
+//
+// PackagingCompilerParameters.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ class PackagingCompilerParameters : DotNetCompilerParameters
+ {
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingNuGetProject.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingNuGetProject.cs
new file mode 100644
index 0000000000..d1b707234b
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingNuGetProject.cs
@@ -0,0 +1,158 @@
+//
+// PackagingNuGetProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using MonoDevelop.Core;
+using MonoDevelop.PackageManagement;
+using NuGet.Frameworks;
+using NuGet.Packaging;
+using NuGet.Packaging.Core;
+using NuGet.ProjectManagement;
+using NuGet.ProjectManagement.Projects;
+using NuGet.Protocol.Core.Types;
+using NuGet.Versioning;
+
+namespace MonoDevelop.Packaging
+{
+ class PackagingNuGetProject : NuGetProject, INuGetIntegratedProject, IHasDotNetProject
+ {
+ PackagingProject project;
+
+ public PackagingNuGetProject (PackagingProject project)
+ {
+ this.project = project;
+
+ InternalMetadata.Add (NuGetProjectMetadataKeys.TargetFramework, NuGetFramework.Parse ("any"));
+ InternalMetadata.Add (NuGetProjectMetadataKeys.Name, project.Name);
+ InternalMetadata.Add (NuGetProjectMetadataKeys.UniqueName, project.Name);
+ }
+
+ public override async Task<IEnumerable<NuGet.Packaging.PackageReference>> GetInstalledPackagesAsync (CancellationToken token)
+ {
+ return await Runtime.RunInMainThread (() => {
+ return project
+ .PackageReferences
+ .Select (packageReference => packageReference.ToNuGetPackageReference ())
+ .ToList ();
+ });
+ }
+
+ public override async Task<bool> InstallPackageAsync (
+ PackageIdentity packageIdentity,
+ DownloadResourceResult downloadResourceResult,
+ INuGetProjectContext nuGetProjectContext,
+ CancellationToken token)
+ {
+ return await Runtime.RunInMainThread (async () => {
+
+ // Check if this NuGet package is already installed and should be removed.
+ PackageReference existingPackageReference = project.FindPackageReference (packageIdentity);
+ if (existingPackageReference != null) {
+ if (ShouldRemoveExistingPackageReference (existingPackageReference, packageIdentity)) {
+ project.PackageReferences.Remove (existingPackageReference);
+ } else {
+ nuGetProjectContext.Log (
+ MessageLevel.Info,
+ GettextCatalog.GetString ("Package '{0}' already installed.", packageIdentity));
+ return true;
+ }
+ }
+
+ bool developmentDependency = false;
+ if (IsNuGetBuildPackagingPackage (packageIdentity)) {
+ await GlobalPackagesExtractor.Extract (project.ParentSolution, packageIdentity, downloadResourceResult, token);
+
+ developmentDependency = true;
+ GenerateNuGetBuildPackagingTargets (packageIdentity);
+ }
+
+ var packageReference = new PackageReference (packageIdentity);
+ if (developmentDependency)
+ packageReference.PrivateAssets = "All";
+ project.PackageReferences.Add (packageReference);
+ await SaveProject ();
+ return true;
+ });
+ }
+
+ public override async Task<bool> UninstallPackageAsync (
+ PackageIdentity packageIdentity,
+ INuGetProjectContext nuGetProjectContext,
+ CancellationToken token)
+ {
+ return await Runtime.RunInMainThread (() => {
+ PackageReference packageReference = project.FindPackageReference (packageIdentity);
+ if (packageReference != null) {
+ project.PackageReferences.Remove (packageReference);
+ SaveProject ();
+ }
+ return true;
+ });
+ }
+
+ /// <summary>
+ /// If the package version is already installed then there is no need to install the
+ /// NuGet package.
+ /// </summary>
+ bool ShouldRemoveExistingPackageReference (PackageReference packageReference, PackageIdentity packageIdentity)
+ {
+ var existingPackageReference = packageReference.ToNuGetPackageReference ();
+ return !VersionComparer.Default.Equals (existingPackageReference.PackageIdentity.Version, packageIdentity.Version);
+ }
+
+ bool IsNuGetBuildPackagingPackage (PackageIdentity packageIdentity)
+ {
+ return StringComparer.OrdinalIgnoreCase.Equals (packageIdentity.Id, "NuGet.Build.Packaging");
+ }
+
+ void GenerateNuGetBuildPackagingTargets (PackageIdentity packageIdentity)
+ {
+ GenerateNuGetBuildPackagingTargets (packageIdentity, project);
+ }
+
+ public static void GenerateNuGetBuildPackagingTargets (PackageIdentity packageIdentity, PackagingProject project)
+ {
+ var packagePathResolver = new VersionFolderPathResolver (string.Empty);
+ string packageDirectory = packagePathResolver.GetPackageDirectory (packageIdentity.Id, packageIdentity.Version);
+ string buildDirectory = Path.Combine (packageDirectory, "build");
+ string prop = Path.Combine (buildDirectory, "NuGet.Build.Packaging.props");
+ string target = Path.Combine (buildDirectory, "NuGet.Build.Packaging.targets");
+
+ MSBuildNuGetImportGenerator.CreateImports (project, prop, target);
+ }
+
+ public Task SaveProject ()
+ {
+ return project.SaveAsync (new ProgressMonitor ());
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingProject.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingProject.cs
new file mode 100644
index 0000000000..5a5362bd52
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingProject.cs
@@ -0,0 +1,378 @@
+//
+// PackagingProject.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Xml;
+using MonoDevelop.Core;
+using MonoDevelop.Core.Assemblies;
+using MonoDevelop.Core.Serialization;
+using MonoDevelop.PackageManagement;
+using MonoDevelop.Projects;
+using MonoDevelop.Projects.MSBuild;
+using NuGet.Packaging.Core;
+using NuGet.ProjectManagement;
+
+namespace MonoDevelop.Packaging
+{
+ class PackagingProject : DotNetProject, INuGetAwareProject
+ {
+ PackageReferenceCollection packageReferences;
+ ReferenceAssemblyFrameworkCollection referenceAssemblyFrameworks;
+
+ public PackagingProject ()
+ {
+ UsePartialTypes = false;
+ RequiresMicrosoftBuild = true;
+ }
+
+ [ItemProperty ("PackageId")]
+ string id;
+
+ [ItemProperty ("PackageVersion")]
+ string version;
+
+ [ItemProperty ("Authors")]
+ string authors;
+
+ [ItemProperty ("Owners")]
+ string owners;
+
+ [ItemProperty ("Copyright")]
+ string copyright;
+
+ [ItemProperty ("DevelopmentDependency")]
+ bool developmentDependency;
+
+ [ItemProperty ("PackageTags")]
+ string tags;
+
+ [ItemProperty ("Title")]
+ string title;
+
+ [ItemProperty ("NeutralLanguage")]
+ string language;
+
+ [ItemProperty ("PackageReleaseNotes")]
+ string releaseNotes;
+
+ [ItemProperty ("Summary")]
+ string summary;
+
+ [ItemProperty ("PackageProjectUrl")]
+ string projectUrl;
+
+ [ItemProperty ("PackageIconUrl")]
+ string iconUrl;
+
+ [ItemProperty ("PackageLicenseUrl")]
+ string licenseUrl;
+
+ [ItemProperty ("PackageRequireLicenseAcceptance")]
+ bool requireLicenseAcceptance;
+
+ protected override DotNetCompilerParameters OnCreateCompilationParameters (
+ DotNetProjectConfiguration config,
+ ConfigurationKind kind)
+ {
+ return new PackagingCompilerParameters ();
+ }
+
+ protected override ClrVersion [] OnGetSupportedClrVersions ()
+ {
+ return new ClrVersion[] {
+ ClrVersion.Net_4_5
+ };
+ }
+
+ protected override bool OnSupportsFramework (TargetFramework framework)
+ {
+ bool result = base.OnSupportsFramework (framework);
+ if (result)
+ return result;
+
+ if (framework.Id.Identifier == ".NETFramework") {
+ Version frameworkVersion = null;
+ if (System.Version.TryParse (framework.Id.Version, out frameworkVersion)) {
+ return frameworkVersion.Major >= 4 && frameworkVersion.Minor >= 5;
+ }
+ }
+
+ return false;
+ }
+
+ protected override bool OnGetCanExecute (MonoDevelop.Projects.ExecutionContext context, ConfigurationSelector configuration)
+ {
+ return false;
+ }
+
+ protected override void PopulateOutputFileList (
+ List<FilePath> list,
+ ConfigurationSelector configuration)
+ {
+ list.Add (OnGetOutputFileName (configuration));
+ }
+
+ protected override void OnPrepareForEvaluation (MSBuildProject project)
+ {
+ MSBuildPropertyGroup globalGroup = project.GetGlobalPropertyGroup ();
+ var provider = new MSBuildGlobalPropertyProvider ();
+ foreach (KeyValuePair<string, string> property in provider.GetGlobalProperties ()) {
+ globalGroup.SetValue (property.Key, property.Value, property.Value);
+ }
+ }
+
+ protected override void OnGetDefaultImports (List<string> imports)
+ {
+ imports.Add (@"$(MSBuildBinPath)\Microsoft.Common.targets");
+ }
+
+ protected override void OnWriteProject (ProgressMonitor monitor, MSBuildProject msproject)
+ {
+ base.OnWriteProject (monitor, msproject);
+
+ bool newProject = FileName == null || msproject.IsNewProject;
+ if (newProject) {
+ AddPackagingPropsImport (msproject);
+ AddPackagingTargetsImport (msproject);
+ }
+ }
+
+ void AddPackagingPropsImport (MSBuildProject msproject)
+ {
+ MSBuildObject insertBefore = msproject.GetAllObjects ().FirstOrDefault ();
+ msproject.AddNewImport (
+ @"$(NuGetAuthoringPath)\NuGet.Packaging.Authoring.props",
+ @"Exists('$(NuGetAuthoringPath)\NuGet.Packaging.Authoring.props')",
+ insertBefore);
+ }
+
+ void AddPackagingTargetsImport (MSBuildProject msproject)
+ {
+ // Create dummy new msbuild object to ensure import is added as last child.
+ var insertBefore = new MSBuildItem ();
+ msproject.AddNewImport (
+ @"$(NuGetAuthoringPath)\NuGet.Packaging.Authoring.targets",
+ @"Exists('$(NuGetAuthoringPath)\NuGet.Packaging.Authoring.targets')",
+ insertBefore);
+ }
+
+ protected override string OnGetDefaultTargetPlatform (ProjectCreateInformation projectCreateInfo)
+ {
+ return String.Empty;
+ }
+
+ protected override void OnInitializeFromTemplate (ProjectCreateInformation projectCreateInfo, XmlElement projectOptions)
+ {
+ base.OnInitializeFromTemplate (projectCreateInfo, projectOptions);
+
+ id = projectCreateInfo.Parameters ["PackageId"];
+ version = projectCreateInfo.Parameters ["PackageVersion"];
+ authors = projectCreateInfo.Parameters ["PackageAuthors"];
+ Description = projectCreateInfo.Parameters ["PackageDescription"];
+ }
+
+ public NuGetPackageMetadata GetPackageMetadata ()
+ {
+ return new NuGetPackageMetadata {
+ Id = id,
+ Authors = authors,
+ Description = Description,
+ Version = version,
+
+ Copyright = copyright,
+ DevelopmentDependency = developmentDependency,
+ IconUrl = iconUrl,
+ Language = language,
+ LicenseUrl = licenseUrl,
+ ProjectUrl = projectUrl,
+ Owners = owners,
+ ReleaseNotes = releaseNotes,
+ RequireLicenseAcceptance = requireLicenseAcceptance,
+ Summary = summary,
+ Tags = tags,
+ Title = title
+ };
+ }
+
+ public void UpdatePackageMetadata (NuGetPackageMetadata metadata)
+ {
+ id = ToNullIfEmpty (metadata.Id);
+ version = ToNullIfEmpty (metadata.Version);
+ authors = ToNullIfEmpty (metadata.Authors);
+ Description = ToNullIfEmpty (metadata.Description);
+ copyright = ToNullIfEmpty (metadata.Copyright);
+ developmentDependency = metadata.DevelopmentDependency;
+ iconUrl = ToNullIfEmpty (metadata.IconUrl);
+ language = ToNullIfEmpty (metadata.Language);
+ licenseUrl = ToNullIfEmpty (metadata.LicenseUrl);
+ projectUrl = ToNullIfEmpty (metadata.ProjectUrl);
+ owners = ToNullIfEmpty (metadata.Owners);
+ releaseNotes = ToNullIfEmpty (metadata.ReleaseNotes);
+ requireLicenseAcceptance = metadata.RequireLicenseAcceptance;
+ summary = ToNullIfEmpty (metadata.Summary);
+ tags = ToNullIfEmpty (metadata.Tags);
+ title = ToNullIfEmpty (metadata.Title);
+ }
+
+ static string ToNullIfEmpty (string text)
+ {
+ if (String.IsNullOrEmpty (text))
+ return null;
+
+ return text;
+ }
+
+ protected override void OnReferenceAddedToProject (ProjectReferenceEventArgs e)
+ {
+ base.OnReferenceAddedToProject (e);
+
+ DotNetProject project = GetDotNetProject (e.ProjectReference);
+ if (project != null) {
+ EnsureBuildPackagingNuGetPackageIsInstalled (project);
+ }
+ }
+
+ DotNetProject GetDotNetProject (ProjectReference projectReference)
+ {
+ if (Loading || ParentSolution == null || projectReference.ReferenceType != ReferenceType.Project)
+ return null;
+
+ var project = projectReference.ResolveProject (ParentSolution) as DotNetProject;
+ if (!(project is PackagingProject))
+ return project;
+
+ return null;
+ }
+
+ protected override void OnInitialize ()
+ {
+ packageReferences = new PackageReferenceCollection ();
+ Items.Bind (packageReferences);
+
+ referenceAssemblyFrameworks = new ReferenceAssemblyFrameworkCollection ();
+ Items.Bind (referenceAssemblyFrameworks);
+
+ base.OnInitialize ();
+ }
+
+ public PackageReferenceCollection PackageReferences {
+ get { return packageReferences; }
+ }
+
+ public PackageReference FindPackageReference (PackageIdentity packageIdentity)
+ {
+ return PackageReferences.FirstOrDefault (packageReference => IsMatch (packageReference, packageIdentity));
+ }
+
+ bool IsMatch (PackageReference packageReference, PackageIdentity packageIdentity)
+ {
+ return String.Equals (packageReference.Include, packageIdentity.Id, StringComparison.OrdinalIgnoreCase);
+ }
+
+ public IEnumerable<TargetFrameworkMoniker> GetReferenceAssemblyFrameworks ()
+ {
+ return referenceAssemblyFrameworks.Select (item => item.GetTargetFrameworkMoniker ());
+ }
+
+ public void UpdateReferenceAssemblyFrameworks (IEnumerable<TargetFrameworkMoniker> frameworks)
+ {
+ referenceAssemblyFrameworks.Clear ();
+
+ referenceAssemblyFrameworks.AddRange (frameworks.Select (fx => new ReferenceAssemblyFramework (fx)));
+ }
+
+ PackageReference GetNuGetBuildPackagingPackageReference ()
+ {
+ return PackageReferences.FirstOrDefault (packageReference => IsNuGetBuildPackagingReference (packageReference));
+ }
+
+ bool IsNuGetBuildPackagingReference (PackageReference packageReference)
+ {
+ return StringComparer.OrdinalIgnoreCase.Equals (packageReference.Include, "NuGet.Build.Packaging");
+ }
+
+ public NuGet.ProjectManagement.NuGetProject CreateNuGetProject ()
+ {
+ return new PackagingNuGetProject (this);
+ }
+
+ public bool HasPackages ()
+ {
+ return PackageReferences.Any ();
+ }
+
+ public async Task<bool> HasMissingPackages (IMonoDevelopSolutionManager solutionManager)
+ {
+ PackageIdentity packageIdentity = await GetNuGetBuildPackagingPackage ();
+
+ if (packageIdentity == null)
+ return false;
+
+ return GlobalPackagesExtractor.IsMissing (solutionManager, packageIdentity);
+ }
+
+ public async Task RestorePackagesAsync (
+ IMonoDevelopSolutionManager solutionManager,
+ INuGetProjectContext context,
+ CancellationToken token)
+ {
+ PackageIdentity packageIdentity = await GetNuGetBuildPackagingPackage ();
+
+ if (packageIdentity == null)
+ return;
+
+ await GlobalPackagesExtractor.Download (solutionManager, packageIdentity, context, token);
+
+ await Runtime.RunInMainThread (() => {
+ PackagingNuGetProject.GenerateNuGetBuildPackagingTargets (packageIdentity, this);
+ ReloadProjectBuilder ();
+ });
+ }
+
+ Task<PackageIdentity> GetNuGetBuildPackagingPackage ()
+ {
+ return Runtime.RunInMainThread (() => {
+ var packageReference = GetNuGetBuildPackagingPackageReference ();
+ if (packageReference != null) {
+ return packageReference.ToNuGetPackageReference ().PackageIdentity;
+ }
+ return null;
+ });
+ }
+
+ void EnsureBuildPackagingNuGetPackageIsInstalled (DotNetProject project)
+ {
+ if (!project.IsBuildPackagingNuGetPackageInstalled ()) {
+ project.InstallBuildPackagingNuGetPackage ();
+ }
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingProjectFlavor.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingProjectFlavor.cs
new file mode 100644
index 0000000000..9c80b5540d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/PackagingProjectFlavor.cs
@@ -0,0 +1,51 @@
+//
+// PackagingProjectFlavor.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ class PackagingProjectFlavor : DotNetProjectExtension
+ {
+ protected override ProjectFeatures OnGetSupportedFeatures ()
+ {
+ return ProjectFeatures.Build | ProjectFeatures.Configurations;
+ }
+
+ protected override bool OnGetCanReferenceProject (DotNetProject targetProject, out string reason)
+ {
+ reason = null;
+ return true;
+ }
+
+ protected override void Initialize ()
+ {
+ RequiresMicrosoftBuild = true;
+ base.Initialize ();
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectFileMigrator.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectFileMigrator.cs
new file mode 100644
index 0000000000..c0d7f8564f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectFileMigrator.cs
@@ -0,0 +1,73 @@
+//
+// ProjectFileMigrator.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using System.Linq;
+using MonoDevelop.Core;
+using MonoDevelop.Projects;
+using System.Collections.Generic;
+
+namespace MonoDevelop.Packaging
+{
+ /// <summary>
+ /// Migrates all files apart from AssemblyInfo.cs from one project to another.
+ /// </summary>
+ class ProjectFileMigrator
+ {
+ public void MigrateFiles (Project source, Project target)
+ {
+ foreach (ProjectFile file in GetFilesToMigrate (source).ToArray ()) {
+
+ FilePath destination = GetFileDestinationPath (file, source, target);
+
+ Directory.CreateDirectory (destination.ParentDirectory);
+ FileService.MoveFile (file.FilePath, destination);
+
+ var movedProjectFile = new ProjectFile (destination, file.BuildAction);
+ target.AddFile (movedProjectFile);
+
+ source.Files.Remove (file);
+ }
+ }
+
+ IEnumerable<ProjectFile> GetFilesToMigrate (Project source)
+ {
+ return source.Files.Where (file => !IsExcluded (file)).ToArray ();
+ }
+
+ bool IsExcluded (ProjectFile file)
+ {
+ return string.Equals (file.FilePath.FileName, "AssemblyInfo.cs", StringComparison.OrdinalIgnoreCase);
+ }
+
+ FilePath GetFileDestinationPath (ProjectFile file, Project source, Project target)
+ {
+ FilePath relativePath = source.GetRelativeChildPath (file.FilePath);
+ return target.BaseDirectory.Combine (relativePath);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectHasNuGetMetadataCondition.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectHasNuGetMetadataCondition.cs
new file mode 100644
index 0000000000..4271fc2ca9
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectHasNuGetMetadataCondition.cs
@@ -0,0 +1,52 @@
+//
+// ProjectHasNuGetMetadataCondition.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using Mono.Addins;
+using MonoDevelop.Ide;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ class ProjectHasNuGetMetadataCondition : ConditionType
+ {
+ public ProjectHasNuGetMetadataCondition ()
+ {
+ IdeApp.ProjectOperations.CurrentProjectChanged += delegate { NotifyChanged (); };
+ }
+
+ public override bool Evaluate (NodeElement conditionNode)
+ {
+ var project = IdeApp.ProjectOperations.CurrentSelectedProject as DotNetProject;
+ if (project is PackagingProject) {
+ return true;
+ } else if (project != null) {
+ return project.HasNuGetMetadata ();
+ }
+ return false;
+ }
+ }
+}
+
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectIsDotNetProjectOnlyCondition.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectIsDotNetProjectOnlyCondition.cs
new file mode 100644
index 0000000000..395fbdd672
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ProjectIsDotNetProjectOnlyCondition.cs
@@ -0,0 +1,51 @@
+//
+// ProjectIsDotNetProjectOnlyCondition.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using Mono.Addins;
+using MonoDevelop.Ide;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ class ProjectIsDotNetProjectOnlyCondition : ConditionType
+ {
+ public ProjectIsDotNetProjectOnlyCondition ()
+ {
+ IdeApp.ProjectOperations.CurrentProjectChanged += delegate { NotifyChanged (); };
+ }
+
+ public override bool Evaluate (NodeElement conditionNode)
+ {
+ var project = IdeApp.ProjectOperations.CurrentSelectedProject as DotNetProject;
+ if (project is PackagingProject) {
+ return false;
+ } else if (project != null) {
+ return true;
+ }
+ return false;
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ReferenceAssemblyFramework.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ReferenceAssemblyFramework.cs
new file mode 100644
index 0000000000..b92731d4f0
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ReferenceAssemblyFramework.cs
@@ -0,0 +1,49 @@
+//
+// ReferenceAssemblyFramework.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Projects;
+using MonoDevelop.Core.Assemblies;
+
+namespace MonoDevelop.Packaging
+{
+ [ExportProjectItemType ("ReferenceAssemblyFramework")]
+ class ReferenceAssemblyFramework : ProjectItem
+ {
+ public ReferenceAssemblyFramework ()
+ {
+ }
+
+ public ReferenceAssemblyFramework (TargetFrameworkMoniker targetFramework)
+ {
+ Include = targetFramework.ToString ();
+ }
+
+ public TargetFrameworkMoniker GetTargetFrameworkMoniker ()
+ {
+ return TargetFrameworkMoniker.Parse (Include);
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ReferenceAssemblyFrameworkCollection.cs b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ReferenceAssemblyFrameworkCollection.cs
new file mode 100644
index 0000000000..30d8dc9852
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/MonoDevelop.Packaging/ReferenceAssemblyFrameworkCollection.cs
@@ -0,0 +1,36 @@
+//
+// ReferenceAssemblyFrameworkCollection.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2016 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using MonoDevelop.Projects;
+
+namespace MonoDevelop.Packaging
+{
+ [Serializable]
+ class ReferenceAssemblyFrameworkCollection : ProjectItemCollection<ReferenceAssemblyFramework>
+ {
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/PostBuild.proj b/main/src/addins/MonoDevelop.Packaging/PostBuild.proj
new file mode 100644
index 0000000000..302fc05c43
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/PostBuild.proj
@@ -0,0 +1,12 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <PrepareForRunDependsOn>$(PrepareForRunDependsOn);_MyPostBuildTarget</PrepareForRunDependsOn>
+ <_BuildPackagingVersion>0.1.157-dev</_BuildPackagingVersion>
+ </PropertyGroup>
+ <ItemGroup>
+ <_MyNuGetPackage Include="$(MSBuildProjectDirectory)\..\..\..\packages\NuGet.Build.Packaging.$(_BuildPackagingVersion)\NuGet.Build.Packaging.$(_BuildPackagingVersion).nupkg" />
+ </ItemGroup>
+ <Target Name="_MyPostBuildTarget">
+ <Copy SourceFiles="@(_MyNuGetPackage)" DestinationFolder="$(OutputPath)\packages" />
+ </Target>
+</Project> \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.Packaging/Properties/AddinInfo.cs b/main/src/addins/MonoDevelop.Packaging/Properties/AddinInfo.cs
new file mode 100644
index 0000000000..4409da306c
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Properties/AddinInfo.cs
@@ -0,0 +1,16 @@
+
+using Mono.Addins;
+using Mono.Addins.Description;
+
+[assembly:Addin ("Packaging",
+ Namespace = "MonoDevelop",
+ Version = MonoDevelop.BuildInfo.Version,
+ Category = "IDE extensions")]
+
+[assembly:AddinName ("NuGet Packaging")]
+[assembly:AddinDescription ("Provides support for creating NuGet packages.")]
+
+[assembly:AddinDependency ("Core", MonoDevelop.BuildInfo.Version)]
+[assembly:AddinDependency ("Ide", MonoDevelop.BuildInfo.Version)]
+[assembly:AddinDependency ("DesignerSupport", MonoDevelop.BuildInfo.Version)]
+[assembly:AddinDependency ("PackageManagement", MonoDevelop.BuildInfo.Version)]
diff --git a/main/src/addins/MonoDevelop.Packaging/Properties/AssemblyInfo.cs b/main/src/addins/MonoDevelop.Packaging/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..97a3ba66d3
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Properties/AssemblyInfo.cs
@@ -0,0 +1,9 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+[assembly: AssemblyProduct ("MonoDevelop")]
+[assembly: AssemblyTitle("MonoDevelop.Packaging")]
+[assembly: AssemblyDescription("NuGet packaging addin for MonoDevelop")]
+[assembly: AssemblyVersion ("1.0")]
+[assembly: AssemblyCopyright ("MIT")]
+[assembly: InternalsVisibleTo ("MonoDevelop.Packaging.Tests")]
diff --git a/main/src/addins/MonoDevelop.Packaging/Targets/NuGet.Packaging.Authoring.props b/main/src/addins/MonoDevelop.Packaging/Targets/NuGet.Packaging.Authoring.props
new file mode 100644
index 0000000000..483790a09d
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Targets/NuGet.Packaging.Authoring.props
@@ -0,0 +1,23 @@
+<!--
+***********************************************************************************************
+Microsoft.NuGet.Packaging.Authoring.props
+
+WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
+ created a backup copy. Incorrect changes to this file will make it
+ impossible to load or build your projects from the command-line or the IDE.
+
+Copyright (c) .NET Foundation. All rights reserved.
+***********************************************************************************************
+-->
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+ <Import Project="$(MSBuildProjectDirectory)\$(MSBuildProjectName).nuget.props"
+ Condition="Exists('$(MSBuildProjectDirectory)\$(MSBuildProjectName).nuget.props') AND '$(IncludeNuGetImports)' != 'false'" />
+
+ <PropertyGroup>
+ <NuGetPackaginAuthoringPropsImported>true</NuGetPackaginAuthoringPropsImported>
+ <IsPackagingProject>true</IsPackagingProject>
+ <PackOnBuild>true</PackOnBuild>
+ </PropertyGroup>
+
+</Project> \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.Packaging/Targets/NuGet.Packaging.Authoring.targets b/main/src/addins/MonoDevelop.Packaging/Targets/NuGet.Packaging.Authoring.targets
new file mode 100644
index 0000000000..761336ba18
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Targets/NuGet.Packaging.Authoring.targets
@@ -0,0 +1,23 @@
+<!--
+***********************************************************************************************
+Microsoft.NuGet.Packaging.Authoring.targets
+
+WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
+ created a backup copy. Incorrect changes to this file will make it
+ impossible to load or build your projects from the command-line or the IDE.
+
+Copyright (c) .NET Foundation. All rights reserved.
+***********************************************************************************************
+-->
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+ <PropertyGroup>
+ <PrepareForRunDependsOn></PrepareForRunDependsOn>
+ </PropertyGroup>
+
+ <Target Name="CreateManifestResourceNames" />
+ <Target Name="CoreCompile" />
+
+ <Import Project="$(MSBuildProjectDirectory)\$(MSBuildProjectName).nuget.targets"
+ Condition="Exists('$(MSBuildProjectDirectory)\$(MSBuildProjectName).nuget.targets') AND '$(IncludeNuGetImports)' != 'false'" />
+</Project> \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.Packaging/Templates/CrossPlatformLibrary.xpt.xml b/main/src/addins/MonoDevelop.Packaging/Templates/CrossPlatformLibrary.xpt.xml
new file mode 100644
index 0000000000..af39670c7f
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Templates/CrossPlatformLibrary.xpt.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0"?>
+<Template
+ originator="Matt Ward"
+ created="2016/09/09"
+ lastModified="2016/09/09">
+
+ <TemplateConfiguration>
+ <_Name>Multiplatform Library</_Name>
+ <Category>multiplat/library/general</Category>
+ <Icon>md-crossplatform-shared-project</Icon>
+ <Image id="md-crossplatform-shared-project" />
+ <LanguageName>C#</LanguageName>
+ <_Description>A project template for creating a multiplatform library project and its corresponding NuGet package.</_Description>
+ <Wizard>MonoDevelop.Packaging.CrossPlatformLibraryTemplateWizard</Wizard>
+ <DefaultParameters>UseCustomAssemblyInfoVersion=true;AssemblyInfoVersion=1.0.0.0</DefaultParameters>
+ </TemplateConfiguration>
+
+ <Combine name="${ProjectName}" directory=".">
+ <Project name="${ProjectName}.Shared" directory="${ProjectName}.Shared" type="SharedAssetsProject" if="CreateSharedProject">
+ <Options DefaultNamespace="${ProjectName}" HideGettingStarted="true" />
+ <Files>
+ <FileTemplateReference TemplateID="EmptyClass" name="MyClass.cs" />
+ </Files>
+ </Project>
+
+ <Project name="${ProjectName}" directory = "." type="C#PortableLibrary" if="CreatePortableProject">
+ <Options Target="Library"
+ TargetFrameworkVersion=".NETPortable,Version=v4.5,Profile=Profile78"
+ DefaultNamespace="${ProjectName}"
+ HideGettingStarted="true" />
+ <Packages>
+ <Package ID="NuGet.Build.Packaging" Version="0.1.157-dev" directory="../packages" />
+ </Packages>
+ <Files>
+ <FileTemplateReference TemplateID="EmptyClass" name="MyClass.cs" />
+ <FileTemplateReference TemplateID="CSharpAssemblyInfo" name="AssemblyInfo.cs" />
+ </Files>
+ </Project>
+
+ <Project name="${ProjectName}.iOS" directory="${ProjectName}.iOS" type="XamarinIOS" if="CreateIOSProject">
+ <Options Target="Library"
+ TargetFrameworkVersion="Xamarin.iOS,Version=v1.0"
+ DefaultNamespace="${ProjectName}"
+ HideGettingStarted="true" />
+ <References>
+ <Reference type="Gac" refto="System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" />
+ <Reference type="Gac" refto="System.Xml, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" />
+ <Reference type="Gac" refto="System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" />
+ <Reference type="Gac" refto="Xamarin.iOS" />
+ <Reference type="Project" refto="${ProjectName}.Shared" />
+ </References>
+ <Packages>
+ <Package ID="NuGet.Build.Packaging" Version="0.1.157-dev" directory="../packages" />
+ </Packages>
+ <Files>
+ <FileTemplateReference TemplateID="CSharpAssemblyInfo" name="AssemblyInfo.cs" />
+ </Files>
+ </Project>
+
+ <Project name="${ProjectName}.Android" directory="${ProjectName}.Android" type="MonoDroid" if="CreateAndroidProject">
+ <Options Target="Library" DefaultNamespace="${ProjectName}" HideGettingStarted="true" />
+ <References>
+ <Reference type="Gac" refto="System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" />
+ <Reference type="Gac" refto="System.Xml, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" />
+ <Reference type="Gac" refto="System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e" />
+ <Reference type="Gac" refto="Mono.Android" />
+ <Reference type="Project" refto="${ProjectName}.Shared" />
+ </References>
+ <Packages>
+ <Package ID="NuGet.Build.Packaging" Version="0.1.157-dev" directory="../packages" />
+ </Packages>
+ <Files>
+ <FileTemplateReference TemplateID="CSharpAssemblyInfo" name="AssemblyInfo.cs" />
+ </Files>
+ </Project>
+
+ <Project name="${ProjectName}.NuGet" directory="${ProjectName}.NuGet" type="NuGetPackaging" if="CreateNuGetProject">
+ <Options TargetFrameworkVersion="4.5" DefaultNamespace="${ProjectName}" HideGettingStarted="true" />
+ <Packages>
+ <Package ID="NuGet.Build.Packaging" Version="0.1.157-dev" directory="../packages" />
+ </Packages>
+ <References>
+ <Reference type="Project" refto="${ProjectName}.Android" if="CreateAndroidProject" />
+ <Reference type="Project" refto="${ProjectName}.iOS" if="CreateIOSProject" />
+ </References>
+ </Project>
+ </Combine>
+</Template>
diff --git a/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library.png b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library.png
new file mode 100644
index 0000000000..b9c4c32d42
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library@2x.png b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library@2x.png
new file mode 100644
index 0000000000..4dedd56a8e
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library~dark.png b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library~dark.png
new file mode 100644
index 0000000000..3d1650d75b
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library~dark.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library~dark@2x.png b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library~dark@2x.png
new file mode 100644
index 0000000000..2306226ed1
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library~dark@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget.png b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget.png
new file mode 100644
index 0000000000..411a3e46de
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget@2x.png b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget@2x.png
new file mode 100644
index 0000000000..023b60814a
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget~dark.png b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget~dark.png
new file mode 100644
index 0000000000..87de5a7d15
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget~dark.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget~dark@2x.png b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget~dark@2x.png
new file mode 100644
index 0000000000..659a996362
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget~dark@2x.png
Binary files differ
diff --git a/main/src/addins/MonoDevelop.Packaging/Templates/PackagingProject.xpt.xml b/main/src/addins/MonoDevelop.Packaging/Templates/PackagingProject.xpt.xml
new file mode 100644
index 0000000000..adcd0e67e8
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/Templates/PackagingProject.xpt.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<Template
+ originator="Matt Ward"
+ created="2016/08/08"
+ lastModified="2016/08/08">
+
+ <TemplateConfiguration>
+ <_Name>NuGet Package</_Name>
+ <Category>other/net/general</Category>
+ <Icon>md-package-project</Icon>
+ <Image id="md-package-project" />
+ <FileExtension>.nuproj</FileExtension>
+ <_Description>Creates a NuGet Packaging project.</_Description>
+ <Wizard>MonoDevelop.Packaging.ProjectTemplateWizard</Wizard>
+ </TemplateConfiguration>
+
+ <Combine name="${ProjectName}" directory=".">
+ <Project name="${ProjectName}" directory="." type="NuGetPackaging">
+ <Options TargetFrameworkVersion="4.5" />
+ <Packages>
+ <Package ID="NuGet.Build.Packaging" Version="0.1.157-dev" directory="../packages" />
+ </Packages>
+ <Files>
+ <File name="readme.txt"><![CDATA[
+This readme.txt file will be displayed immediately after the NuGet package is installed.
+]]></File>
+ </Files>
+ </Project>
+ </Combine>
+</Template>
diff --git a/main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.cs b/main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.cs
new file mode 100644
index 0000000000..0ae78ac937
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.cs
@@ -0,0 +1,448 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace MonoDevelop.Packaging.Gui
+{
+ public partial class GtkCrossPlatformLibraryProjectTemplateWizardPageWidget
+ {
+ private global::Gtk.HBox mainHBox;
+
+ private global::Gtk.EventBox leftBorderEventBox;
+
+ private global::Gtk.VBox configurationVBox;
+
+ private global::Gtk.EventBox configurationTopEventBox;
+
+ private global::Gtk.EventBox configurationTableEventBox;
+
+ private global::Gtk.Table configurationTable;
+
+ private global::Gtk.Label descriptionLabel;
+
+ private global::Gtk.Entry descriptionTextBox;
+
+ private global::Gtk.Label implementationLabel;
+
+ private global::Gtk.EventBox nameEventBox;
+
+ private global::Gtk.Label nameLabel;
+
+ private global::Gtk.Entry nameTextBox;
+
+ private global::Gtk.EventBox organizationInfoEventBox;
+
+ private global::Gtk.Label paddingLabelSharedCode;
+
+ private global::Gtk.Label paddingLabelTargetPlatforms;
+
+ private global::Gtk.Label paddingLabelXaml;
+
+ private global::Gtk.DrawingArea sharedCodeSeparator;
+
+ private global::Gtk.VBox sharedCodeVBox;
+
+ private global::Gtk.HBox usePortableClassLibraryHBox;
+
+ private global::Gtk.RadioButton sharedProjectRadioButton;
+
+ private global::Gtk.VBox usePortableLibraryInfoVBox;
+
+ private global::Gtk.Label usePortableLibraryInfoIconPaddingLabel;
+
+ private global::Gtk.EventBox usePortableLibraryInfoEventBox;
+
+ private global::Gtk.HBox useSharedLibraryHBox;
+
+ private global::Gtk.RadioButton portableClassLibraryRadioButton;
+
+ private global::Gtk.VBox useSharedLibraryInfoVBox;
+
+ private global::Gtk.Label useSharedLibraryInfoIconPaddingLabel;
+
+ private global::Gtk.EventBox useSharedLibraryInfoEventBox;
+
+ private global::Gtk.Label targetPlatformsLabel;
+
+ private global::Gtk.DrawingArea targetPlatformsSeparator;
+
+ private global::Gtk.VBox targetPlatformsVBox;
+
+ private global::Gtk.CheckButton androidCheckButton;
+
+ private global::Gtk.CheckButton iOSCheckButton;
+
+ private global::Gtk.EventBox configurationBottomEventBox;
+
+ private global::Gtk.EventBox backgroundLargeImageEventBox;
+
+ private global::Gtk.VBox backgroundLargeImageVBox;
+
+ protected virtual void Build ()
+ {
+ global::Stetic.Gui.Initialize (this);
+ // Widget MonoDevelop.Packaging.Gui.GtkCrossPlatformLibraryProjectTemplateWizardPageWidget
+ global::Stetic.BinContainer.Attach (this);
+ this.Name = "MonoDevelop.Packaging.Gui.GtkCrossPlatformLibraryProjectTemplateWizardPageWidget";
+ // Container child MonoDevelop.Packaging.Gui.GtkCrossPlatformLibraryProjectTemplateWizardPageWidget.Gtk.Container+ContainerChild
+ this.mainHBox = new global::Gtk.HBox ();
+ this.mainHBox.Name = "mainHBox";
+ // Container child mainHBox.Gtk.Box+BoxChild
+ this.leftBorderEventBox = new global::Gtk.EventBox ();
+ this.leftBorderEventBox.WidthRequest = 30;
+ this.leftBorderEventBox.Name = "leftBorderEventBox";
+ this.mainHBox.Add (this.leftBorderEventBox);
+ global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.mainHBox [this.leftBorderEventBox]));
+ w1.Position = 0;
+ w1.Expand = false;
+ // Container child mainHBox.Gtk.Box+BoxChild
+ this.configurationVBox = new global::Gtk.VBox ();
+ this.configurationVBox.WidthRequest = 440;
+ this.configurationVBox.Name = "configurationVBox";
+ // Container child configurationVBox.Gtk.Box+BoxChild
+ this.configurationTopEventBox = new global::Gtk.EventBox ();
+ this.configurationTopEventBox.Name = "configurationTopEventBox";
+ this.configurationVBox.Add (this.configurationTopEventBox);
+ global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.configurationVBox [this.configurationTopEventBox]));
+ w2.Position = 0;
+ // Container child configurationVBox.Gtk.Box+BoxChild
+ this.configurationTableEventBox = new global::Gtk.EventBox ();
+ this.configurationTableEventBox.Name = "configurationTableEventBox";
+ // Container child configurationTableEventBox.Gtk.Container+ContainerChild
+ this.configurationTable = new global::Gtk.Table (((uint)(9)), ((uint)(3)), false);
+ this.configurationTable.Name = "configurationTable";
+ this.configurationTable.RowSpacing = ((uint)(7));
+ this.configurationTable.ColumnSpacing = ((uint)(6));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.descriptionLabel = new global::Gtk.Label ();
+ this.descriptionLabel.Name = "descriptionLabel";
+ this.descriptionLabel.Xpad = 5;
+ this.descriptionLabel.Xalign = 1F;
+ this.descriptionLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("Description:");
+ this.descriptionLabel.Justify = ((global::Gtk.Justification)(1));
+ this.configurationTable.Add (this.descriptionLabel);
+ global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.descriptionLabel]));
+ w3.TopAttach = ((uint)(1));
+ w3.BottomAttach = ((uint)(2));
+ w3.XOptions = ((global::Gtk.AttachOptions)(4));
+ w3.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.descriptionTextBox = new global::Gtk.Entry ();
+ this.descriptionTextBox.CanFocus = true;
+ this.descriptionTextBox.Name = "descriptionTextBox";
+ this.descriptionTextBox.IsEditable = true;
+ this.descriptionTextBox.InvisibleChar = '●';
+ this.configurationTable.Add (this.descriptionTextBox);
+ global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.descriptionTextBox]));
+ w4.TopAttach = ((uint)(1));
+ w4.BottomAttach = ((uint)(2));
+ w4.LeftAttach = ((uint)(1));
+ w4.RightAttach = ((uint)(2));
+ w4.XOptions = ((global::Gtk.AttachOptions)(4));
+ w4.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.implementationLabel = new global::Gtk.Label ();
+ this.implementationLabel.Name = "implementationLabel";
+ this.implementationLabel.Xpad = 5;
+ this.implementationLabel.Xalign = 1F;
+ this.implementationLabel.Yalign = 0.8F;
+ this.implementationLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("Implementation:");
+ this.implementationLabel.Justify = ((global::Gtk.Justification)(1));
+ this.configurationTable.Add (this.implementationLabel);
+ global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.implementationLabel]));
+ w5.TopAttach = ((uint)(6));
+ w5.BottomAttach = ((uint)(7));
+ w5.XOptions = ((global::Gtk.AttachOptions)(4));
+ w5.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.nameEventBox = new global::Gtk.EventBox ();
+ this.nameEventBox.WidthRequest = 16;
+ this.nameEventBox.HeightRequest = 16;
+ this.nameEventBox.Name = "nameEventBox";
+ this.nameEventBox.VisibleWindow = false;
+ this.configurationTable.Add (this.nameEventBox);
+ global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.nameEventBox]));
+ w6.LeftAttach = ((uint)(2));
+ w6.RightAttach = ((uint)(3));
+ w6.XOptions = ((global::Gtk.AttachOptions)(4));
+ w6.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.nameLabel = new global::Gtk.Label ();
+ this.nameLabel.Name = "nameLabel";
+ this.nameLabel.Xpad = 5;
+ this.nameLabel.Xalign = 1F;
+ this.nameLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("Name:");
+ this.nameLabel.Justify = ((global::Gtk.Justification)(1));
+ this.configurationTable.Add (this.nameLabel);
+ global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.nameLabel]));
+ w7.XOptions = ((global::Gtk.AttachOptions)(4));
+ w7.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.nameTextBox = new global::Gtk.Entry ();
+ this.nameTextBox.CanFocus = true;
+ this.nameTextBox.Name = "nameTextBox";
+ this.nameTextBox.IsEditable = true;
+ this.nameTextBox.InvisibleChar = '●';
+ this.configurationTable.Add (this.nameTextBox);
+ global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.nameTextBox]));
+ w8.LeftAttach = ((uint)(1));
+ w8.RightAttach = ((uint)(2));
+ w8.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.organizationInfoEventBox = new global::Gtk.EventBox ();
+ this.organizationInfoEventBox.WidthRequest = 16;
+ this.organizationInfoEventBox.HeightRequest = 16;
+ this.organizationInfoEventBox.Name = "organizationInfoEventBox";
+ this.organizationInfoEventBox.VisibleWindow = false;
+ this.configurationTable.Add (this.organizationInfoEventBox);
+ global::Gtk.Table.TableChild w9 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.organizationInfoEventBox]));
+ w9.TopAttach = ((uint)(1));
+ w9.BottomAttach = ((uint)(2));
+ w9.LeftAttach = ((uint)(2));
+ w9.RightAttach = ((uint)(3));
+ w9.XOptions = ((global::Gtk.AttachOptions)(2));
+ w9.YOptions = ((global::Gtk.AttachOptions)(2));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.paddingLabelSharedCode = new global::Gtk.Label ();
+ this.paddingLabelSharedCode.WidthRequest = 132;
+ this.paddingLabelSharedCode.Name = "paddingLabelSharedCode";
+ this.paddingLabelSharedCode.Justify = ((global::Gtk.Justification)(1));
+ this.configurationTable.Add (this.paddingLabelSharedCode);
+ global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.paddingLabelSharedCode]));
+ w10.TopAttach = ((uint)(7));
+ w10.BottomAttach = ((uint)(8));
+ w10.XOptions = ((global::Gtk.AttachOptions)(4));
+ w10.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.paddingLabelTargetPlatforms = new global::Gtk.Label ();
+ this.paddingLabelTargetPlatforms.WidthRequest = 132;
+ this.paddingLabelTargetPlatforms.Name = "paddingLabelTargetPlatforms";
+ this.paddingLabelTargetPlatforms.Justify = ((global::Gtk.Justification)(1));
+ this.configurationTable.Add (this.paddingLabelTargetPlatforms);
+ global::Gtk.Table.TableChild w11 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.paddingLabelTargetPlatforms]));
+ w11.TopAttach = ((uint)(4));
+ w11.BottomAttach = ((uint)(5));
+ w11.XOptions = ((global::Gtk.AttachOptions)(4));
+ w11.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.paddingLabelXaml = new global::Gtk.Label ();
+ this.paddingLabelXaml.WidthRequest = 132;
+ this.paddingLabelXaml.HeightRequest = 5;
+ this.paddingLabelXaml.Name = "paddingLabelXaml";
+ this.paddingLabelXaml.Justify = ((global::Gtk.Justification)(1));
+ this.configurationTable.Add (this.paddingLabelXaml);
+ global::Gtk.Table.TableChild w12 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.paddingLabelXaml]));
+ w12.TopAttach = ((uint)(8));
+ w12.BottomAttach = ((uint)(9));
+ w12.XOptions = ((global::Gtk.AttachOptions)(4));
+ w12.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.sharedCodeSeparator = new global::Gtk.DrawingArea ();
+ this.sharedCodeSeparator.HeightRequest = 1;
+ this.sharedCodeSeparator.Name = "sharedCodeSeparator";
+ this.configurationTable.Add (this.sharedCodeSeparator);
+ global::Gtk.Table.TableChild w13 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.sharedCodeSeparator]));
+ w13.TopAttach = ((uint)(5));
+ w13.BottomAttach = ((uint)(6));
+ w13.RightAttach = ((uint)(3));
+ w13.YPadding = ((uint)(10));
+ w13.XOptions = ((global::Gtk.AttachOptions)(4));
+ w13.YOptions = ((global::Gtk.AttachOptions)(0));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.sharedCodeVBox = new global::Gtk.VBox ();
+ this.sharedCodeVBox.Name = "sharedCodeVBox";
+ // Container child sharedCodeVBox.Gtk.Box+BoxChild
+ this.usePortableClassLibraryHBox = new global::Gtk.HBox ();
+ this.usePortableClassLibraryHBox.Name = "usePortableClassLibraryHBox";
+ // Container child usePortableClassLibraryHBox.Gtk.Box+BoxChild
+ this.sharedProjectRadioButton = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("Platform specific"));
+ this.sharedProjectRadioButton.CanFocus = true;
+ this.sharedProjectRadioButton.Name = "sharedProjectRadioButton";
+ this.sharedProjectRadioButton.Active = true;
+ this.sharedProjectRadioButton.DrawIndicator = true;
+ this.sharedProjectRadioButton.UseUnderline = true;
+ this.sharedProjectRadioButton.Group = new global::GLib.SList (global::System.IntPtr.Zero);
+ this.usePortableClassLibraryHBox.Add (this.sharedProjectRadioButton);
+ global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.usePortableClassLibraryHBox [this.sharedProjectRadioButton]));
+ w14.Position = 0;
+ // Container child usePortableClassLibraryHBox.Gtk.Box+BoxChild
+ this.usePortableLibraryInfoVBox = new global::Gtk.VBox ();
+ this.usePortableLibraryInfoVBox.Name = "usePortableLibraryInfoVBox";
+ // Container child usePortableLibraryInfoVBox.Gtk.Box+BoxChild
+ this.usePortableLibraryInfoIconPaddingLabel = new global::Gtk.Label ();
+ this.usePortableLibraryInfoIconPaddingLabel.HeightRequest = 1;
+ this.usePortableLibraryInfoIconPaddingLabel.Name = "usePortableLibraryInfoIconPaddingLabel";
+ this.usePortableLibraryInfoVBox.Add (this.usePortableLibraryInfoIconPaddingLabel);
+ global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.usePortableLibraryInfoVBox [this.usePortableLibraryInfoIconPaddingLabel]));
+ w15.Position = 0;
+ w15.Expand = false;
+ w15.Fill = false;
+ // Container child usePortableLibraryInfoVBox.Gtk.Box+BoxChild
+ this.usePortableLibraryInfoEventBox = new global::Gtk.EventBox ();
+ this.usePortableLibraryInfoEventBox.WidthRequest = 16;
+ this.usePortableLibraryInfoEventBox.HeightRequest = 16;
+ this.usePortableLibraryInfoEventBox.Name = "usePortableLibraryInfoEventBox";
+ this.usePortableLibraryInfoEventBox.VisibleWindow = false;
+ this.usePortableLibraryInfoVBox.Add (this.usePortableLibraryInfoEventBox);
+ global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.usePortableLibraryInfoVBox [this.usePortableLibraryInfoEventBox]));
+ w16.Position = 1;
+ this.usePortableClassLibraryHBox.Add (this.usePortableLibraryInfoVBox);
+ global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.usePortableClassLibraryHBox [this.usePortableLibraryInfoVBox]));
+ w17.Position = 1;
+ w17.Expand = false;
+ this.sharedCodeVBox.Add (this.usePortableClassLibraryHBox);
+ global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.sharedCodeVBox [this.usePortableClassLibraryHBox]));
+ w18.Position = 0;
+ w18.Expand = false;
+ w18.Fill = false;
+ w18.Padding = ((uint)(1));
+ // Container child sharedCodeVBox.Gtk.Box+BoxChild
+ this.useSharedLibraryHBox = new global::Gtk.HBox ();
+ this.useSharedLibraryHBox.Name = "useSharedLibraryHBox";
+ // Container child useSharedLibraryHBox.Gtk.Box+BoxChild
+ this.portableClassLibraryRadioButton = new global::Gtk.RadioButton (global::Mono.Unix.Catalog.GetString ("Single for all platforms"));
+ this.portableClassLibraryRadioButton.CanFocus = true;
+ this.portableClassLibraryRadioButton.Name = "portableClassLibraryRadioButton";
+ this.portableClassLibraryRadioButton.DrawIndicator = true;
+ this.portableClassLibraryRadioButton.UseUnderline = true;
+ this.portableClassLibraryRadioButton.Group = this.sharedProjectRadioButton.Group;
+ this.useSharedLibraryHBox.Add (this.portableClassLibraryRadioButton);
+ global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.useSharedLibraryHBox [this.portableClassLibraryRadioButton]));
+ w19.Position = 0;
+ // Container child useSharedLibraryHBox.Gtk.Box+BoxChild
+ this.useSharedLibraryInfoVBox = new global::Gtk.VBox ();
+ this.useSharedLibraryInfoVBox.Name = "useSharedLibraryInfoVBox";
+ // Container child useSharedLibraryInfoVBox.Gtk.Box+BoxChild
+ this.useSharedLibraryInfoIconPaddingLabel = new global::Gtk.Label ();
+ this.useSharedLibraryInfoIconPaddingLabel.HeightRequest = 1;
+ this.useSharedLibraryInfoIconPaddingLabel.Name = "useSharedLibraryInfoIconPaddingLabel";
+ this.useSharedLibraryInfoVBox.Add (this.useSharedLibraryInfoIconPaddingLabel);
+ global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.useSharedLibraryInfoVBox [this.useSharedLibraryInfoIconPaddingLabel]));
+ w20.Position = 0;
+ w20.Expand = false;
+ w20.Fill = false;
+ // Container child useSharedLibraryInfoVBox.Gtk.Box+BoxChild
+ this.useSharedLibraryInfoEventBox = new global::Gtk.EventBox ();
+ this.useSharedLibraryInfoEventBox.WidthRequest = 16;
+ this.useSharedLibraryInfoEventBox.HeightRequest = 16;
+ this.useSharedLibraryInfoEventBox.Name = "useSharedLibraryInfoEventBox";
+ this.useSharedLibraryInfoEventBox.VisibleWindow = false;
+ this.useSharedLibraryInfoVBox.Add (this.useSharedLibraryInfoEventBox);
+ global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.useSharedLibraryInfoVBox [this.useSharedLibraryInfoEventBox]));
+ w21.Position = 1;
+ this.useSharedLibraryHBox.Add (this.useSharedLibraryInfoVBox);
+ global::Gtk.Box.BoxChild w22 = ((global::Gtk.Box.BoxChild)(this.useSharedLibraryHBox [this.useSharedLibraryInfoVBox]));
+ w22.Position = 1;
+ w22.Expand = false;
+ this.sharedCodeVBox.Add (this.useSharedLibraryHBox);
+ global::Gtk.Box.BoxChild w23 = ((global::Gtk.Box.BoxChild)(this.sharedCodeVBox [this.useSharedLibraryHBox]));
+ w23.Position = 1;
+ w23.Expand = false;
+ w23.Fill = false;
+ w23.Padding = ((uint)(1));
+ this.configurationTable.Add (this.sharedCodeVBox);
+ global::Gtk.Table.TableChild w24 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.sharedCodeVBox]));
+ w24.TopAttach = ((uint)(6));
+ w24.BottomAttach = ((uint)(8));
+ w24.LeftAttach = ((uint)(1));
+ w24.RightAttach = ((uint)(3));
+ w24.XOptions = ((global::Gtk.AttachOptions)(4));
+ w24.YOptions = ((global::Gtk.AttachOptions)(0));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.targetPlatformsLabel = new global::Gtk.Label ();
+ this.targetPlatformsLabel.Name = "targetPlatformsLabel";
+ this.targetPlatformsLabel.Xpad = 5;
+ this.targetPlatformsLabel.Xalign = 1F;
+ this.targetPlatformsLabel.Yalign = 0.8F;
+ this.targetPlatformsLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("Target Platforms:");
+ this.targetPlatformsLabel.Justify = ((global::Gtk.Justification)(1));
+ this.configurationTable.Add (this.targetPlatformsLabel);
+ global::Gtk.Table.TableChild w25 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.targetPlatformsLabel]));
+ w25.TopAttach = ((uint)(3));
+ w25.BottomAttach = ((uint)(4));
+ w25.XOptions = ((global::Gtk.AttachOptions)(4));
+ w25.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.targetPlatformsSeparator = new global::Gtk.DrawingArea ();
+ this.targetPlatformsSeparator.HeightRequest = 1;
+ this.targetPlatformsSeparator.Name = "targetPlatformsSeparator";
+ this.configurationTable.Add (this.targetPlatformsSeparator);
+ global::Gtk.Table.TableChild w26 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.targetPlatformsSeparator]));
+ w26.TopAttach = ((uint)(2));
+ w26.BottomAttach = ((uint)(3));
+ w26.RightAttach = ((uint)(3));
+ w26.YPadding = ((uint)(10));
+ w26.XOptions = ((global::Gtk.AttachOptions)(4));
+ w26.YOptions = ((global::Gtk.AttachOptions)(0));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.targetPlatformsVBox = new global::Gtk.VBox ();
+ this.targetPlatformsVBox.Name = "targetPlatformsVBox";
+ // Container child targetPlatformsVBox.Gtk.Box+BoxChild
+ this.androidCheckButton = new global::Gtk.CheckButton ();
+ this.androidCheckButton.CanFocus = true;
+ this.androidCheckButton.Name = "androidCheckButton";
+ this.androidCheckButton.Label = global::Mono.Unix.Catalog.GetString ("Android");
+ this.androidCheckButton.Active = true;
+ this.androidCheckButton.DrawIndicator = true;
+ this.androidCheckButton.UseUnderline = true;
+ this.targetPlatformsVBox.Add (this.androidCheckButton);
+ global::Gtk.Box.BoxChild w27 = ((global::Gtk.Box.BoxChild)(this.targetPlatformsVBox [this.androidCheckButton]));
+ w27.Position = 0;
+ w27.Expand = false;
+ w27.Fill = false;
+ w27.Padding = ((uint)(1));
+ // Container child targetPlatformsVBox.Gtk.Box+BoxChild
+ this.iOSCheckButton = new global::Gtk.CheckButton ();
+ this.iOSCheckButton.CanFocus = true;
+ this.iOSCheckButton.Name = "iOSCheckButton";
+ this.iOSCheckButton.Label = global::Mono.Unix.Catalog.GetString ("iOS");
+ this.iOSCheckButton.Active = true;
+ this.iOSCheckButton.DrawIndicator = true;
+ this.iOSCheckButton.UseUnderline = true;
+ this.targetPlatformsVBox.Add (this.iOSCheckButton);
+ global::Gtk.Box.BoxChild w28 = ((global::Gtk.Box.BoxChild)(this.targetPlatformsVBox [this.iOSCheckButton]));
+ w28.Position = 1;
+ w28.Expand = false;
+ w28.Fill = false;
+ w28.Padding = ((uint)(1));
+ this.configurationTable.Add (this.targetPlatformsVBox);
+ global::Gtk.Table.TableChild w29 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.targetPlatformsVBox]));
+ w29.TopAttach = ((uint)(3));
+ w29.BottomAttach = ((uint)(5));
+ w29.LeftAttach = ((uint)(1));
+ w29.RightAttach = ((uint)(2));
+ w29.XOptions = ((global::Gtk.AttachOptions)(4));
+ w29.YOptions = ((global::Gtk.AttachOptions)(0));
+ this.configurationTableEventBox.Add (this.configurationTable);
+ this.configurationVBox.Add (this.configurationTableEventBox);
+ global::Gtk.Box.BoxChild w31 = ((global::Gtk.Box.BoxChild)(this.configurationVBox [this.configurationTableEventBox]));
+ w31.Position = 1;
+ w31.Expand = false;
+ w31.Fill = false;
+ // Container child configurationVBox.Gtk.Box+BoxChild
+ this.configurationBottomEventBox = new global::Gtk.EventBox ();
+ this.configurationBottomEventBox.Name = "configurationBottomEventBox";
+ this.configurationVBox.Add (this.configurationBottomEventBox);
+ global::Gtk.Box.BoxChild w32 = ((global::Gtk.Box.BoxChild)(this.configurationVBox [this.configurationBottomEventBox]));
+ w32.Position = 2;
+ this.mainHBox.Add (this.configurationVBox);
+ global::Gtk.Box.BoxChild w33 = ((global::Gtk.Box.BoxChild)(this.mainHBox [this.configurationVBox]));
+ w33.Position = 1;
+ w33.Expand = false;
+ w33.Fill = false;
+ // Container child mainHBox.Gtk.Box+BoxChild
+ this.backgroundLargeImageEventBox = new global::Gtk.EventBox ();
+ this.backgroundLargeImageEventBox.Name = "backgroundLargeImageEventBox";
+ // Container child backgroundLargeImageEventBox.Gtk.Container+ContainerChild
+ this.backgroundLargeImageVBox = new global::Gtk.VBox ();
+ this.backgroundLargeImageVBox.Name = "backgroundLargeImageVBox";
+ this.backgroundLargeImageEventBox.Add (this.backgroundLargeImageVBox);
+ this.mainHBox.Add (this.backgroundLargeImageEventBox);
+ global::Gtk.Box.BoxChild w35 = ((global::Gtk.Box.BoxChild)(this.mainHBox [this.backgroundLargeImageEventBox]));
+ w35.Position = 2;
+ this.Add (this.mainHBox);
+ if ((this.Child != null)) {
+ this.Child.ShowAll ();
+ }
+ this.Hide ();
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget.cs b/main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget.cs
new file mode 100644
index 0000000000..fd93c0c519
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget.cs
@@ -0,0 +1,582 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace MonoDevelop.Packaging.Gui
+{
+ public partial class GtkNuGetPackageMetadataOptionsPanelWidget
+ {
+ private global::Gtk.Notebook notebook;
+
+ private global::Gtk.Table generalTable;
+
+ private global::Gtk.Label packageAuthorsLabel;
+
+ private global::Gtk.Entry packageAuthorsTextBox;
+
+ private global::Gtk.VBox packageDescriptionLabelVBox;
+
+ private global::Gtk.Label packageDescriptionLabel;
+
+ private global::Gtk.Label packageDescriptionPaddingLabel;
+
+ private global::Gtk.ScrolledWindow packageDescriptionScrolledWindow;
+
+ private global::Gtk.TextView packageDescriptionTextView;
+
+ private global::Gtk.Label packageIdLabel;
+
+ private global::Gtk.Entry packageIdTextBox;
+
+ private global::Gtk.Label packageVersionLabel;
+
+ private global::Gtk.Entry packageVersionTextBox;
+
+ private global::Gtk.Label generalTabPageLabel;
+
+ private global::Gtk.Table detailsTable;
+
+ private global::Gtk.Label packageCopyrightLabel;
+
+ private global::Gtk.Entry packageCopyrightTextBox;
+
+ private global::Gtk.CheckButton packageDevelopmentDependencyCheckBox;
+
+ private global::Gtk.Label packageDevelopmentDependencyLabel;
+
+ private global::Gtk.Label packageIconUrlLabel;
+
+ private global::Gtk.Entry packageIconUrlTextBox;
+
+ private global::Gtk.HBox packageLanguageHBox;
+
+ private global::Gtk.ComboBoxEntry packageLanguageComboBox;
+
+ private global::Gtk.Label packageLanguageLabel;
+
+ private global::Gtk.Label packageLicenseUrlLabel;
+
+ private global::Gtk.Entry packageLicenseUrlTextBox;
+
+ private global::Gtk.Label packageOwnersLabel;
+
+ private global::Gtk.Entry packageOwnersTextBox;
+
+ private global::Gtk.Label packageProjectUrlLabel;
+
+ private global::Gtk.Entry packageProjectUrlTextBox;
+
+ private global::Gtk.VBox packageReleaseNotesLabelVBox;
+
+ private global::Gtk.Label packageReleaseNotesLabel;
+
+ private global::Gtk.Label packageReleaseNotesPaddingLabel;
+
+ private global::Gtk.ScrolledWindow packageReleaseNotesScrolledWindow;
+
+ private global::Gtk.TextView packageReleaseNotesTextView;
+
+ private global::Gtk.CheckButton packageRequireLicenseAcceptanceCheckBox;
+
+ private global::Gtk.Label packageRequireLicenseAcceptanceLabel;
+
+ private global::Gtk.Label packageSummaryLabel;
+
+ private global::Gtk.Entry packageSummaryTextBox;
+
+ private global::Gtk.Label packageTagsLabel;
+
+ private global::Gtk.Entry packageTagsTextBox;
+
+ private global::Gtk.Label packageTitleLabel;
+
+ private global::Gtk.Entry packageTitleTextBox;
+
+ private global::Gtk.Label detailsTabPageLabel;
+
+ protected virtual void Build()
+ {
+ global::Stetic.Gui.Initialize(this);
+ // Widget MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget
+ global::Stetic.BinContainer.Attach(this);
+ this.Name = "MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget";
+ // Container child MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget.Gtk.Container+ContainerChild
+ this.notebook = new global::Gtk.Notebook();
+ this.notebook.CanFocus = true;
+ this.notebook.Name = "notebook";
+ this.notebook.CurrentPage = 0;
+ // Container child notebook.Gtk.Notebook+NotebookChild
+ this.generalTable = new global::Gtk.Table(((uint)(5)), ((uint)(3)), false);
+ this.generalTable.Name = "generalTable";
+ this.generalTable.RowSpacing = ((uint)(6));
+ this.generalTable.ColumnSpacing = ((uint)(6));
+ this.generalTable.BorderWidth = ((uint)(10));
+ // Container child generalTable.Gtk.Table+TableChild
+ this.packageAuthorsLabel = new global::Gtk.Label();
+ this.packageAuthorsLabel.Name = "packageAuthorsLabel";
+ this.packageAuthorsLabel.Xalign = 0F;
+ this.packageAuthorsLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Authors:");
+ this.generalTable.Add(this.packageAuthorsLabel);
+ global::Gtk.Table.TableChild w1 = ((global::Gtk.Table.TableChild)(this.generalTable[this.packageAuthorsLabel]));
+ w1.TopAttach = ((uint)(2));
+ w1.BottomAttach = ((uint)(3));
+ w1.XOptions = ((global::Gtk.AttachOptions)(4));
+ w1.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child generalTable.Gtk.Table+TableChild
+ this.packageAuthorsTextBox = new global::Gtk.Entry();
+ this.packageAuthorsTextBox.CanFocus = true;
+ this.packageAuthorsTextBox.Name = "packageAuthorsTextBox";
+ this.packageAuthorsTextBox.IsEditable = true;
+ this.packageAuthorsTextBox.InvisibleChar = '●';
+ this.generalTable.Add(this.packageAuthorsTextBox);
+ global::Gtk.Table.TableChild w2 = ((global::Gtk.Table.TableChild)(this.generalTable[this.packageAuthorsTextBox]));
+ w2.TopAttach = ((uint)(2));
+ w2.BottomAttach = ((uint)(3));
+ w2.LeftAttach = ((uint)(1));
+ w2.RightAttach = ((uint)(2));
+ w2.XOptions = ((global::Gtk.AttachOptions)(4));
+ w2.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child generalTable.Gtk.Table+TableChild
+ this.packageDescriptionLabelVBox = new global::Gtk.VBox();
+ this.packageDescriptionLabelVBox.Name = "packageDescriptionLabelVBox";
+ this.packageDescriptionLabelVBox.Spacing = 6;
+ // Container child packageDescriptionLabelVBox.Gtk.Box+BoxChild
+ this.packageDescriptionLabel = new global::Gtk.Label();
+ this.packageDescriptionLabel.WidthRequest = 164;
+ this.packageDescriptionLabel.Name = "packageDescriptionLabel";
+ this.packageDescriptionLabel.Xalign = 0F;
+ this.packageDescriptionLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Description:");
+ this.packageDescriptionLabelVBox.Add(this.packageDescriptionLabel);
+ global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.packageDescriptionLabelVBox[this.packageDescriptionLabel]));
+ w3.Position = 0;
+ w3.Expand = false;
+ w3.Fill = false;
+ w3.Padding = ((uint)(6));
+ // Container child packageDescriptionLabelVBox.Gtk.Box+BoxChild
+ this.packageDescriptionPaddingLabel = new global::Gtk.Label();
+ this.packageDescriptionPaddingLabel.Name = "packageDescriptionPaddingLabel";
+ this.packageDescriptionPaddingLabel.Xalign = 0F;
+ this.packageDescriptionLabelVBox.Add(this.packageDescriptionPaddingLabel);
+ global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.packageDescriptionLabelVBox[this.packageDescriptionPaddingLabel]));
+ w4.Position = 1;
+ w4.Expand = false;
+ w4.Fill = false;
+ this.generalTable.Add(this.packageDescriptionLabelVBox);
+ global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.generalTable[this.packageDescriptionLabelVBox]));
+ w5.TopAttach = ((uint)(3));
+ w5.BottomAttach = ((uint)(4));
+ w5.XOptions = ((global::Gtk.AttachOptions)(4));
+ w5.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child generalTable.Gtk.Table+TableChild
+ this.packageDescriptionScrolledWindow = new global::Gtk.ScrolledWindow();
+ this.packageDescriptionScrolledWindow.Name = "packageDescriptionScrolledWindow";
+ this.packageDescriptionScrolledWindow.HscrollbarPolicy = ((global::Gtk.PolicyType)(2));
+ this.packageDescriptionScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child packageDescriptionScrolledWindow.Gtk.Container+ContainerChild
+ this.packageDescriptionTextView = new global::Gtk.TextView();
+ this.packageDescriptionTextView.CanFocus = true;
+ this.packageDescriptionTextView.Name = "packageDescriptionTextView";
+ this.packageDescriptionTextView.AcceptsTab = false;
+ this.packageDescriptionTextView.WrapMode = ((global::Gtk.WrapMode)(2));
+ this.packageDescriptionScrolledWindow.Add(this.packageDescriptionTextView);
+ this.generalTable.Add(this.packageDescriptionScrolledWindow);
+ global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.generalTable[this.packageDescriptionScrolledWindow]));
+ w7.TopAttach = ((uint)(3));
+ w7.BottomAttach = ((uint)(4));
+ w7.LeftAttach = ((uint)(1));
+ w7.RightAttach = ((uint)(2));
+ w7.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child generalTable.Gtk.Table+TableChild
+ this.packageIdLabel = new global::Gtk.Label();
+ this.packageIdLabel.Name = "packageIdLabel";
+ this.packageIdLabel.Xalign = 0F;
+ this.packageIdLabel.LabelProp = global::Mono.Unix.Catalog.GetString("ID:");
+ this.generalTable.Add(this.packageIdLabel);
+ global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.generalTable[this.packageIdLabel]));
+ w8.XOptions = ((global::Gtk.AttachOptions)(4));
+ w8.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child generalTable.Gtk.Table+TableChild
+ this.packageIdTextBox = new global::Gtk.Entry();
+ this.packageIdTextBox.CanFocus = true;
+ this.packageIdTextBox.Name = "packageIdTextBox";
+ this.packageIdTextBox.IsEditable = true;
+ this.packageIdTextBox.InvisibleChar = '●';
+ this.generalTable.Add(this.packageIdTextBox);
+ global::Gtk.Table.TableChild w9 = ((global::Gtk.Table.TableChild)(this.generalTable[this.packageIdTextBox]));
+ w9.LeftAttach = ((uint)(1));
+ w9.RightAttach = ((uint)(2));
+ w9.XOptions = ((global::Gtk.AttachOptions)(4));
+ w9.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child generalTable.Gtk.Table+TableChild
+ this.packageVersionLabel = new global::Gtk.Label();
+ this.packageVersionLabel.Name = "packageVersionLabel";
+ this.packageVersionLabel.Xalign = 0F;
+ this.packageVersionLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Version:");
+ this.generalTable.Add(this.packageVersionLabel);
+ global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.generalTable[this.packageVersionLabel]));
+ w10.TopAttach = ((uint)(1));
+ w10.BottomAttach = ((uint)(2));
+ w10.XOptions = ((global::Gtk.AttachOptions)(4));
+ w10.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child generalTable.Gtk.Table+TableChild
+ this.packageVersionTextBox = new global::Gtk.Entry();
+ this.packageVersionTextBox.CanFocus = true;
+ this.packageVersionTextBox.Name = "packageVersionTextBox";
+ this.packageVersionTextBox.IsEditable = true;
+ this.packageVersionTextBox.InvisibleChar = '●';
+ this.generalTable.Add(this.packageVersionTextBox);
+ global::Gtk.Table.TableChild w11 = ((global::Gtk.Table.TableChild)(this.generalTable[this.packageVersionTextBox]));
+ w11.TopAttach = ((uint)(1));
+ w11.BottomAttach = ((uint)(2));
+ w11.LeftAttach = ((uint)(1));
+ w11.RightAttach = ((uint)(2));
+ w11.XOptions = ((global::Gtk.AttachOptions)(4));
+ w11.YOptions = ((global::Gtk.AttachOptions)(4));
+ this.notebook.Add(this.generalTable);
+ // Notebook tab
+ this.generalTabPageLabel = new global::Gtk.Label();
+ this.generalTabPageLabel.Name = "generalTabPageLabel";
+ this.generalTabPageLabel.LabelProp = global::Mono.Unix.Catalog.GetString("General");
+ this.notebook.SetTabLabel(this.generalTable, this.generalTabPageLabel);
+ this.generalTabPageLabel.ShowAll();
+ // Container child notebook.Gtk.Notebook+NotebookChild
+ this.detailsTable = new global::Gtk.Table(((uint)(13)), ((uint)(3)), false);
+ this.detailsTable.Name = "detailsTable";
+ this.detailsTable.RowSpacing = ((uint)(6));
+ this.detailsTable.ColumnSpacing = ((uint)(6));
+ this.detailsTable.BorderWidth = ((uint)(10));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageCopyrightLabel = new global::Gtk.Label();
+ this.packageCopyrightLabel.Name = "packageCopyrightLabel";
+ this.packageCopyrightLabel.Xalign = 0F;
+ this.packageCopyrightLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Copyright:");
+ this.detailsTable.Add(this.packageCopyrightLabel);
+ global::Gtk.Table.TableChild w13 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageCopyrightLabel]));
+ w13.TopAttach = ((uint)(1));
+ w13.BottomAttach = ((uint)(2));
+ w13.XOptions = ((global::Gtk.AttachOptions)(4));
+ w13.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageCopyrightTextBox = new global::Gtk.Entry();
+ this.packageCopyrightTextBox.CanFocus = true;
+ this.packageCopyrightTextBox.Name = "packageCopyrightTextBox";
+ this.packageCopyrightTextBox.IsEditable = true;
+ this.packageCopyrightTextBox.InvisibleChar = '●';
+ this.detailsTable.Add(this.packageCopyrightTextBox);
+ global::Gtk.Table.TableChild w14 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageCopyrightTextBox]));
+ w14.TopAttach = ((uint)(1));
+ w14.BottomAttach = ((uint)(2));
+ w14.LeftAttach = ((uint)(1));
+ w14.RightAttach = ((uint)(2));
+ w14.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageDevelopmentDependencyCheckBox = new global::Gtk.CheckButton();
+ this.packageDevelopmentDependencyCheckBox.CanFocus = true;
+ this.packageDevelopmentDependencyCheckBox.Name = "packageDevelopmentDependencyCheckBox";
+ this.packageDevelopmentDependencyCheckBox.Label = "";
+ this.packageDevelopmentDependencyCheckBox.DrawIndicator = true;
+ this.packageDevelopmentDependencyCheckBox.UseUnderline = true;
+ this.packageDevelopmentDependencyCheckBox.Xalign = 0F;
+ this.detailsTable.Add(this.packageDevelopmentDependencyCheckBox);
+ global::Gtk.Table.TableChild w15 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageDevelopmentDependencyCheckBox]));
+ w15.TopAttach = ((uint)(8));
+ w15.BottomAttach = ((uint)(9));
+ w15.LeftAttach = ((uint)(1));
+ w15.RightAttach = ((uint)(2));
+ w15.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageDevelopmentDependencyLabel = new global::Gtk.Label();
+ this.packageDevelopmentDependencyLabel.Name = "packageDevelopmentDependencyLabel";
+ this.packageDevelopmentDependencyLabel.Xalign = 0F;
+ this.packageDevelopmentDependencyLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Development Dependency:");
+ this.detailsTable.Add(this.packageDevelopmentDependencyLabel);
+ global::Gtk.Table.TableChild w16 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageDevelopmentDependencyLabel]));
+ w16.TopAttach = ((uint)(8));
+ w16.BottomAttach = ((uint)(9));
+ w16.XOptions = ((global::Gtk.AttachOptions)(4));
+ w16.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageIconUrlLabel = new global::Gtk.Label();
+ this.packageIconUrlLabel.Name = "packageIconUrlLabel";
+ this.packageIconUrlLabel.Xalign = 0F;
+ this.packageIconUrlLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Icon URL:");
+ this.detailsTable.Add(this.packageIconUrlLabel);
+ global::Gtk.Table.TableChild w17 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageIconUrlLabel]));
+ w17.TopAttach = ((uint)(5));
+ w17.BottomAttach = ((uint)(6));
+ w17.XOptions = ((global::Gtk.AttachOptions)(4));
+ w17.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageIconUrlTextBox = new global::Gtk.Entry();
+ this.packageIconUrlTextBox.CanFocus = true;
+ this.packageIconUrlTextBox.Name = "packageIconUrlTextBox";
+ this.packageIconUrlTextBox.IsEditable = true;
+ this.packageIconUrlTextBox.InvisibleChar = '●';
+ this.detailsTable.Add(this.packageIconUrlTextBox);
+ global::Gtk.Table.TableChild w18 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageIconUrlTextBox]));
+ w18.TopAttach = ((uint)(5));
+ w18.BottomAttach = ((uint)(6));
+ w18.LeftAttach = ((uint)(1));
+ w18.RightAttach = ((uint)(2));
+ w18.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageLanguageHBox = new global::Gtk.HBox();
+ this.packageLanguageHBox.Name = "packageLanguageHBox";
+ this.packageLanguageHBox.Spacing = 6;
+ // Container child packageLanguageHBox.Gtk.Box+BoxChild
+ this.packageLanguageComboBox = global::Gtk.ComboBoxEntry.NewText();
+ this.packageLanguageComboBox.Name = "packageLanguageComboBox";
+ this.packageLanguageHBox.Add(this.packageLanguageComboBox);
+ global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.packageLanguageHBox[this.packageLanguageComboBox]));
+ w19.Position = 0;
+ w19.Expand = false;
+ w19.Fill = false;
+ this.detailsTable.Add(this.packageLanguageHBox);
+ global::Gtk.Table.TableChild w20 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageLanguageHBox]));
+ w20.TopAttach = ((uint)(10));
+ w20.BottomAttach = ((uint)(11));
+ w20.LeftAttach = ((uint)(1));
+ w20.RightAttach = ((uint)(2));
+ w20.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageLanguageLabel = new global::Gtk.Label();
+ this.packageLanguageLabel.Name = "packageLanguageLabel";
+ this.packageLanguageLabel.Xalign = 0F;
+ this.packageLanguageLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Language:");
+ this.detailsTable.Add(this.packageLanguageLabel);
+ global::Gtk.Table.TableChild w21 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageLanguageLabel]));
+ w21.TopAttach = ((uint)(10));
+ w21.BottomAttach = ((uint)(11));
+ w21.XOptions = ((global::Gtk.AttachOptions)(4));
+ w21.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageLicenseUrlLabel = new global::Gtk.Label();
+ this.packageLicenseUrlLabel.Name = "packageLicenseUrlLabel";
+ this.packageLicenseUrlLabel.Xalign = 0F;
+ this.packageLicenseUrlLabel.LabelProp = global::Mono.Unix.Catalog.GetString("License URL:");
+ this.detailsTable.Add(this.packageLicenseUrlLabel);
+ global::Gtk.Table.TableChild w22 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageLicenseUrlLabel]));
+ w22.TopAttach = ((uint)(6));
+ w22.BottomAttach = ((uint)(7));
+ w22.XOptions = ((global::Gtk.AttachOptions)(4));
+ w22.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageLicenseUrlTextBox = new global::Gtk.Entry();
+ this.packageLicenseUrlTextBox.CanFocus = true;
+ this.packageLicenseUrlTextBox.Name = "packageLicenseUrlTextBox";
+ this.packageLicenseUrlTextBox.IsEditable = true;
+ this.packageLicenseUrlTextBox.InvisibleChar = '●';
+ this.detailsTable.Add(this.packageLicenseUrlTextBox);
+ global::Gtk.Table.TableChild w23 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageLicenseUrlTextBox]));
+ w23.TopAttach = ((uint)(6));
+ w23.BottomAttach = ((uint)(7));
+ w23.LeftAttach = ((uint)(1));
+ w23.RightAttach = ((uint)(2));
+ w23.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageOwnersLabel = new global::Gtk.Label();
+ this.packageOwnersLabel.Name = "packageOwnersLabel";
+ this.packageOwnersLabel.Xalign = 0F;
+ this.packageOwnersLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Owners:");
+ this.detailsTable.Add(this.packageOwnersLabel);
+ global::Gtk.Table.TableChild w24 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageOwnersLabel]));
+ w24.XOptions = ((global::Gtk.AttachOptions)(4));
+ w24.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageOwnersTextBox = new global::Gtk.Entry();
+ this.packageOwnersTextBox.CanFocus = true;
+ this.packageOwnersTextBox.Name = "packageOwnersTextBox";
+ this.packageOwnersTextBox.IsEditable = true;
+ this.packageOwnersTextBox.InvisibleChar = '●';
+ this.detailsTable.Add(this.packageOwnersTextBox);
+ global::Gtk.Table.TableChild w25 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageOwnersTextBox]));
+ w25.LeftAttach = ((uint)(1));
+ w25.RightAttach = ((uint)(2));
+ w25.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageProjectUrlLabel = new global::Gtk.Label();
+ this.packageProjectUrlLabel.Name = "packageProjectUrlLabel";
+ this.packageProjectUrlLabel.Xalign = 0F;
+ this.packageProjectUrlLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Project URL:");
+ this.detailsTable.Add(this.packageProjectUrlLabel);
+ global::Gtk.Table.TableChild w26 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageProjectUrlLabel]));
+ w26.TopAttach = ((uint)(4));
+ w26.BottomAttach = ((uint)(5));
+ w26.XOptions = ((global::Gtk.AttachOptions)(4));
+ w26.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageProjectUrlTextBox = new global::Gtk.Entry();
+ this.packageProjectUrlTextBox.CanFocus = true;
+ this.packageProjectUrlTextBox.Name = "packageProjectUrlTextBox";
+ this.packageProjectUrlTextBox.IsEditable = true;
+ this.packageProjectUrlTextBox.InvisibleChar = '●';
+ this.detailsTable.Add(this.packageProjectUrlTextBox);
+ global::Gtk.Table.TableChild w27 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageProjectUrlTextBox]));
+ w27.TopAttach = ((uint)(4));
+ w27.BottomAttach = ((uint)(5));
+ w27.LeftAttach = ((uint)(1));
+ w27.RightAttach = ((uint)(2));
+ w27.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageReleaseNotesLabelVBox = new global::Gtk.VBox();
+ this.packageReleaseNotesLabelVBox.Name = "packageReleaseNotesLabelVBox";
+ this.packageReleaseNotesLabelVBox.Spacing = 6;
+ // Container child packageReleaseNotesLabelVBox.Gtk.Box+BoxChild
+ this.packageReleaseNotesLabel = new global::Gtk.Label();
+ this.packageReleaseNotesLabel.Name = "packageReleaseNotesLabel";
+ this.packageReleaseNotesLabel.Xalign = 0F;
+ this.packageReleaseNotesLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Release Notes:");
+ this.packageReleaseNotesLabelVBox.Add(this.packageReleaseNotesLabel);
+ global::Gtk.Box.BoxChild w28 = ((global::Gtk.Box.BoxChild)(this.packageReleaseNotesLabelVBox[this.packageReleaseNotesLabel]));
+ w28.Position = 0;
+ w28.Expand = false;
+ w28.Fill = false;
+ w28.Padding = ((uint)(6));
+ // Container child packageReleaseNotesLabelVBox.Gtk.Box+BoxChild
+ this.packageReleaseNotesPaddingLabel = new global::Gtk.Label();
+ this.packageReleaseNotesPaddingLabel.Name = "packageReleaseNotesPaddingLabel";
+ this.packageReleaseNotesPaddingLabel.Xalign = 0F;
+ this.packageReleaseNotesLabelVBox.Add(this.packageReleaseNotesPaddingLabel);
+ global::Gtk.Box.BoxChild w29 = ((global::Gtk.Box.BoxChild)(this.packageReleaseNotesLabelVBox[this.packageReleaseNotesPaddingLabel]));
+ w29.Position = 1;
+ w29.Expand = false;
+ w29.Fill = false;
+ this.detailsTable.Add(this.packageReleaseNotesLabelVBox);
+ global::Gtk.Table.TableChild w30 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageReleaseNotesLabelVBox]));
+ w30.TopAttach = ((uint)(11));
+ w30.BottomAttach = ((uint)(12));
+ w30.XOptions = ((global::Gtk.AttachOptions)(4));
+ w30.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageReleaseNotesScrolledWindow = new global::Gtk.ScrolledWindow();
+ this.packageReleaseNotesScrolledWindow.Name = "packageReleaseNotesScrolledWindow";
+ this.packageReleaseNotesScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child packageReleaseNotesScrolledWindow.Gtk.Container+ContainerChild
+ this.packageReleaseNotesTextView = new global::Gtk.TextView();
+ this.packageReleaseNotesTextView.CanFocus = true;
+ this.packageReleaseNotesTextView.Name = "packageReleaseNotesTextView";
+ this.packageReleaseNotesTextView.AcceptsTab = false;
+ this.packageReleaseNotesTextView.WrapMode = ((global::Gtk.WrapMode)(2));
+ this.packageReleaseNotesScrolledWindow.Add(this.packageReleaseNotesTextView);
+ this.detailsTable.Add(this.packageReleaseNotesScrolledWindow);
+ global::Gtk.Table.TableChild w32 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageReleaseNotesScrolledWindow]));
+ w32.TopAttach = ((uint)(11));
+ w32.BottomAttach = ((uint)(12));
+ w32.LeftAttach = ((uint)(1));
+ w32.RightAttach = ((uint)(2));
+ w32.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageRequireLicenseAcceptanceCheckBox = new global::Gtk.CheckButton();
+ this.packageRequireLicenseAcceptanceCheckBox.CanFocus = true;
+ this.packageRequireLicenseAcceptanceCheckBox.Name = "packageRequireLicenseAcceptanceCheckBox";
+ this.packageRequireLicenseAcceptanceCheckBox.Label = "";
+ this.packageRequireLicenseAcceptanceCheckBox.DrawIndicator = true;
+ this.packageRequireLicenseAcceptanceCheckBox.UseUnderline = true;
+ this.packageRequireLicenseAcceptanceCheckBox.Xalign = 0F;
+ this.detailsTable.Add(this.packageRequireLicenseAcceptanceCheckBox);
+ global::Gtk.Table.TableChild w33 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageRequireLicenseAcceptanceCheckBox]));
+ w33.TopAttach = ((uint)(7));
+ w33.BottomAttach = ((uint)(8));
+ w33.LeftAttach = ((uint)(1));
+ w33.RightAttach = ((uint)(2));
+ w33.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageRequireLicenseAcceptanceLabel = new global::Gtk.Label();
+ this.packageRequireLicenseAcceptanceLabel.Name = "packageRequireLicenseAcceptanceLabel";
+ this.packageRequireLicenseAcceptanceLabel.Xalign = 0F;
+ this.packageRequireLicenseAcceptanceLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Require License Acceptance:");
+ this.detailsTable.Add(this.packageRequireLicenseAcceptanceLabel);
+ global::Gtk.Table.TableChild w34 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageRequireLicenseAcceptanceLabel]));
+ w34.TopAttach = ((uint)(7));
+ w34.BottomAttach = ((uint)(8));
+ w34.XOptions = ((global::Gtk.AttachOptions)(4));
+ w34.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageSummaryLabel = new global::Gtk.Label();
+ this.packageSummaryLabel.Name = "packageSummaryLabel";
+ this.packageSummaryLabel.Xalign = 0F;
+ this.packageSummaryLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Summary:");
+ this.detailsTable.Add(this.packageSummaryLabel);
+ global::Gtk.Table.TableChild w35 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageSummaryLabel]));
+ w35.TopAttach = ((uint)(3));
+ w35.BottomAttach = ((uint)(4));
+ w35.XOptions = ((global::Gtk.AttachOptions)(4));
+ w35.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageSummaryTextBox = new global::Gtk.Entry();
+ this.packageSummaryTextBox.CanFocus = true;
+ this.packageSummaryTextBox.Name = "packageSummaryTextBox";
+ this.packageSummaryTextBox.IsEditable = true;
+ this.packageSummaryTextBox.InvisibleChar = '●';
+ this.detailsTable.Add(this.packageSummaryTextBox);
+ global::Gtk.Table.TableChild w36 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageSummaryTextBox]));
+ w36.TopAttach = ((uint)(3));
+ w36.BottomAttach = ((uint)(4));
+ w36.LeftAttach = ((uint)(1));
+ w36.RightAttach = ((uint)(2));
+ w36.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageTagsLabel = new global::Gtk.Label();
+ this.packageTagsLabel.Name = "packageTagsLabel";
+ this.packageTagsLabel.Xalign = 0F;
+ this.packageTagsLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Tags:");
+ this.detailsTable.Add(this.packageTagsLabel);
+ global::Gtk.Table.TableChild w37 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageTagsLabel]));
+ w37.TopAttach = ((uint)(9));
+ w37.BottomAttach = ((uint)(10));
+ w37.XOptions = ((global::Gtk.AttachOptions)(4));
+ w37.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageTagsTextBox = new global::Gtk.Entry();
+ this.packageTagsTextBox.CanFocus = true;
+ this.packageTagsTextBox.Name = "packageTagsTextBox";
+ this.packageTagsTextBox.IsEditable = true;
+ this.packageTagsTextBox.InvisibleChar = '●';
+ this.detailsTable.Add(this.packageTagsTextBox);
+ global::Gtk.Table.TableChild w38 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageTagsTextBox]));
+ w38.TopAttach = ((uint)(9));
+ w38.BottomAttach = ((uint)(10));
+ w38.LeftAttach = ((uint)(1));
+ w38.RightAttach = ((uint)(2));
+ w38.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageTitleLabel = new global::Gtk.Label();
+ this.packageTitleLabel.Name = "packageTitleLabel";
+ this.packageTitleLabel.Xalign = 0F;
+ this.packageTitleLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Title:");
+ this.detailsTable.Add(this.packageTitleLabel);
+ global::Gtk.Table.TableChild w39 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageTitleLabel]));
+ w39.TopAttach = ((uint)(2));
+ w39.BottomAttach = ((uint)(3));
+ w39.XOptions = ((global::Gtk.AttachOptions)(4));
+ w39.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child detailsTable.Gtk.Table+TableChild
+ this.packageTitleTextBox = new global::Gtk.Entry();
+ this.packageTitleTextBox.CanFocus = true;
+ this.packageTitleTextBox.Name = "packageTitleTextBox";
+ this.packageTitleTextBox.IsEditable = true;
+ this.packageTitleTextBox.InvisibleChar = '●';
+ this.detailsTable.Add(this.packageTitleTextBox);
+ global::Gtk.Table.TableChild w40 = ((global::Gtk.Table.TableChild)(this.detailsTable[this.packageTitleTextBox]));
+ w40.TopAttach = ((uint)(2));
+ w40.BottomAttach = ((uint)(3));
+ w40.LeftAttach = ((uint)(1));
+ w40.RightAttach = ((uint)(2));
+ w40.YOptions = ((global::Gtk.AttachOptions)(4));
+ this.notebook.Add(this.detailsTable);
+ global::Gtk.Notebook.NotebookChild w41 = ((global::Gtk.Notebook.NotebookChild)(this.notebook[this.detailsTable]));
+ w41.Position = 1;
+ // Notebook tab
+ this.detailsTabPageLabel = new global::Gtk.Label();
+ this.detailsTabPageLabel.Name = "detailsTabPageLabel";
+ this.detailsTabPageLabel.LabelProp = global::Mono.Unix.Catalog.GetString("Details");
+ this.notebook.SetTabLabel(this.detailsTable, this.detailsTabPageLabel);
+ this.detailsTabPageLabel.ShowAll();
+ this.Add(this.notebook);
+ if ((this.Child != null))
+ {
+ this.Child.ShowAll();
+ }
+ this.generalTabPageLabel.Hide();
+ this.Hide();
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkPackagingProjectTemplateWizardPageWidget.cs b/main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkPackagingProjectTemplateWizardPageWidget.cs
new file mode 100644
index 0000000000..e433a10da4
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/gtk-gui/MonoDevelop.Packaging.Gui.GtkPackagingProjectTemplateWizardPageWidget.cs
@@ -0,0 +1,235 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace MonoDevelop.Packaging.Gui
+{
+ public partial class GtkPackagingProjectTemplateWizardPageWidget
+ {
+ private global::Gtk.HBox mainHBox;
+
+ private global::Gtk.EventBox leftBorderEventBox;
+
+ private global::Gtk.VBox configurationVBox;
+
+ private global::Gtk.EventBox configurationTopEventBox;
+
+ private global::Gtk.EventBox configurationTableEventBox;
+
+ private global::Gtk.Table configurationTable;
+
+ private global::Gtk.EventBox idEventBox;
+
+ private global::Gtk.EventBox organizationInfoEventBox;
+
+ private global::Gtk.EventBox versionEventBox;
+
+ private global::Gtk.Label packageAuthorsLabel;
+
+ private global::Gtk.Entry packageAuthorsTextBox;
+
+ private global::Gtk.Label packageDescriptionLabel;
+
+ private global::Gtk.Entry packageDescriptionTextBox;
+
+ private global::Gtk.Label packageIdLabel;
+
+ private global::Gtk.Entry packageIdTextBox;
+
+ private global::Gtk.DrawingArea separator;
+
+ private global::Gtk.EventBox configurationBottomEventBox;
+
+ private global::Gtk.EventBox backgroundLargeImageEventBox;
+
+ private global::Gtk.VBox backgroundLargeImageVBox;
+
+ protected virtual void Build ()
+ {
+ global::Stetic.Gui.Initialize (this);
+ // Widget MonoDevelop.Packaging.Gui.GtkPackagingProjectTemplateWizardPageWidget
+ global::Stetic.BinContainer.Attach (this);
+ this.Name = "MonoDevelop.Packaging.Gui.GtkPackagingProjectTemplateWizardPageWidget";
+ // Container child MonoDevelop.Packaging.Gui.GtkPackagingProjectTemplateWizardPageWidget.Gtk.Container+ContainerChild
+ this.mainHBox = new global::Gtk.HBox ();
+ this.mainHBox.Name = "mainHBox";
+ // Container child mainHBox.Gtk.Box+BoxChild
+ this.leftBorderEventBox = new global::Gtk.EventBox ();
+ this.leftBorderEventBox.WidthRequest = 30;
+ this.leftBorderEventBox.Name = "leftBorderEventBox";
+ this.mainHBox.Add (this.leftBorderEventBox);
+ global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.mainHBox [this.leftBorderEventBox]));
+ w1.Position = 0;
+ w1.Expand = false;
+ // Container child mainHBox.Gtk.Box+BoxChild
+ this.configurationVBox = new global::Gtk.VBox ();
+ this.configurationVBox.WidthRequest = 440;
+ this.configurationVBox.Name = "configurationVBox";
+ // Container child configurationVBox.Gtk.Box+BoxChild
+ this.configurationTopEventBox = new global::Gtk.EventBox ();
+ this.configurationTopEventBox.Name = "configurationTopEventBox";
+ this.configurationVBox.Add (this.configurationTopEventBox);
+ global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.configurationVBox [this.configurationTopEventBox]));
+ w2.Position = 0;
+ // Container child configurationVBox.Gtk.Box+BoxChild
+ this.configurationTableEventBox = new global::Gtk.EventBox ();
+ this.configurationTableEventBox.Name = "configurationTableEventBox";
+ // Container child configurationTableEventBox.Gtk.Container+ContainerChild
+ this.configurationTable = new global::Gtk.Table (((uint)(4)), ((uint)(3)), false);
+ this.configurationTable.Name = "configurationTable";
+ this.configurationTable.RowSpacing = ((uint)(7));
+ this.configurationTable.ColumnSpacing = ((uint)(6));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.idEventBox = new global::Gtk.EventBox ();
+ this.idEventBox.WidthRequest = 16;
+ this.idEventBox.HeightRequest = 16;
+ this.idEventBox.Name = "idEventBox";
+ this.idEventBox.VisibleWindow = false;
+ this.configurationTable.Add (this.idEventBox);
+ global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.idEventBox]));
+ w3.LeftAttach = ((uint)(2));
+ w3.RightAttach = ((uint)(3));
+ w3.XOptions = ((global::Gtk.AttachOptions)(4));
+ w3.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.organizationInfoEventBox = new global::Gtk.EventBox ();
+ this.organizationInfoEventBox.WidthRequest = 16;
+ this.organizationInfoEventBox.HeightRequest = 16;
+ this.organizationInfoEventBox.Name = "organizationInfoEventBox";
+ this.organizationInfoEventBox.VisibleWindow = false;
+ // Container child organizationInfoEventBox.Gtk.Container+ContainerChild
+ this.versionEventBox = new global::Gtk.EventBox ();
+ this.versionEventBox.WidthRequest = 16;
+ this.versionEventBox.HeightRequest = 16;
+ this.versionEventBox.Name = "versionEventBox";
+ this.versionEventBox.VisibleWindow = false;
+ this.organizationInfoEventBox.Add (this.versionEventBox);
+ this.configurationTable.Add (this.organizationInfoEventBox);
+ global::Gtk.Table.TableChild w5 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.organizationInfoEventBox]));
+ w5.TopAttach = ((uint)(1));
+ w5.BottomAttach = ((uint)(2));
+ w5.LeftAttach = ((uint)(2));
+ w5.RightAttach = ((uint)(3));
+ w5.XOptions = ((global::Gtk.AttachOptions)(2));
+ w5.YOptions = ((global::Gtk.AttachOptions)(2));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.packageAuthorsLabel = new global::Gtk.Label ();
+ this.packageAuthorsLabel.Name = "packageAuthorsLabel";
+ this.packageAuthorsLabel.Xpad = 5;
+ this.packageAuthorsLabel.Xalign = 1F;
+ this.packageAuthorsLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("Author:");
+ this.packageAuthorsLabel.Justify = ((global::Gtk.Justification)(1));
+ this.configurationTable.Add (this.packageAuthorsLabel);
+ global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.packageAuthorsLabel]));
+ w6.TopAttach = ((uint)(2));
+ w6.BottomAttach = ((uint)(3));
+ w6.XOptions = ((global::Gtk.AttachOptions)(4));
+ w6.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.packageAuthorsTextBox = new global::Gtk.Entry ();
+ this.packageAuthorsTextBox.CanFocus = true;
+ this.packageAuthorsTextBox.Name = "packageAuthorsTextBox";
+ this.packageAuthorsTextBox.IsEditable = true;
+ this.packageAuthorsTextBox.InvisibleChar = '●';
+ this.configurationTable.Add (this.packageAuthorsTextBox);
+ global::Gtk.Table.TableChild w7 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.packageAuthorsTextBox]));
+ w7.TopAttach = ((uint)(2));
+ w7.BottomAttach = ((uint)(3));
+ w7.LeftAttach = ((uint)(1));
+ w7.RightAttach = ((uint)(2));
+ w7.XOptions = ((global::Gtk.AttachOptions)(4));
+ w7.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.packageDescriptionLabel = new global::Gtk.Label ();
+ this.packageDescriptionLabel.Name = "packageDescriptionLabel";
+ this.packageDescriptionLabel.Xpad = 5;
+ this.packageDescriptionLabel.Xalign = 1F;
+ this.packageDescriptionLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("Description:");
+ this.packageDescriptionLabel.Justify = ((global::Gtk.Justification)(1));
+ this.configurationTable.Add (this.packageDescriptionLabel);
+ global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.packageDescriptionLabel]));
+ w8.TopAttach = ((uint)(3));
+ w8.BottomAttach = ((uint)(4));
+ w8.XOptions = ((global::Gtk.AttachOptions)(4));
+ w8.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.packageDescriptionTextBox = new global::Gtk.Entry ();
+ this.packageDescriptionTextBox.CanFocus = true;
+ this.packageDescriptionTextBox.Name = "packageDescriptionTextBox";
+ this.packageDescriptionTextBox.IsEditable = true;
+ this.packageDescriptionTextBox.InvisibleChar = '●';
+ this.configurationTable.Add (this.packageDescriptionTextBox);
+ global::Gtk.Table.TableChild w9 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.packageDescriptionTextBox]));
+ w9.TopAttach = ((uint)(3));
+ w9.BottomAttach = ((uint)(4));
+ w9.LeftAttach = ((uint)(1));
+ w9.RightAttach = ((uint)(2));
+ w9.XOptions = ((global::Gtk.AttachOptions)(4));
+ w9.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.packageIdLabel = new global::Gtk.Label ();
+ this.packageIdLabel.WidthRequest = 132;
+ this.packageIdLabel.Name = "packageIdLabel";
+ this.packageIdLabel.Xpad = 5;
+ this.packageIdLabel.Xalign = 1F;
+ this.packageIdLabel.LabelProp = global::Mono.Unix.Catalog.GetString ("ID:");
+ this.packageIdLabel.Justify = ((global::Gtk.Justification)(1));
+ this.configurationTable.Add (this.packageIdLabel);
+ global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.packageIdLabel]));
+ w10.XOptions = ((global::Gtk.AttachOptions)(4));
+ w10.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.packageIdTextBox = new global::Gtk.Entry ();
+ this.packageIdTextBox.CanFocus = true;
+ this.packageIdTextBox.Name = "packageIdTextBox";
+ this.packageIdTextBox.IsEditable = true;
+ this.packageIdTextBox.InvisibleChar = '●';
+ this.configurationTable.Add (this.packageIdTextBox);
+ global::Gtk.Table.TableChild w11 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.packageIdTextBox]));
+ w11.LeftAttach = ((uint)(1));
+ w11.RightAttach = ((uint)(2));
+ w11.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child configurationTable.Gtk.Table+TableChild
+ this.separator = new global::Gtk.DrawingArea ();
+ this.separator.HeightRequest = 1;
+ this.separator.Name = "separator";
+ this.configurationTable.Add (this.separator);
+ global::Gtk.Table.TableChild w12 = ((global::Gtk.Table.TableChild)(this.configurationTable [this.separator]));
+ w12.TopAttach = ((uint)(1));
+ w12.BottomAttach = ((uint)(2));
+ w12.RightAttach = ((uint)(3));
+ w12.XOptions = ((global::Gtk.AttachOptions)(4));
+ w12.YOptions = ((global::Gtk.AttachOptions)(0));
+ this.configurationTableEventBox.Add (this.configurationTable);
+ this.configurationVBox.Add (this.configurationTableEventBox);
+ global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.configurationVBox [this.configurationTableEventBox]));
+ w14.Position = 1;
+ w14.Expand = false;
+ w14.Fill = false;
+ // Container child configurationVBox.Gtk.Box+BoxChild
+ this.configurationBottomEventBox = new global::Gtk.EventBox ();
+ this.configurationBottomEventBox.Name = "configurationBottomEventBox";
+ this.configurationVBox.Add (this.configurationBottomEventBox);
+ global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.configurationVBox [this.configurationBottomEventBox]));
+ w15.Position = 2;
+ this.mainHBox.Add (this.configurationVBox);
+ global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.mainHBox [this.configurationVBox]));
+ w16.Position = 1;
+ w16.Expand = false;
+ w16.Fill = false;
+ // Container child mainHBox.Gtk.Box+BoxChild
+ this.backgroundLargeImageEventBox = new global::Gtk.EventBox ();
+ this.backgroundLargeImageEventBox.Name = "backgroundLargeImageEventBox";
+ // Container child backgroundLargeImageEventBox.Gtk.Container+ContainerChild
+ this.backgroundLargeImageVBox = new global::Gtk.VBox ();
+ this.backgroundLargeImageVBox.Name = "backgroundLargeImageVBox";
+ this.backgroundLargeImageEventBox.Add (this.backgroundLargeImageVBox);
+ this.mainHBox.Add (this.backgroundLargeImageEventBox);
+ global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.mainHBox [this.backgroundLargeImageEventBox]));
+ w18.Position = 2;
+ this.Add (this.mainHBox);
+ if ((this.Child != null)) {
+ this.Child.ShowAll ();
+ }
+ this.Hide ();
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/gtk-gui/generated.cs b/main/src/addins/MonoDevelop.Packaging/gtk-gui/generated.cs
new file mode 100644
index 0000000000..453751b36a
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/gtk-gui/generated.cs
@@ -0,0 +1,88 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace Stetic
+{
+ internal class Gui
+ {
+ private static bool initialized;
+
+ internal static void Initialize(Gtk.Widget iconRenderer)
+ {
+ if ((Stetic.Gui.initialized == false))
+ {
+ Stetic.Gui.initialized = true;
+ }
+ }
+ }
+
+ internal class BinContainer
+ {
+ private Gtk.Widget child;
+
+ private Gtk.UIManager uimanager;
+
+ public static BinContainer Attach(Gtk.Bin bin)
+ {
+ BinContainer bc = new BinContainer();
+ bin.SizeRequested += new Gtk.SizeRequestedHandler(bc.OnSizeRequested);
+ bin.SizeAllocated += new Gtk.SizeAllocatedHandler(bc.OnSizeAllocated);
+ bin.Added += new Gtk.AddedHandler(bc.OnAdded);
+ return bc;
+ }
+
+ private void OnSizeRequested(object sender, Gtk.SizeRequestedArgs args)
+ {
+ if ((this.child != null))
+ {
+ args.Requisition = this.child.SizeRequest();
+ }
+ }
+
+ private void OnSizeAllocated(object sender, Gtk.SizeAllocatedArgs args)
+ {
+ if ((this.child != null))
+ {
+ this.child.Allocation = args.Allocation;
+ }
+ }
+
+ private void OnAdded(object sender, Gtk.AddedArgs args)
+ {
+ this.child = args.Widget;
+ }
+
+ public void SetUiManager(Gtk.UIManager uim)
+ {
+ this.uimanager = uim;
+ this.child.Realized += new System.EventHandler(this.OnRealized);
+ }
+
+ private void OnRealized(object sender, System.EventArgs args)
+ {
+ if ((this.uimanager != null))
+ {
+ Gtk.Widget w;
+ w = this.child.Toplevel;
+ if (((w != null)
+ && typeof(Gtk.Window).IsInstanceOfType(w)))
+ {
+ ((Gtk.Window)(w)).AddAccelGroup(this.uimanager.AccelGroup);
+ this.uimanager = null;
+ }
+ }
+ }
+ }
+
+ internal class ActionGroups
+ {
+ public static Gtk.ActionGroup GetActionGroup(System.Type type)
+ {
+ return Stetic.ActionGroups.GetActionGroup(type.FullName);
+ }
+
+ public static Gtk.ActionGroup GetActionGroup(string name)
+ {
+ return null;
+ }
+ }
+}
diff --git a/main/src/addins/MonoDevelop.Packaging/gtk-gui/gui.stetic b/main/src/addins/MonoDevelop.Packaging/gtk-gui/gui.stetic
new file mode 100644
index 0000000000..b6cc959ea9
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/gtk-gui/gui.stetic
@@ -0,0 +1,1794 @@
+<?xml version="1.0" encoding="utf-8"?>
+<stetic-interface>
+ <configuration>
+ <images-root-path>..</images-root-path>
+ <target-gtk-version>2.12</target-gtk-version>
+ </configuration>
+ <import>
+ <widget-library name="../../../../build/bin/MonoDevelop.Ide.dll" />
+ <widget-library name="../../../../build/AddIns/MonoDevelop.DesignerSupport/MonoDevelop.DesignerSupport.dll" />
+ <widget-library name="../../../../build/AddIns/MonoDevelop.Packaging/MonoDevelop.Packaging.dll" internal="true" />
+ </import>
+ <widget class="Gtk.Bin" id="MonoDevelop.Packaging.Gui.GtkPackagingProjectTemplateWizardPageWidget" design-size="875 456">
+ <property name="MemberName" />
+ <property name="Visible">False</property>
+ <child>
+ <widget class="Gtk.HBox" id="mainHBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.EventBox" id="leftBorderEventBox">
+ <property name="MemberName" />
+ <property name="WidthRequest">30</property>
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.VBox" id="configurationVBox">
+ <property name="MemberName" />
+ <property name="WidthRequest">440</property>
+ <child>
+ <widget class="Gtk.EventBox" id="configurationTopEventBox">
+ <property name="MemberName" />
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="configurationTableEventBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.Table" id="configurationTable">
+ <property name="MemberName" />
+ <property name="NRows">4</property>
+ <property name="NColumns">3</property>
+ <property name="RowSpacing">7</property>
+ <property name="ColumnSpacing">6</property>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="idEventBox">
+ <property name="MemberName" />
+ <property name="WidthRequest">16</property>
+ <property name="HeightRequest">16</property>
+ <property name="VisibleWindow">False</property>
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="LeftAttach">2</property>
+ <property name="RightAttach">3</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="organizationInfoEventBox">
+ <property name="MemberName" />
+ <property name="WidthRequest">16</property>
+ <property name="HeightRequest">16</property>
+ <property name="VisibleWindow">False</property>
+ <child>
+ <widget class="Gtk.EventBox" id="versionEventBox">
+ <property name="MemberName" />
+ <property name="WidthRequest">16</property>
+ <property name="HeightRequest">16</property>
+ <property name="VisibleWindow">False</property>
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">1</property>
+ <property name="BottomAttach">2</property>
+ <property name="LeftAttach">2</property>
+ <property name="RightAttach">3</property>
+ <property name="AutoSize">False</property>
+ <property name="XOptions">Shrink</property>
+ <property name="YOptions">Shrink</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">False</property>
+ <property name="XShrink">True</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">False</property>
+ <property name="YShrink">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageAuthorsLabel">
+ <property name="MemberName" />
+ <property name="Xpad">5</property>
+ <property name="Xalign">1</property>
+ <property name="LabelProp" translatable="yes">Author:</property>
+ <property name="Justify">Right</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">2</property>
+ <property name="BottomAttach">3</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageAuthorsTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">2</property>
+ <property name="BottomAttach">3</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageDescriptionLabel">
+ <property name="MemberName" />
+ <property name="Xpad">5</property>
+ <property name="Xalign">1</property>
+ <property name="LabelProp" translatable="yes">Description:</property>
+ <property name="Justify">Right</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">3</property>
+ <property name="BottomAttach">4</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageDescriptionTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">3</property>
+ <property name="BottomAttach">4</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageIdLabel">
+ <property name="MemberName" />
+ <property name="WidthRequest">132</property>
+ <property name="Xpad">5</property>
+ <property name="Xalign">1</property>
+ <property name="LabelProp" translatable="yes">ID:</property>
+ <property name="Justify">Right</property>
+ </widget>
+ <packing>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageIdTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">False</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.DrawingArea" id="separator">
+ <property name="MemberName" />
+ <property name="HeightRequest">1</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">1</property>
+ <property name="BottomAttach">2</property>
+ <property name="RightAttach">3</property>
+ <property name="AutoSize">False</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">0</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">False</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="configurationBottomEventBox">
+ <property name="MemberName" />
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">2</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="backgroundLargeImageEventBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.VBox" id="backgroundLargeImageVBox">
+ <property name="MemberName" />
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">2</property>
+ <property name="AutoSize">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <widget class="Gtk.Bin" id="MonoDevelop.Packaging.Gui.GtkNuGetPackageMetadataOptionsPanelWidget" design-size="678 606">
+ <property name="MemberName" />
+ <property name="Visible">False</property>
+ <child>
+ <widget class="Gtk.Notebook" id="notebook">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="CurrentPage">0</property>
+ <child>
+ <widget class="Gtk.Table" id="generalTable">
+ <property name="MemberName" />
+ <property name="NRows">5</property>
+ <property name="NColumns">3</property>
+ <property name="RowSpacing">6</property>
+ <property name="ColumnSpacing">6</property>
+ <property name="BorderWidth">10</property>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageAuthorsLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Authors:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">2</property>
+ <property name="BottomAttach">3</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageAuthorsTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">2</property>
+ <property name="BottomAttach">3</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.VBox" id="packageDescriptionLabelVBox">
+ <property name="MemberName" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.Label" id="packageDescriptionLabel">
+ <property name="MemberName" />
+ <property name="WidthRequest">164</property>
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Description:</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ <property name="Padding">6</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageDescriptionPaddingLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">3</property>
+ <property name="BottomAttach">4</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.ScrolledWindow" id="packageDescriptionScrolledWindow">
+ <property name="MemberName" />
+ <property name="HscrollbarPolicy">Never</property>
+ <property name="ShadowType">In</property>
+ <child>
+ <widget class="Gtk.TextView" id="packageDescriptionTextView">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="ShowScrollbars">True</property>
+ <property name="AcceptsTab">False</property>
+ <property name="Text" translatable="yes" />
+ <property name="WrapMode">Word</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">3</property>
+ <property name="BottomAttach">4</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">False</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageIdLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">ID:</property>
+ </widget>
+ <packing>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageIdTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageVersionLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Version:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">1</property>
+ <property name="BottomAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageVersionTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">1</property>
+ <property name="BottomAttach">2</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="generalTabPageLabel">
+ <property name="MemberName" />
+ <property name="Visible">False</property>
+ <property name="LabelProp" translatable="yes">General</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Table" id="detailsTable">
+ <property name="MemberName" />
+ <property name="NRows">13</property>
+ <property name="NColumns">3</property>
+ <property name="RowSpacing">6</property>
+ <property name="ColumnSpacing">6</property>
+ <property name="BorderWidth">10</property>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageCopyrightLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Copyright:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">1</property>
+ <property name="BottomAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageCopyrightTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">1</property>
+ <property name="BottomAttach">2</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.CheckButton" id="packageDevelopmentDependencyCheckBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
+ <property name="Xalign">0</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">8</property>
+ <property name="BottomAttach">9</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageDevelopmentDependencyLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Development Dependency:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">8</property>
+ <property name="BottomAttach">9</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageIconUrlLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Icon URL:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">5</property>
+ <property name="BottomAttach">6</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageIconUrlTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">5</property>
+ <property name="BottomAttach">6</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.HBox" id="packageLanguageHBox">
+ <property name="MemberName" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.ComboBoxEntry" id="packageLanguageComboBox">
+ <property name="MemberName" />
+ <property name="IsTextCombo">True</property>
+ <property name="Items" translatable="yes" />
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">10</property>
+ <property name="BottomAttach">11</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageLanguageLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Language:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">10</property>
+ <property name="BottomAttach">11</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageLicenseUrlLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">License URL:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">6</property>
+ <property name="BottomAttach">7</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageLicenseUrlTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">6</property>
+ <property name="BottomAttach">7</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageOwnersLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Owners:</property>
+ </widget>
+ <packing>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageOwnersTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageProjectUrlLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Project URL:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">4</property>
+ <property name="BottomAttach">5</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageProjectUrlTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">4</property>
+ <property name="BottomAttach">5</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.VBox" id="packageReleaseNotesLabelVBox">
+ <property name="MemberName" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.Label" id="packageReleaseNotesLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Release Notes:</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ <property name="Padding">6</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageReleaseNotesPaddingLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">11</property>
+ <property name="BottomAttach">12</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.ScrolledWindow" id="packageReleaseNotesScrolledWindow">
+ <property name="MemberName" />
+ <property name="ShadowType">In</property>
+ <child>
+ <widget class="Gtk.TextView" id="packageReleaseNotesTextView">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="ShowScrollbars">True</property>
+ <property name="AcceptsTab">False</property>
+ <property name="Text" translatable="yes" />
+ <property name="WrapMode">Word</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">11</property>
+ <property name="BottomAttach">12</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.CheckButton" id="packageRequireLicenseAcceptanceCheckBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
+ <property name="Xalign">0</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">7</property>
+ <property name="BottomAttach">8</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageRequireLicenseAcceptanceLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Require License Acceptance:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">7</property>
+ <property name="BottomAttach">8</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageSummaryLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Summary:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">3</property>
+ <property name="BottomAttach">4</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageSummaryTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">3</property>
+ <property name="BottomAttach">4</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageTagsLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Tags:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">9</property>
+ <property name="BottomAttach">10</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageTagsTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">9</property>
+ <property name="BottomAttach">10</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="packageTitleLabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes">Title:</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">2</property>
+ <property name="BottomAttach">3</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="packageTitleTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">2</property>
+ <property name="BottomAttach">3</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="detailsTabPageLabel">
+ <property name="MemberName" />
+ <property name="LabelProp" translatable="yes">Details</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <widget class="Gtk.Bin" id="MonoDevelop.Packaging.Gui.GtkCrossPlatformLibraryProjectTemplateWizardPageWidget" design-size="734 457">
+ <property name="MemberName" />
+ <property name="Visible">False</property>
+ <child>
+ <widget class="Gtk.HBox" id="mainHBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.EventBox" id="leftBorderEventBox">
+ <property name="MemberName" />
+ <property name="WidthRequest">30</property>
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.VBox" id="configurationVBox">
+ <property name="MemberName" />
+ <property name="WidthRequest">440</property>
+ <child>
+ <widget class="Gtk.EventBox" id="configurationTopEventBox">
+ <property name="MemberName" />
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="configurationTableEventBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.Table" id="configurationTable">
+ <property name="MemberName" />
+ <property name="NRows">9</property>
+ <property name="NColumns">3</property>
+ <property name="RowSpacing">7</property>
+ <property name="ColumnSpacing">6</property>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="descriptionLabel">
+ <property name="MemberName" />
+ <property name="Xpad">5</property>
+ <property name="Xalign">1</property>
+ <property name="LabelProp" translatable="yes">Description:</property>
+ <property name="Justify">Right</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">1</property>
+ <property name="BottomAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="descriptionTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">1</property>
+ <property name="BottomAttach">2</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="implementationLabel">
+ <property name="MemberName" />
+ <property name="Xpad">5</property>
+ <property name="Xalign">1</property>
+ <property name="Yalign">0.8</property>
+ <property name="LabelProp" translatable="yes">Implementation:</property>
+ <property name="Justify">Right</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">6</property>
+ <property name="BottomAttach">7</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="nameEventBox">
+ <property name="MemberName" />
+ <property name="WidthRequest">16</property>
+ <property name="HeightRequest">16</property>
+ <property name="VisibleWindow">False</property>
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="LeftAttach">2</property>
+ <property name="RightAttach">3</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="nameLabel">
+ <property name="MemberName" />
+ <property name="Xpad">5</property>
+ <property name="Xalign">1</property>
+ <property name="LabelProp" translatable="yes">Name:</property>
+ <property name="Justify">Right</property>
+ </widget>
+ <packing>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Entry" id="nameTextBox">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="IsEditable">True</property>
+ <property name="InvisibleChar">●</property>
+ </widget>
+ <packing>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">False</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="organizationInfoEventBox">
+ <property name="MemberName" />
+ <property name="WidthRequest">16</property>
+ <property name="HeightRequest">16</property>
+ <property name="VisibleWindow">False</property>
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">1</property>
+ <property name="BottomAttach">2</property>
+ <property name="LeftAttach">2</property>
+ <property name="RightAttach">3</property>
+ <property name="AutoSize">False</property>
+ <property name="XOptions">Shrink</property>
+ <property name="YOptions">Shrink</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">False</property>
+ <property name="XShrink">True</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">False</property>
+ <property name="YShrink">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="paddingLabelSharedCode">
+ <property name="MemberName" />
+ <property name="WidthRequest">132</property>
+ <property name="Justify">Right</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">7</property>
+ <property name="BottomAttach">8</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="paddingLabelTargetPlatforms">
+ <property name="MemberName" />
+ <property name="WidthRequest">132</property>
+ <property name="Justify">Right</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">4</property>
+ <property name="BottomAttach">5</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="paddingLabelXaml">
+ <property name="MemberName" />
+ <property name="WidthRequest">132</property>
+ <property name="HeightRequest">5</property>
+ <property name="Justify">Right</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">8</property>
+ <property name="BottomAttach">9</property>
+ <property name="AutoSize">False</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.DrawingArea" id="sharedCodeSeparator">
+ <property name="MemberName" />
+ <property name="HeightRequest">1</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">5</property>
+ <property name="BottomAttach">6</property>
+ <property name="RightAttach">3</property>
+ <property name="YPadding">10</property>
+ <property name="AutoSize">False</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">0</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">False</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.VBox" id="sharedCodeVBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.HBox" id="usePortableClassLibraryHBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.RadioButton" id="sharedProjectRadioButton">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes">Platform specific</property>
+ <property name="Active">True</property>
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">sharedCodeRadioButtonGroup</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.VBox" id="usePortableLibraryInfoVBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.Label" id="usePortableLibraryInfoIconPaddingLabel">
+ <property name="MemberName" />
+ <property name="HeightRequest">1</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="usePortableLibraryInfoEventBox">
+ <property name="MemberName" />
+ <property name="WidthRequest">16</property>
+ <property name="HeightRequest">16</property>
+ <property name="VisibleWindow">False</property>
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ <property name="Padding">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.HBox" id="useSharedLibraryHBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.RadioButton" id="portableClassLibraryRadioButton">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes">Single for all platforms</property>
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">sharedCodeRadioButtonGroup</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.VBox" id="useSharedLibraryInfoVBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.Label" id="useSharedLibraryInfoIconPaddingLabel">
+ <property name="MemberName" />
+ <property name="HeightRequest">1</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="useSharedLibraryInfoEventBox">
+ <property name="MemberName" />
+ <property name="WidthRequest">16</property>
+ <property name="HeightRequest">16</property>
+ <property name="VisibleWindow">False</property>
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ <property name="Padding">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">6</property>
+ <property name="BottomAttach">8</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">3</property>
+ <property name="AutoSize">False</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">0</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">False</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="targetPlatformsLabel">
+ <property name="MemberName" />
+ <property name="Xpad">5</property>
+ <property name="Xalign">1</property>
+ <property name="Yalign">0.8</property>
+ <property name="LabelProp" translatable="yes">Target Platforms:</property>
+ <property name="Justify">Right</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">3</property>
+ <property name="BottomAttach">4</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.DrawingArea" id="targetPlatformsSeparator">
+ <property name="MemberName" />
+ <property name="HeightRequest">1</property>
+ </widget>
+ <packing>
+ <property name="TopAttach">2</property>
+ <property name="BottomAttach">3</property>
+ <property name="RightAttach">3</property>
+ <property name="YPadding">10</property>
+ <property name="AutoSize">False</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">0</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">False</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.VBox" id="targetPlatformsVBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.CheckButton" id="androidCheckButton">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes">Android</property>
+ <property name="Active">True</property>
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ <property name="Padding">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.CheckButton" id="iOSCheckButton">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes">iOS</property>
+ <property name="Active">True</property>
+ <property name="DrawIndicator">True</property>
+ <property name="HasLabel">True</property>
+ <property name="UseUnderline">True</property>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ <property name="Padding">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">3</property>
+ <property name="BottomAttach">5</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="XOptions">Fill</property>
+ <property name="YOptions">0</property>
+ <property name="XExpand">False</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">False</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="configurationBottomEventBox">
+ <property name="MemberName" />
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">2</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.EventBox" id="backgroundLargeImageEventBox">
+ <property name="MemberName" />
+ <child>
+ <widget class="Gtk.VBox" id="backgroundLargeImageVBox">
+ <property name="MemberName" />
+ <child>
+ <placeholder />
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">2</property>
+ <property name="AutoSize">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+</stetic-interface> \ No newline at end of file
diff --git a/main/src/addins/MonoDevelop.Packaging/packages.config b/main/src/addins/MonoDevelop.Packaging/packages.config
new file mode 100644
index 0000000000..7f48b7a6ed
--- /dev/null
+++ b/main/src/addins/MonoDevelop.Packaging/packages.config
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="NuGet.Build.Packaging" version="0.1.157-dev" targetFramework="net45" />
+</packages> \ No newline at end of file
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntime.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntime.cs
index 3fc8785350..c44e90f51d 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntime.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MonoTargetRuntime.cs
@@ -174,8 +174,7 @@ namespace MonoDevelop.Core.Assemblies
public override string GetMSBuildBinPath (string toolsVersion)
{
- bool monoUseMSBuild = Runtime.Preferences.BuildWithMSBuild
- && System.Version.Parse (toolsVersion) >= new System.Version(15, 0);
+ bool monoUseMSBuild = Runtime.Preferences.BuildWithMSBuild || System.Version.Parse (toolsVersion) >= new System.Version(15, 0);
if (monoUseMSBuild) {
var path = Path.Combine (monoDir, "msbuild", toolsVersion, "bin");
@@ -200,6 +199,31 @@ namespace MonoDevelop.Core.Assemblies
return null;
}
+ public override string GetMSBuildToolsPath (string toolsVersion)
+ {
+ bool monoUseMSBuild = Runtime.Preferences.BuildWithMSBuild || System.Version.Parse (toolsVersion) >= new System.Version (15, 0);
+
+ if (monoUseMSBuild) {
+ var path = Path.Combine (monoDir, "msbuild", toolsVersion, "bin");
+ if (Directory.Exists (path))
+ return path;
+
+ // ToolsVersion >= 15.0 is supported only by msbuild, so, just
+ // return null here
+ return null;
+ }
+
+ var xbpath = Path.Combine (monoDir, "xbuild", toolsVersion, "bin");
+ if (Directory.Exists (xbpath))
+ return xbpath;
+
+ if (toolsVersion == "4.0")
+ //HACK: Mono puts xbuild 4.0 in 4.5 directory, even though there is no such thing as ToolsVersion 4.5
+ return GetMSBuildToolsPath ("4.5");
+
+ return null;
+ }
+
public override string GetMSBuildExtensionsPath ()
{
return Path.Combine (monoDir, "xbuild");
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MsNetTargetRuntime.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MsNetTargetRuntime.cs
index 6f9b9044e9..fdfae7aa54 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MsNetTargetRuntime.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/MsNetTargetRuntime.cs
@@ -162,6 +162,18 @@ namespace MonoDevelop.Core.Assemblies
return null;
}
}
+
+ public override string GetMSBuildToolsPath (string toolsVersion)
+ {
+ using (RegistryKey msb = Registry.LocalMachine.OpenSubKey (@"SOFTWARE\Microsoft\MSBuild\ToolsVersions\" + toolsVersion, false)) {
+ if (msb != null) {
+ string path = msb.GetValue ("MSBuildToolsPath") as string;
+ if (path != null && Directory.Exists (path))
+ return path;
+ }
+ return null;
+ }
+ }
public override string GetMSBuildExtensionsPath ()
{
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/TargetRuntime.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/TargetRuntime.cs
index f2c88611fc..60aff87963 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/TargetRuntime.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Core.Assemblies/TargetRuntime.cs
@@ -323,7 +323,12 @@ namespace MonoDevelop.Core.Assemblies
/// Returns the MSBuild bin path for this runtime.
/// </summary>
public abstract string GetMSBuildBinPath (string toolsVersion);
-
+
+ /// <summary>
+ /// Returns the MSBuild bin path for this runtime.
+ /// </summary>
+ public abstract string GetMSBuildToolsPath (string toolsVersion);
+
/// <summary>
/// Returns the MSBuild extensions path.
/// </summary>
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvaluationContext.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvaluationContext.cs
index 87e9e8b43b..42ef306d01 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvaluationContext.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildEvaluationContext.cs
@@ -102,10 +102,11 @@ namespace MonoDevelop.Projects.MSBuild
properties.Add ("MSBuildProjectDirectory", MSBuildProjectService.ToMSBuildPath (null, dir));
properties.Add ("MSBuildProjectDirectoryNoRoot", MSBuildProjectService.ToMSBuildPath (null, dir.Substring (Path.GetPathRoot (dir).Length)));
- string toolsVersion = project.ToolsVersion;
- if (string.IsNullOrEmpty (toolsVersion) || Version.Parse (toolsVersion) < new Version ("12.0"))
- toolsVersion = "12.0";
- string toolsPath = ToolLocationHelper.GetPathToBuildTools ("12.0");
+ // This MSBuild loader is v15.0
+ string toolsVersion = "15.0";
+ properties.Add ("MSBuildAssemblyVersion", "15.0");
+
+ var toolsPath = Runtime.SystemAssemblyService.DefaultRuntime.GetMSBuildToolsPath (toolsVersion);
var frameworkToolsPath = ToolLocationHelper.GetPathToDotNetFramework (TargetDotNetFrameworkVersion.VersionLatest);
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildProjectService.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildProjectService.cs
index cafc374cb9..8f8858b4d4 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildProjectService.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.MSBuild/MSBuildProjectService.cs
@@ -906,9 +906,13 @@ namespace MonoDevelop.Projects.MSBuild
static bool runLocal = false;
- static string GetNewestInstalledToolsVersion (TargetRuntime runtime, out string binDir)
+ static string GetNewestInstalledToolsVersion (TargetRuntime runtime, bool requiresMicrosoftBuild, out string binDir)
{
- var supportedToolsVersions = new [] { "15.0", "14.0", "12.0", "4.0" };
+ string [] supportedToolsVersions;
+ if ((requiresMicrosoftBuild || Runtime.Preferences.BuildWithMSBuild) && !Platform.IsWindows)
+ supportedToolsVersions = new [] { "15.0"};
+ else
+ supportedToolsVersions = new [] { "14.0", "12.0", "4.0" };
foreach (var toolsVersion in supportedToolsVersions) {
binDir = runtime.GetMSBuildBinPath (toolsVersion);
@@ -918,15 +922,19 @@ namespace MonoDevelop.Projects.MSBuild
}
throw new Exception ("Did not find MSBuild for runtime " + runtime.Id);
}
-
- internal static async Task<RemoteProjectBuilder> GetProjectBuilder (TargetRuntime runtime, string minToolsVersion, string file, string solutionFile, int customId, bool lockBuilder = false)
+
+ internal static async Task<RemoteProjectBuilder> GetProjectBuilder (TargetRuntime runtime, string minToolsVersion, string file, string solutionFile, int customId, bool requiresMicrosoftBuild, bool lockBuilder = false)
{
+ Version mtv = Version.Parse (minToolsVersion);
+ if (mtv >= new Version (15,0))
+ requiresMicrosoftBuild = true;
+
using (await buildersLock.EnterAsync ())
{
string binDir;
- var toolsVersion = GetNewestInstalledToolsVersion (runtime, out binDir);
+ var toolsVersion = GetNewestInstalledToolsVersion (runtime, requiresMicrosoftBuild, out binDir);
- Version tv, mtv;
+ Version tv;
if (Version.TryParse (toolsVersion, out tv) && Version.TryParse (minToolsVersion, out mtv) && tv < mtv) {
throw new InvalidOperationException (string.Format (
"Project requires MSBuild ToolsVersion '{0}' which is not supported by runtime '{1}'",
@@ -935,7 +943,7 @@ namespace MonoDevelop.Projects.MSBuild
}
//one builder per solution
- string builderKey = runtime.Id + " # " + solutionFile + " # " + customId;
+ string builderKey = runtime.Id + " # " + solutionFile + " # " + customId + " # " + requiresMicrosoftBuild;
RemoteBuildEngine builder = null;
@@ -958,7 +966,7 @@ namespace MonoDevelop.Projects.MSBuild
return await Task.Run (async () => {
//always start the remote process explicitly, even if it's using the current runtime and fx
//else it won't pick up the assembly redirects from the builder exe
- var exe = GetExeLocation (runtime, toolsVersion);
+ var exe = GetExeLocation (runtime, toolsVersion, requiresMicrosoftBuild);
MonoDevelop.Core.Execution.RemotingService.RegisterRemotingChannel ();
var pinfo = new ProcessStartInfo (exe) {
@@ -1063,12 +1071,13 @@ namespace MonoDevelop.Projects.MSBuild
return dictionary;;
}
- static string GetExeLocation (TargetRuntime runtime, string toolsVersion)
+ static string GetExeLocation (TargetRuntime runtime, string toolsVersion, bool requiresMicrosoftBuild)
{
var builderDir = new FilePath (typeof(MSBuildProjectService).Assembly.Location).ParentDirectory.Combine ("MSBuild");
var version = Version.Parse (toolsVersion);
- bool useMicrosoftBuild =
+ bool useMicrosoftBuild =
+ requiresMicrosoftBuild ||
((version >= new Version (15, 0)) && Runtime.Preferences.BuildWithMSBuild) ||
(version >= new Version (4, 0) && runtime is MsNetTargetRuntime);
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
index 10576b6eba..54016cb404 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects.SharedAssetsProjects/SharedAssetsProject.cs
@@ -84,7 +84,18 @@ namespace MonoDevelop.Projects.SharedAssetsProjects
{
base.OnInitializeFromTemplate (projectCreateInfo, projectOptions);
languageName = projectOptions.GetAttribute ("language");
- DefaultNamespace = projectCreateInfo.ProjectName;
+
+ string templateDefaultNamespace = GetDefaultNamespace (projectCreateInfo, projectOptions);
+ DefaultNamespace = templateDefaultNamespace ?? projectCreateInfo.ProjectName;
+ }
+
+ static string GetDefaultNamespace (ProjectCreateInformation projectCreateInfo, XmlElement projectOptions)
+ {
+ string defaultNamespace = projectOptions.Attributes["DefaultNamespace"]?.Value;
+ if (defaultNamespace != null)
+ return StringParserService.Parse (defaultNamespace, projectCreateInfo.Parameters);
+
+ return null;
}
protected override void OnReadProject (ProgressMonitor monitor, MSBuildProject msproject)
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs
index b9f45d554a..59a1a68a51 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/DotNetProject.cs
@@ -157,7 +157,8 @@ namespace MonoDevelop.Projects
if (projectCreateInfo != null) {
Name = projectCreateInfo.ProjectName;
binPath = projectCreateInfo.BinPath;
- defaultNamespace = SanitisePotentialNamespace (projectCreateInfo.ProjectName);
+ string templateDefaultNamespace = GetDefaultNamespace (projectCreateInfo, projectOptions);
+ defaultNamespace = SanitisePotentialNamespace (templateDefaultNamespace ?? projectCreateInfo.ProjectName);
} else {
binPath = ".";
}
@@ -173,6 +174,15 @@ namespace MonoDevelop.Projects
}
}
+ static string GetDefaultNamespace (ProjectCreateInformation projectCreateInfo, XmlElement projectOptions)
+ {
+ string defaultNamespace = projectOptions.Attributes["DefaultNamespace"]?.Value;
+ if (defaultNamespace != null)
+ return StringParserService.Parse (defaultNamespace, projectCreateInfo.Parameters);
+
+ return null;
+ }
+
void DefineSymbols (DotNetCompilerParameters pars, XmlElement projectOptions, string attributeName)
{
if (projectOptions != null) {
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs
index 82625a9235..22a36a48bd 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/Project.cs
@@ -1275,7 +1275,7 @@ namespace MonoDevelop.Projects
projectBuilder.Shutdown ();
projectBuilder.ReleaseReference ();
}
- var pb = await MSBuildProjectService.GetProjectBuilder (runtime, ToolsVersion, FileName, slnFile, 0);
+ var pb = await MSBuildProjectService.GetProjectBuilder (runtime, ToolsVersion, FileName, slnFile, 0, RequiresMicrosoftBuild);
pb.AddReference ();
pb.Disconnected += delegate {
CleanupProjectBuilder ();
@@ -1318,7 +1318,7 @@ namespace MonoDevelop.Projects
var sln = ParentSolution;
var slnFile = sln != null ? sln.FileName : null;
- var pb = await MSBuildProjectService.GetProjectBuilder (runtime, ToolsVersion, FileName, slnFile, 0, true);
+ var pb = await MSBuildProjectService.GetProjectBuilder (runtime, ToolsVersion, FileName, slnFile, 0, RequiresMicrosoftBuild, true);
pb.AddReference ();
if (modifiedInMemory) {
try {
@@ -1375,6 +1375,17 @@ namespace MonoDevelop.Projects
);
}
+ bool requiresMicrosoftBuild;
+
+ internal protected bool RequiresMicrosoftBuild {
+ get {
+ return requiresMicrosoftBuild || ProjectExtension.IsMicrosoftBuildRequired;
+ }
+ set {
+ requiresMicrosoftBuild = value;
+ }
+ }
+
/// <summary>
/// Adds a file to the project
/// </summary>
diff --git a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectExtension.cs b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectExtension.cs
index a4a234ccd5..29b9f12deb 100644
--- a/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectExtension.cs
+++ b/main/src/core/MonoDevelop.Core/MonoDevelop.Projects/ProjectExtension.cs
@@ -60,6 +60,16 @@ namespace MonoDevelop.Projects
return next.SupportsFlavor (guid);
}
+ internal bool IsMicrosoftBuildRequired {
+ get {
+ return RequiresMicrosoftBuild || (next != null && next.IsMicrosoftBuildRequired);
+ }
+ }
+
+ protected bool RequiresMicrosoftBuild {
+ get; set;
+ }
+
internal protected virtual ProjectRunConfiguration OnCreateRunConfiguration (string name)
{
return next.OnCreateRunConfiguration (name);
diff --git a/main/src/core/MonoDevelop.Ide/AssemblyInfo.cs b/main/src/core/MonoDevelop.Ide/AssemblyInfo.cs
index 3114ec36ed..ffa787567c 100644
--- a/main/src/core/MonoDevelop.Ide/AssemblyInfo.cs
+++ b/main/src/core/MonoDevelop.Ide/AssemblyInfo.cs
@@ -32,4 +32,6 @@ using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("MonoDevelop.GtkCore")]
[assembly: InternalsVisibleTo("MonoDevelop.PackageManagement")]
[assembly: InternalsVisibleTo("Xamarin.Forms.Addin.Tests")]
+[assembly: InternalsVisibleTo("MonoDevelop.Packaging")]
+[assembly: InternalsVisibleTo("MonoDevelop.Packaging.Tests")]
[assembly: InternalsVisibleTo ("MonoDevelop.FSharp.Tests")]
diff --git a/main/src/core/MonoDevelop.Ide/ExtensionModel/StockIcons.addin.xml b/main/src/core/MonoDevelop.Ide/ExtensionModel/StockIcons.addin.xml
index 9f9ea61fbb..3b5f1a3594 100644
--- a/main/src/core/MonoDevelop.Ide/ExtensionModel/StockIcons.addin.xml
+++ b/main/src/core/MonoDevelop.Ide/ExtensionModel/StockIcons.addin.xml
@@ -206,6 +206,7 @@
<StockIcon stockid="md-prefs-task-list" resource="prefs-task-list-16.png" size="Menu" />
<StockIcon stockid="md-prefs-updates" resource="prefs-updates-16.png" size="Menu" />
<StockIcon stockid="md-prefs-feedback" resource="prefs-feedback-16.png" size="Menu" />
+ <StockIcon stockid="md-prefs-metadata" resource="prefs-metadata-16.png" size="Menu" />
<StockIcon stockid="md-prefs-maintenance" resource="prefs-maintenance-16.png" size="Menu" />
<StockIcon stockid="md-prefs-performance" resource="prefs-performance-16.png" size="Menu" />
<StockIcon stockid="md-prefs-visual-style" resource="prefs-visual-style-16.png" size="Menu" />
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectDescriptor.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectDescriptor.cs
index 78a24d98b3..b22295fcd5 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectDescriptor.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectDescriptor.cs
@@ -100,7 +100,7 @@ namespace MonoDevelop.Ide.Templates
if (xmlElement ["Packages"] != null) {
foreach (XmlNode xmlNode in xmlElement["Packages"].ChildNodes) {
if (xmlNode is XmlElement) {
- var packageReference = ProjectTemplatePackageReference.Create ((XmlElement)xmlNode);
+ var packageReference = ProjectTemplatePackageReference.Create ((XmlElement)xmlNode, baseDirectory);
projectDescriptor.packageReferences.Add (packageReference);
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplatePackageReference.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplatePackageReference.cs
index 555df5fb9c..83d90a2b6f 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplatePackageReference.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplatePackageReference.cs
@@ -1,60 +1,68 @@
-//
-// ProjectTemplatePackageReference.cs
-//
-// Author:
-// Matt Ward <matt.ward@xamarin.com>
-//
-// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
+//
+// ProjectTemplatePackageReference.cs
+//
+// Author:
+// Matt Ward <matt.ward@xamarin.com>
+//
+// Copyright (c) 2014 Xamarin Inc. (http://xamarin.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
using System;
using System.Xml;
-
+using MonoDevelop.Core;
+
namespace MonoDevelop.Ide.Templates
{
public class ProjectTemplatePackageReference
{
public static ProjectTemplatePackageReference Create (XmlElement xmlElement)
+ {
+ return Create (xmlElement, FilePath.Null);
+ }
+
+ internal static ProjectTemplatePackageReference Create (XmlElement xmlElement, FilePath baseDirectory)
{
- return new ProjectTemplatePackageReference {
- Id = GetAttribute (xmlElement, "id"),
- Version = GetAttribute (xmlElement, "version"),
- CreateCondition = GetAttribute (xmlElement, "if"),
- IsLocalPackage = GetBoolAttribute (xmlElement, "local")
- };
+ return new ProjectTemplatePackageReference {
+ Id = GetAttribute (xmlElement, "id"),
+ Version = GetAttribute (xmlElement, "version"),
+ CreateCondition = GetAttribute (xmlElement, "if"),
+ IsLocalPackage = GetBoolAttribute (xmlElement, "local"),
+ Directory = GetPath (xmlElement, "directory", baseDirectory)
+ };
}
public string Id { get; private set; }
public string Version { get; private set; }
public string CreateCondition { get; private set; }
- internal bool IsLocalPackage { get; private set; }
+ internal bool IsLocalPackage { get; private set; }
+ internal FilePath Directory { get; private set; }
- static string GetAttribute (XmlElement xmlElement, string attributeName)
+ static string GetAttribute (XmlElement xmlElement, string attributeName, string defaultValue = "")
{
foreach (XmlAttribute attribute in xmlElement.Attributes) {
if (attributeName.Equals (attribute.Name, StringComparison.OrdinalIgnoreCase)) {
return attribute.Value;
}
}
- return "";
+ return defaultValue;
}
static bool GetBoolAttribute (XmlElement xmlElement, string attributeName)
@@ -66,6 +74,15 @@ namespace MonoDevelop.Ide.Templates
return result;
return false;
+ }
+
+ static FilePath GetPath (XmlElement xmlElement, string attributeName, FilePath baseDirectory)
+ {
+ string directory = GetAttribute (xmlElement, attributeName, null);
+ if (directory == null)
+ return FilePath.Null;
+
+ return baseDirectory.Combine (directory).FullPath;
}
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj
index daea55ddb7..3ee3faba3a 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj
@@ -8007,6 +8007,30 @@
<EmbeddedResource Include="options\KeyBindingSchemeRider-mac.xml">
<LogicalName>KeyBindingSchemeRider-mac.xml</LogicalName>
</EmbeddedResource>
+ <EmbeddedResource Include="icons\prefs-metadata-16.png">
+ <LogicalName>prefs-metadata-16.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\prefs-metadata-16%402x.png">
+ <LogicalName>prefs-metadata-16@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\prefs-metadata-16~dark.png">
+ <LogicalName>prefs-metadata-16~dark.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\prefs-metadata-16~dark%402x.png">
+ <LogicalName>prefs-metadata-16~dark@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\prefs-metadata-16~dark~sel.png">
+ <LogicalName>prefs-metadata-16~dark~sel.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\prefs-metadata-16~dark~sel%402x.png">
+ <LogicalName>prefs-metadata-16~dark~sel@2x.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\prefs-metadata-16~sel.png">
+ <LogicalName>prefs-metadata-16~sel.png</LogicalName>
+ </EmbeddedResource>
+ <EmbeddedResource Include="icons\prefs-metadata-16~sel%402x.png">
+ <LogicalName>prefs-metadata-16~sel@2x.png</LogicalName>
+ </EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Compile Include="MonoDevelop.Ide.Commands\CustomStringTagProvider.cs" />
diff --git a/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16.png b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16.png
new file mode 100644
index 0000000000..0cb309a601
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16@2x.png b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16@2x.png
new file mode 100644
index 0000000000..c04287ac72
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark.png b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark.png
new file mode 100644
index 0000000000..10869d987c
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark@2x.png b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark@2x.png
new file mode 100644
index 0000000000..7b66df1d06
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark~sel.png b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark~sel.png
new file mode 100644
index 0000000000..64255347fd
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark~sel.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark~sel@2x.png b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark~sel@2x.png
new file mode 100644
index 0000000000..82a5afce0c
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark~sel@2x.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~sel.png b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~sel.png
new file mode 100644
index 0000000000..64255347fd
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~sel.png
Binary files differ
diff --git a/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~sel@2x.png b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~sel@2x.png
new file mode 100644
index 0000000000..82a5afce0c
--- /dev/null
+++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~sel@2x.png
Binary files differ
diff --git a/main/tests/Makefile.am b/main/tests/Makefile.am
index 3d1fbc7172..416b5ebe54 100644
--- a/main/tests/Makefile.am
+++ b/main/tests/Makefile.am
@@ -29,6 +29,7 @@ TEST_ASSEMBLIES_COMMON = \
$(TEST_DIR)/MonoDevelop.Debugger.Tests.dll \
$(TEST_DIR)/Mono.TextTemplating.Tests.dll \
$(TEST_DIR)/MonoDevelop.PackageManagement.Tests.dll \
+ $(TEST_DIR)/MonoDevelop.Packaging.Tests.dll \
$(TEST_DIR)/MonoDevelop.TextEditor.Tests.dll \
$(TEST_DIR)/MonoDevelop.Xml.Tests.dll \
$(TEST_DIR)/MonoDevelop.AspNet.Tests.dll \