diff --git a/CSharp/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/JSON/JSONDataFormat.cs b/CSharp/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/JSON/JSONDataFormat.cs
new file mode 100755
index 00000000..128813ff
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/JSON/JSONDataFormat.cs
@@ -0,0 +1,180 @@
+using System;
+using System.Collections.Generic;
+
+using UniversalEditor.DataFormats.Text.Plain;
+
+using UniversalEditor.ObjectModels.JSON;
+using UniversalEditor.ObjectModels.JSON.Fields;
+using UniversalEditor.ObjectModels.Text.Plain;
+
+namespace UniversalEditor.DataFormats.PropertyList.JSON
+{
+
+ ///
+ /// Represents a JSON document, a text-based, human-readable format for representing simple data structures and associative arrays.
+ ///
+ public class JSONDataFormat : PlainTextDataFormat
+ {
+ private static DataFormatReference _dfr = null;
+ protected override DataFormatReference MakeReferenceInternal()
+ {
+ if (_dfr == null)
+ {
+ _dfr = base.MakeReferenceInternal();
+ _dfr.Capabilities.Add(typeof(JSONObjectModel), DataFormatCapabilities.All);
+ }
+ return _dfr;
+ }
+
+ public void ApplySettings(JSONPresetSettings settings)
+ {
+ switch(settings)
+ {
+ case JSONPresetSettings.JSON:
+ mvarSettings.ObjectNamePrefix = "\"";
+ mvarSettings.ObjectNameSuffix = "\"";
+ mvarSettings.ObjectNameValueSeparator = ":";
+ mvarSettings.FieldNamePrefix = "\"";
+ mvarSettings.FieldNameSuffix = "\"";
+ mvarSettings.FieldNameValueSeparator = ":";
+ mvarSettings.FieldSeparator = ",";
+ mvarSettings.StringLiteralPrefix = "\"";
+ mvarSettings.StringLiteralSuffix = "\"";
+ break;
+ case JSONPresetSettings.ExtendedINI:
+ mvarSettings.ObjectNamePrefix = "";
+ mvarSettings.ObjectNameSuffix = "";
+ mvarSettings.ObjectNameValueSeparator = " ";
+ mvarSettings.FieldNamePrefix = "";
+ mvarSettings.FieldNameSuffix = "";
+ mvarSettings.FieldNameValueSeparator = "=";
+ mvarSettings.FieldSeparator = ";";
+ mvarSettings.StringLiteralPrefix = "\"";
+ mvarSettings.StringLiteralSuffix = "\"";
+ break;
+ }
+ }
+
+ private JSONSettings mvarSettings = new JSONSettings();
+ public JSONSettings Settings { get { return mvarSettings; } }
+
+ protected override void BeforeLoadInternal(Stack objectModels)
+ {
+ base.BeforeLoadInternal(objectModels);
+ objectModels.Push(new PlainTextObjectModel());
+ }
+ protected override void AfterLoadInternal(Stack objectModels)
+ {
+ base.AfterLoadInternal(objectModels);
+
+ PlainTextObjectModel ptom = (objectModels.Pop() as PlainTextObjectModel);
+ JSONObjectModel json = (objectModels.Pop() as JSONObjectModel);
+
+ throw new NotImplementedException();
+ }
+ protected override void BeforeSaveInternal(Stack objectModels)
+ {
+ base.BeforeSaveInternal(objectModels);
+
+ JSONObjectModel json = (objectModels.Pop() as JSONObjectModel);
+ PlainTextObjectModel ptom = (objectModels.Pop() as PlainTextObjectModel);
+ ptom.Lines.Clear();
+
+ for (int iObj = 0; iObj < json.Objects.Count; iObj++)
+ {
+ WriteObject(ptom, json.Objects[iObj]);
+ if (iObj < json.Objects.Count - 1)
+ ptom.WriteLine();
+ }
+ }
+
+ private void WriteObject(PlainTextObjectModel ptom, JSONObject obj)
+ {
+ WriteObject(ptom, obj, 0);
+ }
+ private void WriteObject(PlainTextObjectModel ptom, JSONObject obj, int indentLevel)
+ {
+ string szIndent = "";
+ if (mvarSettings.IndentChildFields)
+ {
+ szIndent = ptom.GetIndent(indentLevel);
+ }
+ if (obj.Name != "")
+ {
+ ptom.Lines.Add(mvarSettings.ObjectNamePrefix + obj.Name + mvarSettings.ObjectNameSuffix + (mvarSettings.AppendSpaceAfterObjectName ? " " : "") + mvarSettings.ObjectNameValueSeparator + " ");
+ }
+ if (mvarSettings.AppendLineAfterObjectName && obj.Name != "")
+ {
+ ptom.WriteLine();
+ ptom.Write(szIndent);
+ }
+ ptom.WriteLine(mvarSettings.ObjectPrefix);
+
+ // Content body
+ for (int i = 0; i < obj.Fields.Count; i++)
+ {
+ JSONField f = obj.Fields[i];
+ WriteField(ptom, f, indentLevel + 1);
+
+ if (i < obj.Fields.Count - 1)
+ {
+ ptom.Write(mvarSettings.FieldSeparator);
+ }
+ if (mvarSettings.AppendLineAfterField) ptom.WriteLine();
+ }
+
+ ptom.Write(szIndent + mvarSettings.ObjectSuffix);
+ }
+ private void WriteField(PlainTextObjectModel ptom, JSONField f, int indentLevel)
+ {
+ if (f.GetType() != typeof(JSONObjectField))
+ {
+ if (mvarSettings.IndentChildFields)
+ {
+ ptom.Write(ptom.GetIndent(indentLevel));
+ }
+ ptom.Write(mvarSettings.FieldNamePrefix + f.Name + mvarSettings.FieldNameSuffix + mvarSettings.FieldNameValueSeparator + " ");
+ if (mvarSettings.AppendLineAfterFieldName)
+ {
+ ptom.WriteLine();
+ ptom.Write(ptom.GetIndent(indentLevel));
+ }
+ }
+ if (f.GetType() == typeof(JSONArrayField))
+ {
+ ptom.Write(mvarSettings.ArrayPrefix);
+ if (mvarSettings.AppendLineAfterStartArray) ptom.WriteLine();
+
+ JSONArrayField af = (f as JSONArrayField);
+ for(int i = 0; i < af.Values.Count; i++)
+ {
+ if (mvarSettings.IndentArrayValues)
+ {
+ ptom.Write(ptom.GetIndent(indentLevel + 1));
+ }
+ ptom.Write(mvarSettings.ArrayValuePrefix + af.Values[i] + mvarSettings.ArrayValueSuffix);
+
+ if (i < af.Values.Count - 1) ptom.Write(", ");
+ if (mvarSettings.AppendLineAfterArrayValue) ptom.WriteLine();
+ }
+ ptom.Write(ptom.GetIndent(indentLevel) + mvarSettings.ArraySuffix);
+ }
+ else if (f.GetType() == typeof(JSONBooleanField))
+ {
+ ptom.Write((f as JSONBooleanField).Value.ToString().ToLower());
+ }
+ else if (f.GetType() == typeof(JSONNumberField))
+ {
+ ptom.Write((f as JSONNumberField).Value.ToString());
+ }
+ else if (f.GetType() == typeof(JSONObjectField))
+ {
+ WriteObject(ptom, (f as JSONObjectField).Value, indentLevel);
+ }
+ else if (f.GetType() == typeof(JSONStringField))
+ {
+ ptom.Write(mvarSettings.StringLiteralPrefix + (f as JSONStringField).Value + mvarSettings.StringLiteralSuffix);
+ }
+ }
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/JSON/JSONPresetSettings.cs b/CSharp/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/JSON/JSONPresetSettings.cs
new file mode 100755
index 00000000..926ece6f
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/JSON/JSONPresetSettings.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace UniversalEditor.DataFormats.PropertyList.JSON
+{
+ public enum JSONPresetSettings
+ {
+ JSON = 0,
+ ExtendedINI = 1
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/JSON/JSONSettings.cs b/CSharp/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/JSON/JSONSettings.cs
new file mode 100755
index 00000000..0bfdd2e7
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/DataFormats/PropertyList/JSON/JSONSettings.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace UniversalEditor.DataFormats.PropertyList.JSON
+{
+ public class JSONSettings
+ {
+ private string mvarObjectNameValueSeparator = ":";
+ public string ObjectNameValueSeparator { get { return mvarObjectNameValueSeparator; } set { mvarObjectNameValueSeparator = value; } }
+
+ private string mvarFieldNamePrefix = "\"";
+ public string FieldNamePrefix { get { return mvarFieldNamePrefix; } set { mvarFieldNamePrefix = value; } }
+ private string mvarFieldNameSuffix = "\"";
+ public string FieldNameSuffix { get { return mvarFieldNameSuffix; } set { mvarFieldNameSuffix = value; } }
+
+ private string mvarArrayPrefix = "[";
+ public string ArrayPrefix { get { return mvarArrayPrefix; } set { mvarArrayPrefix = value; } }
+ private string mvarArraySuffix = "]";
+ public string ArraySuffix { get { return mvarArraySuffix; } set { mvarArraySuffix = value; } }
+
+ private string mvarArrayValuePrefix = "\"";
+ public string ArrayValuePrefix { get { return mvarArrayValuePrefix; } set { mvarArrayValuePrefix = value; } }
+ private string mvarArrayValueSuffix = "\"";
+ public string ArrayValueSuffix { get { return mvarArrayValueSuffix; } set { mvarArrayValueSuffix = value; } }
+
+ private bool mvarAppendSpaceAfterObjectName = false;
+ public bool AppendSpaceAfterObjectName { get { return mvarAppendSpaceAfterObjectName; } set { mvarAppendSpaceAfterObjectName = value; } }
+ private bool mvarAppendLineAfterObjectName = true;
+ public bool AppendLineAfterObjectName { get { return mvarAppendLineAfterObjectName; } set { mvarAppendLineAfterObjectName = value; } }
+
+ private bool mvarAppendLineAfterStartArray = true;
+ public bool AppendLineAfterStartArray { get { return mvarAppendLineAfterStartArray; } set { mvarAppendLineAfterStartArray = value; } }
+ private bool mvarAppendLineAfterArrayValue = true;
+ public bool AppendLineAfterArrayValue { get { return mvarAppendLineAfterArrayValue; } set { mvarAppendLineAfterArrayValue = value; } }
+ private bool mvarAppendLineAfterField = true;
+ public bool AppendLineAfterField { get { return mvarAppendLineAfterField; } set { mvarAppendLineAfterField = value; } }
+ private bool mvarAppendLineAfterFieldName = false;
+ public bool AppendLineAfterFieldName { get { return mvarAppendLineAfterFieldName; } set { mvarAppendLineAfterFieldName = value; } }
+
+ private string mvarFieldSeparator = ",";
+ public string FieldSeparator { get { return mvarFieldSeparator; } set { mvarFieldSeparator = value; } }
+
+ private bool mvarIndentChildFields = true;
+ public bool IndentChildFields { get { return mvarIndentChildFields; } set { mvarIndentChildFields = value; } }
+ private bool mvarIndentArrayValues = true;
+ public bool IndentArrayValues { get { return mvarIndentArrayValues; } set { mvarIndentArrayValues = value; } }
+
+ private string mvarObjectNamePrefix = "\"";
+ public string ObjectNamePrefix { get { return mvarObjectNamePrefix; } set { mvarObjectNamePrefix = value; } }
+ private string mvarObjectNameSuffix = "\"";
+ public string ObjectNameSuffix { get { return mvarObjectNameSuffix; } set { mvarObjectNameSuffix = value; } }
+
+ private string mvarObjectPrefix = "{";
+ public string ObjectPrefix { get { return mvarObjectPrefix; } set { mvarObjectPrefix = value; } }
+ private string mvarObjectSuffix = "}";
+ public string ObjectSuffix { get { return mvarObjectSuffix; } set { mvarObjectSuffix = value; } }
+
+ private string mvarFieldNameValueSeparator = ":";
+ public string FieldNameValueSeparator { get { return mvarFieldNameValueSeparator; } set { mvarFieldNameValueSeparator = value; } }
+
+ private string mvarStringLiteralPrefix = "\"";
+ public string StringLiteralPrefix { get { return mvarStringLiteralPrefix; } set { mvarStringLiteralPrefix = value; } }
+ private string mvarStringLiteralSuffix = "\"";
+ public string StringLiteralSuffix { get { return mvarStringLiteralSuffix; } set { mvarStringLiteralSuffix = value; } }
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/DataFormats/Text/Plain/PlainTextDataFormat.cs b/CSharp/Libraries/UniversalEditor.Essential/DataFormats/Text/Plain/PlainTextDataFormat.cs
new file mode 100644
index 00000000..18611b9e
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/DataFormats/Text/Plain/PlainTextDataFormat.cs
@@ -0,0 +1,67 @@
+//
+// PlainTextDataFormat.cs
+//
+// Author:
+// Mike Becker
+//
+// Copyright (c) 2019 Mike Becker
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+using System;
+using UniversalEditor.IO;
+using UniversalEditor.ObjectModels.Text.Plain;
+
+namespace UniversalEditor.DataFormats.Text.Plain
+{
+ public class PlainTextDataFormat : DataFormat
+ {
+ private static DataFormatReference _dfr = null;
+ protected override DataFormatReference MakeReferenceInternal()
+ {
+ if (_dfr == null)
+ {
+ _dfr = base.MakeReferenceInternal();
+ _dfr.Capabilities.Add(typeof(PlainTextObjectModel), DataFormatCapabilities.All);
+ }
+ return _dfr;
+ }
+
+ protected override void LoadInternal(ref ObjectModel objectModel)
+ {
+ PlainTextObjectModel ptom = (objectModel as PlainTextObjectModel);
+ if (ptom == null)
+ throw new ObjectModelNotSupportedException();
+
+ Reader reader = Accessor.Reader;
+ while (!reader.EndOfStream)
+ {
+ string line = reader.ReadLine();
+ ptom.Lines.Add(line);
+ }
+ }
+
+ protected override void SaveInternal(ObjectModel objectModel)
+ {
+ PlainTextObjectModel ptom = (objectModel as PlainTextObjectModel);
+ if (ptom == null)
+ throw new ObjectModelNotSupportedException();
+
+ Writer writer = Accessor.Writer;
+ foreach (string line in ptom.Lines)
+ {
+ writer.WriteLine(line);
+ }
+ }
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONArrayField.cs b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONArrayField.cs
new file mode 100755
index 00000000..6960ecc7
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONArrayField.cs
@@ -0,0 +1,23 @@
+using System;
+
+namespace UniversalEditor.ObjectModels.JSON.Fields
+{
+ ///
+ /// Description of ArrayField.
+ ///
+ public class JSONArrayField : JSONField
+ {
+ private System.Collections.Specialized.StringCollection mvarValues = new System.Collections.Specialized.StringCollection();
+ public System.Collections.Specialized.StringCollection Values { get { return mvarValues; } }
+
+ public override object Clone()
+ {
+ JSONArrayField clone = new JSONArrayField();
+ foreach (string value in Values)
+ {
+ clone.Values.Add(value.Clone() as string);
+ }
+ return clone;
+ }
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONBooleanField.cs b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONBooleanField.cs
new file mode 100755
index 00000000..a50987f0
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONBooleanField.cs
@@ -0,0 +1,21 @@
+using System;
+
+namespace UniversalEditor.ObjectModels.JSON.Fields
+{
+ ///
+ /// Description of BooleanField.
+ ///
+ public class JSONBooleanField
+ : JSONField
+ {
+ private bool mvarValue = false;
+ public bool Value { get { return mvarValue; } set { mvarValue = value; } }
+
+ public override object Clone()
+ {
+ JSONBooleanField clone = new JSONBooleanField();
+ clone.Value = Value;
+ return clone;
+ }
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONNumberField.cs b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONNumberField.cs
new file mode 100755
index 00000000..628e8fb9
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONNumberField.cs
@@ -0,0 +1,21 @@
+using System;
+
+namespace UniversalEditor.ObjectModels.JSON.Fields
+{
+ ///
+ /// Description of NumberField.
+ ///
+ public class JSONNumberField
+ : JSONField
+ {
+ private int mvarValue = 0;
+ public int Value { get { return mvarValue; } set { mvarValue = value; } }
+
+ public override object Clone()
+ {
+ JSONNumberField clone = new JSONNumberField();
+ clone.Value = Value;
+ return clone;
+ }
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONObjectField.cs b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONObjectField.cs
new file mode 100755
index 00000000..2b072ec3
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONObjectField.cs
@@ -0,0 +1,20 @@
+using System;
+
+namespace UniversalEditor.ObjectModels.JSON.Fields
+{
+ ///
+ /// Description of ObjectField.
+ ///
+ public class JSONObjectField : JSONField
+ {
+ private JSONObject mvarValue = null;
+ public JSONObject Value { get { return mvarValue; } set { mvarValue = value; } }
+
+ public override object Clone()
+ {
+ JSONObjectField clone = new JSONObjectField();
+ clone.Value = (Value.Clone() as JSONObject);
+ return clone;
+ }
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONStringField.cs b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONStringField.cs
new file mode 100755
index 00000000..cdb1dc0a
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/Fields/JSONStringField.cs
@@ -0,0 +1,21 @@
+using System;
+
+namespace UniversalEditor.ObjectModels.JSON.Fields
+{
+ ///
+ /// Description of StringField.
+ ///
+ public class JSONStringField
+ : JSONField
+ {
+ private string mvarValue = "";
+ public string Value { get { return mvarValue; } set { mvarValue = value; } }
+
+ public override object Clone()
+ {
+ JSONStringField clone = new JSONStringField();
+ clone.Value = (Value.Clone() as string);
+ return clone;
+ }
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/JSONField.cs b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/JSONField.cs
new file mode 100755
index 00000000..100f20bb
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/JSONField.cs
@@ -0,0 +1,65 @@
+using System;
+using UniversalEditor.ObjectModels.JSON.Fields;
+
+namespace UniversalEditor.ObjectModels.JSON
+{
+ ///
+ /// Description of Field.
+ ///
+ public abstract class JSONField : ICloneable
+ {
+ private string mvarName = "";
+ public string Name { get { return mvarName; } set { mvarName = value; } }
+
+ public class JSONFieldCollection
+ : System.Collections.ObjectModel.Collection
+ {
+ public JSONNumberField Add(string Name, int Value)
+ {
+ JSONNumberField f = new JSONNumberField();
+ f.Name = Name;
+ f.Value = Value;
+ base.Add(f);
+ return f;
+ }
+ public JSONStringField Add(string Name, string Value)
+ {
+ JSONStringField f = new JSONStringField();
+ f.Name = Name;
+ f.Value = Value;
+ base.Add(f);
+ return f;
+ }
+ public JSONBooleanField Add(string Name, bool Value)
+ {
+ JSONBooleanField f = new JSONBooleanField();
+ f.Name = Name;
+ f.Value = Value;
+ base.Add(f);
+ return f;
+ }
+ public JSONArrayField Add(string Name, params string[] Values)
+ {
+ JSONArrayField f = new JSONArrayField();
+ f.Name = Name;
+ foreach(string s in Values)
+ {
+ f.Values.Add(s);
+ }
+ base.Add(f);
+ return f;
+ }
+ public JSONObjectField Add(string Name, JSONObject Value)
+ {
+ JSONObjectField f = new JSONObjectField();
+ f.Name = Name;
+ Value.Name = Name;
+ f.Value = Value;
+ base.Add(f);
+ return f;
+ }
+ }
+
+ public abstract object Clone();
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/JSONObject.cs b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/JSONObject.cs
new file mode 100755
index 00000000..e4536b8d
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/JSONObject.cs
@@ -0,0 +1,72 @@
+using System;
+
+namespace UniversalEditor.ObjectModels.JSON
+{
+ ///
+ /// Description of Object.
+ ///
+ public class JSONObject : ICloneable
+ {
+ private string mvarName = "";
+ public string Name { get { return mvarName; } set { mvarName = value; } }
+
+ private JSONField.JSONFieldCollection mvarFields = new JSONField.JSONFieldCollection();
+ public JSONField.JSONFieldCollection Fields { get { return mvarFields; } }
+
+ public class JSONObjectCollection
+ : System.Collections.ObjectModel.Collection
+ {
+ public JSONObject Add()
+ {
+ return Add("");
+ }
+ public JSONObject Add(string Name)
+ {
+ JSONObject o = new JSONObject();
+ o.Name = Name;
+ base.Add(o);
+ return o;
+ }
+
+ public JSONObject this[string Name]
+ {
+ get
+ {
+ foreach(JSONObject o in this)
+ {
+ if (o.Name == Name)
+ {
+ return o;
+ }
+ }
+ return null;
+ }
+ }
+ public bool Contains(string Name)
+ {
+ return (this[Name] != null);
+ }
+ public bool Remove(string Name)
+ {
+ JSONObject o = this[Name];
+ if (o != null)
+ {
+ base.Remove(o);
+ return true;
+ }
+ return false;
+ }
+ }
+
+ public object Clone()
+ {
+ JSONObject clone = new JSONObject();
+ foreach (JSONField field in Fields)
+ {
+ clone.Fields.Add(field.Clone() as JSONField);
+ }
+ clone.Name = (Name.Clone() as string);
+ return clone;
+ }
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/JSONObjectModel.cs b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/JSONObjectModel.cs
new file mode 100644
index 00000000..056a2713
--- /dev/null
+++ b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/JSON/JSONObjectModel.cs
@@ -0,0 +1,46 @@
+//
+// JSONObjectModel.cs
+//
+// Author:
+// Mike Becker
+//
+// Copyright (c) 2019 Mike Becker
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+using System;
+namespace UniversalEditor.ObjectModels.JSON
+{
+ public class JSONObjectModel : ObjectModel
+ {
+ private JSONObject.JSONObjectCollection mvarObjects = new JSONObject.JSONObjectCollection();
+ public JSONObject.JSONObjectCollection Objects { get { return mvarObjects; } }
+
+ public override void Clear()
+ {
+ Objects.Clear();
+ }
+
+ public override void CopyTo(ObjectModel where)
+ {
+ JSONObjectModel clone = (where as JSONObjectModel);
+ if (clone == null)
+ throw new ObjectModelNotSupportedException();
+
+ foreach (JSONObject obj in Objects)
+ {
+ clone.Objects.Add(obj.Clone() as JSONObject);
+ }
+ }
+ }
+}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/Text/Plain/PlainTextObjectModel.cs b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/Text/Plain/PlainTextObjectModel.cs
index 61ad463f..da02b87d 100644
--- a/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/Text/Plain/PlainTextObjectModel.cs
+++ b/CSharp/Libraries/UniversalEditor.Essential/ObjectModels/Text/Plain/PlainTextObjectModel.cs
@@ -51,5 +51,27 @@ namespace UniversalEditor.ObjectModels.Text.Plain
mvarLines.Add(splitt);
}
}
+
+ private int indentSize = 4;
+ public string GetIndent(int length)
+ {
+ return new string(' ', indentSize * length);
+ }
+
+ public void Write(string value)
+ {
+ if (Lines.Count < 1)
+ {
+ Lines.Add(value);
+ }
+ else
+ {
+ Lines[Lines.Count - 1] = Lines[Lines.Count - 1] + value;
+ }
+ }
+ public void WriteLine(string value = "")
+ {
+ Write(value + LineTerminator);
+ }
}
}
diff --git a/CSharp/Libraries/UniversalEditor.Essential/UniversalEditor.Essential.csproj b/CSharp/Libraries/UniversalEditor.Essential/UniversalEditor.Essential.csproj
index 54a944b5..14b15627 100644
--- a/CSharp/Libraries/UniversalEditor.Essential/UniversalEditor.Essential.csproj
+++ b/CSharp/Libraries/UniversalEditor.Essential/UniversalEditor.Essential.csproj
@@ -167,6 +167,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -183,6 +195,10 @@
+
+
+
+