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