private void timer_Tick(object sender, System.EventArgs e)
        {
            Point    pt   = PointToClient(Control.MousePosition);
            TreeNode node = this.suiteTreeView.GetNodeAt(pt);

            if (node == null)
            {
                return;
            }

            if (pt.Y < 30)
            {
                if (node.PrevVisibleNode != null)
                {
                    node = node.PrevVisibleNode;
                    DragHelper.ImageList_DragShowNolock(false);
                    node.EnsureVisible();
                    this.suiteTreeView.Refresh();
                    DragHelper.ImageList_DragShowNolock(true);
                }
            }
            else if (pt.Y > this.suiteTreeView.Size.Height - 30)
            {
                if (node.NextVisibleNode != null)
                {
                    node = node.NextVisibleNode;

                    DragHelper.ImageList_DragShowNolock(false);
                    node.EnsureVisible();
                    this.suiteTreeView.Refresh();
                    DragHelper.ImageList_DragShowNolock(true);
                }
            }
        }
        private void suiteTreeView_DragOver(object sender, DragEventArgs e)
        {
            Point formP = this.PointToClient(new Point(e.X, e.Y));

            DragHelper.ImageList_DragMove(formP.X - this.suiteTreeView.Left, formP.Y - this.suiteTreeView.Top);
            TreeNode dropNode = this.suiteTreeView.GetNodeAt(this.suiteTreeView.PointToClient(new Point(e.X, e.Y)));

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

            e.Effect = DragDropEffects.Move;

            if (this.tempDropNode != dropNode)
            {
                DragHelper.ImageList_DragShowNolock(false);
                this.suiteTreeView.SelectedNode = dropNode;
                DragHelper.ImageList_DragShowNolock(true);
                tempDropNode = dropNode;
            }

            TreeNode tmpNode = dropNode;

            while (tmpNode.Parent != null)
            {
                if (tmpNode.Parent == this.dragNode)
                {
                    e.Effect = DragDropEffects.None;
                }

                tmpNode = tmpNode.Parent;
            }
        }
            /// <summary>
            /// Gets called when the item is dropped.
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void _Drop(object sender, DragEventArgs e)
            {
                var treeView = sender as TreeView;

                if (treeView == null || treeView != this._treeView)
                {
                    return;
                }

                // Unlock updates
                DragHelper.ImageList_DragShowNolock(false);
                treeView.Refresh();

                if (this._draggedNode != null && this.NodeMap != "")
                {
                    var      movingNode       = this._draggedNode;
                    var      NodeIndexes      = this.NodeMap.Split(_NODEMAP_DELIMITER);
                    var      InsertCollection = treeView.Nodes;
                    TreeNode newParent        = null;
                    for (var i = 0; i < NodeIndexes.Length - 1; i++)
                    {
                        var index = Int32.Parse(NodeIndexes[i]);
                        if (index > InsertCollection.Count)
                        {
                            index = InsertCollection.Count;
                        }
                        InsertCollection = (newParent = InsertCollection[index]).Nodes;
                    }

                    var insertIndex = Int32.Parse(NodeIndexes[NodeIndexes.Length - 1]);

                    // special case: we're inserting the node into the same tree again
                    var oldIndex = InsertCollection.IndexOf(movingNode);
                    // we need to decrement the stored index, because after removing the node, all following elements' indexes will be decremented
                    if (oldIndex <= insertIndex && movingNode.Parent == newParent)
                    {
                        --insertIndex;
                    }

                    // prepare move
                    this._OnNodeMove?.Invoke(movingNode, newParent, insertIndex);

                    // move
                    movingNode.Remove();
                    InsertCollection.Insert(insertIndex, movingNode);

                    var index2 = int.Parse(NodeIndexes[NodeIndexes.Length - 1]);
                    if (index2 < InsertCollection.Count)
                    {
                        treeView.SelectedNode = InsertCollection[index2];
                    }

                    this._draggedNode             = null;
                    this._dragScrollTimer.Enabled = false;
                }
            }
Exemple #4
0
        private void BetterTreeView_DragOver(object sender, DragEventArgs e)
        {
            DragScroll();

            // Compute drag position and move image
            Point formP = PointToClient(new Point(e.X, e.Y));

            DragHelper.ImageList_DragMove(formP.X - Left, formP.Y - Top);

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

            // Make sure we have a node.
            if (dropNode == null)
            {
                e.Effect = DragDropEffects.None;
                return;
            }

            if (tempDropNode != dropNode)
            {
                DragHelper.ImageList_DragShowNolock(false);
                SelectedNode = dropNode;
                DragHelper.ImageList_DragShowNolock(true);
                tempDropNode = dropNode;
            }

            // Make sure that we aren't dropping onto a child node.
            TreeNode tmpNode = dropNode;

            while (tmpNode.Parent != null)
            {
                if (tmpNode.Parent == dragNode)
                {
                    e.Effect = DragDropEffects.None;
                    return;
                }
                tmpNode = tmpNode.Parent;
            }

            // Allow any event handlers a chance to cancel the drag/drop.
            DragOverNodeEventArgs args = new DragOverNodeEventArgs(dragNode, dropNode);

            if (DragOverNode != null)
            {
                DragOverNode(this, args);
            }
            if (args.Cancel)
            {
                e.Effect = DragDropEffects.None;
                return;
            }

            e.Effect = DragDropEffects.All;
        }
Exemple #5
0
        private void timer_Tick(object sender, EventArgs e)
        {
            try
            {
                // get node at mouse position
                Point    pt   = PointToClient(Control.MousePosition);
                TreeNode node = this.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();
                        this.Refresh();
                        // show drag image
                        DragHelper.ImageList_DragShowNolock(true);
                    }
                }
                // if mouse is near to the bottom, scroll down
                else if (pt.Y > this.Size.Height - 30)
                {
                    if (node.NextVisibleNode != null)
                    {
                        node = node.NextVisibleNode;

                        DragHelper.ImageList_DragShowNolock(false);
                        node.EnsureVisible();
                        this.Refresh();
                        DragHelper.ImageList_DragShowNolock(true);
                    }
                }
            }
            catch (Exception ex)
            {
                ACSLog.InsertLog(MessageBoxIcon.Error, ex);
            }
        }
            private void _Draw()
            {
                // hide image
                DragHelper.ImageList_DragShowNolock(false);

                // paint treeview
                this._treeView.Refresh();

                // paint placeholder
                var hoveredNode = this._nodeOver;

                if (hoveredNode != null && hoveredNode.TreeView != null)
                {
                    switch (this._placeHolder)
                    {
                    case PlaceHolderType.LeafTop: {
                        this._DrawLeafTopPlaceholders(hoveredNode);
                        break;
                    }

                    case PlaceHolderType.LeafBottom: {
                        this._DrawLeafBottomPlaceholders(hoveredNode, this._parentDragDrop);
                        break;
                    }

                    case PlaceHolderType.AddToFolder: {
                        this._DrawAddToFolderPlaceholder(hoveredNode);
                        break;
                    }

                    case PlaceHolderType.FolderTop: {
                        this._DrawFolderTopPlaceholders(hoveredNode);
                        break;
                    }

                    case PlaceHolderType.None: {
                        break;
                    }

                    default: {
                        throw new NotImplementedException("Unknown place holder type");
                    }
                    }
                }

                // paint image
                DragHelper.ImageList_DragShowNolock(true);
            }
            /// <summary>
            /// Gets called when the timer ticks.
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void _Tick(object sender, EventArgs e)
            {
                var treeView = this._treeView;

                // get node at mouse position
                var pt   = treeView.PointToClient(Control.MousePosition);
                var node = treeView.GetNodeAt(pt);

                if (node == null)
                {
                    return;
                }

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

                    node = node.PrevVisibleNode;

                    // hide drag image
                    DragHelper.ImageList_DragShowNolock(false);

                    // scroll and refresh
                    node.EnsureVisible();
                    this._Draw();
                }
                // if mouse is near to the bottom, scroll down
                else if (pt.Y > treeView.Size.Height - _SCROLL_PIXEL_RANGE)
                {
                    if (node.NextVisibleNode == null)
                    {
                        return;
                    }

                    node = node.NextVisibleNode;

                    DragHelper.ImageList_DragShowNolock(false);
                    node.EnsureVisible();
                    this._Draw();
                }
            }
Exemple #8
0
        protected override void OnDragOver(DragEventArgs drgevent)
        {
            try
            {
                // Compute drag position and move image
                Point formP = this.PointToClient(new Point(drgevent.X, drgevent.Y));
                //DragHelper.ImageList_DragMove(formP.X - this.Left, formP.Y - this.Top);
                DragHelper.ImageList_DragMove(formP.X, formP.Y);

                // Get actual drop node
                TreeNode dropNode = this.GetNodeAt(this.PointToClient(new Point(drgevent.X, drgevent.Y)));
                if (dropNode == null)
                {
                    //Verificar
                    //drgevent.Effect = DragDropEffects.None;
                    return;
                }

                drgevent.Effect = DragDropEffects.Move;

                // if mouse is on a new node select it
                if (this.tempDropNode != dropNode)
                {
                    DragHelper.ImageList_DragShowNolock(false);
                    this.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 == this.dragNode)
                    {
                        drgevent.Effect = DragDropEffects.None;
                    }
                    tmpNode = tmpNode.Parent;
                }
            }
            catch (Exception e)
            {
                ACSLog.InsertLog(MessageBoxIcon.Error, e);
            }
        }
Exemple #9
0
        private void treeView1_DragOver(object sender, DragEventArgs e)
        {
            // Compute drag position and move image
            Point formP = this.PointToClient(new Point(e.X, e.Y));

            DragHelper.ImageList_DragMove(formP.X - this.treeView1.Left, formP.Y - this.treeView1.Top);

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

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

            e.Effect = DragDropEffects.Move;

            // if mouse is on a new node select it
            if (this.tempDropNode != dropNode)
            {
                DragHelper.ImageList_DragShowNolock(false);
                this.treeView1.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 == this.dragNode)
                {
                    e.Effect = DragDropEffects.None;
                }
                tmpNode = tmpNode.Parent;
            }
        }
            /// <summary>
            /// Gets called when the mouse moves with a dragged item.
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void _DragOver(object sender, DragEventArgs e)
            {
                var treeView = sender as TreeView;

                if (treeView == null || treeView != this._treeView)
                {
                    return;
                }

                var currentScreenPoint = new Drawing.Point(e.X, e.Y);

                // Compute drag position and move image
                var form = treeView.FindForm();

                if (form == null)
                {
                    DragHelper.ImageList_DragShowNolock(false);
                }
                else
                {
                    var tvP   = treeView.GetLocationOnForm();
                    var formP = form.PointToClient(currentScreenPoint);
                    formP.Offset(-tvP.X, -tvP.Y);
                    DragHelper.ImageList_DragMove(formP.X, formP.Y);
                }

                var hoveredNode = treeView.GetNodeAt(treeView.PointToClient(currentScreenPoint));

                if (hoveredNode == null)
                {
                    return;
                }

                var draggedNode = this._draggedNode;

                #region If hoveredNode is a child of the dragged node then cancel
                if (hoveredNode.IsChildOf(draggedNode))
                {
                    this.NodeMap = string.Empty;
                    return;
                }
                #endregion

                // A bit long, but to summarize, process the following code only if the nodeover is null
                // and either the nodeover is not the same thing as nodemoving UNLESSS nodeover happens
                // to be the last node in the branch (so we can allow drag & drop below a parent branch)
                if (hoveredNode == draggedNode && (hoveredNode.Parent == null || hoveredNode.Index != (hoveredNode.Parent.Nodes.Count - 1)))
                {
                    return;
                }

                var offsetY = treeView.PointToClient(Cursor.Position).Y - hoveredNode.Bounds.Top;

                this._ResetDraw();

                if (!this._IsFolderNode(hoveredNode))
                {
                    #region Standard Node

                    if (offsetY < (hoveredNode.Bounds.Height / 2))
                    {
                        //this.lblDebug.Text = "top";

                        #region Store the placeholder info into a pipe delimited string

                        this.SetNewNodeMap(hoveredNode, false);
                        if (this.SetMapsEqual())
                        {
                            return;
                        }

                        #endregion

                        this._SetAndDraw(PlaceHolderType.LeafTop, hoveredNode);
                    }
                    else
                    {
                        //this.lblDebug.Text = "bottom";

                        #region Allow drag drop to parent branches

                        TreeNode ParentDragDrop = null;
                        // If the node the mouse is over is the last node of the branch we should allow
                        // the ability to drop the "nodemoving" node BELOW the parent node
                        if (hoveredNode.Parent != null && hoveredNode.Index == (hoveredNode.Parent.Nodes.Count - 1))
                        {
                            var XPos = treeView.PointToClient(Cursor.Position).X;
                            if (XPos < hoveredNode.Bounds.Left)
                            {
                                ParentDragDrop = hoveredNode.Parent;

                                var image = ParentDragDrop.GetImage();
                                if (XPos < (ParentDragDrop.Bounds.Left - (image?.Size.Width ?? 0)))
                                {
                                    if (ParentDragDrop.Parent != null)
                                    {
                                        ParentDragDrop = ParentDragDrop.Parent;
                                    }
                                }
                            }
                        }

                        #endregion

                        #region Store the placeholder info into a pipe delimited string

                        // Since we are in a special case here, use the ParentDragDrop node as the current "nodeover"
                        this.SetNewNodeMap(ParentDragDrop ?? hoveredNode, true);
                        if (this.SetMapsEqual())
                        {
                            return;
                        }

                        #endregion

                        this._SetAndDraw(PlaceHolderType.LeafBottom, hoveredNode, ParentDragDrop);
                    }

                    #endregion
                }
                else
                {
                    #region Folder Node

                    if (offsetY < (hoveredNode.Bounds.Height / 3))
                    {
                        //this.lblDebug.Text = "folder top";

                        #region Store the placeholder info into a pipe delimited string

                        this.SetNewNodeMap(hoveredNode, false);
                        if (this.SetMapsEqual())
                        {
                            return;
                        }

                        #endregion
                        this._SetAndDraw(PlaceHolderType.FolderTop, hoveredNode);
                    }
                    else if ((hoveredNode.Parent != null && hoveredNode.Index == 0) && (offsetY > (hoveredNode.Bounds.Height - (hoveredNode.Bounds.Height / 3))))
                    {
                        //this.lblDebug.Text = "folder bottom";

                        #region Store the placeholder info into a pipe delimited string

                        this.SetNewNodeMap(hoveredNode, true);
                        if (this.SetMapsEqual())
                        {
                            return;
                        }

                        #endregion

                        this._SetAndDraw(PlaceHolderType.FolderTop, hoveredNode);
                    }
                    else
                    {
                        //this.lblDebug.Text = "folder over";

                        if (hoveredNode.Nodes.Count > 0)
                        {
                            DragHelper.ImageList_DragShowNolock(false);
                            hoveredNode.Expand();

                            this._SetAndDraw(PlaceHolderType.AddToFolder, hoveredNode);
                        }
                        else
                        {
                            #region Prevent the node from being dragged onto itself

                            if (draggedNode == hoveredNode)
                            {
                                return;
                            }

                            #endregion

                            #region If hoveredNode is a child then cancel
                            if (hoveredNode.IsChildOf(draggedNode))
                            {
                                this.NodeMap = string.Empty;
                                return;
                            }
                            #endregion

                            #region Store the placeholder info into a pipe delimited string

                            this.SetNewNodeMap(hoveredNode, false);
                            this.NewNodeMap = this.NewNodeMap.Insert(this.NewNodeMap.Length, _NODEMAP_DELIMITER + "0");

                            if (this.SetMapsEqual())
                            {
                                return;
                            }

                            #endregion

                            this._SetAndDraw(PlaceHolderType.AddToFolder, hoveredNode);
                        }
                    }

                    #endregion
                }
            }