/src/Main/Base/Project/Src/Internal/Templates/File/FileTemplate.cs
C# | 321 lines | 275 code | 40 blank | 6 comment | 27 complexity | d69c752275e5156b2296d39fae876ec8 MD5 | raw file
- // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
- // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Xml;
- using ICSharpCode.Core;
- using ICSharpCode.SharpDevelop.Project;
- namespace ICSharpCode.SharpDevelop.Internal.Templates
- {
- public class TemplateProperty
- {
- string name;
- string localizedName;
- string type;
- string category;
- string description;
- string defaultValue;
-
- public string Name {
- get {
- return name;
- }
- }
-
- public string LocalizedName {
- get {
- return localizedName;
- }
- }
-
- public string Type {
- get {
- return type;
- }
- }
-
- public string Category {
- get {
- return category;
- }
- }
-
- public string Description {
- get {
- return description;
- }
- }
-
- public string DefaultValue {
- get {
- return defaultValue;
- }
- }
-
- public TemplateProperty(XmlElement propertyElement)
- {
- name = propertyElement.GetAttribute("name");
- localizedName= propertyElement.GetAttribute("localizedName");
- type = propertyElement.GetAttribute("type");
- category = propertyElement.GetAttribute("category");
- description = propertyElement.GetAttribute("description");
- defaultValue = propertyElement.GetAttribute("defaultValue");
- }
- }
-
- public class TemplateType
- {
- string name;
- Hashtable pairs = new Hashtable();
-
- public string Name {
- get {
- return name;
- }
- }
-
- public Hashtable Pairs {
- get {
- return pairs;
- }
- }
-
- public TemplateType(XmlElement enumType)
- {
- name = enumType.GetAttribute("name");
- foreach (XmlElement node in enumType.ChildNodes) {
- pairs[node.GetAttribute("name")] = node.GetAttribute("value");
- }
- }
- }
-
- /// <summary>
- /// This class defines and holds the new file templates.
- /// </summary>
- public class FileTemplate : IComparable
- {
- public static List<FileTemplate> FileTemplates = new List<FileTemplate>();
-
- string author = null;
- string name = null;
- string category = null;
- string languagename = null;
- string icon = null;
- string description = null;
- string wizardpath = null;
- string defaultName = null;
- string subcategory = null;
- bool newFileDialogVisible = true;
-
- List<FileDescriptionTemplate> files = new List<FileDescriptionTemplate>();
- List<TemplateProperty> properties = new List<TemplateProperty>();
- List<TemplateType> customTypes = new List<TemplateType>();
- List<ReferenceProjectItem> requiredAssemblyReferences = new List<ReferenceProjectItem>();
-
- XmlElement fileoptions = null;
-
- int IComparable.CompareTo(object other)
- {
- FileTemplate pt = other as FileTemplate;
- if (pt == null) return -1;
- int res = category.CompareTo(pt.category);
- if (res != 0) return res;
- return name.CompareTo(pt.name);
- }
-
- public string Author {
- get {
- return author;
- }
- }
- public string Name {
- get {
- return name;
- }
- }
- public string Category {
- get {
- return category;
- }
- }
- public string Subcategory {
- get {
- return subcategory;
- }
- }
- public string LanguageName {
- get {
- return languagename;
- }
- }
- public string Icon {
- get {
- return icon;
- }
- }
- public string Description {
- get {
- return description;
- }
- }
- public string WizardPath {
- get {
- return wizardpath;
- }
- }
- public string DefaultName {
- get {
- return defaultName;
- }
- }
- public XmlElement Fileoptions {
- get {
- return fileoptions;
- }
- }
- public bool NewFileDialogVisible {
- get {
- return newFileDialogVisible;
- }
- }
-
- public List<FileDescriptionTemplate> FileDescriptionTemplates {
- get {
- return files;
- }
- }
-
- public List<TemplateProperty> Properties {
- get {
- return properties;
- }
- }
-
- public List<TemplateType> CustomTypes {
- get {
- return customTypes;
- }
- }
-
- public List<ReferenceProjectItem> RequiredAssemblyReferences {
- get { return requiredAssemblyReferences; }
- }
-
- public bool HasProperties {
- get {
- return properties != null && properties.Count > 0;
- }
- }
-
- public FileTemplate(string filename)
- {
- XmlDocument doc = new XmlDocument();
- doc.Load(filename);
-
- author = doc.DocumentElement.GetAttribute("author");
-
- XmlElement config = doc.DocumentElement["Config"];
- name = config.GetAttribute("name");
- icon = config.GetAttribute("icon");
- category = config.GetAttribute("category");
- defaultName = config.GetAttribute("defaultname");
- languagename = config.GetAttribute("language");
-
- if (config.HasAttribute("subcategory")) {
- subcategory = config.GetAttribute("subcategory");
- }
- string newFileDialogVisibleAttr = config.GetAttribute("newfiledialogvisible");
- if (newFileDialogVisibleAttr != null && newFileDialogVisibleAttr.Length != 0) {
- if (newFileDialogVisibleAttr.Equals("false", StringComparison.OrdinalIgnoreCase))
- newFileDialogVisible = false;
- }
- if (doc.DocumentElement["Description"] != null) {
- description = doc.DocumentElement["Description"].InnerText;
- }
-
- if (config["Wizard"] != null) {
- wizardpath = config["Wizard"].Attributes["path"].InnerText;
- }
-
- if (doc.DocumentElement["Properties"] != null) {
- XmlNodeList propertyList = doc.DocumentElement["Properties"].SelectNodes("Property");
- foreach (XmlElement propertyElement in propertyList) {
- properties.Add(new TemplateProperty(propertyElement));
- }
- }
-
- if (doc.DocumentElement["Types"] != null) {
- XmlNodeList typeList = doc.DocumentElement["Types"].SelectNodes("Type");
- foreach (XmlElement typeElement in typeList) {
- customTypes.Add(new TemplateType(typeElement));
- }
- }
-
- if (doc.DocumentElement["References"] != null) {
- XmlNodeList references = doc.DocumentElement["References"].SelectNodes("Reference");
- foreach (XmlElement reference in references) {
- if (!reference.HasAttribute("include"))
- throw new InvalidDataException("Reference without 'include' attribute!");
- ReferenceProjectItem item = new ReferenceProjectItem(null, reference.GetAttribute("include"));
- item.SetMetadata("HintPath", reference.GetAttribute("hintPath"));
- var requiredTargetFramework = reference.GetElementsByTagName("RequiredTargetFramework").OfType<XmlElement>().FirstOrDefault();
- if (requiredTargetFramework != null) {
- item.SetMetadata("RequiredTargetFramework", requiredTargetFramework.Value);
- }
- requiredAssemblyReferences.Add(item);
- }
- }
-
- fileoptions = doc.DocumentElement["AdditionalOptions"];
-
- doc.DocumentElement.SetAttribute("fileName", filename); // used for template loading warnings
-
- // load the files
- XmlElement files = doc.DocumentElement["Files"];
- XmlNodeList nodes = files.ChildNodes;
- foreach (XmlNode filenode in nodes) {
- if (filenode is XmlElement) {
- this.files.Add(new FileDescriptionTemplate((XmlElement)filenode, Path.GetDirectoryName(filename)));
- }
- }
- }
-
- public static void UpdateTemplates()
- {
- string dataTemplateDir = Path.Combine(PropertyService.DataDirectory, "templates", "file");
- List<string> files = FileUtility.SearchDirectory(dataTemplateDir, "*.xft");
- foreach (string templateDirectory in AddInTree.BuildItems<string>(ProjectTemplate.TemplatePath, null, false)) {
- if (!Directory.Exists(templateDirectory))
- Directory.CreateDirectory(templateDirectory);
- files.AddRange(FileUtility.SearchDirectory(templateDirectory, "*.xft"));
- }
- FileTemplates.Clear();
- foreach (string file in files) {
- try {
- FileTemplates.Add(new FileTemplate(file));
- } catch (XmlException ex) {
- MessageService.ShowError("Error loading template file " + file + ":\n" + ex.Message);
- } catch (TemplateLoadException ex) {
- MessageService.ShowError("Error loading template file " + file + ":\n" + ex.ToString());
- } catch(Exception e) {
- MessageService.ShowException(e, "Error loading template file " + file + ".");
- }
- }
- FileTemplates.Sort();
- }
-
- static FileTemplate()
- {
- UpdateTemplates();
- }
- }
- }