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; } }
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; }
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(); } }
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); } }
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 } }