Composant GANTT C# Compétences à mettre en œuvre C4.1.6.1 Mettre en place et exploiter un environnement de développement C4.1.6.2 Mettre en place et exploiter un environnement de test C4.1.7.1 Développer les éléments d une solution C4.1.7.2 Créer un composant logiciel C4.1.7.3 Analyser et modifier le code d un composant logiciel C4.2.1.3 Concevoir les mises à jour à effectuer C4.2.1.4 Réaliser les mises à jour C4.2.2.1 Repérer les évolutions des composants utilisés et leurs conséquences C4.2.2.2 Concevoir les mises à jour à effectuer C4.2.2.3 Élaborer et réaliser les tests unitaires des composants mis à jour C5.2.1.1 Évaluer le degré de conformité des pratiques à un référentiel, à une norme ou à un standard adopté par le prestataire informatique C5.2.1.2 Identifier et partager les bonnes pratiques à intégrer C5.2.4.1 Se documenter à propos d une technologie, d un composant, d un outil ou d une méthode C5.2.4.2 Identifier le potentiel et les limites d'une technologie, d un composant, d un outil ou d une méthode par rapport à un service à produire SLAM 2 - Page 1
CONTEXTE et DEMANDE Le but est de pouvoir disposer d un composant capable de gérer un diagramme de Gantt. Le composant pourra, par exemple, être utilisé dans un contexte d une SSII qui souhaite planifier les différentes interventions de ses informaticiens sur ses différents projets. Une interface de saisie est prévue. Elle sera composée d un diagramme de GANTT par projet (il a été décidé de commencer avec 2 projets à planifier). L application devra être capable de vérifier qu il y a pas d incohérence dans la planification (un même intervenant qui intervient à la même date sur les deux projets). Compte tenu de ces besoins, une première analyse a permis de déterminer que le composant doit permettre de : - Définir la durée maximum du projet ; - Saisir la liste des intervenants : pour chaque intervenant, on devra gérer son nom et son prénom ainsi qu une couleur distinctive ; - Saisir la liste des tâches à accomplir : pour chaque tâche, on devra gérer sa désignation ainsi que sa durée prévue et sa durée restante (durée non encore planifiée) ; - Affecter les intervenants aux tâches via un simple clic ou double clic sur la liste des intervenants ; - Dans un premier temps, le composant sera basé sur des unités temporelles simplement numérotées de 1 à n ; - Le composant devra exposer des listes typées : la liste des intervenants et la liste des tâches à réaliser. Le composant à créer sera basé sur une DataGridView. Phase 1 : environnement Afin de mettre en place correctement l environnement de développement, vous devrez créer une solution avec : - Un projet de type Bibliothèque de Classes nommé Gantt ; - Un Contrôle Uilisateur nommé LeDiagramme inclus dans ce projet ; Le composant doit régulièrement être testé dans un projet de type Windows Form par exemple. Afin d optimiser le développement, ce projet de test sera inclus dans la solution : - Ajouter à la solution un projet de test, de type Windows Form, nommé TestComposant ; - Définissez ce projet comme projet de démarrage ; - Renommer le formulaire de test en FormTest.vb ; - Changer son entête en «Test du composant». Le composant va se composer de plusieurs éléments : - Le code du composant lui-même, - Une classe nommée Intervenant, - Une classe nommée Tache, SLAM 2 - Page 2
Vous devez donc créer : - Une classe nommée Intervenant, stockée dans un fichier de même nom ; - Une classe nommée Tache, stockée dans un fichier de même nom ; - Un diagramme de classes permettant de visualiser l ensemble des classes. A ce stade, vous devriez donc avoir : Phase 2 : la classe Intervenant Elle va permettre de gérer les différents intervenants sur le projet. Pour chaque intervenant, on ne gère que leur nom et leur prénom. Le diagramme de GANTT étant un outil de représentation, chaque intervenant devra être associé à une couleur choisie parmi les couleurs standardisées de Windows. Cette classe ne présente aucune difficulté, on pourra donc utiliser le concept de propriété pour permettre l accès aux trois éléments privés cités. Il est également demandé de créer une propriété publique en lecture seule qui permet de récupérer les initiales de l intervenant sous la forme Initiale du prénom suivie de l Initiale du nom. Vous devriez obtenir, à la fin de cette phase : SLAM 2 - Page 3
Phase 3 : la classe Tache Cette classe va permettre de gérer les différentes tâches du projet. Chaque tâche est liée à une désignation et à une durée de planifiée. Il est préférable de gérer également la durée non encore répartie entre les différents intervenants. Par défaut, lors de l instanciation d une tâche, cette durée est initialisée à la durée de la tâche. On définira 3 propriétés publiques pour accéder aisément à ces attributs privés : - DescriptionTache : valorise et retourne la désignation de la tâche ; - DureeTache : valorise et retourne la durée de la tâche ; - ResteTache : retourne la durée restante (la durée non encore planifiée) de la tâche. Cette propriété est en lecture seule. Il est également demandé de gérer les méthodes publiques suivantes : - Fonction booléenne Enlever (entier) qui enlève des unités de temps à la durée de la tâche. Cette fonction retourne faux si une erreur est apparue, vrai sinon. - Fonction booléenne FinDePlanification() : retourne vrai si la tâche est entièrement répartie ; - Fonction booléenne AucunePlanification() : retourne vrai si la tâche n a pas commencé à être planifiée. Vous devriez obtenir, à la fin de cette phase : SLAM 2 - Page 4
Phase 4 : Dessinons le composant Si vous regardez l interface graphique DiagrammeDeGantt.vb, vous aurez un écran qui vous semble vide : En réalité, ce que vous obtenez, correspond à l espace utilisé par votre composant dans le Windows Form dans lequel il sera utilisé. Il convient donc de calculer au plus juste la taille de votre contrôle. Notre composant sera basé sur un DataGridView. - Placez un contrôle de ce type dans votre composant, et nommé «dg» le DataGridView que vous avez placé. Afin de simplifier les traitements à venir, il faut ajuster les bords de votre composant avec les bords du Data GridView. Ainsi, il faut éviter : dg Espace du composant Vous devriez plutôt obtenir : SLAM 2 - Page 5
Quand un programmeur utilisera ce composant, il sera amené à le redimensionner à sa guise. Afin de lier le DataGridView au bord du composant, modifiez la propriété Anchor du DataGridView. Phase 5 : Générons et utilisons le composant Le composant est désormais, graphiquement, créé. Nous devons le générer afin de pouvoir l utiliser et le tester dans notre formulaire de test. La génération d un composant est une génération de bibliothèques de classes que vous connaissez. - Générer la bibliothèque nommée MonComposant. Le composant doit pouvoir être utilisé dans notre projet de test. - La boîte à outil contient, de manière automatique, le nouveau composant.net que vous êtes en train de créer. Vous devriez obtenir : Pour manipuler le composant, il suffit de le manipuler comme tout autre composant et d utiliser le glisserdéplacer sur le formulaire. - Poser un composant «LeDiagramme» sur votre interface et répondez aux questions suivantes : o Comment se nomme le composant dans votre interface? o Voyez-vous le nom «dg» quelque part dans la liste des propriétés? o Avez-vous possibilités d ajouter des lignes ou des colonnes dans votre composant? - Renommer le composant en «Planning1». Phase 6 : Premiers pas dans la programmation du composant Compte tenu de ce que vous avez observé dans la phase précédente, notre composant n expose aucune méthode. Il faut donc que notre composant expose des méthodes qui permettent d agir sur le DataGridView qui le compose. SLAM 2 - Page 6
Dans un premier temps, notre contrôle doit se baser sur un ensemble de Tâches et d Intervenants qui vont devoir accomplir ses tâches. Dans notre composant, nous allons donc utiliser deux listes privées typées : private List<Intervenant> LesIntervenants = new List<Intervenant>(); private List<Tache> LesTaches = new List<Tache>(); Ainsi qu un entier permettant de gérer le nombre d unité de temps maximum du projet Gantt : private int dureeprojet = 0 Ces données étant privées, il faut utiliser des propriétés pour permettre leur manipulation par l utilisateur du composant. - Ecrire les 2 propriétés publiques permettant de gérer les accès à ces propriétés privées. Vous nommerez ces propriétés : o ToutesLesTâches pour gérer LesTâches (propriété en lecture seule) o TousLesIntervenants pour gérer Intervenants - Créer une méthode AjouterUneTache. Cette méthode ajouter une tâche passée en paramètre à la LIST des tâches. Cette méthode commence à construire le DataGridView en ajoutant des colonnes en fonction de la durée de la tâche à ajouter. Ainsi, si la tâche a une durée de 3, la méthode ajoute 3 colonnes à dg (voir la propriété Colums de dg pour réaliser ce traitement). - Créer une méthode AjouterUnIntervenant qui ajoute un intervenant passé en paramètre à la LIST des intervenants. - Générer le composant ; - Utiliser l évènement Form_Load du formulaire de test afin de créer le planning suivant : Tâche T1, durée 4 Tâche T2, durée 2 Tâche T3, durée 3 Intervenants : Delphine BOCQ en Color.Purple Frédéric BAURAND, en Color.Red Rui ALVES, en Color.Green Geoffray JUILLARD, en Color.Orange Olivier THEVENIN en Color.Silver - Tester la syntaxe de votre code et le bon chargement. - Examiner votre composant en mode réel : il doit se composer de 3 lignes et de 9 colonnes. Phase 7 : Paramètres du DataGridView Il faut maintenant remplir le DataGridView avec les informations contenues dans les différentes listes typées. SLAM 2 - Page 7
- Modifier la méthode AjouterTâche pour qu elle remplisse l entête de la ligne avec le nom de la tâche et qu elle renseigne les entêtes de colonnes avec l unité de temps. - Modifier le constructeur du composant afin qu il créée 2 colonnes qui présentent la durée de la tâche et sa durée restante. Vous devriez obtenir : Phase 8 : Affectation des ressources à chaque tâche Dans cette phase, nous allons affecter les ressources (les intervenants) aux différentes tâches. De nombreuses solutions sont envisageables. Parmi ces possibilités, voici celle qui est retenue : - L utilisateur du composant sélectionne des cases à affecter dans le diagramme de GANTT ; - Il utilise le clic DROIT de la souris pour faire apparaître la liste des intervenants ; - Les intervenants apparaissent sur fond clair et dans la couleur qui les représente ; - Il utilise le clic sur la liste pour sélectionner son intervenant ; - La liste des intervenants s occulte, les initiales de l intervenant ainsi que la couleur qui le représente apparaissent dans les cases sélectionnées. - Vous devriez obtenir : Et si on clique sur Delphine Bocq, on aura : SLAM 2 - Page 8
- Pour réaliser cela, il suffit d ajouter un composant de type ContextMenuStrip au composant. Ce composant sera enrichi par les noms des intervenants lors de l ajout des intervenants au composant. - Un clic droit sur la sélection des cellules dans dg fait apparaitre le menu contextuel (utiliser Cursor.Position pour leur faire apparaître au bon endroit!). - Un click sur un item du menu contextuel placera les initiales de l intervenant sélectionné dans la grille. Cela décrémentera également la durée restante de la tâche à l aide de la méthode appropriée. Vous devriez avoir : Phase 9 : finalisations Voici quelques pistes pour aller plus loin dans le développement de ce composant : - Contrôle sur la durée de la tâche : quand on place un intervenant sur une tâche, il serait bon de contrôler que la durée qui lui est affecté ne dépasse pas la durée totale de la tâche, compte tenu des précédentes affectations. - Le composant utilise une unité de temps non précisé. Il serait bon de pouvoir choisir cette unité. - Il est possible d étendre le composant en lui permettant d exposer des évènements, comme le fait qu une tâche soit totalement affectée ou que toutes les tâches soient planifiées. - Il serait intéressant que le composant puisse retourner un tableau à deux dimensions ou une collection permettant de connaître les dates d interventions des intervenants, et la tâche sur laquelle ils interviennent. - Si l utilisateur du composant se trompe, il faut qu il recommence toute sa planification. Il serait bon de pouvoir annuler une affectation. - Il serait sympathique de changer l icône représentative du composant. SLAM 2 - Page 9