using System.Drawing;
using System.Windows.Forms;
namespace Developpez.Dotnet.Windows.Forms
{
///
/// Un TabControl dont les onglets peuvent être réordonnés en les glissant avec la souris
///
public class TabControlEx : TabControl
{
///
/// Redéfinit la propriété
/// Renvoie toujours true
///
public override bool AllowDrop
{
get { return true; }
set { }
}
private bool _dragging;
///
/// Redéfinit la méthode
///
/// Paramètres de l'évènement
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (!_dragging)
{
if (e.Button == MouseButtons.Left)
{
int idx = GetTabIndexAtPosition(e.X, e.Y);
if (idx >= 0)
{
_dragging = true;
this.DoDragDrop(idx, DragDropEffects.Move);
return;
}
}
}
_dragging = false;
}
///
/// Redéfinit la méthode
///
/// Paramètres de l'évènement
protected override void OnDragEnter(DragEventArgs e)
{
base.OnDragEnter(e);
if (e.Data.GetDataPresent(typeof(int)))
e.Effect = DragDropEffects.Move;
}
///
/// Redéfinit la méthode
///
/// Paramètres de l'évènement
protected override void OnDragDrop(DragEventArgs e)
{
base.OnDragDrop(e);
int idxOld;
if (e.Data.GetDataPresent(typeof(int)))
idxOld = (int)e.Data.GetData(typeof(int));
else
return;
Point pos = this.PointToClient(new Point(e.X, e.Y));
int idxNew = GetNewTabIndexForPosition(pos.X, pos.Y);
if (idxNew < 0)
idxNew = this.TabCount;
if (idxNew == idxOld)
return;
TabPage tp = this.TabPages[idxOld];
this.TabPages.Remove(tp);
if (idxOld < idxNew)
idxNew--;
this.TabPages.Insert(idxNew, tp);
this.SelectedTab = tp;
}
private int GetTabIndexAtPosition(int x, int y)
{
for (int i = 0; i < this.TabCount; i++)
{
Rectangle rect = this.GetTabRect(i);
if (rect.Contains(x, y))
{
return i;
}
}
return -1;
}
private int GetNewTabIndexForPosition(int x, int y)
{
int idx = GetTabIndexAtPosition(x, y);
Rectangle rect = this.GetTabRect(idx);
if (x < rect.Left + rect.Width / 2)
return idx;
return idx + 1;
}
}
}