Introduction à SwingStates
Première machine à états sur un canvas

L'objectif de cet exercice est d'utiliser le widget canvas et une machine à états de la librairie SwingStates pour créer un bouton (pour en savoir plus sur SwingStates, consulter cette page).

Récupérer le fichier SimpleButton.java. Ce fichier crée un canvas et un objet SimpleButton destiné à encapsuler les éléments visuels et le comportement du bouton. Pour le moment, seul le texte du bouton est dessiné sur le canvas (à l'aide d'un objet CText) et aucun comportement ne lui est associé.
Créer un rectangle autour du texte du bouton. En jouant sur l'ordre d'affichage et sur la hiérarchie entre objets, faire en sorte que le texte soit au-dessus et que le rectangle se déplace avec lui lors de l'appel simple.getShape().translateBy(100,100) de la fonction main.
Ajouter au bouton une machine à états afin de décrire son comportement. Ajouter au rectangle un CExtensionalTag afin de pouvoir réagir aux interactions à la souris sur le bouton. Faire en sorte que le bord du rectangle s'épaississe lorsque la souris le survole et qu'il change de couleur si l'utilisateur enfonce le bouton de la souris au-dessus de lui (voir images ci-dessous). L'action associée au bouton (e.g. doClick) ne devra être déclenchée que si le bouton de la souris a été enfoncé et relâché au-dessus du bouton (voir cette vidéo). Prévoir le cas où le bouton de la souris est relâché en dehors du bouton et celui où le pointeur sort puis entre à nouveau dans le bouton...

A l'aide d'une JFrame et d'un objet StateMachineVisualization, afficher la machine à états créée à l'étape précédente.
Modifier la machine à états en utilisant la méthode armTimer et des transitions TimeOut pour permettre le déclenchement d'actions spécifiques sur un demi-clic (bouton maintenu enfoncé pendant x millisecondes), un clic et demi (un clic suivi d'un demi-clic) et un double-clic.
Faire en sorte que l'on puisse spécifier à la création du SimpleButton le bouton de la souris et le modificateur éventuel qui serviront à déclencher les actions.