public override void OnMultipleNodeDrop(object[] dataObjects, DragOperation operation, DropPosition pos)
        {
            DotNetProject p     = (DotNetProject)CurrentNode.GetParentDataItem(typeof(Project), false);
            AddinData     adata = p.GetAddinData();

            ExtensionNodeInfo en = (ExtensionNodeInfo)CurrentNode.DataItem;

            foreach (ExtensionNodeInfo newNode in dataObjects)
            {
                if (newNode.Node.Parent is ExtensionNodeDescription)
                {
                    ((ExtensionNodeDescription)newNode.Node.Parent).ChildNodes.Remove(en.Node);
                }
                else
                {
                    ((Extension)newNode.Node.Parent).ExtensionNodes.Remove(newNode.Node);
                }
                InsertNode(adata, en, pos, newNode.Node);

                // Add all other nodes after the first node
                en  = newNode;
                pos = DropPosition.After;
            }

            adata.CachedAddinManifest.Save();
            adata.NotifyChanged(false);
        }
        public override void BuildNode(ITreeBuilder treeBuilder, object dataObject, ref string label, ref Pixbuf icon, ref Pixbuf closedIcon)
        {
            ExtensionNodeInfo        ninfo = (ExtensionNodeInfo)dataObject;
            ExtensionNodeDescription node  = ninfo.Node;

            label = GLib.Markup.EscapeText(node.NodeName);
            StringBuilder desc = new StringBuilder();

            foreach (NodeAttribute at in node.Attributes)
            {
                if (desc.Length > 0)
                {
                    desc.Append("  ");
                }
                desc.Append(at.Name).Append("=\"").Append(GLib.Markup.EscapeText(at.Value)).Append('"');
            }
            if (desc.Length > 0)
            {
                label += "(<i>" + desc + "</i>)";
            }

            icon = Context.GetIcon("md-extension-node");

            if (treeBuilder.Options ["ShowExistingNodes"] && !ninfo.CanModify)
            {
                Gdk.Pixbuf gicon = Context.GetComposedIcon(icon, "fade");
                if (gicon == null)
                {
                    gicon = ImageService.MakeTransparent(icon, 0.5);
                    Context.CacheComposedIcon(icon, "fade", gicon);
                }
                icon = gicon;
            }
        }
        ExtensionNodeTypeCollection GetAllowedChildTypes()
        {
            ExtensionNodeInfo en     = (ExtensionNodeInfo)CurrentNode.DataItem;
            object            parent = en.Node.Parent;

            Extension ext = parent as Extension;

            if (ext != null)
            {
                return(ext.GetAllowedNodeTypes());
            }
            else
            {
                ExtensionNodeDescription node = (ExtensionNodeDescription)parent;
                if (node != null)
                {
                    ExtensionNodeType tn = node.GetNodeType();
                    if (tn != null)
                    {
                        return(tn.GetAllowedNodeTypes());
                    }
                }
            }
            return(new ExtensionNodeTypeCollection());
        }
        public override void BuildChildNodes(ITreeBuilder treeBuilder, object dataObject)
        {
            ExtensionNodeInfo en = (ExtensionNodeInfo)dataObject;

            foreach (ExtensionNodeInfo child in en.Expand())
            {
                treeBuilder.AddChild(child);
            }
        }
        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);
        }
 public override bool CanDeleteMultipleItems()
 {
     foreach (var nav in CurrentNodes)
     {
         ExtensionNodeInfo en = (ExtensionNodeInfo)nav.DataItem;
         if (!en.CanModify)
         {
             return(false);
         }
     }
     return(true);
 }
        public override DragOperation CanDragNode()
        {
            ExtensionNodeInfo en = (ExtensionNodeInfo)CurrentNode.DataItem;

            if (en.CanModify)
            {
                return(DragOperation.Copy | DragOperation.Move);
            }
            else
            {
                return(DragOperation.None);
            }
        }
        public void AddNodeBefore(object data)
        {
            DotNetProject p     = (DotNetProject)CurrentNode.GetParentDataItem(typeof(Project), false);
            AddinData     adata = p.GetAddinData();

            ExtensionNodeInfo        en      = (ExtensionNodeInfo)CurrentNode.DataItem;
            ExtensionNodeType        ntype   = (ExtensionNodeType)data;
            ExtensionNodeDescription newNode = new ExtensionNodeDescription(ntype.NodeName);

            InsertNode(adata, en, DropPosition.Before, newNode);

            adata.CachedAddinManifest.Save();
            adata.NotifyChanged(false);
        }
        public override int CompareObjects(ITreeNavigator thisNode, ITreeNavigator otherNode)
        {
            ExtensionNodeInfo n1 = thisNode.DataItem as ExtensionNodeInfo;
            ExtensionNodeInfo n2 = otherNode.DataItem as ExtensionNodeInfo;

            if (n1 != null && n2 != null)
            {
                return(n1.Order.CompareTo(n2.Order));
            }
            else
            {
                return(base.CompareObjects(thisNode, otherNode));
            }
        }
        public override void DeleteMultipleItems()
        {
            if (MessageService.Confirm(GettextCatalog.GetString("Are you sure you want to delete the selected nodes?"), AlertButton.Delete))
            {
                foreach (var nav in CurrentNodes)
                {
                    ExtensionNodeInfo en = (ExtensionNodeInfo)nav.DataItem;
                    if (en.Node.Parent is Extension)
                    {
                        ((Extension)en.Node.Parent).ExtensionNodes.Remove(en.Node);
                    }
                    else if (en.Node.Parent is ExtensionNodeDescription)
                    {
                        ((ExtensionNodeDescription)en.Node.Parent).ChildNodes.Remove(en.Node);
                    }
                }
            }
            DotNetProject p     = (DotNetProject)CurrentNode.GetParentDataItem(typeof(Project), false);
            AddinData     adata = p.GetAddinData();

            adata.SaveAddinManifest();
            adata.NotifyChanged(false);
        }
		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;
		}
        public override string GetNodeName(ITreeNavigator thisNode, object dataObject)
        {
            ExtensionNodeInfo ep = (ExtensionNodeInfo)dataObject;

            return(ep.Node.Id);
        }
        public override void OnNodeRemoved(object dataObject)
        {
            ExtensionNodeInfo en = (ExtensionNodeInfo)dataObject;

            en.Changed -= HandleNodeChanged;
        }
        public override bool HasChildNodes(ITreeBuilder builder, object dataObject)
        {
            ExtensionNodeInfo en = (ExtensionNodeInfo)dataObject;

            return(en.HasChildren);
        }