/// <summary> /// Insertion d'une page <see cref="TabDockerPage"/> pour héberger un contrôle client. /// </summary> /// <remarks> /// La gestion de l'image n'est prise en charge que si le contrôle <see cref="TabDocker"/> /// est associé à une liste d'images via la propriété <see cref="ImageList"/>. /// <br/> /// Si l'image est déterminée par un index ou par une clé, l'image doit déjà figurer dans la liste d'images <see cref="ImageList"/>. /// Si l'image est directement fournie (type <see cref="Image"/>), elle sera automatiquement ajoutée à la liste d'images <see cref="ImageList"/>. /// <br/> /// L'argument <paramref name="page"/> permet de fournir une page personnalisée pour héberger le client. /// Cette page doit être une sous-classe de la classe <see cref="TabDockerPage"/>. /// </remarks> /// <param name="page">page destinée à héberger le client</param> /// <param name="client">contrôle client à héberger</param> /// <param name="text">libellé de l'onglet</param> /// <param name="imageOrIndexOrKey">image ou index d'image ou clé d'image à associer à l'onglet</param> /// <param name="select">si true, sélectionne la page créée</param> /// <returns>la page créée pour héberger le contrôle client</returns> public TabDockerPage ClientAdd( TabDockerPage page, Control client, string text, object imageOrIndexOrKey, bool select ) { if ( page == null ) throw new ArgumentNullException( "ClientAdd : la référence sur la page d'hébergement est null", "page" ); return DoAddClient( page, -1, client, text, imageOrIndexOrKey, select ); }
/// <summary> /// Ajoute une page après la dernière page. /// </summary> /// <param name="page">page à ajouter</param> /// <param name="select">si true, sélectionne la page ajoutée</param> /// <returns>la page insérée (valeur de l'argument page)</returns> public TabDockerPage PageAdd( TabDockerPage page, bool select ) { return DoPageInsert( -1, page, select ); }
/// <summary> /// Insère une page après la page actuellement sélectionnée. /// </summary> /// <remarks> /// Permet de contourner le fonctionnement incorrect de <see cref="TabControl.TabPageCollection.Insert(int,TabPage)"/>. /// </remarks> /// <param name="page">page à insérer</param> /// <param name="select">si true, sélectionne la page insérée</param> /// <returns>la page insérée (valeur de l'argument page)</returns> public TabDockerPage PageInsert( TabDockerPage page, bool select ) { return DoPageInsert( SelectedIndex + 1, page, select ); }
/// <summary> /// Insère une page à la position index. /// </summary> /// <remarks> /// Permet de contourner le fonctionnement incorrect de <see cref="TabControl.TabPageCollection.Insert(int,TabPage)"/>. /// </remarks> /// <param name="index">index d'insertion de la page</param> /// <param name="page">page à insérer</param> /// <param name="select">si true, sélectionne la page insérée</param> /// <returns>la page insérée (valeur de l'argument page)</returns> public TabDockerPage PageInsert( int index, TabDockerPage page, bool select ) { return DoPageInsert( index, page, select ); }
/// <summary> /// Adjonction d'un contrôle à docker /// </summary> /// <param name="page">page à ajouter</param> /// <param name="tabIndex">position d'insertion de l'onglet</param> /// <param name="client">contrôle à docker</param> /// <param name="text">libellé de l'onglet</param> /// <param name="imageOrIndexOrKey">image ou index d'image ou clé d'image associée à l'onglet</param> /// <param name="select">si true, sélectionne la page créée</param> /// <returns>la référence sur la page créée</returns> private TabDockerPage DoAddClient( TabDockerPage page, int tabIndex, Control client, string text, object imageOrIndexOrKey, bool select ) { // préparer la nouvelle page page.Text = text; page.Client = client; client.Dock = DockStyle.Fill; // insérer la nouvelle page DoPageInsert( tabIndex, page, select ); // gestion de l'image if ( imageOrIndexOrKey != null ) { if ( imageOrIndexOrKey is Image ) { if ( ImageList != null ) { ImageList.Images.Add( imageOrIndexOrKey as Image ); page.ImageIndex = ImageList.Images.Count - 1; } } else if ( imageOrIndexOrKey is Icon ) { if ( ImageList != null ) { ImageList.Images.Add( imageOrIndexOrKey as Icon ); page.ImageIndex = ImageList.Images.Count - 1; } } else if ( imageOrIndexOrKey is string ) { string imageKey = imageOrIndexOrKey as string; if ( !string.IsNullOrEmpty( imageKey ) ) page.ImageKey = imageKey; } else { int imageIndex = -1; try { imageIndex = (int) imageOrIndexOrKey; } catch ( Exception x ) { throw new ArgumentException( "L'argument doit être de type Image, Icon, string ou int", "imageOrIndexOrKey", x ); } if ( imageIndex != -1 ) page.ImageIndex = imageIndex; } } // donner le focus au client si nécessaire if ( select && AutoFocusClient ) page.ActivatePage(); // retourner la page créée return page; }
/// <summary> /// Insère la page à la position spécifiée par index /// </summary> /// <remarks> /// Cette méthode est requise parce que le composant <see cref="TabControl"/> n'assume pas correctement /// cette fonctionnalité : les différentes méthodes Insert de TabPageCollection ne fonctionnent pas /// correctement lorsque le contrôleur de pages n'est pas visible. /// <br/> /// Cette méthode aura en outre pour effet de déclencher les deux événements <see cref="TabControl.Selected"/> /// et <see cref="TabControl.SelectedIndexChanged"/> lors de l'adjonction d'un onglet quand la collection des onglets /// est vide : aucun de ces deux événements n'est déclenché par le composant <see cref="TabControl"/>. /// </remarks> /// <param name="index">position d'insertion</param> /// <param name="page">page à insérer</param> /// <param name="select">si true, sélectionne la page insérée</param> /// <returns>la référence sur la page insérée</returns> protected TabDockerPage DoPageInsert( int index, TabDockerPage page, bool select ) { // validation de la page if ( page == null ) throw new ArgumentNullException( "page", "La référence sur la page à ajouter ou à insérer ne peut être null" ); // Insertion en fin : simplement ajouter la page if ( TabCount == 0 || index < 0 || index >= TabCount ) { TabPages.Add( page ); if ( select ) SelectedDockerTab = page; //if ( TabCount == 1 ) DoFireSelectEvents(); // déclencher Selected et SelectedIndexChanged // cf. OnControlAdded (30 11 2010) return page; } // mémoriser l'onglet sélectionné TabPage selected = SelectedTab; // nouvelles pages TabPage[] pages = new TabPage[ TabPages.Count + 1 ]; // récupérer les pages figurant avant la position d'insertion for ( int ix = 0 ; ix < index ; ix++ ) pages[ ix ] = TabPages[ ix ]; // placer la nouvelle page pages[ index ] = page; // récupérer les pages figurant après la position d'insertion for ( int ix = index ; ix < TabPages.Count ; ix++ ) pages[ ix + 1 ] = TabPages[ ix ]; // remplacer les pages TabPages.Clear(); TabPages.AddRange( pages ); // restaurer ou modifier la sélection SelectedTab = select ? page : selected; // retourner la page elle-même return page; }