Pour modéliser ce gestionnaire, nous nous sommes tout d'abord intéressés à la partie système, c'est-à-dire sans prendre en compte l'aspect graphique. Et nous avons alors dégagé quatre classes :
Elle permet à partir du chemin complet du répertoire d'un fichier et de son nom, de connaître toutes les informations disponibles sur un fichier : savoir si c'est un répertoire, sa taille, sa date de dernière modification, son extension ...
Son attribut estSelectionne permet de renseigner si un fichier est selectionné (lors d'un clic de souris).
Ses attributs :
Ses fonctions membres :
Elle permet principalement de stocker un ensemble de fichiers en mémoire afin d'y effectuer des actions systèmes, des opérations ensemblistes (union de deux listes, intersection, ...) ou des tris. Elle peut être obtenue à partir d'un chemin (elle listera alors le contenu de ce répertoire), ou suite à une commande système (par exemple un grep), ou encore après une opération ensembliste sur une ou plusieurs listes.
Ses attributs : cet objet ne contient que des méthodes et aucun attribut. En effet, elle hérite de std::list<Fichier *>.
Ses fonctions membres :
La liste des actions systèmes est stockée dans un fichier avec le format suivant :
Chaque action doit commencer par <ACTION> et se finir par </ACTION> il doit y avoir 4 lignes entre ces deux balises:
De plus, la ligne de commande doit contenir des caractères spéciaux pour spécifier les fichiers qu'elle doit prendre en arguments.
Rôle de la classe :Cette classe représente le moteur interne de gror. C'est elle qui permet d'interpréter et d'exécuter des lignes de commandes paramétrées.
Les actions systèmes sont stockées sur le disque dans le fichier .GrorAction (dans le répertoire de l'utilisateur).
Elles sont chargées en mémoire par la classe ListeActionSyst qui les stock sous forme de liste chainée (c.f. ListeActionSyst).
Ce champ permet de décrire l'action, c'est lui qui est affiché dans la 'comboBox' de sélection d'une action lorsque l'utilisateur désire en lancer une.
Il s'agit de la ligne de commande paramétrée (c.f. plus bas pour le paramétrage de cette ligne de commande). C'est elle qui sera interprétée en fonction des paramètres et de la liste des fichiers sélectionnés puis exécutée avec un appel à la fonction systeme(command) du C.
Ce sont des booléens permettant de contrôler la façon dont l'action va s'exécuter:
-> chemin: signale si le chemin complet doit être utilisé pour lancer l'action ou non (dans ce cas seul les noms de fichier sont utilisés).
-> separate: sert a savoir si l'action doit être lancée plusieurs fois sur chacun des fichiers (un par un) ou une seule fois avec l'ensemble des fichiers. Dans le premier cas, la ligne de commande doit comporter des balises __GROR et GROR__ délimitant les fichiers a "séparer" (c.f. ligne de commande).
-> bloquant: Ce booléen signale si la commande doit être bloquante ou non... Dans certains cas on préfère attendre la fin de l'action dans d'autres, on préfère reprendre la main avant (surtout dans le cas des commandes longues a exécuter). Cependant cette fonctionnalité n'est pas encore prise en compte dans la classe ActionSyst. Pour le moment, toutes les actions sont bloquantes. Cela fait partie des amméliorations a apporter a gror.
La ligne de commande paramétrée est une ligne de commande linux classique comportant en plus des paramètres qui peuvent avoir les formes suivantes :
Quand l'interpréteur de gror rencontre un %i, il le remplace par le ième fichier de la liste des fichiers sélectionnés. Si la liste comporte moins de i fichiers, alors l'action n'est pas lancée et l'utilisateur est prévenu.
Dans l'exemple la commande lancée sera "rm nomDuPremierFichierSélectionné". Ce qui supprime le fichier sélectionné.
Cela ressemble beaucoup au premier cas, la différence est que le %%i sera remplacé par tous les fichiers de la liste des fichiers sélectionnés à partir du ième. Donc %%1 représente tous les fichiers sélectionnés.
L'exemple lance donc "touch" suivit de l'ensemble des fichiers sélectionnés (séparés par un espace). Ce qui aura pour effet de mettre l'heure de ces fichiers à l'heure actuelle du système.
Dans certains cas, l'utilisateur peut vouloir lancer une même action sur une liste de fichiers avec un paramètre changeant, il peut aussi vouloir saisir un nom d'archive par exemple. Pour permettre cela Gror propose ce système de variable: lorsque l'interpréteur de Gror rencontre %? XXXXXX ? il ouvre une boite de dialogue posant la question à l'utilisateur, ce dernier saisit la réponse, alors %? XXXXXX ? est remplacer par la saisie de l'utilisateur.
Ceci correspond au cas 'separate'. Si la partie variable contient k questions, alors k questions seront posées, et k commandes (avec chacune une des réponses) seront lancées. De même si la partie variable contient k fichiers. Cependant on peut conserver une partie fixe (si on désire une seule saisie utilisateur par exemple) en dehors des balises __GROR et GROR__. Dans l'exemple, on va lancer g++ sur chacun des fichiers sélectionnés.
Note: avec ce même schéma, on pourrait ajouter une fonctionnalité __WarnMessage de warningWarn__ pour faire des lignes de commandes plus sécurisées...
Dans ces deux cas des exceptions sont levées, elles sont ensuite récupérées dans la partie graphique affichant un message d'erreur adéquat.
Une classe GrorException a été créée a cet usage.