mirror of
				https://github.com/Theodor-Springmann-Stiftung/hamann-ausgabe-core.git
				synced 2025-10-31 10:15:33 +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();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
| }
 | 
