protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);

            OnMouseMove(e);

            if (HoverTabIdx != -1)
            {
                if (e.Button == MouseButtons.Left)
                {
                    if (HoverTabIdx == SelectedTabIdx)
                    {
                        if (e.Location.X > Tabs[HoverTabIdx].MinX + Tabs[HoverTabIdx].Width - Tabs[HoverTabIdx].CloseButtonWidth)
                        {
                            RemoveTab(HoverTabIdx);
                        }
                        else
                        {
                            DragState = new TabDragData {
                                Tab = Tabs[SelectedTabIdx], InitialIdx = SelectedTabIdx, MouseX = e.Location.X, RelativeMouseX = e.Location.X - Tabs[SelectedTabIdx].MinX
                            };
                        }
                    }
                    else
                    {
                        if (HoverTabIdx > Tabs.Count - 1)
                        {
                            OnButtonClick(HoverTabIdx - Tabs.Count, e.Location, e.Button);
                        }
                        else if (HoverTabIdx == Tabs.Count - 1)
                        {
                            OnNewTabClick(e.Location, e.Button);
                        }
                        else
                        {
                            SelectTab(HoverTabIdx);
                        }
                    }
                }
                else if (e.Button == MouseButtons.Middle)
                {
                    if (HoverTabIdx < Tabs.Count - 1)
                    {
                        RemoveTab(HoverTabIdx);
                    }
                }
            }

            if (OnTabClicked != null)
            {
                object TabData = (HoverTabIdx == -1)? null : Tabs[HoverTabIdx].Data;
                OnTabClicked(TabData, e.Location, e.Button);
            }
        }
        protected override void OnMouseUp(MouseEventArgs e)
        {
            base.OnMouseUp(e);

            if (DragState != null)
            {
                if (OnTabReorder != null)
                {
                    OnTabReorder();
                }

                DragState = null;

                LayoutTabs();
                Invalidate();
            }
        }