diff options
author | Matt Ward <matt.ward@xamarin.com> | 2016-12-09 14:21:49 +0300 |
---|---|---|
committer | Matt Ward <matt.ward@xamarin.com> | 2016-12-09 15:46:41 +0300 |
commit | fa94861909b1424b8be4f5bf2b523a6529da6908 (patch) | |
tree | 9c6d8513a37cd1df74f6141b10968adeee9a7d37 | |
parent | 3a2a2d561966b5c96cadb94a7bf8678e1c9edead (diff) | |
parent | 5c063dc7831fdc27b45b28407236fda08a41ac78 (diff) |
Merge branch 'nugetizer3000'
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 Binary files differnew file mode 100644 index 0000000000..b9c4c32d42 --- /dev/null +++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library.png 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 Binary files differnew file mode 100644 index 0000000000..4dedd56a8e --- /dev/null +++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library@2x.png 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 Binary files differnew file mode 100644 index 0000000000..3d1650d75b --- /dev/null +++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library~dark.png 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 Binary files differnew file mode 100644 index 0000000000..2306226ed1 --- /dev/null +++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-multiplatform-library~dark@2x.png diff --git a/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget.png b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget.png Binary files differnew file mode 100644 index 0000000000..411a3e46de --- /dev/null +++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget.png 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 Binary files differnew file mode 100644 index 0000000000..023b60814a --- /dev/null +++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget@2x.png 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 Binary files differnew file mode 100644 index 0000000000..87de5a7d15 --- /dev/null +++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget~dark.png 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 Binary files differnew file mode 100644 index 0000000000..659a996362 --- /dev/null +++ b/main/src/addins/MonoDevelop.Packaging/Templates/Images/preview-nuget~dark@2x.png 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 Binary files differnew file mode 100644 index 0000000000..0cb309a601 --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16.png 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 Binary files differnew file mode 100644 index 0000000000..c04287ac72 --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16@2x.png 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 Binary files differnew file mode 100644 index 0000000000..10869d987c --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark.png 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 Binary files differnew file mode 100644 index 0000000000..7b66df1d06 --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark@2x.png 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 Binary files differnew file mode 100644 index 0000000000..64255347fd --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark~sel.png 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 Binary files differnew file mode 100644 index 0000000000..82a5afce0c --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~dark~sel@2x.png 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 Binary files differnew file mode 100644 index 0000000000..64255347fd --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~sel.png 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 Binary files differnew file mode 100644 index 0000000000..82a5afce0c --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/icons/prefs-metadata-16~sel@2x.png 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 \ |