From 29b8690485ed5611add75f3e76c0f6b794555f80 Mon Sep 17 00:00:00 2001 From: Michael Becker Date: Thu, 8 Oct 2020 16:11:28 -0400 Subject: [PATCH] templating improvements and actually loading the ObjectModel content via XML from a template --- .../FileSystem/WindowsFileSystem.uexml | 4 ++ .../UEPackage/UEPackageXMLDataFormat.cs | 18 +++++++ .../Database/DatabaseObjectModel.cs | 30 +++++++++++ .../FileSystem/FileSystemObjectModel.cs | 51 +++++++++++++++++++ .../UniversalEditor.Essential/Template.cs | 1 + .../MainWindow.cs | 4 ++ 6 files changed, 108 insertions(+) diff --git a/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/WindowsFileSystem.uexml b/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/WindowsFileSystem.uexml index b9d1c0b3..b49743ea 100644 --- a/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/WindowsFileSystem.uexml +++ b/Content/UniversalEditor.Content.PlatformIndependent/Templates/Document/FileSystem/WindowsFileSystem.uexml @@ -6,6 +6,10 @@ Windows filesystem Creates a standard Windows NT file structure. + + General + File system/archive + diff --git a/Libraries/UniversalEditor.Essential/DataFormats/UEPackage/UEPackageXMLDataFormat.cs b/Libraries/UniversalEditor.Essential/DataFormats/UEPackage/UEPackageXMLDataFormat.cs index acfb15c4..1b232f83 100644 --- a/Libraries/UniversalEditor.Essential/DataFormats/UEPackage/UEPackageXMLDataFormat.cs +++ b/Libraries/UniversalEditor.Essential/DataFormats/UEPackage/UEPackageXMLDataFormat.cs @@ -655,6 +655,24 @@ namespace UniversalEditor.DataFormats.UEPackage { template.ObjectModelReference = new ObjectModelReference(tagContent.Attributes["ObjectModelType"].Value); } + + if (tagContent.Attributes["FileName"] != null) + { + // TODO: load the specified file as the given ObjectModel type + } + else + { + if (template.ObjectModelReference.Type != null) + { + System.Reflection.ParameterModifier pmodType = new System.Reflection.ParameterModifier(); + System.Reflection.MethodInfo miFromMarkup = template.ObjectModelReference.Type.GetMethod("FromMarkup", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static, null, new Type[] { typeof(MarkupTagElement) }, new System.Reflection.ParameterModifier[] { pmodType }); + if (miFromMarkup != null) + { + ObjectModel om = (miFromMarkup.Invoke(null, new object[] { tagContent }) as ObjectModel); + template.ObjectModel = om; + } + } + } template.TemplateContent.Elements.Add(tagContent); } } diff --git a/Libraries/UniversalEditor.Essential/ObjectModels/Database/DatabaseObjectModel.cs b/Libraries/UniversalEditor.Essential/ObjectModels/Database/DatabaseObjectModel.cs index 2b543f26..edab65e2 100644 --- a/Libraries/UniversalEditor.Essential/ObjectModels/Database/DatabaseObjectModel.cs +++ b/Libraries/UniversalEditor.Essential/ObjectModels/Database/DatabaseObjectModel.cs @@ -19,6 +19,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +using UniversalEditor.ObjectModels.Markup; + namespace UniversalEditor.ObjectModels.Database { /// @@ -37,6 +39,7 @@ namespace UniversalEditor.ObjectModels.Database return _omr; } + public string Name { get; set; } = null; public DatabaseTable.DatabaseTableCollection Tables { get; } = new DatabaseTable.DatabaseTableCollection(); public override void Clear() @@ -54,5 +57,32 @@ namespace UniversalEditor.ObjectModels.Database clone.Tables.Add(Tables[i].Clone() as DatabaseTable); } } + + public static DatabaseObjectModel FromMarkup(MarkupTagElement tag) + { + DatabaseObjectModel db = new DatabaseObjectModel(); + for (int i = 0; i < tag.Elements.Count; i++) + { + MarkupTagElement tag2 = (tag.Elements[i] as MarkupTagElement); + if (tag2 == null) continue; + if (tag2.FullName == "Tables") + { + foreach (MarkupElement elTable in tag2.Elements ) + { + MarkupTagElement tagTable = (elTable as MarkupTagElement); + if (tagTable == null) continue; + if (tagTable.FullName != "Table") continue; + + MarkupAttribute attName = tag2.Attributes["Name"]; + if (attName == null) continue; + + DatabaseTable dt = new DatabaseTable(); + dt.Name = attName.Value; + db.Tables.Add(dt); + } + } + } + return db; + } } } diff --git a/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSystemObjectModel.cs b/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSystemObjectModel.cs index 45ba5429..9b534da8 100644 --- a/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSystemObjectModel.cs +++ b/Libraries/UniversalEditor.Essential/ObjectModels/FileSystem/FileSystemObjectModel.cs @@ -23,6 +23,7 @@ using System; using System.Collections.Generic; using MBS.Framework.Logic.Conditional; using UniversalEditor.Accessors; +using UniversalEditor.ObjectModels.Markup; namespace UniversalEditor.ObjectModels.FileSystem { @@ -533,5 +534,55 @@ namespace UniversalEditor.ObjectModels.FileSystem } return _CriteriaObjects; } + + public static ObjectModel FromMarkup(MarkupTagElement tagContent) + { + FileSystemObjectModel fsom = new FileSystemObjectModel(); + InitFileSystemFromMarkup(fsom, tagContent); + return fsom; + } + + private static void InitFileSystemFromMarkup(IFileSystemContainer fsom, MarkupTagElement tagContent) + { + MarkupTagElement tagFolders = tagContent.Elements["Folders"] as MarkupTagElement; + MarkupTagElement tagFiles = tagContent.Elements["Files"] as MarkupTagElement; + if (tagFolders != null) + { + for (int i = 0; i < tagFolders.Elements.Count; i++) + { + MarkupTagElement tagFolder = (tagFolders.Elements[i] as MarkupTagElement); + if (tagFolder == null) continue; + if (tagFolder.FullName != "Folder") continue; + + MarkupAttribute attName = tagFolder.Attributes["Name"]; + + Folder item = new Folder(); + if (attName != null) + { + item.Name = attName.Value; + } + InitFileSystemFromMarkup(item, tagFolder); + fsom.Folders.Add(item); + } + } + if (tagFiles != null) + { + for (int i = 0; i < tagFiles.Elements.Count; i++) + { + MarkupTagElement tagFile = (tagFiles.Elements[i] as MarkupTagElement); + if (tagFile == null) continue; + if (tagFile.FullName != "File") continue; + + MarkupAttribute attName = tagFile.Attributes["Name"]; + + File item = new File(); + if (attName != null) + { + item.Name = attName.Value; + } + fsom.Files.Add(item); + } + } + } } } diff --git a/Libraries/UniversalEditor.Essential/Template.cs b/Libraries/UniversalEditor.Essential/Template.cs index 7f5c134a..ce407669 100644 --- a/Libraries/UniversalEditor.Essential/Template.cs +++ b/Libraries/UniversalEditor.Essential/Template.cs @@ -116,6 +116,7 @@ namespace UniversalEditor if (mvarObjectModel == null) Create(); return mvarObjectModel; } + set { mvarObjectModel = value; } } private ObjectModelReference mvarObjectModelReference = null; diff --git a/Libraries/UniversalEditor.UserInterface/MainWindow.cs b/Libraries/UniversalEditor.UserInterface/MainWindow.cs index f60c19c4..86dc3eb6 100644 --- a/Libraries/UniversalEditor.UserInterface/MainWindow.cs +++ b/Libraries/UniversalEditor.UserInterface/MainWindow.cs @@ -314,6 +314,10 @@ namespace UniversalEditor.UserInterface return null; } + if (template.ObjectModel != null) + { + template.ObjectModel.CopyTo(objm); + } page.Document = new Document(objm, null, null); page.Document.Title = String.Format(filename, iUntitledDocCount);