Exemplo n.º 1
0
        //
        // Timer tick. Updates scrolling of the TreeView
        //
        private void timer_Tick(object sender, EventArgs e)
        {
            // get node at mouse position
            Point    pt   = PointToClient(MousePosition);
            TreeNode node = GetNodeAt(pt);

            if (node == null)
            {
                return;
            }

            // if mouse is near to the top, scroll up
            if (pt.Y < 30)
            {
                // set actual node to the upper one
                if (node.PrevVisibleNode != null)
                {
                    node = node.PrevVisibleNode;

                    // hide drag image
                    DragHelper.ImageList_DragShowNolock(false);
                    // scroll and refresh
                    node.EnsureVisible();
                    Refresh();
                    // show drag image
                    DragHelper.ImageList_DragShowNolock(true);
                }
            }
            // if mouse is near to the bottom, scroll down
            else if (pt.Y > Size.Height - 30)
            {
                if (node.NextVisibleNode != null)
                {
                    node = node.NextVisibleNode;

                    DragHelper.ImageList_DragShowNolock(false);
                    node.EnsureVisible();
                    Refresh();
                    DragHelper.ImageList_DragShowNolock(true);
                }
            }
        }
Exemplo n.º 2
0
        //
        // OnDragOver event handler. Updates the dragged node's ghost image's position
        //
        protected override void OnDragOver(DragEventArgs drgevent)
        {
            base.OnDragOver(drgevent);

            // Cancel if no node is being dragged
            if (_draggedNode == null)
            {
                return;
            }

            // Compute drag position and move image
            var findForm = FindForm();

            if (findForm != null)
            {
                Point formP = findForm.PointToClient(new Point(drgevent.X, drgevent.Y));
                DragHelper.ImageList_DragMove(formP.X - Left, formP.Y - Top);
            }

            // Get actual drop node
            TreeNode dropNode = GetNodeAt(PointToClient(new Point(drgevent.X, drgevent.Y)));

            if (dropNode == null)
            {
                drgevent.Effect = DragDropEffects.None;
                return;
            }

            TreeViewNodeDragEventArgs evArgs = new TreeViewNodeDragEventArgs(TreeViewNodeDragEventType.DragOver, TreeViewNodeDragEventBehavior.PlaceInside, _draggedNode, dropNode);

            if (DragOperation != null)
            {
                DragOperation(evArgs);

                // Cancel the operation if the user specified so
                if (evArgs.Cancel)
                {
                    drgevent.Effect = DragDropEffects.None;
                    OnDragDrop(drgevent);
                    return;
                }
                if (!evArgs.Allow)
                {
                    return;
                }
            }

            drgevent.Effect = DragDropEffects.Move;

            // Dissalow the drag here
            if (!evArgs.Allow)
            {
                drgevent.Effect = DragDropEffects.None;
            }

            // if mouse is on a new node select it
            if (_tempDropNode != dropNode)
            {
                DragHelper.ImageList_DragShowNolock(false);
                SelectedNode = dropNode;
                DragHelper.ImageList_DragShowNolock(true);
                _tempDropNode = dropNode;
            }

            // Avoid that drop node is child of drag node
            TreeNode tmpNode = dropNode;

            while (tmpNode.Parent != null)
            {
                if (tmpNode.Parent == _draggedNode)
                {
                    drgevent.Effect = DragDropEffects.None;
                }
                tmpNode = tmpNode.Parent;
            }
        }