/// <summary> /// This event is fired when the user drags over a drag and drop control with the mouse. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void fileSystemTreeView_DragOver(object sender, DragEventArgs e) { //Console.WriteLine("dragover"); // Compute drag position and move image Point position = this.fileSystemTreeView.PointToClient(new Point(e.X, e.Y)); DragHelper.ImageList_DragMove(position.X - this.fileSystemTreeView.Left, position.Y - this.fileSystemTreeView.Top); // Get actual drop node TreeNode dropNode = this.fileSystemTreeView.GetNodeAt(position); if (dropNode == null) { e.Effect = DragDropEffects.None; return; } //if ((e.KeyState & 8) == 8) //ctrl - copy //{ // ShowToolTip(position.X, position.Y, "Copy to "); //} //else //{ // ShowToolTip(position.X, position.Y, "Move to "); //} e.Effect = DragDropEffects.Move; // if mouse is on a new node select it if (this.tempDropNode != dropNode) { DragHelper.ImageList_DragShowNolock(false); this.fileSystemTreeView.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> /// This event is fired when the user releases the mouse over the drop target. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void fileSystemTreeView_DragDrop(object sender, DragEventArgs e) { // Unlock updates DragHelper.ImageList_DragLeave(this.fileSystemTreeView.Handle); Console.WriteLine("drag: {0}", dragNode.Text); Point position = this.fileSystemTreeView.PointToClient(new Point(e.X, e.Y)); TreeNode dropNode = this.fileSystemTreeView.GetNodeAt(position); Console.WriteLine("drop: {0}", dropNode.Text); if (this.dragNode != dropNode) { // node is a drive if (this.dragNode.Parent == null) { } // node is a folder else { try { Directory.Move(this.dragNode.FullPath.Replace(@"\\", @"\"), dropNode.FullPath.Replace(@"\\", @"\") + @"\" + this.dragNode.Text); if (this.dragNode.Parent.Nodes.Count == 1) { this.dragNode.Parent.ImageIndex = 0; this.dragNode.Parent.SelectedImageIndex = 0; this.dragNode.Parent.StateImageIndex = 0; } } catch (IOException ex) { } //if ((e.KeyState & 8) == 8) //ctrl - copy //{ // Directory.Copy() //} //else //{ // Directory.Move() //} } } this.dragNode = null; this.scrollTimer.Enabled = false; //this.tooltip.Hide(this.fileSystemTreeView); }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void scrollTimer_Tick(object sender, EventArgs e) { // get node at mouse position Point pt = this.fileSystemTreeView.PointToClient(Control.MousePosition); TreeNode node = this.fileSystemTreeView.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.fileSystemTreeView.Refresh(); // show drag image DragHelper.ImageList_DragShowNolock(true); } } // if mouse is near to the bottom, scroll down else if (pt.Y > this.fileSystemTreeView.Size.Height - 30) { if (node.NextVisibleNode != null) { node = node.NextVisibleNode; DragHelper.ImageList_DragShowNolock(false); node.EnsureVisible(); this.fileSystemTreeView.Refresh(); DragHelper.ImageList_DragShowNolock(true); } } }
//private ImageList imageListDrag = new ImageList(); /// <summary> /// This event is fired as soon as a drag operation is started. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void fileSystemTreeView_ItemDrag(object sender, ItemDragEventArgs e) { this.dragNode = (TreeNode)e.Item; this.fileSystemTreeView.SelectedNode = this.dragNode; Console.WriteLine("dragnode: {0}", this.dragNode.Text); Bitmap bmp = new Bitmap(32, 32); Graphics gfx = Graphics.FromImage(bmp); gfx.DrawImage(this.fileSystemTreeView.ImageList.Images[0], 0, 0); Point p = this.fileSystemTreeView.PointToClient(Control.MousePosition); int dx = p.X + this.fileSystemTreeView.Indent - this.dragNode.Bounds.Left - this.fileSystemTreeView.Location.X; int dy = p.Y - this.dragNode.Bounds.Top - this.fileSystemTreeView.Location.Y; if (DragHelper.ImageList_BeginDrag(this.fileSystemTreeView.ImageList.Handle, 0, dx, dy)) { // Begin dragging this.fileSystemTreeView.DoDragDrop(bmp, DragDropEffects.Move); // End dragging image DragHelper.ImageList_EndDrag(); } }
/// <summary> /// This event is fired when the user leaves the control with the mouse while dragging an element. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void fileSystemTreeView_DragLeave(object sender, EventArgs e) { Console.WriteLine("dragleave"); DragHelper.ImageList_DragLeave(this.fileSystemTreeView.Handle); this.scrollTimer.Enabled = false; }
/// <summary> /// This event is fired when the user moves the mouse onto the control while dragging an element. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void fileSystemTreeView_DragEnter(object sender, DragEventArgs e) { Console.WriteLine("dragenter"); DragHelper.ImageList_DragEnter(this.fileSystemTreeView.Handle, e.X - this.fileSystemTreeView.Left, e.Y - this.fileSystemTreeView.Top); this.scrollTimer.Enabled = true; }