示例#1
0
 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;
                    }
                }
            }
        }