Ejemplo n.º 1
0
        void AddNodeSorted(ExtensionNodeDescriptionCollection list, ExtensionNodeDescription node, ref int curPos)
        {
            // Adds the node at the correct position, taking into account insertbefore and insertafter

            if (node.InsertAfter.Length > 0) {
                string afterId = node.InsertAfter;
                for (int n=0; n<list.Count; n++) {
                    if (list[n].Id == afterId) {
                        list.Insert (n + 1, node);
                        curPos = n + 2;
                        return;
                    }
                }
            }
            else if (node.InsertBefore.Length > 0) {
                string beforeId = node.InsertBefore;
                for (int n=0; n<list.Count; n++) {
                    if (list[n].Id == beforeId) {
                        list.Insert (n, node);
                        curPos = n + 1;
                        return;
                    }
                }
            }
            if (curPos == -1)
                list.Add (node);
            else
                list.Insert (curPos++, node);
        }
Ejemplo n.º 2
0
        void EnsureInsertionsSorted(ExtensionNodeDescriptionCollection list)
        {
            // Makes sure that the nodes in the collections are properly sorted wrt insertafter and insertbefore attributes
            Dictionary<string,ExtensionNodeDescription> added = new Dictionary<string, ExtensionNodeDescription> ();
            List<ExtensionNodeDescription> halfSorted = new List<ExtensionNodeDescription> ();
            bool orderChanged = false;

            for (int n = list.Count - 1; n >= 0; n--) {
                ExtensionNodeDescription node = list [n];
                if (node.Id.Length > 0)
                    added [node.Id] = node;
                if (node.InsertAfter.Length > 0) {
                    ExtensionNodeDescription relNode;
                    if (added.TryGetValue (node.InsertAfter, out relNode)) {
                        // Out of order. Move it before the referenced node
                        int i = halfSorted.IndexOf (relNode);
                        halfSorted.Insert (i, node);
                        orderChanged = true;
                    } else {
                        halfSorted.Add (node);
                    }
                } else
                    halfSorted.Add (node);
            }
            halfSorted.Reverse ();
            List<ExtensionNodeDescription> fullSorted = new List<ExtensionNodeDescription> ();
            added.Clear ();

            foreach (ExtensionNodeDescription node in halfSorted) {
                if (node.Id.Length > 0)
                    added [node.Id] = node;
                if (node.InsertBefore.Length > 0) {
                    ExtensionNodeDescription relNode;
                    if (added.TryGetValue (node.InsertBefore, out relNode)) {
                        // Out of order. Move it before the referenced node
                        int i = fullSorted.IndexOf (relNode);
                        fullSorted.Insert (i, node);
                        orderChanged = true;
                    } else {
                        fullSorted.Add (node);
                    }
                } else
                    fullSorted.Add (node);
            }
            if (orderChanged) {
                list.Clear ();
                foreach (ExtensionNodeDescription node in fullSorted)
                    list.Add (node);
            }
        }