private void OnNodesChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.Action == NotifyCollectionChangedAction.Reset) { Children.Clear(); nodeToUmlClassControl.Clear(); umlClassControlToNode.Clear(); NodeNames.Clear(); return; } if (e.OldItems != null) { foreach (Node node in e.OldItems) { var umlClassControl = nodeToUmlClassControl[(UmlClass)node]; Children.Remove(umlClassControl); nodeToUmlClassControl.Remove((UmlClass)node); umlClassControlToNode.Remove(umlClassControl); NodeNames.Remove(node.Name); } } if (e.NewItems != null) { foreach (Node node in e.NewItems) { AddNode(node); if (!NodeNames.Contains(node.Name)) { NodeNames.Add(node.Name); } } } OnFilterTextChanged(null, FilterText); }
/// <summary> /// Aktualisiert den Baumstring. /// </summary> /// <param name="pTree">Der Baumstring.</param> public void UpdateTree(string pTree) { Debug.WriteLine(pTree); lock (_updateTreeLock) { Reset(pTree); // Listen neu init. und Positionszeiger des Baumstrings auf 0(Anfang) setzen. //+ -------------------------------- Hash = Next <string>(); // Hash auslesen Index = Next <int>(); // Hauptknotenindex auslesen //+ -------------------------------- // Füge X NULL-Werte in die Listen hinzu. 'X' steht hierbei für den Wert der 'Index'-Variable. In 90aeq und kleiner sind es 20 (gewesen). // Die NULL-Werte sind nicht Sinnlos, sondern dienen für bestimmte Befehle. // Hier eine Auflistung der Befehle in 90aeq: // 0 = Byte auslesen // 1 = Boolean auslesen // 2 = Byte auslesen // 3 = Short auslesen // 4 = int auslesen // 5 = long auslesen // 6 = Float auslesen // 7 = Double auslesen // 8 = Char auslesen // 9 = UTF-String auslesen // 11 = Neue Liste // 12 = Ende der Liste // 13 = Verschlüsselter String? // Alles über oder gleich dem Wert der 'Index'-Variable = Node for (int i = 0; i < Index; i++) { NodeNames.Add(null); NodeIndices.Add(null); } //+ -------------------------------- // Füge nun alle Knotennamen in die Liste hinzu. while (!IsEmpty()) { NodeNames.Add(Next <string>()); } //+ -------------------------------- // Manche Knoten haben nicht wie andere Werte oder andere Knoten gespeichert sondern bestimmte Werte. for (int i = Index; i < NodeNames.Count; i++) { if (!NodeValues.ContainsKey(NodeNames[i])) { NodeValues.Add(NodeNames[i], i); } } //+ -------------------------------- // Fügt alle Indices eines Knotens in eine Liste hinzu. // Key = Knotenname // Value = Index // Die Indices geben die Unterknoten des Knotens zurück. #region " BEISPIEL " // Baum: 1337;20;PROTOCOL_HASH;;5;;: // KEY = PROTOCOL_HASH // VALUE = List<int>() { 5 }; // 5 Gibt an das der Knoten ein Long zurückgibt. Siehe oben in der Befehlsliste. #endregion while (NodeIndices.Count < NodeNames.Count) { var indices = new List <int>(); while (!IsEmpty()) { indices.Add(Next <int>()); } NodeIndices.Add(indices); } //+ -------------------------------- // Springt zur Stelle an der ':' steht. Next <object>(':'); //+ -------------------------------- for (int i = Index; i < NodeIndices.Count; i++) { List <int> indices = NodeIndices[i]; foreach (int t in indices) { if (t != 0) { continue; } var values = new Dictionary <string, int>(); for (int k = 0; !IsEmpty(); k++) { values.Add(Next <string>(), k); } NodeValues[NodeNames[i]] = values; } } } }