tbf/WorkflowConfigurator/UserControls/DraggableTabControl.cs

89 lines
2.3 KiB
C#
Raw Permalink Normal View History

2022-01-06 14:41:50 +00:00
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();
}
}
}