Browse Source

Enable using PropertyGroups in the project templates. Updated ComplexExample, it should now demonstrate all project template features.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@967 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
f70afa7916
  1. 139
      data/templates/project/ComplexExample.xpt.test
  2. 117
      src/Main/Base/Project/Src/Internal/Templates/Project/CombineDescriptor.cs
  3. 33
      src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs
  4. 8
      src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs
  5. 2
      src/Main/Base/Project/Src/Project/Items/ProjectItem.cs

139
data/templates/project/ComplexExample.xpt.test

@ -7,9 +7,9 @@ @@ -7,9 +7,9 @@
<TemplateConfiguration>
<Name>Complex EXAMPLE</Name>
<Category>C#</Category>
<Icon>C#.Project.ConsoleCSharpProject</Icon>
<Icon>C#.Project.DOSProject</Icon>
<LanguageName>C#</LanguageName>
<Description>Creates a combine</Description>
<Description>Example template that tries to use every feature once</Description>
</TemplateConfiguration>
<!-- Actions -->
@ -18,56 +18,118 @@ @@ -18,56 +18,118 @@
</Actions>
<!-- Template Content -->
<Combine name = "${ProjectName}" directory = ".">
<!-- for compatibility reasons, the root node is allowed to be called either Solution or Combine -->
<Solution name = "${ProjectName}" directory = ".">
<!-- the startup project can be specified like this: -->
<Options>
<StartupProject>${ProjectName}</StartupProject>
</Options>
<Combine name = "Empty Sub Combine" directory = "SubCombine1"/>
<!-- you can nest solution folders inside the Solution node -->
<SolutionFolder name = "Empty Sub Folder"/>
<Combine name = "VB.NET Sub Combine" directory = "VBNetSubCombine">
<Project name = "VBNetProject" directory = "." language="VBNET">
<SolutionFolder name = "VB.NET Sub Folder">
<!-- Solution folders can contain: nested solution folders and projects -->
<SolutionFolder name = "Nested Sub Folder"/>
<Project name = "VBNetProject" directory = "VBNetSubProject" language="VBNet">
<!-- you can use the Options node to set properties on the SharpDevelop "IProject". -->
<Options OutputType = "WinExe"/>
<!-- add a PropertyGroup to the project to set MSBuild properties (not all MSBuild properties are exposed by the "IProject") -->
<PropertyGroup>
<RemoveIntegerChecks>True</RemoveIntegerChecks>
</PropertyGroup>
<Options Target = "Exe" PauseConsoleOutput = "True"/>
<!-- use PropertyItems to include MSBuild items -->
<ProjectItems>
<!-- create GAC references like this: -->
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Deployment" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<!-- Visual Basic Default Imports work like this: -->
<Import Include="Microsoft.VisualBasic" />
<Import Include="System" />
<Import Include="System.Collections" />
<Import Include="System.Collections.Generic" />
<Import Include="System.Data" />
<Import Include="System.Drawing" />
<Import Include="System.Diagnostics" />
<Import Include="System.Windows.Forms" />
</ProjectItems>
<References>
<Reference type="Gac" refto="System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</References>
<Imports>
<!-- you can import additional MSBuild targets in the Imports-section of the project node -->
<Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" />
</Imports>
<Files>
<File name="Main.vb">
<![CDATA[' project created on ${Date} at ${Time}
Imports System
Module Main
Sub Main()
Console.WriteLine("Hello World!")
End Sub
End Module
<!-- Here come the files of the project -->
<!-- Put the file content in a CDATA section. You can use all StringParser expressions. -->
<File name="Main.vb">
<![CDATA[${StandardHeader.VBNET}
Public Partial Class MainForm
Inherits System.Windows.Forms.Form
Public Sub New()
'
' The Me.InitializeComponent call is required for Windows Forms designer support.
'
Me.InitializeComponent
'
' TODO : Add constructor code after InitializeComponents
'
End Sub
End Class
]]></File>
<!--
The file element supports these attributes:
language, buildAction, copyToOutputDirectory, dependentUpon, subType
-->
<File name="Main.Designer.vb" buildAction="Compile" dependentUpon="Main.vb" subType="Code"><![CDATA[
Partial Class MainForm
' This file is required for Windows Forms designer support.
' Do not change the contents inside the source code editor. The Forms designer might
' not be able to load this method if it was changed manually.
Private Sub InitializeComponent()
'
'Form1
'
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Name = "MainForm"
Me.Text = "MainForm"
End Sub
End Class
]]>
</File>
</Files>
</Project>
</Combine>
</Project>
</SolutionFolder>
<!-- a project without language uses the language specified in the template header -->
<Project name = "${ProjectName}" directory = ".">
<Options/>
<ProjectItems>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ProjectItems>
<Files>
<File name="Elements\Readme.txt"><![CDATA[// project ${ProjectName} and file ${FileName} created on ${Date}
at ${Time}]]></File>
<File name="Tables\Readme.txt"><![CDATA[// project created on ${Date} at
${Time}]]></File>
<File name="Forms\Readme.txt"><![CDATA[// project created on ${Date} at
${Time}]]></File>
<File name="Forms\Dialogs\Readme.txt"><![CDATA[// project created on
${Date} at ${Time}]]></File>
<File name="Forms\Controls\Readme.txt"><![CDATA[// project created on
${Date} at ${Time}]]></File>
<File name="Menu\Readme.txt"><![CDATA[// project created on ${Date} at
${Time}]]></File>
<File name="Reports\Readme.txt"><![CDATA[// project created on ${Date}
at ${Time}]]></File>
<File name="Batches\Readme.txt"><![CDATA[// project created on ${Date}
at ${Time}]]></File>
<File name="Tables\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
<File name="Forms\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
<File name="Forms\Dialogs\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
<File name="Forms\Controls\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
<File name="Menu\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
<File name="Reports\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
<File name="Batches\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
<File name="Main.cs"><![CDATA[// project created on ${Date} at ${Time}
using System;
@ -105,13 +167,8 @@ using System.Runtime.CompilerServices; @@ -105,13 +167,8 @@ using System.Runtime.CompilerServices;
[assembly: AssemblyVersion("1.0.*")]
// The following attributes specify the key for the sign of your assembly. See the
// .NET Framework documentation for more information about signing.
// This is not required, if you don't want signing let these attributes like they're.
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]
]]></File>
</Files>
</Project>
</Combine>
</Solution>
</Template>

117
src/Main/Base/Project/Src/Internal/Templates/Project/CombineDescriptor.cs

@ -20,8 +20,60 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -20,8 +20,60 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
{
public class CombineDescriptor
{
ArrayList projectDescriptors = new ArrayList();
ArrayList combineDescriptors = new ArrayList();
SolutionFolderDescriptor mainFolder = new SolutionFolderDescriptor("");
class SolutionFolderDescriptor
{
internal string name;
internal List<ProjectDescriptor> projectDescriptors = new List<ProjectDescriptor>();
internal List<SolutionFolderDescriptor> solutionFoldersDescriptors = new List<SolutionFolderDescriptor>();
internal void Read(XmlElement element)
{
name = element.GetAttribute("name");
foreach (XmlNode node in element.ChildNodes) {
if (node != null) {
switch (node.Name) {
case "Project":
projectDescriptors.Add(ProjectDescriptor.CreateProjectDescriptor((XmlElement)node));
break;
case "SolutionFolder":
solutionFoldersDescriptors.Add(new SolutionFolderDescriptor((XmlElement)node));
break;
}
}
}
}
internal bool AddContents(Solution solution, ProjectCreateInformation projectCreateInformation, string defaultLanguage, ISolutionFolderContainer parentFolder)
{
// Create sub projects
foreach (SolutionFolderDescriptor folderDescriptor in solutionFoldersDescriptors) {
SolutionFolder folder = solution.CreateFolder(folderDescriptor.name);
parentFolder.AddFolder(folder);
folderDescriptor.AddContents(solution, projectCreateInformation, defaultLanguage, folder);
}
foreach (ProjectDescriptor projectDescriptor in projectDescriptors) {
IProject newProject = projectDescriptor.CreateProject(projectCreateInformation, defaultLanguage);
if (newProject == null)
return false;
newProject.Location = FileUtility.GetRelativePath(projectCreateInformation.CombinePath, newProject.FileName);
parentFolder.AddFolder(newProject);
projectCreateInformation.CreatedProjects.Add(newProject.FileName);
}
return true;
}
public SolutionFolderDescriptor(XmlElement element)
{
Read(element);
}
public SolutionFolderDescriptor(string name)
{
this.name = name;
}
}
string name;
string startupProject = null;
@ -34,15 +86,9 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -34,15 +86,9 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
}
}
public ArrayList ProjectDescriptors {
public List<ProjectDescriptor> ProjectDescriptors {
get {
return projectDescriptors;
}
}
public ArrayList CombineDescriptors {
get {
return projectDescriptors;
return mainFolder.projectDescriptors;
}
}
#endregion
@ -52,14 +98,14 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -52,14 +98,14 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
this.name = name;
}
public string CreateCombine(ProjectCreateInformation projectCreateInformation, string defaultLanguage)
public string CreateSolution(ProjectCreateInformation projectCreateInformation, string defaultLanguage)
{
Solution newCombine = new Solution();
string newCombineName = StringParser.Parse(name, new string[,] {
{"ProjectName", projectCreateInformation.ProjectName}
});
Solution newSolution = new Solution();
string newCombineName = StringParser.Parse(name, new string[,] {
{"ProjectName", projectCreateInformation.ProjectName}
});
newCombine.Name = newCombineName;
newSolution.Name = newCombineName;
string oldCombinePath = projectCreateInformation.CombinePath;
string oldProjectPath = projectCreateInformation.ProjectBasePath;
@ -74,36 +120,26 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -74,36 +120,26 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
}
}
// Create sub projects
foreach (ProjectDescriptor projectDescriptor in projectDescriptors) {
IProject newProject = projectDescriptor.CreateProject(projectCreateInformation, defaultLanguage);
if (newProject == null)
return null;
newProject.Location = FileUtility.GetRelativePath(oldCombinePath, newProject.FileName);
newCombine.AddFolder(newProject);
projectCreateInformation.CreatedProjects.Add(newProject.FileName);
}
// // Create sub combines
// foreach (CombineDescriptor combineDescriptor in combineDescriptors) {
// newCombine.AddEntry(combineDescriptor.CreateCombine(projectCreateInformation, defaultLanguage));
// }
projectCreateInformation.CombinePath = oldCombinePath;
projectCreateInformation.ProjectBasePath = oldProjectPath;
if (!mainFolder.AddContents(newSolution, projectCreateInformation, defaultLanguage, newSolution)) {
newSolution.Dispose();
return null;
}
string combineLocation = Path.Combine(projectCreateInformation.CombinePath, newCombineName + ".sln");
// Save combine
if (File.Exists(combineLocation)) {
StringParser.Properties["combineLocation"] = combineLocation;
if (MessageService.AskQuestion("${res:ICSharpCode.SharpDevelop.Internal.Templates.CombineDescriptor.OverwriteProjectQuestion}")) {
newCombine.Save(combineLocation);
newSolution.Save(combineLocation);
}
} else {
newCombine.Save(combineLocation);
newSolution.Save(combineLocation);
}
newCombine.Dispose();
newSolution.Dispose();
return combineLocation;
}
@ -119,18 +155,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -119,18 +155,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
combineDescriptor.startupProject = element["Options"]["StartupProject"].InnerText;
}
foreach (XmlNode node in element.ChildNodes) {
if (node != null) {
switch (node.Name) {
case "Project":
combineDescriptor.projectDescriptors.Add(ProjectDescriptor.CreateProjectDescriptor((XmlElement)node));
break;
case "Combine":
combineDescriptor.combineDescriptors.Add(CreateCombineDescriptor((XmlElement)node));
break;
}
}
}
combineDescriptor.mainFolder.Read(element);
return combineDescriptor;
}
}

33
src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs

@ -31,6 +31,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -31,6 +31,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
List<FileDescriptionTemplate> files = new List<FileDescriptionTemplate>(); // contains FileTemplate classes
List<ProjectItem> projectItems = new List<ProjectItem>();
List<string> projectImports = new List<string>();
List<PropertyGroup> propertyGroups = new List<PropertyGroup>();
XmlElement projectOptions = null;
@ -41,6 +42,12 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -41,6 +42,12 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
}
}
public List<PropertyGroup> PropertyGroups {
get {
return propertyGroups;
}
}
public List<FileDescriptionTemplate> Files {
get {
return files;
@ -136,7 +143,11 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -136,7 +143,11 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
foreach(string projectImport in projectImports) {
((AbstractProject)project).Imports.Add(projectImport);
}
foreach (PropertyGroup pg in propertyGroups) {
((AbstractProject)project).BaseConfiguration.Merge(pg);
}
// Add Files
foreach (FileDescriptionTemplate file in files) {
string fileName = Path.Combine(projectCreateInformation.ProjectBasePath, StringParser.Parse(file.Name, new string[,] { {"ProjectName", projectCreateInformation.ProjectName} }));
@ -243,23 +254,37 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -243,23 +254,37 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
if (element["Imports"] != null) {
ReadProjectImports(projectDescriptor, element["Imports"]);
}
foreach (XmlNode node in element) {
if (node.NodeType == XmlNodeType.Element && node.Name == "PropertyGroup") {
ReadPropertyGroup(projectDescriptor, (XmlElement)node);
}
}
return projectDescriptor;
}
static void ReadProjectItems(ProjectDescriptor projectDescriptor, XmlElement xml)
{
//projectDescriptor.references
foreach (XmlNode node in xml.ChildNodes) {
XmlElement el = node as XmlElement;
if (el != null) {
XmlTextReader reader = new XmlTextReader(new StringReader(el.OuterXml));
XmlReader reader = new XmlNodeReader(el);
reader.Read();
projectDescriptor.projectItems.Add(ProjectItem.ReadItem(reader, null, el.Name));
reader.Close();
}
}
}
static void ReadPropertyGroup(ProjectDescriptor projectDescriptor, XmlElement xml)
{
XmlReader reader = new XmlNodeReader(xml);
reader.Read();
PropertyGroup pg = new PropertyGroup();
PropertyGroup.ReadProperties(reader, pg, xml.Name);
projectDescriptor.propertyGroups.Add(pg);
reader.Close();
}
static void ReadProjectImports(ProjectDescriptor projectDescriptor, XmlElement xml)
{
XmlNodeList nodes = xml.SelectNodes("Import/@Project");

8
src/Main/Base/Project/Src/Internal/Templates/Project/ProjectTemplate.cs

@ -187,7 +187,9 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -187,7 +187,9 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
icon = config["Icon"].InnerText;
}
if (doc.DocumentElement["Combine"] != null) {
if (doc.DocumentElement["Solution"] != null) {
combineDescriptor = CombineDescriptor.CreateCombineDescriptor(doc.DocumentElement["Solution"]);
} else if (doc.DocumentElement["Combine"] != null) {
combineDescriptor = CombineDescriptor.CreateCombineDescriptor(doc.DocumentElement["Combine"]);
}
@ -226,7 +228,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -226,7 +228,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
WizardDialog wizard = new WizardDialog("Project Wizard", customizer, wizardpath);
if (wizard.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) {
if (combineDescriptor != null)
lastCombine = combineDescriptor.CreateCombine(projectCreateInformation, this.languagename);
lastCombine = combineDescriptor.CreateSolution(projectCreateInformation, this.languagename);
else if (projectDescriptor != null)
lastCombine = projectDescriptor.CreateProject(projectCreateInformation, this.languagename).FileName;
} else {
@ -234,7 +236,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -234,7 +236,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
}
} else {
if (combineDescriptor != null)
lastCombine = combineDescriptor.CreateCombine(projectCreateInformation, this.languagename);
lastCombine = combineDescriptor.CreateSolution(projectCreateInformation, this.languagename);
else if (projectDescriptor != null)
lastCombine = projectDescriptor.CreateProject(projectCreateInformation, this.languagename).FileName;
}

2
src/Main/Base/Project/Src/Project/Items/ProjectItem.cs

@ -129,7 +129,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -129,7 +129,7 @@ namespace ICSharpCode.SharpDevelop.Project
Properties);
}
public static ProjectItem ReadItem(XmlTextReader reader, IProject project, string itemType)
public static ProjectItem ReadItem(XmlReader reader, IProject project, string itemType)
{
ProjectItem newItem = project != null ? project.CreateProjectItem(itemType) : ProjectItemFactory.CreateProjectItem(project, itemType);
newItem.Include = reader.GetAttribute("Include");

Loading…
Cancel
Save