/// <summary>
        /// Handler for dock widget drag event.
        /// </summary>
        /// <param name="eventData">Pointer data.</param>
        /// <param name="dragCorners">Cached drag corners.</param>
        public void ProcessDockWidgetDrag(PointerEventData eventData, Vector3[] dragCorners)
        {
            DebugEx.VerboseFormat("DockingGroupScript.ProcessDockWidgetDrag(eventData = {0}, dragCorners = {1})", eventData, dragCorners);

            float x = Mouse.scaledX - dragCorners[0].x;

            DragInfoHolder.dockingArea = mParent;

            #region Insert dummy dock widget if absent
            if (
                DummyDockWidgetScript.instance == null
                ||
                DummyDockWidgetScript.instance.parent != this
                )
            {
                DummyDockWidgetScript.Create(DragInfoHolder.dockWidget).
                InsertToDockingGroup(this, 0);
            }
            #endregion

            int dummyIndex = -1;

            #region Find dummy dock widget position
            float contentWidth = 0f;

            int index = 0;

            for (int i = 0; i < mChildren.Count; ++i)
            {
                if (mChildren[i] == DummyDockWidgetScript.instance)
                {
                    dummyIndex = i;
                }
                else
                {
                    RectTransform tabTransform = mTabsTransform.GetChild(i) as RectTransform;

                    float tabWidth = tabTransform.sizeDelta.x;

                    if (
                        x >= contentWidth
                        &&
                        x <= contentWidth + tabWidth
                        )
                    {
                        if (x <= contentWidth + tabWidth / 2)
                        {
                            index = i;
                        }
                        else
                        {
                            index = i + 1;
                        }
                    }

                    contentWidth += tabWidth;
                }
            }

            if (x >= contentWidth)
            {
                index = mChildren.Count;
            }

            if (dummyIndex < index)
            {
                --index;
            }

            dummyIndex = index;
            #endregion

            InsertDockWidget(DummyDockWidgetScript.instance, dummyIndex);

            int dockWidgetIndex = -1;

            #region Place tabs where it should be
            contentWidth = 0f;

            for (int i = 0; i < mChildren.Count; ++i)
            {
                if (mChildren[i] == DragInfoHolder.dockWidget)
                {
                    dockWidgetIndex = i;
                }
                else
                {
                    RectTransform tabTransform = mTabsTransform.GetChild(i) as RectTransform;

                    float tabWidth = tabTransform.sizeDelta.x;

                    if (i == dummyIndex)
                    {
                        Utils.AlignRectTransformStretchLeft(tabTransform, tabWidth, x - tabWidth * 0.3f, 0f, -1f);
                    }
                    else
                    {
                        Utils.AlignRectTransformStretchLeft(tabTransform, tabWidth, contentWidth, 0f, -1f);
                    }

                    contentWidth += tabWidth;
                }
            }
            #endregion

            if (dockWidgetIndex >= 0)
            {
                RectTransform tabTransform      = mTabsTransform.GetChild(dockWidgetIndex) as RectTransform;
                RectTransform dummyTabTransform = mTabsTransform.GetChild(dummyIndex)      as RectTransform;

                tabTransform.offsetMin = dummyTabTransform.offsetMin;
                tabTransform.offsetMax = dummyTabTransform.offsetMax;
            }
        }