public virtual bool DragElement(TreeViewItem targetItem, Rect targetItemRect, bool firstItem)
{
DropPosition below;
TreeViewItem parent;
if (targetItem == null)
{
if (this.m_DropData != null)
{
this.m_DropData.dropTargetControlID = 0;
this.m_DropData.rowMarkerControlID = 0;
}
bool perform = Event.current.type == EventType.DragPerform;
DragAndDrop.visualMode = this.DoDrag(null, null, perform, DropPosition.Below);
if ((DragAndDrop.visualMode != DragAndDropVisualMode.None) && perform)
{
this.FinalizeDragPerformed(true);
}
return false;
}
Vector2 mousePosition = Event.current.mousePosition;
bool flag2 = this.m_TreeView.data.CanBeParent(targetItem);
Rect rect = targetItemRect;
float betweenHalfHeight = !flag2 ? (targetItemRect.height * 0.5f) : this.m_TreeView.gui.halfDropBetweenHeight;
if (firstItem)
{
rect.yMin -= betweenHalfHeight;
}
rect.yMax += betweenHalfHeight;
if (!rect.Contains(mousePosition))
{
return false;
}
if (!flag2 || (mousePosition.y >= (targetItemRect.yMax - betweenHalfHeight)))
{
below = DropPosition.Below;
}
else if (!flag2 || (firstItem && (mousePosition.y <= (targetItemRect.yMin + betweenHalfHeight))))
{
below = DropPosition.Above;
}
else
{
below = DropPosition.Upon;
}
if (this.m_TreeView.data.IsExpanded(targetItem) && targetItem.hasChildren)
{
parent = targetItem;
}
else
{
parent = targetItem.parent;
}
DragAndDropVisualMode none = DragAndDropVisualMode.None;
if (Event.current.type == EventType.DragPerform)
{
if (below == DropPosition.Upon)
{
none = this.DoDrag(targetItem, targetItem, true, below);
}
if ((none == DragAndDropVisualMode.None) && (parent != null))
{
none = this.DoDrag(parent, targetItem, true, below);
}
if (none != DragAndDropVisualMode.None)
{
this.FinalizeDragPerformed(false);
}
else
{
this.DragCleanup(true);
this.m_TreeView.NotifyListenersThatDragEnded(null, false);
}
}
else
{
if (this.m_DropData == null)
{
this.m_DropData = new DropData();
}
this.m_DropData.dropTargetControlID = 0;
this.m_DropData.rowMarkerControlID = 0;
int itemControlID = TreeView.GetItemControlID(targetItem);
this.HandleAutoExpansion(itemControlID, targetItem, targetItemRect, betweenHalfHeight, mousePosition);
if (below == DropPosition.Upon)
{
none = this.DoDrag(targetItem, targetItem, false, below);
}
if (none != DragAndDropVisualMode.None)
{
this.m_DropData.dropTargetControlID = itemControlID;
DragAndDrop.visualMode = none;
}
else if ((targetItem != null) && (parent != null))
{
none = this.DoDrag(parent, targetItem, false, below);
if (none != DragAndDropVisualMode.None)
{
this.drawRowMarkerAbove = below == DropPosition.Above;
this.m_DropData.rowMarkerControlID = itemControlID;
this.m_DropData.dropTargetControlID = !this.drawRowMarkerAbove ? TreeView.GetItemControlID(parent) : 0;
DragAndDrop.visualMode = none;
}
}
}
Event.current.Use();
return true;
}