ExtensionNodeDescription InsertNode(AddinData adata, ExtensionNodeInfo refNode, DropPosition pos, ExtensionNodeDescription newNode) { ExtensionNodeDescriptionCollection nodes = null; newNode.InsertBefore = ""; newNode.InsertAfter = ""; if (refNode.CanModify) { if (pos == DropPosition.Into) { nodes = refNode.Node.ChildNodes; } else if (refNode.Node.Parent is ExtensionNodeDescription) { nodes = ((ExtensionNodeDescription)refNode.Node.Parent).ChildNodes; } } else { if (pos == DropPosition.After) { newNode.InsertAfter = refNode.Node.Id; } else if (pos == DropPosition.Before) { newNode.InsertBefore = refNode.Node.Id; } } if (nodes == null) { string path = refNode.Node.GetParentPath(); if (pos == DropPosition.Into) { path += "/" + refNode.Node.Id; } Extension ext = adata.CachedAddinManifest.MainModule.GetExtension(path); nodes = ext.ExtensionNodes; } for (int n = 0; n < nodes.Count; n++) { ExtensionNodeDescription node = nodes [n]; if (node == refNode.Node) { if (pos == DropPosition.After) { n++; } nodes.Insert(n, newNode); return(newNode); } } nodes.Add(newNode); return(newNode); }