Sous-sections
La boîte à outils fournit les mécanismes de base pour créer simplement de nouveaux dispositifs
d'interaction à partir de la classe abstraite DMaggLiteGenericInteraction. Bien qu'il puisse
être nécessaire de connaître certaines bases de la programmation avec ICON pour construire des
dispositifs complexes (en particulier la création de slots et la lecture de leurs valeurs), le
squelette de dispositif de haut-niveau que nous proposons permet de s'en affranchir en grande
partie. En effet, nous avons regroupé les mécanismes bas-niveau communs aux dispositifs
d'interaction de MAGGLITE au niveau de la classe abstraite afin de permettre au programmeur de ne
développer que les actions spécifiques à l'interaction qu'il veut réaliser.
Nous présenterons deux exemples: la conception du dispositif de Glisser-Déposer (Drag) et
celle du dispositif des Responsive Handles.
D.2.1 Conception du dispositif de Glisser-Déposer
Tout d'abord, rappelons le principe de l'interaction de Glisser-Déposer. Elle consiste à:
- sélectionner un objet,
- initier l'action,
- déplacer l'objet,
- terminer l'action.
Figure D.2:
Dispositif de Glisser-Déposer.
|
Pour réaliser cette interaction dans le paradigme des graphes d'interaction, et donc avec un
dispositif générique d'interaction, il va falloir tout d'abord spécifier les objets auxquels peut
s'appliquer l'interaction et construire un dispositif recevant par ses slots d'entrée (voir figure
D.2): les objets sélectionnés (le slot id, la sélection des objets est confiée au
dispositif pick), des valeurs numériques de position (slots p.x et p.y) et une
commande d'utilisation (slot useD.2).
À chaque itération de la machine réactive, il faudra donc, à partir des valeurs reçues en entrée,
effectuer les actions correspondantes aux étapes précédemment citées.
La classe abstraite DMaggLiteGenericInteraction fournit ces slots d'entrée et maintient à jour
les sélections et vérifications de compatibilité des objets ainsi que les commandes d'utilisation de
l'interaction à chaque pas de la machine réactive. Elle propose alors des méthodes de plus
haut-niveau permettant de réaliser les actions sur les objets graphiques. Le code Java
D.2.1 présente (en partie) l'implémentation du dispositif de Glisser-déposer à partir de
cette classe.
Dans un premier temps, les variables de classe accepted et excluded permettent de
définir les classes d'objets graphiques compatibles avec l'interaction. Elles sont retournées par
l'implémentation des méthodes getAcceptedTypes() et getExcludedTypes()D.3, lignes 25 et 30. Ces méthodes permettent à la super classe
de trier les objets sélectionnés reçus, assurant que les objets passés en paramètre des méthodes
d'action seront compatibles avec l'interaction. Pour notre dispositif de Drag, les classes
compatibles doivent implémenter les interfaces MaggLiteMoveable et
MaggLiteDraggable.
Ensuite, les méthodes openTasks et closeTasks sont appelées lors de l'ouverture et de
la fermeture du dispositif. Elles permettent de réaliser des actions spécifiques à l'interaction
à ces moments précis (initialisation du dispositif à l'ouverture ou annulation des actions en cours
à la fermeture).
Enfin, les méthodes d'action permettent d'implémenter le cœur de l'interaction. Elles sont
invoquées par l'algorithme principal de la classe abstraite, à chaque pas et pour chaque objet
graphique compatible, selon les cas suivants:
- alwaysProcess(): à chaque pas, quelles que soient les valeurs des entrées du dispositif;
- enteredProximity(MaggLite ml, boolean fromShape): entrée dans la proximité de
l'objet compatible ml. La variable booléenne fromShape permet de savoir si l'entrée
s'est faite par l'intérieur de l'objet ou par l'extérieur;
- movedProximity(MaggLite ml): déplacement dans la proximité de l'objet ml;
- boolean exitedProximity(MaggLite ml, boolean toShape): sortie de la proximité de
l'objet compatible ml. La variable booléenne toShape permet de savoir si la sortie
se fait en direction de l'objet ou vers l'extérieur. La valeur booléenne de retour permet de
signifier à l'algorithme principal si l'interaction doit continuer malgré la sortie;
- entered(MaggLite ml, boolean fromProximity): entrée dans l'objet compatible ml. La
variable booléenne fromProximity permet de savoir si l'entrée s'est faite par la proximité
de l'objet;
- moved(MaggLite ml): déplacement à l'intérieur de l'objet compatible ml;
- boolean exited(MaggLite ml, boolean toProximity): sortie de l'objet compatible
ml. La variable booléenne toProximity permet de savoir si la sortie se fait vers la
proximité de l'objet. La valeur booléenne de retour permet de signifier à l'algorithme principal
si l'interaction doit continuer malgré la sortie.
Pour notre exemple du Drag, les méthodes d'action dans la proximité des objets ne réalisent
aucune action. Seules les méthodes d'action dans l'objet sont utilisées. Les commentaires dans le
listing D.2.1 détaillent brièvement les actions réalisées. Notons simplement l'appel des
méthodes isInUse() et getPos() définies dans la classe abstraite. Elle permettent de
savoir si le dispositif est en cours d'utilisation (ordre reçu par le slot use) et les
positions reçues (slots x et y).
D.2.2 Exemple des Responsive Handles
L'implémentation des Responsive Handles utilise quand à elle les actions de proximité pour
créer une poignée, la déplacer ou la supprimer (voir le code Java D.2.2). Cette
implémentation est relativement simple par rapport la réalisation éventuelle de cette nouvelle
interaction avec une boîte à outil standard. De plus, elle est générique, pouvant être utilisée avec
de nombreuses classes d'objets graphiques. Il nous a fallu réaliser:
- une nouvelle classe d'objets graphique, les poignées: MaggLiteHandle;
- un nouveau dispositif d'interaction: DMaggLiteHandle;
Nous ne présenterons ici que le code du dispositif, sans détailler celui du composant de retour
graphique (MaggLiteHandle):
Ce dispositif s'applique aux objets qui implémentent les interfaces
MaggLiteMoveable, MaggLiteSized et MaggLiteShaped. En effet, il est nécessaire
que les objets puissent être déplacés, redimensionnés et qu'ils aient une forme définie. Par contre,
en sont évidemment exclus les objets de la classe MaggLiteHandle, les instruments de
l'interaction.
Les actions de l'interaction sont réalisées dans les méthodes de proximité: création et association
d'une poignée à un objet graphique lors de l'entrée, déplacement de la poignée associée lors d'un
mouvement dans la proximité (suivi du pointeur) et suppression de la poignée lors de la sortie de la
proximité.
Enfin, les actions réalisées spécifiquement par la poignée sur l'objet graphique (déplacement,
redimensionnement et rotation) sont réalisée directement dans l'implémentation de la poignée,
elle-même manipulée à l'aide du dispositif de Glisser-Déposer.
stuf
2005-09-06