using System; using System.Drawing; using System.Windows.Forms; namespace WorkflowConfigurator.UserControls { public class DraggableTabControl : TabControl { public bool TabOrderChanged = false; private TabPage predraggedTab; public DraggableTabControl() { this.AllowDrop = false; } protected override void OnMouseDown(MouseEventArgs e) { predraggedTab = getPointedTab(); base.OnMouseDown(e); } protected override void OnMouseUp(MouseEventArgs e) { predraggedTab = null; base.OnMouseUp(e); } protected override void OnMouseMove(MouseEventArgs e) { if (e.Button == MouseButtons.Left && predraggedTab != null) this.DoDragDrop(predraggedTab, DragDropEffects.Move); base.OnMouseMove(e); } protected override void OnDragOver(DragEventArgs drgevent) { TabPage draggedTab = (TabPage)drgevent.Data.GetData(typeof(TabPage)); TabPage pointedTab = getPointedTab(); if (draggedTab == predraggedTab && pointedTab != null) { drgevent.Effect = DragDropEffects.Move; if (pointedTab != draggedTab) { swapTabPages(draggedTab, pointedTab); } } base.OnDragOver(drgevent); } private TabPage getPointedTab() { for (int i = 0; i < this.TabPages.Count; i++) { if (this.GetTabRect(i).Contains(this.PointToClient(Cursor.Position))) return this.TabPages[i]; } return null; } private void swapTabPages(TabPage src, TabPage dst) { int srci = this.TabPages.IndexOf(src); int dsti = this.TabPages.IndexOf(dst); this.TabPages[dsti] = src; this.TabPages[srci] = dst; if (this.SelectedIndex == srci) { this.SelectedIndex = dsti; } else if (this.SelectedIndex == dsti) { this.SelectedIndex = srci; } TabOrderChanged = true; this.Refresh(); } } }