public bool PerformDrop(EditorWindow dropWindow, DropInfo dropInfo, Vector2 screenPos)
{
var extraInfo = dropInfo.userData as ExtraDropInfo;
var rootWindow = extraInfo.rootWindow;
var edge = extraInfo.edge;
var dropIndex = extraInfo.index;
var dropRect = dropInfo.rect;
var beginning = (edge & ViewEdge.Before) != 0;
var wantsVertical = (edge & ViewEdge.FitsVertical) != 0;
SplitView parentForDrop = null;
if (vertical == wantsVertical || children.Length < 2)
{ // Current view can accommodate desired drop
if (!beginning)
{
if (rootWindow)
{
dropIndex = children.Length;
}
else
{
++dropIndex;
}
}
parentForDrop = this;
}
else if (rootWindow)
{ // Docking to a window: need to insert a parent
var newParent = ScriptableObject.CreateInstance <SplitView>();
newParent.position = position;
if (window.rootView == this)
{
window.rootView = newParent;
}
else // Main window has MainView as its root
{
parent.AddChild(newParent, parent.IndexOfChild(this));
}
newParent.AddChild(this);
position = new Rect(Vector2.zero, position.size);
dropIndex = beginning ? 0 : 1;
parentForDrop = newParent;
}
else
{ // Docking in a view: need to insert a child
var newChild = ScriptableObject.CreateInstance <SplitView>();
newChild.AddChild(children[dropIndex]);
AddChild(newChild, dropIndex);
newChild.position = newChild.children[0].position;
newChild.children[0].position = new Rect(Vector2.zero, newChild.position.size);
dropIndex = beginning ? 0 : 1;
parentForDrop = newChild;
}
dropRect.position = dropRect.position - screenPosition.position;
var newDockArea = ScriptableObject.CreateInstance <DockArea>();
parentForDrop.vertical = wantsVertical;
parentForDrop.MakeRoomForRect(dropRect);
parentForDrop.AddChild(newDockArea, dropIndex);
newDockArea.position = dropRect;
DockArea.s_OriginalDragSource.RemoveTab(dropWindow, killIfEmpty: true, sendEvents: false);
dropWindow.m_Parent = newDockArea;
newDockArea.AddTab(dropWindow, sendPaneEvents: false);
Reflow();
RecalcMinMaxAndReflowAll(this);
newDockArea.MakeVistaDWMHappyDance();
return(true);
}