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); }
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); } }