Index: Core/Common/src/Core.Common.Controls.TreeView/DragDropHandler.cs =================================================================== diff -u -r688579f00220a59473f60b78f10253633743b853 -r46a14ec1ad945f15590e3362d8fe47498110e10d --- Core/Common/src/Core.Common.Controls.TreeView/DragDropHandler.cs (.../DragDropHandler.cs) (revision 688579f00220a59473f60b78f10253633743b853) +++ Core/Common/src/Core.Common.Controls.TreeView/DragDropHandler.cs (.../DragDropHandler.cs) (revision 46a14ec1ad945f15590e3362d8fe47498110e10d) @@ -49,23 +49,17 @@ { ClearPlaceHolders(treeView); - Point point = treeView.PointToClient(new Point(e.X, e.Y)); + var point = treeView.PointToClient(new Point(e.X, e.Y)); var nodeOver = treeView.GetNodeAt(point); + var draggedNode = (TreeNode) e.Data.GetData(typeof(TreeNode)); - var nodeDragging = e.Data.GetData(typeof(TreeNode)) as TreeNode; - - if (nodeOver == null || nodeDragging == null) + if (nodeOver == null) { - if (nodeOver != null) - { - e.Effect = DragDropEffects.All; - } - return; } // Handle dragged items which were originally higher up in the tree under the same parent (all indices shift by one) - if (e.Effect.Equals(DragDropEffects.Move) && nodeDragging.Parent == nodeDropTarget && nodeOver.Index > nodeDragging.Index && dropAtLocation > 0) + if (e.Effect.Equals(DragDropEffects.Move) && draggedNode.Parent == nodeDropTarget && nodeOver.Index > draggedNode.Index && dropAtLocation > 0) { dropAtLocation--; } @@ -77,31 +71,31 @@ } var treeNodeInfo = getTreeNodeInfoForData(nodeDropTarget.Tag); - var previousParentNode = nodeDragging.Parent; + var formerParentNode = draggedNode.Parent; - previousParentNode.Nodes.Remove(nodeDragging); - nodeDropTarget.Nodes.Insert(dropAtLocation, nodeDragging); + // Move the tree node + formerParentNode.Nodes.Remove(draggedNode); + nodeDropTarget.Nodes.Insert(dropAtLocation, draggedNode); // Ensure the dragged node is visible afterwards - nodeDragging.EnsureVisible(); + draggedNode.EnsureVisible(); // Restore any lost selection - treeView.SelectedNode = nodeDragging; + treeView.SelectedNode = draggedNode; if (treeNodeInfo.OnDrop != null) { - treeNodeInfo.OnDrop(nodeDragging.Tag, nodeDragging.Parent.Tag, previousParentNode.Tag, dropAtLocation, treeViewControl); + treeNodeInfo.OnDrop(draggedNode.Tag, draggedNode.Parent.Tag, formerParentNode.Tag, dropAtLocation, treeViewControl); } } /// /// This method handles the event for a . /// /// The of the . - /// The sender of the event. /// The arguments of the event. /// A function for obtaining the object corresponding to a provided data object. - public void HandleDragOver(FormsTreeView treeView, object sender, DragEventArgs e, Func getTreeNodeInfoForData) + public void HandleDragOver(FormsTreeView treeView, DragEventArgs e, Func getTreeNodeInfoForData) { if (lastDragOverPoint.X == e.X && lastDragOverPoint.Y == e.Y) { @@ -112,30 +106,30 @@ var point = treeView.PointToClient(lastDragOverPoint); var nodeOver = treeView.GetNodeAt(point); - var nodeDragging = e.Data.GetData(typeof(TreeNode)) as TreeNode; + var draggedNode = (TreeNode) e.Data.GetData(typeof(TreeNode)); - if (nodeOver == null || nodeDragging == null || nodeOver == nodeDragging || IsChildOf(nodeOver, nodeDragging)) + if (nodeOver == null || nodeOver == draggedNode || IsChildOf(nodeOver, draggedNode)) { ClearPlaceHolders(treeView); return; } - ScrollIntoView(point, nodeOver, sender); + ScrollIntoView(point, nodeOver, treeView); - PlaceholderLocation placeholderLocation = GetPlaceHoldersLocation(treeView, nodeDragging, nodeOver, e, getTreeNodeInfoForData); + var placeholderLocation = GetPlaceHoldersLocation(treeView, draggedNode, nodeOver, e, getTreeNodeInfoForData); - if (null == nodeDropTarget) + if (nodeDropTarget == null) { return; } var treeNodeInfo = getTreeNodeInfoForData(nodeDropTarget.Tag); - var canDrop = treeNodeInfo.CanDrop != null && treeNodeInfo.CanDrop(nodeDragging.Tag, nodeDropTarget.Tag); + var canDrop = treeNodeInfo.CanDrop != null && treeNodeInfo.CanDrop(draggedNode.Tag, nodeDropTarget.Tag); e.Effect = canDrop ? DragDropEffects.Move : DragDropEffects.None; - if (PlaceholderLocation.None == placeholderLocation) + if (placeholderLocation == PlaceholderLocation.None) { return; } @@ -160,26 +154,20 @@ /// A function for obtaining the object corresponding to a provided data object. public void HandleItemDrag(FormsTreeView treeView, ItemDragEventArgs e, Func getTreeNodeInfoForData) { - // gather allowed effects for the current item. - var sourceNode = (TreeNode) e.Item; - var treeNodeInfo = getTreeNodeInfoForData(sourceNode.Tag); - var parentTag = sourceNode.Parent != null ? sourceNode.Parent.Tag : null; + var draggedNode = (TreeNode) e.Item; + var treeNodeInfo = getTreeNodeInfoForData(draggedNode.Tag); + var parentTag = draggedNode.Parent != null ? draggedNode.Parent.Tag : null; - var canDrag = treeNodeInfo.CanDrag != null && treeNodeInfo.CanDrag(sourceNode.Tag, parentTag); + var canDrag = treeNodeInfo.CanDrag != null && treeNodeInfo.CanDrag(draggedNode.Tag, parentTag); if (!canDrag) { return; } - // store both treenode and tag of treenode in dataobject - // to be dragged. - IDataObject dataObject = new DataObject(); - dataObject.SetData(typeof(TreeNode), sourceNode); + // Provide the drag drop operation with a data object containing the dragged tree node + var dataObject = new DataObject(); - if (sourceNode.Tag != null) - { - dataObject.SetData(sourceNode.Tag.GetType(), sourceNode.Tag); - } + dataObject.SetData(typeof(TreeNode), draggedNode); treeView.DoDragDrop(dataObject, DragDropEffects.Move); } @@ -193,20 +181,20 @@ ClearPlaceHolders(treeView); } - private void DrawPlaceholder(FormsTreeView treeView, TreeNode node, PlaceholderLocation location) + private void DrawPlaceholder(FormsTreeView treeView, TreeNode node, PlaceholderLocation placeHolderLocation) { - if (lastPlaceholderNode == node && lastPlaceholderLocation == location) + if (lastPlaceholderNode == node && lastPlaceholderLocation == placeHolderLocation) { return; } ClearPlaceHolders(treeView); lastPlaceholderNode = node; - lastPlaceholderLocation = location; + lastPlaceholderLocation = placeHolderLocation; placeHolderGraphics = treeView.CreateGraphics(); - node.DrawPlaceHolder(location, treeView.CreateGraphics()); + node.DrawPlaceHolder(placeHolderLocation, treeView.CreateGraphics()); } private void ClearPlaceHolders(FormsTreeView treeView) @@ -222,7 +210,7 @@ } } - private bool IsChildOf(TreeNode childNode, TreeNode node) + private static bool IsChildOf(TreeNode childNode, TreeNode node) { while (childNode != null && childNode.Parent != null) { @@ -237,23 +225,20 @@ return false; } - private static void ScrollIntoView(Point point, TreeNode nodeOver, object sender) + private static void ScrollIntoView(Point point, TreeNode nodeOver, FormsTreeView treeView) { - var treeView = sender as FormsTreeView; - if (treeView == null) - { - return; - } int delta = treeView.Height - point.Y; - if ((delta < treeView.Height/2) && (delta > 0)) + + if (delta < treeView.Height/2 && delta > 0) { var nextVisibleNode = nodeOver.NextVisibleNode; if (nextVisibleNode != null) { nextVisibleNode.EnsureVisible(); } } - if ((delta > treeView.Height/2) && (delta < treeView.Height)) + + if (delta > treeView.Height/2 && delta < treeView.Height) { var previousVisibleNode = nodeOver.PrevVisibleNode; if (previousVisibleNode != null) @@ -265,7 +250,7 @@ private PlaceholderLocation GetPlaceHoldersLocation(FormsTreeView treeView, TreeNode nodeDragging, TreeNode nodeOver, DragEventArgs e, Func getTreeNodeInfoForData) { - var loc = PlaceholderLocation.None; + var placeholderLocation = PlaceholderLocation.None; int offsetY = treeView.PointToClient(Cursor.Position).Y - nodeOver.Bounds.Top; if (offsetY < nodeOver.Bounds.Height/3 && nodeDragging.NextNode != nodeOver) @@ -277,56 +262,59 @@ { nodeDropTarget = nodeOver.Parent; dropAtLocation = nodeOver.Parent == null ? 0 : nodeOver.Parent.Nodes.IndexOf(nodeOver); - loc = PlaceholderLocation.Top; + placeholderLocation = PlaceholderLocation.Top; } else { nodeDropTarget = nodeOver; dropAtLocation = 0; - loc = PlaceholderLocation.Middle; + placeholderLocation = PlaceholderLocation.Middle; } } else { nodeDropTarget = nodeOver; dropAtLocation = 0; - loc = PlaceholderLocation.Middle; + placeholderLocation = PlaceholderLocation.Middle; } } - else if ((nodeOver.Parent != null) && (offsetY > nodeOver.Bounds.Height - nodeOver.Bounds.Height/3) && - nodeDragging.PrevNode != nodeOver) + else if (nodeOver.Parent != null + && offsetY > nodeOver.Bounds.Height - nodeOver.Bounds.Height/3 + && nodeDragging.PrevNode != nodeOver) { var treeNodeInfo = getTreeNodeInfoForData(nodeOver.Parent.Tag); if (treeNodeInfo.CanInsert != null && treeNodeInfo.CanInsert(nodeDragging.Tag, nodeOver.Tag)) { nodeDropTarget = nodeOver.Parent; - dropAtLocation = nodeOver.Parent == null - ? 0 - : nodeOver.Parent.Nodes.IndexOf(nodeOver) + 1; - loc = PlaceholderLocation.Bottom; + dropAtLocation = nodeOver.Parent != null + ? nodeOver.Parent.Nodes.IndexOf(nodeOver) + 1 + : 0; + placeholderLocation = PlaceholderLocation.Bottom; } else { nodeDropTarget = nodeOver; dropAtLocation = 0; - loc = PlaceholderLocation.Middle; + placeholderLocation = PlaceholderLocation.Middle; } } - else if (nodeDragging != nodeOver && offsetY < nodeOver.Bounds.Height - nodeOver.Bounds.Height/4 + else if (nodeDragging != nodeOver + && offsetY < nodeOver.Bounds.Height - nodeOver.Bounds.Height/4 && offsetY > nodeOver.Bounds.Height/4) { nodeDropTarget = nodeOver; dropAtLocation = 0; - loc = PlaceholderLocation.Middle; + placeholderLocation = PlaceholderLocation.Middle; } - if (loc == PlaceholderLocation.None || - (loc == PlaceholderLocation.Middle && nodeDropTarget == nodeDragging.Parent)) + if (placeholderLocation == PlaceholderLocation.None + || (placeholderLocation == PlaceholderLocation.Middle && nodeDropTarget == nodeDragging.Parent)) { ClearPlaceHolders(treeView); e.Effect = DragDropEffects.None; } - return loc; + + return placeholderLocation; } } } \ No newline at end of file Index: Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs =================================================================== diff -u -re2e9b8f56864fad784b080c62dfb0145e0c0d4b3 -r46a14ec1ad945f15590e3362d8fe47498110e10d --- Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision e2e9b8f56864fad784b080c62dfb0145e0c0d4b3) +++ Core/Common/src/Core.Common.Controls.TreeView/TreeViewControl.cs (.../TreeViewControl.cs) (revision 46a14ec1ad945f15590e3362d8fe47498110e10d) @@ -753,7 +753,7 @@ private void TreeViewDragOver(object sender, DragEventArgs e) { - dragDropHandler.HandleDragOver(treeView, sender, e, GetTreeNodeInfoForData); + dragDropHandler.HandleDragOver(treeView, e, GetTreeNodeInfoForData); } private void TreeViewItemDrag(object sender, ItemDragEventArgs e)