diff options
author | Michael Hutchinson <mhutchinson@novell.com> | 2010-08-27 04:05:38 +0400 |
---|---|---|
committer | Michael Hutchinson <mhutchinson@novell.com> | 2010-08-27 04:05:38 +0400 |
commit | 883f733b22554461143795f1d39e5b352feba221 (patch) | |
tree | 295cb6aaf4bf2e75a6e55056fe8de3ed7c80f694 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Templates | |
parent | 2a0b550c3e32db434350574f6636bd9e16e293c5 (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')
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); } } } |