public static CombineDescriptor CreateCombineDescriptor(XmlElement element)
        {
            CombineDescriptor combineDescriptor = new CombineDescriptor(element.Attributes["name"].InnerText);

            if (element.Attributes["directory"] != null) {
                combineDescriptor.relativeDirectory = element.Attributes["directory"].InnerText;
            }

            if (element["Options"] != null && element["Options"]["StartupProject"] != null) {
                combineDescriptor.startupProject = element["Options"]["StartupProject"].InnerText;
            }

            foreach (XmlNode node in element.ChildNodes) {
                if (node != null) {
                    switch (node.Name) {
                        case "Project":
                            combineDescriptor.entryDescriptors.Add (ProjectDescriptor.CreateProjectDescriptor((XmlElement)node));
                            break;
                        case "Combine":
                            combineDescriptor.entryDescriptors.Add (CreateCombineDescriptor((XmlElement)node));
                            break;
                        case "CombineEntry":
                            combineDescriptor.entryDescriptors.Add (CombineEntryDescriptor.CreateDescriptor((XmlElement)node));
                            break;
                    }
                }
            }
            return combineDescriptor;
        }
        protected ProjectTemplate(AddIn addin, string fileName)
        {
            Stream stream = addin.GetResourceStream (fileName);
            if (stream == null)
                throw new ApplicationException ("Template " + fileName + " not found");

            XmlDocument doc = new XmlDocument();
            try {
                doc.Load(stream);
            } finally {
                stream.Close ();
            }

            originator   = doc.DocumentElement.Attributes["originator"].InnerText;
            created      = doc.DocumentElement.Attributes["created"].InnerText;
            lastmodified = doc.DocumentElement.Attributes["lastModified"].InnerText;

            XmlElement config = doc.DocumentElement["TemplateConfiguration"];

            if (config["Wizard"] != null) {
                wizardpath = config["Wizard"].InnerText;
            }

            name         = GettextCatalog.GetString (config["_Name"].InnerText);
            category     = config["Category"].InnerText;

            if (config["LanguageName"] != null)
                languagename = config["LanguageName"].InnerText;

            if (config["_Description"] != null) {
                description  = GettextCatalog.GetString (config["_Description"].InnerText);
            }

            if (config["Icon"] != null) {
                icon = ResourceService.GetStockId (addin, config["Icon"].InnerText);
            }

            if (doc.DocumentElement["Combine"] != null) {
                combineDescriptor = CombineDescriptor.CreateCombineDescriptor(doc.DocumentElement["Combine"]);
            }

            // Read Actions;
            if (doc.DocumentElement["Actions"] != null) {
                foreach (XmlElement el in doc.DocumentElement["Actions"]) {
                    actions.Add(new OpenFileAction(el.Attributes["filename"].InnerText));
                }
            }
        }