//
    // Déclenchement centralisé des événements
    //

    /// <summary>
    /// Déclenchement centralisé de l'événement <see cref="DragStart"/>
    /// </summary>
    /// <param name="e">descripteur de l'événement</param>
    protected virtual void OnDragStart( DragStartEventArgs e ) {
      if ( DragStart != null ) DragStart( this, e );
    }
    /// <summary>
    /// Démarre une opération glisser-déplacer 
    /// </summary>
    /// <param name="e">descripteur de l'événement souris</param>
    /// <remarks>l'opération effectuée par la cible</remarks>
    /// <returns>l'effet réalisé par la cible du drop</returns>
    protected virtual DragDropEffects DoDragDrop( MouseEventArgs e ) {
      DragDropEffects result = DragDropEffects.None;

      try {
        if ( DesignMode ) return result;

        // construire l'objet transitionnel du drag-drop
        IDataObject dataObject = new DataObject();

        // si prise en charge du drag-drop des onglets, déterminer l'index de l'onglet à glisser
        if ( autoDragTabs ) {
          int draggedIndex = TabIndexFromLocation( dragWatcher.Location );
          if ( draggedIndex < 0 || draggedIndex >= TabCount ) throw new ArgumentOutOfRangeException( "dragTabIndex", draggedIndex, "Impossible de démarrer le drag-drop automatique d'onglet" );
          dataObject.SetData( AutoDragTabFormat, draggedIndex );
        }

        // noter que le dragging commence
        dragWatcher.DragStart();

        // diffuser l'événement DragStart
        DragStartEventArgs args = new DragStartEventArgs( DragDropEffects.Scroll, dataObject, dragWatcher.Button, dragWatcher.Location, false );
        OnDragStart( args );
        if ( args.Cancel || args.AllowedEffects == DragDropEffects.None ) return result;

        // effectuer le protocole drag-drop
        result = DoDragDrop( dataObject, args.AllowedEffects );

        // terminer le protocole drag-drop côté source
        if ( result != DragDropEffects.None ) OnDragTerminate( new DragEventArgs( dataObject, 0, 0, 0, args.AllowedEffects, result ) );
 
      } finally { dragWatcher.DragTerminate(); }
      return result;
    }