package ste.pendu.wordeditor;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import javax.swing.JPanel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.AbstractListModel;
import java.awt.GridLayout;

/**
 * Liste des mots.
 * 
 * 
 */
public class JListBean extends JPanel
{

  /**
   * Le modèle pour afficher les données dans la liste.
   */
  private JListModel model = null;

  /**
   * La vue du bean.
   */
  private JList list = null;

  /**
   * Modèle de la liste.
   */
  private class JListModel extends AbstractListModel
                                   implements PropertyChangeListener
  {
    private WordListModel wlModel = null;

    private int size=0;

    public JListModel()
    {}

    public void setWordListModel(WordListModel wlModel)
    {
      this.wlModel=wlModel;
      if (this.wlModel != null)
        {
          this.wlModel.addPropertyChangeListener(this);
        }
    }

    public WordListModel getWordListModel()
    {
      return this.wlModel;
    }

    public Object getElementAt(int index)
    {
      Object o = null;
      if (this.wlModel != null)
        {
          o=this.wlModel.getWord(index);
        }
      return o;
    }

    public int getSize()
    {
      return this.size;
    }
    
    public void propertyChange(PropertyChangeEvent evt)
    {
      int newSize=this.wlModel.getWordListSize();
      if (newSize!=this.size)
        {
          super.fireContentsChanged(this.wlModel, this.size, newSize);
        }
      this.size=newSize;
    }
    
  }

  public JListBean(WordListModel wlModel)
  {
    super(new GridLayout());
    
    this.model = new JListModel();
    this.model.setWordListModel(wlModel);
    this.list = new JList(this.model);
    this.add(new JScrollPane(list));
  }

  /**
   * Retourne l'index sélectionné; -1 si aucun item n'est sélectionné.
   * 
   * @return l'index sélectionné; -1 si aucun n'est sélectionné
   */
  public int getSelectedIndex()
  {
    return this.list.getSelectedIndex();
  }

  /**
   * Retourne un tableau des indexes sélectionnés.
   * 
   * @return un tableau d'indices
   */
  public int[] getSelectedIndices()
  {
    return this.list.getSelectedIndices();
  }

  /**
   * Retourne le mot sélectionné, ou null s'il n'y en a aucun
   * sélectionné.
   * 
   * @return le mot sélectionné
   */
  public Object getSelectedValue()
  {
    return this.list.getSelectedValue();
  }

  /**
   * Retourne un tableau des mots sélectionnés.
   * 
   * @return un tableau des mots sélectionnés
   */
  public Object[] getSelectedValues()
  {
    return this.list.getSelectedValues();
  }

  /**
   * Donne l'état de la sélection.
   * 
   * @return <code>true</code> si rien n'est sélectionné
   */
  public boolean isSelectionEmpty()
  {
    return this.list.isSelectionEmpty();
  }

}
