mirror of
https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
synced 2025-10-29 01:05:32 +00:00
175 lines
5.2 KiB
C#
175 lines
5.2 KiB
C#
using System;
|
|
using System.CodeDom;
|
|
using System.Collections.Generic;
|
|
using System.Drawing.Text;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using System.Xml;
|
|
using System.Xml.Linq;
|
|
|
|
namespace HaInformator
|
|
{
|
|
public class Tree : TreeNode
|
|
{
|
|
public AttributeTree Attributes;
|
|
public List<XElement> Elements = new List<XElement>();
|
|
|
|
public Tree(XDocument doc) : this(doc.Root)
|
|
{
|
|
}
|
|
|
|
public Tree(XElement element)
|
|
{
|
|
this.BeginEdit();
|
|
this.Name = element.Name.ToString();
|
|
this.Text = this.Name;
|
|
this.Elements.Add(element);
|
|
|
|
if (element.HasAttributes)
|
|
{
|
|
if (Attributes == null)
|
|
Attributes = new AttributeTree();
|
|
foreach (var a in element.Attributes())
|
|
Attributes.AddAttribute(a);
|
|
}
|
|
|
|
if (element.HasElements)
|
|
foreach (var e in element.Elements())
|
|
_addSubTree(new Tree(e));
|
|
this.EndEdit(false);
|
|
}
|
|
|
|
internal void _addSubTree(Tree tree)
|
|
{
|
|
if (this.Nodes.ContainsKey(tree.Name))
|
|
_mergeTreeIntoThis(tree);
|
|
else
|
|
this.Nodes.Add(tree);
|
|
}
|
|
|
|
internal void _mergeTreeIntoThis(Tree tree)
|
|
{
|
|
var act = (Tree)Nodes[tree.Name];
|
|
act.Elements.AddRange(tree.Elements);
|
|
if (tree.Attributes != null)
|
|
{
|
|
if (act.Attributes == null)
|
|
act.Attributes = new AttributeTree();
|
|
act.Attributes.AddAttribute(tree.Attributes);
|
|
}
|
|
foreach (var node in tree.Nodes)
|
|
act._addSubTree((Tree)node);
|
|
}
|
|
|
|
public void SetName(string name)
|
|
{
|
|
this.BeginEdit();
|
|
foreach (var elem in Elements)
|
|
elem.Name = name;
|
|
if (Parent == null || !Parent.Nodes.ContainsKey(name))
|
|
{
|
|
this.Name = name;
|
|
this.Text = name;
|
|
this.EndEdit(false);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
this.Name = name;
|
|
this.Text = name;
|
|
var p = (Tree)Parent;
|
|
this.Remove();
|
|
p._addSubTree(this);
|
|
this.EndEdit(false);
|
|
}
|
|
}
|
|
|
|
public void AddElement(string name, string value)
|
|
{
|
|
this.BeginEdit();
|
|
foreach (var elem in Elements)
|
|
{
|
|
var e = new XElement(name);
|
|
if (!String.IsNullOrWhiteSpace(value))
|
|
e.Value = value;
|
|
elem.Add(e);
|
|
_addSubTree(new Tree(e));
|
|
}
|
|
this.EndEdit(false);
|
|
return;
|
|
}
|
|
|
|
public void RemoveElement()
|
|
{
|
|
this.BeginEdit();
|
|
foreach (var elem in Elements)
|
|
elem.Remove();
|
|
this.Remove();
|
|
this.EndEdit(false);
|
|
}
|
|
|
|
public void AddAttribute(string name, string value)
|
|
{
|
|
this.BeginEdit();
|
|
foreach (var elem in Elements)
|
|
{
|
|
var a = new XAttribute(name, value);
|
|
if (!String.IsNullOrWhiteSpace(value))
|
|
a.Value = value;
|
|
if (!elem.Attributes().Where(x => x.Name == name).Any())
|
|
elem.Add(a);
|
|
if (Attributes == null)
|
|
Attributes = new AttributeTree();
|
|
Attributes.AddAttribute(a);
|
|
}
|
|
// Why was this here?
|
|
//if (Parent == null)
|
|
// return;
|
|
//var p = (Tree)Parent;
|
|
//this.Remove();
|
|
//p._addSubTree(this);
|
|
this.EndEdit(false);
|
|
}
|
|
public void EditAttribute(string source, string target)
|
|
{
|
|
if (source == target)
|
|
return;
|
|
foreach (var elem in Elements)
|
|
if (elem.HasAttributes)
|
|
if (elem.Attributes(source).Any())
|
|
foreach (var a in elem.Attributes(source))
|
|
{
|
|
var attr = new XAttribute(target, a.Value);
|
|
elem.Add(attr);
|
|
a.Remove();
|
|
Attributes.AddAttribute(attr);
|
|
}
|
|
Attributes.RemoveAttribute(source);
|
|
}
|
|
|
|
public void SaveFile(string filepath)
|
|
{
|
|
foreach (var elem in Elements)
|
|
{
|
|
var sb = new System.IO.FileStream(filepath, System.IO.FileMode.Create);
|
|
var set = new XmlWriterSettings()
|
|
{
|
|
Indent = true,
|
|
IndentChars = " ",
|
|
NewLineChars = "\r\n",
|
|
NewLineHandling = NewLineHandling.Replace
|
|
};
|
|
using (var writer = XmlWriter.Create(sb, set))
|
|
{
|
|
elem.Save(writer);
|
|
}
|
|
sb.Close();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|