package ste.pendu.wordeditor;

import java.awt.event.ActionListener;

/**
 * Construction des contrôleurs.
 * 
 * <p>Pour faciliter la construction des contrôleurs, cette classe va
 * construire les contrôleurs. Il s'agira d'une <b>fabrique</b>, c'est à
 * dire qu'elle construit des objets à la demande en fonction de
 * certains paramètres.</p>
 * 
 * 
 */
public class ControlFactory
{
  
  public static final String CONTROL_OUVRIR = "ste.pendu.wordeditor.ControlOuvrir";

  public static final String CONTROL_SAUVER = "ste.pendu.wordeditor.ControlSauver";

  public static final String CONTROL_SAUVER_COMME = "ste.pendu.wordeditor.ControlSauverComme";

  public static final String CONTROL_AJOUTER = "ste.pendu.wordeditor.ControlAjouter";

  public static final String CONTROL_EFFACER = "ste.pendu.wordeditor.ControlEffacer";

  public static final String CONTROL_SUPPRIMER = "ste.pendu.wordeditor.ControlSupprimer";

  public static final String CONTROL_QUITTER = "ste.pendu.wordeditor.ControlQuitter";

  /**
   * Le modèle.
   */
  protected WordListModel model = null;

  /**
   * La vue.
   */
  protected View view = null;

  /**
   * Construction de la fabrique.
   */
  public ControlFactory()
  {}

  /**
   * Construction de la fabrique en passant le modèle et la vue.
   */
  public ControlFactory(WordListModel model, View view)
  {
    this();
    this.model = model;
    this.view = view;
  }
  
  /**
   * Mise à jour du modèle.
   * 
   * @param model le modèle
   */
  public void setWordListModel(WordListModel model)
  {
    this.model = model;
  }

  /**
   * Retourne le modèle.
   * 
   * @return le modèle
   */
  public WordListModel getWordListModel()
  {
    return this.model;
  }

  /**
   * Mise à jour de la vue.
   * 
   * @param view la vue
   */
  public void setView(View view)
  {
    this.view = view;
  }

  /**
   * Retourne la vue.
   * 
   * @return la vue
   */
  public View getView()
  {
    return this.view;
  }

  /**
   * Retourne un contrôleur en fonction du nom de la classe contrôleur.
   * 
   * <p>Attention, il s'agit, à chaque appel de méthode, d'une nouvelle
   * instance du contrôleur! Même si ce sont les mêmes paramètres qui
   * sont passés.</p>
   * 
   * @param controlClassName le nom complet de la classe qui implémente
   * Control et qui va répondre à l'événement que l'on désire. Par
   * exemple, si vous écrivez une classe qui s'appelle
   * ste.pendu.wordeditor.ControlOuvrir, il faudra passer cette chaîne
   * de caractère à la méthode pour obtenir le contrôleur qui permettra
   * d'ouvrir le fichier
   * @return une instance du contrôleur demandé
   * @exception ControlFactoryException si on n'a pas pu créer le
   * Control
   */
  public Control getControl(String controlClassName)
    throws ControlFactoryException
  {
    Control control = null;
    if (this.model == null)
      throw new ControlFactoryException ("Pas de modèle connu.");

    if (this.view == null)
      throw new ControlFactoryException ("Pas de vue connue.");

    if (controlClassName == null)
      throw new ControlFactoryException ("Control null!");

    try
      {
        Object o = Class.forName(controlClassName).newInstance();
        control = (Control)o;
        control.setWordListModel(this.model);
        control.setView(this.view);
      }
    catch(ClassNotFoundException cnfe)
      {
        throw new ControlFactoryException (cnfe.getMessage());
      }
    catch(IllegalAccessException iae)
      {
        throw new ControlFactoryException (iae.getMessage());
      }
    catch(InstantiationException ie)
      {
        throw new ControlFactoryException (ie.getMessage());
      }
    return control;
  }

}
