/// <summary>
        /// Sets up the tree and adds the first level of nodes.
        /// </summary>
        protected void InitializeTree()
        {
            BeginUpdate();
            Nodes.Clear();

            foreach (NodeHierarchy hierarchy in hierarchies)
            {
                MultiSourceTreeNode rootNode = new MultiSourceTreeNode(hierarchy.RootNodeText);
                rootNode.CollapsedImageIndex = hierarchy.RootNodeImageIndex;
                rootNode.ExpandedImageIndex  = hierarchy.RootNodeImageIndex;

                foreach (NodeSource source in hierarchy.NodeSources)
                {
                    NodeInfo[] rootInfos = source.CreateRootNodeInfo();
                    rootNode.AddInfoEntries(rootInfos);
                    source.UpdateNode(rootNode);
                    foreach (NodeInfo info in rootInfos)
                    {
                        AddChildNodes(rootNode, info.BuildChildNodes());
                    }
                }
                Nodes.Add(rootNode);
                rootNode.Expand();
            }
            SelectedNode = Nodes[0];
            EndUpdate();
        }
        private void HandleDoubleClick()
        {
            MultiSourceTreeNode node = (MultiSourceTreeNode)GetNodeAt(lastClickX, lastClickY);

            if (node == null)
            {
                return;
            }

            foreach (NodeInfo info in node.InfoEntries)
            {
                foreach (NodeStateSubscriber subscriber in info.Subscriptions)
                {
                    foreach (MenuDefinition def in subscriber.State.MenuDefinitions.Keys)
                    {
                        bool match = false;
                        if (subscriber.State.MenuDefinitions[def]) // Will equal true if this is a default option.
                        {
                            match = true;
                            if (def.MenuItemTest != null)
                            {
                                match = def.MenuItemTest.Invoke(node, info);
                            }
                        }
                        if (match)
                        {
                            def.OnMenuClicked(node, info);
                            return;
                        }
                    }
                }
            }

            if (node.IsExpanded)
            {
                node.Collapse();
            }
            else
            {
                node.Expand();
            }
        }