Sous-sections

D.2 Les dispositifs d'interactions

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 à:
  1. sélectionner un objet,
  2. initier l'action,
  3. déplacer l'objet,
  4. terminer l'action.

Figure D.2: Dispositif de Glisser-Déposer.
\includegraphics[width=100pt]{drag2}

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.

\begin{figure}\javafile[Structure du code du dispositif \code{Drag} (Glisser-déposer).]{drag}
\end{figure}

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:

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:
  1. une nouvelle classe d'objets graphique, les poignées: MaggLiteHandle;
  2. 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):

\begin{figure}\javafile[Structure du code du dispositif \code{Responsive Handle}.]{handles}
\end{figure}

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