/// <summary>
        /// Adds the control to the tree
        /// </summary>
        /// <param name="ancestor"></param>
        /// <param name="control"></param>
        private void AddControlNode(Node parentNode, GUIControl control, int atIndex)
        {
            SceneNode node = new SceneNode(control);

            if (atIndex >= 0)
                 parentNode.Nodes.Insert(atIndex, node);
            else
                parentNode.Nodes.Add(node);

            foreach (GUIControl childControl in control.Controls)
            {
                AddControlNode(node, childControl);
            }
        }
        private void mSceneTreeView_DragOver(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(TreeNodeAdv[])) && mSceneTreeView.DropPosition.Node != null)
            {
                TreeNodeAdv[] nodes  = e.Data.GetData(typeof(TreeNodeAdv[])) as TreeNodeAdv[];
                TreeNodeAdv   parent = mSceneTreeView.DropPosition.Node;
                if (mSceneTreeView.DropPosition.Position != NodePosition.Inside)
                {
                    parent = parent.Parent;
                }

                SceneNode parentSceneNode = parent.Tag as SceneNode;
                bool      bParentIsView   = parentSceneNode != null && parentSceneNode.Control is GUIView;

                foreach (TreeNodeAdv node in nodes)
                {
                    SceneNode sceneNode = node.Tag as SceneNode;

                    // Can't re-parent to one of its children
                    if (!CheckNodeParent(parent, node))
                    {
                        e.Effect = DragDropEffects.None;
                        return;
                    }

                    // GUIViews can only be direct children of the root (scene)
                    if (sceneNode.Control is GUIView && (parent != mSceneTreeView.Root))
                    {
                        e.Effect = DragDropEffects.None;
                        return;
                    }

                    if (!(sceneNode.Control is GUIView))
                    {
                        GUIView parentView       = sceneNode.Control.ParentView;
                        GUIView targetParentView = null;

                        if (parentSceneNode != null)
                        {
                            if (bParentIsView)
                            {
                                targetParentView = parentSceneNode.Control as GUIView;
                            }
                            else
                            {
                                targetParentView = parentSceneNode.Control.ParentView;
                            }
                        }

                        // Can't reparent to a different view
                        if (parentView != targetParentView)
                        {
                            e.Effect = DragDropEffects.None;
                            return;
                        }

                        // Can't reparent to a non-GUIGroup
                        if (!(parentSceneNode.Control is GUIGroup) && !(parentSceneNode.Control is GUIView))
                        {
                            e.Effect = DragDropEffects.None;
                            return;
                        }
                    }
                }

                e.Effect = e.AllowedEffect;
            }
        }
        /// <summary>
        /// Adds a sceneView node to the scene hierarchy at a specific index
        /// </summary>
        /// <param name="sceneView"></param>
        /// <returns></returns>
        private void AddViewNode(GUIView view, int atIndex)
        {
            SceneNode node = new SceneNode(view);

            if (atIndex >= 0)
                mTreeModel.Nodes.Insert(atIndex, node);
            else
                mTreeModel.Nodes.Add(node);

            AddControlNodes(node, view.Controls);
        }
        private void mSceneTreeView_DragDrop(object sender, DragEventArgs e)
        {
            mSceneTreeView.BeginUpdate();
            {
                TreeNodeAdv[] nodes    = (TreeNodeAdv[])e.Data.GetData(typeof(TreeNodeAdv[]));
                Node          dropNode = mSceneTreeView.DropPosition.Node.Tag as Node;

                GUIControl        parentControl = null;
                List <GUIControl> controls      = new List <GUIControl>();
                int  index         = -1;
                bool bParentChange = false;

                // If dropped inside, we're re-grouping (re-parenting) the controls
                if (mSceneTreeView.DropPosition.Position == NodePosition.Inside)
                {
                    bParentChange = true;

                    SceneNode parent = dropNode as SceneNode;
                    parentControl = parent.Control;

                    // Create a list of controls that we'll re-parent
                    foreach (TreeNodeAdv n in nodes)
                    {
                        SceneNode sceneNode = n.Tag as SceneNode;
                        if (sceneNode.Control is GUIView)
                        {
                            continue;
                        }

                        controls.Add(sceneNode.Control);
                    }
                }
                else
                {
                    SceneNode parent   = dropNode.Parent as SceneNode;
                    Node      nextItem = dropNode;
                    if (mSceneTreeView.DropPosition.Position == NodePosition.After)
                    {
                        nextItem = dropNode.NextNode;
                    }

                    parentControl = (parent != null) ? parent.Control : null;
                    index         = dropNode.Parent.Nodes.IndexOf(nextItem);

                    // Create a list of controls we're going to reorder
                    foreach (TreeNodeAdv n in nodes)
                    {
                        SceneNode sceneNode = n.Tag as SceneNode;
                        controls.Add(sceneNode.Control);

                        if (sceneNode.Control.Parent != parentControl)
                        {
                            bParentChange = true;
                        }
                    }
                }

                if (controls.Count > 0)
                {
                    controls.Sort
                    (
                        (a, b) =>
                        (
                            (b is GUIView ? b.Scene.Views.IndexOf((GUIView)b) : b.Parent.Controls.IndexOf(b)) -
                            (a is GUIView ? a.Scene.Views.IndexOf((GUIView)a) : a.Parent.Controls.IndexOf(a))

                        )
                    );

                    if (bParentChange)
                    {
                        mCommandManager.AddCommand(new ChangeParentCommand(controls, parentControl, index), true);
                    }
                    else
                    {
                        mCommandManager.AddCommand(new ChangeOrderCommand(controls, index), true);
                    }
                }

                mSceneTreeView.DropPosition.Node.IsExpanded = true;
            }
            mSceneTreeView.EndUpdate();
        }