package ste.pendu.wordeditor;

import ste.pendu.wordeditor.WordListModel;
import java.io.IOException;
import java.util.Iterator;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.List;
import java.util.Vector;

/**
 * L'implémentation du modèle.
 */
public abstract class AbstractWordList implements WordListModel
{

  protected PropertyChangeSupport support = new PropertyChangeSupport(this);

  protected List list = null;

  protected String filename = null;

  protected boolean saved = false;

  public static final String WORD = "word";

  public AbstractWordList()
  {
    super();
    this.list = new Vector();
  }

  /**
   * Ajout d'un mot à une position précise.
   * 
   * @param index la position
   * @param mot le mot à ajouter
   */
  public void addWord(int index, String mot)
  {
    this.list.add(index, mot);
    this.saved=false;
    support.firePropertyChange(AbstractWordList.WORD, null, mot);
  }

  /**
   * Ajout d'un mot à la suite.
   * 
   * @param mot le mot à ajouter
   * @return <code>true</code> comme le demande l'API Collection
   * @see java.util.List#add(Object)
   */
  public boolean addWord(String mot)
  {
    boolean rem = this.list.add(mot);
    this.saved=false;
    support.firePropertyChange(AbstractWordList.WORD, null, mot);
    return rem;
  }

  /**
   * Efface tous les mots en mémoire.
   */
  public void clear()
  {
    this.saved=false;
    this.list.clear();
  }

  /**
   * Retourne le nombre de mots.
   * 
   * @return le nombre de mots
   */
  public int getWordListSize()
  {
    return this.list.size();
  }

  /**
   * Retourne un tableau de tous les mots.
   * 
   * @return un tableau contenant tous les mots
   */
  public String[] getWords()
  {
    String[] w = new String[this.getWordListSize()];
    w = (String[])this.list.toArray(w);
    return w;
  }

  /**
   * Retourne le mot à la position indiquée.
   * 
   * @param index la position du mot recherché
   * @return le mot à la position 'index'
   */
  public String getWord(int index)
  {
    return (String)this.list.get(index);
  }

  /**
   * Retourne l'index du mot passé en argument.
   * 
   * @param mot
   * @return l'index du mot recherché
   */
  public int indexOfWord(String mot)
  {
    return this.list.indexOf(mot);
  }

  /**
   * État de sauvegarde des mots.
   * 
   * @return s'il n'y a eu aucune modification depuis la dernière
   * sauvegarde, la valeur retournée est <code>true</code>, mais s'il y
   * a eu une modification, la valeur retournée est <code>false</code>
   */
  public boolean isSaved()
  {
    return this.saved;
  }

  /**
   * Un iterateur sur tous les mots.
   * 
   * @return l'itérateur avec tous les mots
   * @see java.util.Iterator
   */
  public Iterator iterator()
  {
    return this.list.iterator();
  }

  /**
   * Retire le mot à l'index.
   * 
   * @param index index du mot à retirer
   * @return le mot qui a été supprimé
   */
  public String removeWord(int index)
  {
    String s = (String)this.list.remove(index);
    support.firePropertyChange(AbstractWordList.WORD, "XXX", s);
    return s;
  }

  /**
   * Retire le mot.
   * 
   * @param mot le mot à supprimer
   * @return <code>true</code> si le mot a bien été supprimé,
   * <code>false</code> si le mot n'était pas dans la liste
   */
  public boolean removeWord(String mot)
  {
    boolean rem = this.list.remove(mot);
    support.firePropertyChange(AbstractWordList.WORD, "XXX", mot);
    return rem;
  }

  /**
   * Récupère le nom du fichier.
   * 
   * @return le nom du fichier
   */
  public String getFileName()
  {
    return this.filename;
  }

  /**
   * Ajoute un écouteur des changements de propriété.
   * 
   * @param ecouteur l'écouteur des propriétés
   */
  public void addPropertyChangeListener(PropertyChangeListener ecouteur)
  {
    this.support.addPropertyChangeListener(ecouteur);
  }

  /**
   * Ajoute un écouteur des changements de propriété.
   * 
   * @param nom le nom de la propriété à écouter
   * @param ecouteur l'écouteur des propriétés
   */
  public void addPropertyChangeListener(String nom,
                                        PropertyChangeListener ecouteur)
  {
    this.support.addPropertyChangeListener(nom, ecouteur);
  }
  
  /**
   * Retourne les écouteurs de propriété.
   * 
   * @return les écouteurs
   */
  public PropertyChangeListener[] getPropertyChangeListeners()
  {
    return this.support.getPropertyChangeListeners();
  }
  
  /**
   * Retourne les écouteurs telle propriété.
   * 
   * @param nom le nom de la propriété dont on veut récupérer l'écouteur
   * @return les écouteurs
   */
  public PropertyChangeListener[] getPropertyChangeListeners(String nom)
  {
    return this.support.getPropertyChangeListeners(nom);
  }

  /**
   * Supprimer l'écouteur
   * 
   * @param ecouteur l'écouteur à supprimer
   */
  public void removePropertyChangeListener(PropertyChangeListener ecouteur)
  {
    this.support.removePropertyChangeListener(ecouteur);
  }

  /**
   * Supprimer l'écouteur
   * 
   * @param nom nom de la propriété
   * @param ecouteur l'écouteur à supprimer
   */
  public void removePropertyChangeListener(String nom, PropertyChangeListener ecouteur)
  {
    this.support.removePropertyChangeListener(nom, ecouteur);
  }

}
