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

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Hutchinson <mhutchinson@novell.com>2010-08-27 04:05:38 +0400
committerMichael Hutchinson <mhutchinson@novell.com>2010-08-27 04:05:38 +0400
commit883f733b22554461143795f1d39e5b352feba221 (patch)
tree295cb6aaf4bf2e75a6e55056fe8de3ed7c80f694 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates
parent2a0b550c3e32db434350574f6636bd9e16e293c5 (diff)
Templates can now reference content files.
Templates can now reference text and binary content files relative to the template file's location, instead of specifying all content inline.
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates')
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeDomFileDescriptionTemplate.cs4
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeTranslationFileDescriptionTemplate.cs4
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/DirectoryTemplate.cs4
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileDescriptionTemplate.cs6
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs11
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplateReference.cs3
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectDescriptor.cs10
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplate.cs3
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ResourceFileDescriptionTemplate.cs5
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs21
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SolutionDescriptor.cs20
-rw-r--r--main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/TextFileDescriptionTemplate.cs52
12 files changed, 102 insertions, 41 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeDomFileDescriptionTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeDomFileDescriptionTemplate.cs
index 422bcc97e2..729668d9bf 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeDomFileDescriptionTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeDomFileDescriptionTemplate.cs
@@ -45,9 +45,9 @@ namespace MonoDevelop.Ide.Templates
{
XmlElement domContent;
- public override void Load (XmlElement filenode)
+ public override void Load (XmlElement filenode, FilePath baseDirectory)
{
- base.Load (filenode);
+ base.Load (filenode, baseDirectory);
domContent = filenode ["CompileUnit"];
if (domContent == null)
throw new InvalidOperationException ("Invalid CodeDom template. CompileUnit element not found.");
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeTranslationFileDescriptionTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeTranslationFileDescriptionTemplate.cs
index da09f14b02..1fcbdaae1d 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeTranslationFileDescriptionTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/CodeTranslationFileDescriptionTemplate.cs
@@ -54,9 +54,9 @@ namespace MonoDevelop.Ide.Templates
bool showAutogenerationNotice = false;
string sourceLang;
- public override void Load (XmlElement filenode)
+ public override void Load (XmlElement filenode, FilePath baseDirectory)
{
- base.Load (filenode);
+ base.Load (filenode, baseDirectory);
content = filenode.InnerText;
sourceLang = filenode.GetAttribute ("SourceLanguage");
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/DirectoryTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/DirectoryTemplate.cs
index 3134a7f44f..6f91811444 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/DirectoryTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/DirectoryTemplate.cs
@@ -44,7 +44,7 @@ namespace MonoDevelop.Ide.Templates
get { return dirName; }
}
- public override void Load (System.Xml.XmlElement filenode)
+ public override void Load (XmlElement filenode, FilePath baseDirectory)
{
dirName = filenode.GetAttribute ("name");
if (string.IsNullOrEmpty (dirName) || !FileService.IsValidFileName (dirName))
@@ -54,7 +54,7 @@ namespace MonoDevelop.Ide.Templates
if (!(node is XmlElement))
continue;
- FileDescriptionTemplate t = FileDescriptionTemplate.CreateTemplate ((XmlElement)node);
+ FileDescriptionTemplate t = FileDescriptionTemplate.CreateTemplate ((XmlElement)node, baseDirectory);
if (t == null)
throw new InvalidOperationException ("Invalid file template in directory template");
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileDescriptionTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileDescriptionTemplate.cs
index 059467137b..ecbe84dacd 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileDescriptionTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileDescriptionTemplate.cs
@@ -48,7 +48,7 @@ namespace MonoDevelop.Ide.Templates
{
static List<FileTemplateTypeCodon> templates;
- public static FileDescriptionTemplate CreateTemplate (XmlElement element)
+ public static FileDescriptionTemplate CreateTemplate (XmlElement element, FilePath baseDirectory)
{
if (templates == null) {
templates = new List<FileTemplateTypeCodon> ();
@@ -58,7 +58,7 @@ namespace MonoDevelop.Ide.Templates
foreach (FileTemplateTypeCodon template in templates) {
if (template.ElementName == element.Name) {
FileDescriptionTemplate t = (FileDescriptionTemplate) template.CreateInstance (typeof(FileDescriptionTemplate));
- t.Load (element);
+ t.Load (element, baseDirectory);
return t;
}
}
@@ -75,7 +75,7 @@ namespace MonoDevelop.Ide.Templates
public abstract string Name { get; }
- public abstract void Load (XmlElement filenode);
+ public abstract void Load (XmlElement filenode, FilePath baseDirectory);
public abstract bool AddToProject (SolutionItem policyParent, Project project, string language, string directory, string name);
public abstract void Show ();
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs
index d2bb654220..5b9f40bcfd 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplate.cs
@@ -144,11 +144,11 @@ namespace MonoDevelop.Ide.Templates
private static FileTemplate LoadFileTemplate (RuntimeAddin addin, ProjectTemplateCodon codon)
{
- XmlDocument xmlDocument = codon.GetTemplate ();
-
+ XmlDocument xmlDocument = codon.GetTemplate ();
+ FilePath baseDirectory = codon.BaseDirectory;
+
//Configuration
- //XmlNode xmlNodeConfig = xmlDocument.DocumentElement["TemplateConfiguration"];
- XmlElement xmlNodeConfig = xmlDocument.DocumentElement["TemplateConfiguration"];
+ XmlElement xmlNodeConfig = xmlDocument.DocumentElement["TemplateConfiguration"];
FileTemplate fileTemplate = null;
if (xmlNodeConfig["Type"] != null) {
@@ -219,7 +219,8 @@ namespace MonoDevelop.Ide.Templates
if(xmlNodeTemplates != null) {
foreach(XmlNode xmlNode in xmlNodeTemplates.ChildNodes) {
if(xmlNode is XmlElement) {
- fileTemplate.files.Add (FileDescriptionTemplate.CreateTemplate ((XmlElement)xmlNode));
+ fileTemplate.files.Add (
+ FileDescriptionTemplate.CreateTemplate ((XmlElement)xmlNode, baseDirectory));
}
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplateReference.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplateReference.cs
index 285da30b28..97dd1c0f92 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplateReference.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/FileTemplateReference.cs
@@ -32,6 +32,7 @@ using System;
using System.Xml;
using MonoDevelop.Projects;
+using MonoDevelop.Core;
namespace MonoDevelop.Ide.Templates
{
@@ -44,7 +45,7 @@ namespace MonoDevelop.Ide.Templates
string name;
bool suppressAutoOpen = false;
- public override void Load (XmlElement filenode)
+ public override void Load (XmlElement filenode, FilePath baseDirectory)
{
name = filenode.GetAttribute ("name");
string templateID = filenode.GetAttribute ("TemplateID");
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 9a1a1a58a9..e57b764bb4 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectDescriptor.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectDescriptor.cs
@@ -53,7 +53,7 @@ namespace MonoDevelop.Ide.Templates
{
}
- public static ProjectDescriptor CreateProjectDescriptor (XmlElement xmlElement)
+ public static ProjectDescriptor CreateProjectDescriptor (XmlElement xmlElement, FilePath baseDirectory)
{
ProjectDescriptor projectDescriptor = new ProjectDescriptor ();
@@ -66,15 +66,17 @@ namespace MonoDevelop.Ide.Templates
if (xmlElement["Files"] != null) {
foreach (XmlNode xmlNode in xmlElement["Files"].ChildNodes)
if (xmlNode is XmlElement)
- projectDescriptor.files.Add (FileDescriptionTemplate.CreateTemplate ((XmlElement)xmlNode));
+ projectDescriptor.files.Add (
+ FileDescriptionTemplate.CreateTemplate ((XmlElement)xmlNode, baseDirectory));
}
if (xmlElement["Resources"] != null) {
foreach (XmlNode xmlNode in xmlElement["Resources"].ChildNodes) {
if (xmlNode is XmlElement) {
- FileDescriptionTemplate fileTemplate = FileDescriptionTemplate.CreateTemplate ((XmlElement)xmlNode);
+ var fileTemplate = FileDescriptionTemplate.CreateTemplate ((XmlElement)xmlNode, baseDirectory);
if (fileTemplate is SingleFileDescriptionTemplate)
- projectDescriptor.resources.Add ((SingleFileDescriptionTemplate)fileTemplate); else
+ projectDescriptor.resources.Add ((SingleFileDescriptionTemplate)fileTemplate);
+ else
MessageService.ShowError (GettextCatalog.GetString ("Only single-file templates allowed to generate resource files"));
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplate.cs
index 0b545967ca..fcdb3d02c4 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ProjectTemplate.cs
@@ -198,7 +198,8 @@ namespace MonoDevelop.Ide.Templates
throw new InvalidOperationException ("Combine element not found");
}
else {
- solutionDescriptor = SolutionDescriptor.CreateSolutionDescriptor (addin, xmlDocument.DocumentElement ["Combine"]);
+ solutionDescriptor = SolutionDescriptor.CreateSolutionDescriptor (addin, xmlDocument.DocumentElement ["Combine"],
+ codon.BaseDirectory);
}
if (xmlDocument.DocumentElement ["Actions"] != null) {
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ResourceFileDescriptionTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ResourceFileDescriptionTemplate.cs
index 7feca3512d..e2cb831041 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ResourceFileDescriptionTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/ResourceFileDescriptionTemplate.cs
@@ -29,6 +29,7 @@
using System;
using System.Xml;
using MonoDevelop.Projects;
+using MonoDevelop.Core;
namespace MonoDevelop.Ide.Templates
{
@@ -40,11 +41,11 @@ namespace MonoDevelop.Ide.Templates
get { return template.Name; }
}
- public override void Load (XmlElement filenode)
+ public override void Load (XmlElement filenode, FilePath baseDirectory)
{
foreach (XmlNode node in filenode.ChildNodes) {
if (node is XmlElement) {
- template = CreateTemplate ((XmlElement) node) as SingleFileDescriptionTemplate;
+ template = CreateTemplate ((XmlElement) node, baseDirectory) as SingleFileDescriptionTemplate;
if (template == null)
throw new InvalidOperationException ("Resource templates must contain single-file templates.");
return;
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs
index 9ae8d0c895..463d5aacca 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SingleFileDescriptionTemplate.cs
@@ -55,7 +55,7 @@ namespace MonoDevelop.Ide.Templates
string customTool;
List<string> references = new List<string> ();
- public override void Load (XmlElement filenode)
+ public override void Load (XmlElement filenode, FilePath baseDirectory)
{
name = filenode.GetAttribute ("name");
defaultName = filenode.GetAttribute ("DefaultName");
@@ -259,11 +259,18 @@ namespace MonoDevelop.Ide.Templates
Mono.TextEditor.Document doc = new Mono.TextEditor.Document ();
doc.Text = content;
- TextStylePolicy textPolicy = policyParent != null ? policyParent.Policies.Get<TextStylePolicy> ("text/plain") : MonoDevelop.Projects.Policies.PolicyService.GetDefaultPolicy<TextStylePolicy> ("text/plain");
+ TextStylePolicy textPolicy = policyParent != null ? policyParent.Policies.Get<TextStylePolicy> ("text/plain")
+ : MonoDevelop.Projects.Policies.PolicyService.GetDefaultPolicy<TextStylePolicy> ("text/plain");
string eolMarker = TextStylePolicy.GetEolMarker (textPolicy.EolMarker);
byte[] eolMarkerBytes = System.Text.Encoding.UTF8.GetBytes (eolMarker);
+
+ var tabToSpaces = textPolicy.TabsToSpaces? new string (' ', textPolicy.TabWidth) : null;
+
foreach (Mono.TextEditor.LineSegment line in doc.Lines) {
- data = System.Text.Encoding.UTF8.GetBytes (doc.GetTextAt (line.Offset, line.EditableLength));
+ var lineText = doc.GetTextAt (line.Offset, line.EditableLength);
+ if (tabToSpaces != null)
+ lineText.Replace ("\t", tabToSpaces);
+ data = System.Text.Encoding.UTF8.GetBytes (lineText);
ms.Write (data, 0, data.Length);
ms.Write (eolMarkerBytes, 0, eolMarkerBytes.Length);
}
@@ -290,7 +297,8 @@ namespace MonoDevelop.Ide.Templates
// We supply defaults whenever it is possible, to avoid having unsubstituted tags. However,
// do not substitute blanks when a sensible default cannot be guessed, because they result
//in less obvious errors.
- public virtual void ModifyTags (SolutionItem policyParent, Project project, string language, string identifier, string fileName, ref Dictionary<string,string> tags)
+ public virtual void ModifyTags (SolutionItem policyParent, Project project, string language,
+ string identifier, string fileName, ref Dictionary<string,string> tags)
{
DotNetProject netProject = project as DotNetProject;
string languageExtension = "";
@@ -318,7 +326,6 @@ namespace MonoDevelop.Ide.Templates
tags ["FullName"] = ns.Length > 0 ? ns + "." + identifier : identifier;
//some .NET languages may be able to use keywords as identifiers if they're escaped
- //for simplicity, we escape the identifier in "Name" and provide "UnescapedName"
IDotNetLanguageBinding dnb = binding as IDotNetLanguageBinding;
if (dnb != null) {
System.CodeDom.Compiler.CodeDomProvider provider = dnb.GetCodeDomProvider ();
@@ -329,8 +336,10 @@ namespace MonoDevelop.Ide.Templates
}
tags ["Namespace"] = ns;
- if (project != null)
+ if (project != null) {
tags ["ProjectName"] = project.Name;
+ tags ["SafeProjectName"] = CreateIdentifierName (project.Name);
+ }
if ((language != null) && (language.Length > 0))
tags ["Language"] = language;
if (languageExtension.Length > 0)
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SolutionDescriptor.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SolutionDescriptor.cs
index 56614c2fff..d3dc0535ae 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SolutionDescriptor.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/SolutionDescriptor.cs
@@ -58,7 +58,8 @@ namespace MonoDevelop.Ide.Templates
get { return entryDescriptors.ToArray(); }
}
- public static SolutionDescriptor CreateSolutionDescriptor (RuntimeAddin addin, XmlElement xmlElement)
+ public static SolutionDescriptor CreateSolutionDescriptor (RuntimeAddin addin, XmlElement xmlElement,
+ FilePath baseDirectory)
{
SolutionDescriptor solutionDescriptor = new SolutionDescriptor ();
solutionDescriptor.addin = addin;
@@ -82,14 +83,15 @@ namespace MonoDevelop.Ide.Templates
if (xmlNode is XmlElement) {
XmlElement xmlNodeElement = (XmlElement)xmlNode;
switch (xmlNodeElement.Name) {
- case "Project":
- solutionDescriptor.entryDescriptors.Add (ProjectDescriptor.CreateProjectDescriptor (xmlNodeElement));
- break;
- case "CombineEntry":
- case "SolutionItem":
- solutionDescriptor.entryDescriptors.Add (SolutionItemDescriptor.CreateDescriptor (addin, xmlNodeElement));
- break;
-
+ case "Project":
+ solutionDescriptor.entryDescriptors.Add (
+ ProjectDescriptor.CreateProjectDescriptor (xmlNodeElement, baseDirectory));
+ break;
+ case "CombineEntry":
+ case "SolutionItem":
+ solutionDescriptor.entryDescriptors.Add (
+ SolutionItemDescriptor.CreateDescriptor (addin, xmlNodeElement));
+ break;
}
}
}
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/TextFileDescriptionTemplate.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/TextFileDescriptionTemplate.cs
index 6e9adbb51b..aecb7941c0 100644
--- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/TextFileDescriptionTemplate.cs
+++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates/TextFileDescriptionTemplate.cs
@@ -28,22 +28,66 @@
using System;
using System.Xml;
+using MonoDevelop.Core;
+using System.IO;
+using MonoDevelop.Projects;
namespace MonoDevelop.Ide.Templates
{
public class TextFileDescriptionTemplate: SingleFileDescriptionTemplate
{
string content;
+ FilePath contentSrcFile;
- public override void Load (XmlElement filenode)
+ public override void Load (XmlElement filenode, FilePath baseDirectory)
{
- base.Load (filenode);
- content = filenode.InnerText;
+ base.Load (filenode, baseDirectory);
+ var srcAtt = filenode.Attributes["src"];
+ if (srcAtt != null) {
+ contentSrcFile = MakePathNative (srcAtt.Value);
+ if (contentSrcFile.IsNullOrEmpty)
+ throw new InvalidOperationException ("Template's Src attribute is empty");
+ contentSrcFile = contentSrcFile.ToAbsolute (baseDirectory);
+ } else {
+ content = filenode.InnerText;
+ }
+ }
+
+ static internal string MakePathNative (string path)
+ {
+ if (path == null || path.Length == 0)
+ return path;
+ char c = Path.DirectorySeparatorChar == '\\'? '/' : '\\';
+ return path.Replace (c, Path.DirectorySeparatorChar);
}
public override string CreateContent (string language)
{
- return content.Replace ("\t", MonoDevelop.Ide.Gui.Content.TextEditorProperties.IndentString);
+ return contentSrcFile.IsNullOrEmpty? content : File.ReadAllText (contentSrcFile);
+ }
+ }
+
+ public class RawFileDescriptionTemplate : SingleFileDescriptionTemplate
+ {
+ FilePath contentSrcFile;
+
+ public override void Load (XmlElement filenode, FilePath baseDirectory)
+ {
+ base.Load (filenode, baseDirectory);
+ var srcAtt = filenode.Attributes["src"];
+ if (srcAtt == null)
+ throw new InvalidOperationException ("Template is missing Src attribute");
+
+ contentSrcFile = TextFileDescriptionTemplate.MakePathNative (srcAtt.Value);
+ if (contentSrcFile.IsNullOrEmpty)
+ throw new InvalidOperationException ("Template's Src attribute is empty");
+ contentSrcFile = contentSrcFile.ToAbsolute (baseDirectory);
+ }
+
+ public override Stream CreateFileContent (SolutionItem policyParent, Project project, string language,
+ string fileName, string identifier)
+ {
+ return File.OpenRead (contentSrcFile);
}
}
}