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; } } }