package ste.pendu.wordeditor;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

/**
 * Interface pour les contrôleurs.
 * 
 * <p>Tous les contrôleurs de l'éditeur des mots doivent implémenter
 * cette interface pour interagir sans problème avec les autres
 * composants du bean.</p>
 * 
 * <p>Comme il s'agit d'une interface, aucune information ne vous est
 * donnée sur le constructeur. En fait, en observant l'interface, vous
 * pouvez deviner quels vont être vos besoins au niveau du
 * constructeur.</p>
 * 
 * <p>Toutes les classes <b>Action</b> (c'est-à-dire les classes qui
 * vont étendre celle-ci), devront connaître le modèle et la vue pour
 * pouvoir manipuler l'un et obtenir ou manipuler l'autre. Vous pouvez
 * donc faire quatre constructeurs (dans la pratique, les deux premiers
 * seront suffisants:</p>
 * 
 * <ul><li>MonControl()</li>
 * <li>MonControl(WordListModel model, View view)</li>
 * <li>MonControl(WordListModel model)</li>
 * <li>MonControl(View view)</li>
 * </ul>
 * 
 * <p>De toutes manières, il y a les méthodes <i>set</i> et <i>get</i>
 * qui vont vous permettre de remettre les valeurs à jour.</p>
 */
public interface Control extends ActionListener
{

  /**
   * Mise à jour du WordListModel.
   * 
   * @param wordListModel le modèle dont va se servir le controleur pour
   * exécuter les demandes de l'utilisateur
   */
  public void setWordListModel(WordListModel wordListModel);

  /**
   * Retourne le WordListModel.
   * 
   * @return le WordListModel actuel
   */
  public WordListModel getWordListModel();

  /**
   * Mise à jour de la vue.
   * 
   * @param view la vue qui sera utilisée pour récupérer les sélections
   * de l'utilisateur, le texte qu'il aurait pu encoder, et effacer le
   * texte (par exemple)
   */
  public void setView(View view);

  /**
   * Retourne la vue.
   * 
   * @return la vue actuelle
   */
  public View getView();

  /**
   * Action à effectuer.
   * 
   * <p>Lorsqu'un bouton a été pressé ou la touche <code>ENTER</code> a
   * été pressée dans un JTextField, et que l'action est à l'écoute,
   * cette méthode est exécutée. On peut récupérer le paramètre pour
   * savoir quel composant a propagé l'événement et les informations
   * qu'il y a enfermées.</p>
   * 
   * @param action l'action transmise par l'événement
   */
  public void actionPerformed(ActionEvent action);

}
