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 @@
<TemplateConfiguration> <TemplateConfiguration>
<Name>Complex EXAMPLE</Name> <Name>Complex EXAMPLE</Name>
<Category>C#</Category> <Category>C#</Category>
<Icon>C#.Project.ConsoleCSharpProject</Icon> <Icon>C#.Project.DOSProject</Icon>
<LanguageName>C#</LanguageName> <LanguageName>C#</LanguageName>
<Description>Creates a combine</Description> <Description>Example template that tries to use every feature once</Description>
</TemplateConfiguration> </TemplateConfiguration>
<!-- Actions --> <!-- Actions -->
@ -18,56 +18,118 @@
</Actions> </Actions>
<!-- Template Content --> <!-- 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> <Options>
<StartupProject>${ProjectName}</StartupProject> <StartupProject>${ProjectName}</StartupProject>
</Options> </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"> <SolutionFolder name = "VB.NET Sub Folder">
<Project name = "VBNetProject" directory = "." language="VBNET"> <!-- 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> <Imports>
<Reference type="Gac" refto="System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <!-- you can import additional MSBuild targets in the Imports-section of the project node -->
</References> <Import Project="$(MSBuildBinPath)\Microsoft.WinFX.targets" />
</Imports>
<Files> <Files>
<File name="Main.vb"> <!-- Here come the files of the project -->
<![CDATA[' project created on ${Date} at ${Time} <!-- Put the file content in a CDATA section. You can use all StringParser expressions. -->
Imports System <File name="Main.vb">
Module Main <![CDATA[${StandardHeader.VBNET}
Sub Main() Public Partial Class MainForm
Console.WriteLine("Hello World!") Inherits System.Windows.Forms.Form
End Sub
End Module 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> ]]></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> </Files>
</Project> </Project>
</Combine> </SolutionFolder>
<!-- a project without language uses the language specified in the template header -->
<Project name = "${ProjectName}" directory = "."> <Project name = "${ProjectName}" directory = ".">
<Options/> <Options/>
<ProjectItems>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ProjectItems>
<Files> <Files>
<File name="Elements\Readme.txt"><![CDATA[// project ${ProjectName} and file ${FileName} created on ${Date} <File name="Elements\Readme.txt"><![CDATA[// project ${ProjectName} and file ${FileName} created on ${Date}
at ${Time}]]></File> at ${Time}]]></File>
<File name="Tables\Readme.txt"><![CDATA[// project created on ${Date} at <File name="Tables\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
${Time}]]></File> <File name="Forms\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
<File name="Forms\Readme.txt"><![CDATA[// project created on ${Date} at <File name="Forms\Dialogs\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
${Time}]]></File> <File name="Forms\Controls\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
<File name="Forms\Dialogs\Readme.txt"><![CDATA[// project created on <File name="Menu\Readme.txt"><![CDATA[// project created on ${Date} at ${Time}]]></File>
${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="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} <File name="Main.cs"><![CDATA[// project created on ${Date} at ${Time}
using System; using System;
@ -105,13 +167,8 @@ using System.Runtime.CompilerServices;
[assembly: AssemblyVersion("1.0.*")] [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> ]]></File>
</Files> </Files>
</Project> </Project>
</Combine> </Solution>
</Template> </Template>

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

@ -20,8 +20,60 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
{ {
public class CombineDescriptor public class CombineDescriptor
{ {
ArrayList projectDescriptors = new ArrayList(); SolutionFolderDescriptor mainFolder = new SolutionFolderDescriptor("");
ArrayList combineDescriptors = new ArrayList();
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 name;
string startupProject = null; string startupProject = null;
@ -34,15 +86,9 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
} }
} }
public ArrayList ProjectDescriptors { public List<ProjectDescriptor> ProjectDescriptors {
get { get {
return projectDescriptors; return mainFolder.projectDescriptors;
}
}
public ArrayList CombineDescriptors {
get {
return projectDescriptors;
} }
} }
#endregion #endregion
@ -52,14 +98,14 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
this.name = name; this.name = name;
} }
public string CreateCombine(ProjectCreateInformation projectCreateInformation, string defaultLanguage) public string CreateSolution(ProjectCreateInformation projectCreateInformation, string defaultLanguage)
{ {
Solution newCombine = new Solution(); Solution newSolution = new Solution();
string newCombineName = StringParser.Parse(name, new string[,] { string newCombineName = StringParser.Parse(name, new string[,] {
{"ProjectName", projectCreateInformation.ProjectName} {"ProjectName", projectCreateInformation.ProjectName}
}); });
newCombine.Name = newCombineName; newSolution.Name = newCombineName;
string oldCombinePath = projectCreateInformation.CombinePath; string oldCombinePath = projectCreateInformation.CombinePath;
string oldProjectPath = projectCreateInformation.ProjectBasePath; string oldProjectPath = projectCreateInformation.ProjectBasePath;
@ -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.CombinePath = oldCombinePath;
projectCreateInformation.ProjectBasePath = oldProjectPath; projectCreateInformation.ProjectBasePath = oldProjectPath;
if (!mainFolder.AddContents(newSolution, projectCreateInformation, defaultLanguage, newSolution)) {
newSolution.Dispose();
return null;
}
string combineLocation = Path.Combine(projectCreateInformation.CombinePath, newCombineName + ".sln"); string combineLocation = Path.Combine(projectCreateInformation.CombinePath, newCombineName + ".sln");
// Save combine // Save combine
if (File.Exists(combineLocation)) { if (File.Exists(combineLocation)) {
StringParser.Properties["combineLocation"] = combineLocation; StringParser.Properties["combineLocation"] = combineLocation;
if (MessageService.AskQuestion("${res:ICSharpCode.SharpDevelop.Internal.Templates.CombineDescriptor.OverwriteProjectQuestion}")) { if (MessageService.AskQuestion("${res:ICSharpCode.SharpDevelop.Internal.Templates.CombineDescriptor.OverwriteProjectQuestion}")) {
newCombine.Save(combineLocation); newSolution.Save(combineLocation);
} }
} else { } else {
newCombine.Save(combineLocation); newSolution.Save(combineLocation);
} }
newCombine.Dispose(); newSolution.Dispose();
return combineLocation; return combineLocation;
} }
@ -119,18 +155,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
combineDescriptor.startupProject = element["Options"]["StartupProject"].InnerText; combineDescriptor.startupProject = element["Options"]["StartupProject"].InnerText;
} }
foreach (XmlNode node in element.ChildNodes) { combineDescriptor.mainFolder.Read(element);
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;
}
}
}
return combineDescriptor; return combineDescriptor;
} }
} }

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

@ -31,6 +31,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
List<FileDescriptionTemplate> files = new List<FileDescriptionTemplate>(); // contains FileTemplate classes List<FileDescriptionTemplate> files = new List<FileDescriptionTemplate>(); // contains FileTemplate classes
List<ProjectItem> projectItems = new List<ProjectItem>(); List<ProjectItem> projectItems = new List<ProjectItem>();
List<string> projectImports = new List<string>(); List<string> projectImports = new List<string>();
List<PropertyGroup> propertyGroups = new List<PropertyGroup>();
XmlElement projectOptions = null; XmlElement projectOptions = null;
@ -41,6 +42,12 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
} }
} }
public List<PropertyGroup> PropertyGroups {
get {
return propertyGroups;
}
}
public List<FileDescriptionTemplate> Files { public List<FileDescriptionTemplate> Files {
get { get {
return files; return files;
@ -136,7 +143,11 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
foreach(string projectImport in projectImports) { foreach(string projectImport in projectImports) {
((AbstractProject)project).Imports.Add(projectImport); ((AbstractProject)project).Imports.Add(projectImport);
} }
foreach (PropertyGroup pg in propertyGroups) {
((AbstractProject)project).BaseConfiguration.Merge(pg);
}
// Add Files // Add Files
foreach (FileDescriptionTemplate file in files) { foreach (FileDescriptionTemplate file in files) {
string fileName = Path.Combine(projectCreateInformation.ProjectBasePath, StringParser.Parse(file.Name, new string[,] { {"ProjectName", projectCreateInformation.ProjectName} })); string fileName = Path.Combine(projectCreateInformation.ProjectBasePath, StringParser.Parse(file.Name, new string[,] { {"ProjectName", projectCreateInformation.ProjectName} }));
@ -243,23 +254,37 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
if (element["Imports"] != null) { if (element["Imports"] != null) {
ReadProjectImports(projectDescriptor, element["Imports"]); ReadProjectImports(projectDescriptor, element["Imports"]);
} }
foreach (XmlNode node in element) {
if (node.NodeType == XmlNodeType.Element && node.Name == "PropertyGroup") {
ReadPropertyGroup(projectDescriptor, (XmlElement)node);
}
}
return projectDescriptor; return projectDescriptor;
} }
static void ReadProjectItems(ProjectDescriptor projectDescriptor, XmlElement xml) static void ReadProjectItems(ProjectDescriptor projectDescriptor, XmlElement xml)
{ {
//projectDescriptor.references
foreach (XmlNode node in xml.ChildNodes) { foreach (XmlNode node in xml.ChildNodes) {
XmlElement el = node as XmlElement; XmlElement el = node as XmlElement;
if (el != null) { if (el != null) {
XmlTextReader reader = new XmlTextReader(new StringReader(el.OuterXml)); XmlReader reader = new XmlNodeReader(el);
reader.Read(); reader.Read();
projectDescriptor.projectItems.Add(ProjectItem.ReadItem(reader, null, el.Name)); projectDescriptor.projectItems.Add(ProjectItem.ReadItem(reader, null, el.Name));
reader.Close(); 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) static void ReadProjectImports(ProjectDescriptor projectDescriptor, XmlElement xml)
{ {
XmlNodeList nodes = xml.SelectNodes("Import/@Project"); 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
icon = config["Icon"].InnerText; 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"]); combineDescriptor = CombineDescriptor.CreateCombineDescriptor(doc.DocumentElement["Combine"]);
} }
@ -226,7 +228,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
WizardDialog wizard = new WizardDialog("Project Wizard", customizer, wizardpath); WizardDialog wizard = new WizardDialog("Project Wizard", customizer, wizardpath);
if (wizard.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) { if (wizard.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm) == DialogResult.OK) {
if (combineDescriptor != null) if (combineDescriptor != null)
lastCombine = combineDescriptor.CreateCombine(projectCreateInformation, this.languagename); lastCombine = combineDescriptor.CreateSolution(projectCreateInformation, this.languagename);
else if (projectDescriptor != null) else if (projectDescriptor != null)
lastCombine = projectDescriptor.CreateProject(projectCreateInformation, this.languagename).FileName; lastCombine = projectDescriptor.CreateProject(projectCreateInformation, this.languagename).FileName;
} else { } else {
@ -234,7 +236,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
} }
} else { } else {
if (combineDescriptor != null) if (combineDescriptor != null)
lastCombine = combineDescriptor.CreateCombine(projectCreateInformation, this.languagename); lastCombine = combineDescriptor.CreateSolution(projectCreateInformation, this.languagename);
else if (projectDescriptor != null) else if (projectDescriptor != null)
lastCombine = projectDescriptor.CreateProject(projectCreateInformation, this.languagename).FileName; 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
Properties); 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); ProjectItem newItem = project != null ? project.CreateProjectItem(itemType) : ProjectItemFactory.CreateProjectItem(project, itemType);
newItem.Include = reader.GetAttribute("Include"); newItem.Include = reader.GetAttribute("Include");

Loading…
Cancel
Save