/* SpinnerListModel.java -- A spinner model backed by a list or an array.
   Copyright (C) 2004, 2005  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package javax.swing;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.event.ChangeEvent;

/**
 * An implementation of <code>SpinnerModel</code> which uses the values
 * contained within a list or an array.  The backing list or array is
 * only stored as a reference within the class.  As a result, changes
 * made elsewhere to the members of the list or array are reflected by
 * this model.
 * <p>
 *
 * The model itself inherits a list of <code>ChangeListener</code>s from
 * <code>AbstractSpinnerModel</code>.  As this code is unaware of changes
 * made to the backing list or array, it is the responsibility of the
 * application using the model to invoke <code>fireStateChanged()</code>,
 * in order to notify any <code>ChangeListener</code>s, when the list or array
 * changes.  The model handles notification when the reference itself
 * is changed via <code>setList()</code> or when the current value is
 * set directly using <code>setValue()</code>.
 *
 * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
 * @see SpinnerModel
 * @see AbstractSpinnerModel
 * @see JSpinner
 * @since 1.4
 */

public class SpinnerListModel extends AbstractSpinnerModel
  implements Serializable
{
  /**
   * For compatability with Sun's JDK
   */
  private static final long serialVersionUID = 3358804052191994516L;

  /**
   * The backing list for this model.
   */
  private List list;

  /**
   * The current index in the list.
   */
  private transient int index;

  /**
   * Constructs a default <code>SpinnerListModel</code>.  This
   * is a model backed by a list containing only the single
   * <code>String</code> element, "empty".
   */
  public SpinnerListModel()
  {
    List defaultList;

    // Create an empty list.
    defaultList = new ArrayList();
    // Add the string "empty".
    defaultList.add("empty");
    // Set the list.
    setList(defaultList);
  }

  /**
   * Constructs a <code>SpinnerListModel</code> using the supplied list.
   * The model maintains a reference to this list, and returns
   * consecutive elements in response to calls to <code>getNextValue()</code>.
   * The initial value is that at position 0, so an initial call
   * to <code>getValue()</code> returns the same as <code>list.get(0)</code>.
   *
   * @param list The list to use for this model.
   * 
   * @throws IllegalArgumentException if the list is null or contains no
   *         elements.
   *
   * @see SpinnerListModel#getNextValue()
   * @see SpinnerListModel#getValue()
   */ 
  public SpinnerListModel(List list)
  {
    // Retain a reference to the valid list.
    setList(list);
  }

  /**
   * Constructs a <code>SpinnerListModel</code> using the supplied array.
   * The model stores a reference to the wrapper list returned by
   * <code>Arrays.asList()</code>.  The wrapper list reflects modifications
   * in the underlying array, so these changes will also be reflected
   * by the model.  The model produces consecutive elements from the array
   * in response to calls to <code>getNextValue()</code>.  The initial
   * value returned by <code>getValue()</code> is the same as
   * <code>array[0]</code>.
   *
   * @param array The array to use for this model.
   *
   * @throws IllegalArgumentException if the array is null or contains
   *         no elements.
   *
   * @see Arrays#asList(Object[])
   * @see SpinnerListModel#getNextValue()
   * @see SpinnerListModel#getValue()
   */
  public SpinnerListModel(Object[] array)
  {
    // Check for a null or zero-sized array.
    if (array == null || array.length == 0)
      {
        throw new IllegalArgumentException("The supplied array was invalid.");
      }

	// Retain a reference to a wrapper around the valid array. 
	// The array, in list form, will be tested again here, but we can't really
	// avoid this -- a null value to Arrays.asList will throw a
    // NullPointerException.
    setList(Arrays.asList(array));
  }

  /**
   * Returns the backing list for this model.
   *
   * @return The backing list.
   */
  public List getList()
  {
    return list;
  }
    
  /**
   * Returns the next value from the list, which is the same as the element
   * stored at the current index + 1.  Null is returned if there are no more
   * values to be returned (the end of the list has been reached).  An
   * ambiguity can occur here, as null may also be returned as a valid list
   * element.  This operation does not change the current value.
   *
   * @return The next value from the list or null.
   */
  public Object getNextValue()
  {
    // Check for a next value.
    if (index < (list.size() - 1))
      // Return the element at the next index.
      return list.get(index + 1);
    else
      // Return null as this is the end of the list.
      return null;
    }

  /**
   * Returns the previous value from the list, which is the same as the element
   * stored at the current index - 1.  Null is returned if there are no more
   * values to be returned (the start of the list has been reached).  An
   * ambiguity can occur here, as null may also be returned as a valid list
   * element.  This operation does not change the current value.
   *
   * @return The previous value from the list or null.
   */
  public Object getPreviousValue()
  {
    // Check for a previous value.
    if (index > 0) 
      // Return the element at the previous position.
      return list.get(index - 1);
	else
      // Return null as this is the start of the list.
      return null;
    }

  /**
   * Returns the current value of the model.  Initially, this will
   * be the element at position 0.  On later invocations, this will
   * be the last element returned by <code>getNextValue()</code>
   * or <code>getPreviousValue()</code>.
   *
   * @return The current value.
   *
   * @see SpinnerListModel#getPreviousValue()
   * @see SpinnerListModel#getNextValue()
   */
  public Object getValue()
  {
    return list.get(index);
  }

  /**
   * Changes the backing list for this model.  The model only stores
   * a reference to the list, so any changes made to the list elsewhere
   * will be reflected in the values returned by the model.  A
   * <code>ChangeEvent</code> is fired if the list being used actually
   * changes (i.e. the new list is not referentially equal (!=) to the
   * old one).
   *
   * @param list The new list to use.
   *
   * @throws IllegalArgumentException if the list is null or contains
   *         no elements.
   *
   * @see ChangeEvent
   */
  public void setList(List list)
  {
    // Check for null or zero size list.
    if (list == null || list.size() == 0)
      throw new IllegalArgumentException("The supplied list was invalid.");

    // Check for a change of referenced list.
    if (this.list != list)
      {
        // Store the new list.
        this.list = list;
        // Notify listeners of a change.
        fireStateChanged();
      }
    // We reset the other values in either case.
    // Set the index to 0.
    index = 0;
  }

  /**
   * Sets the current value of the model to be the one supplied.
   * The value must exist within the backing list in order for
   * the change to take place.  Otherwise, an exception is thrown.
   * The value used is the first occurrence of the value within
   * the backing list.  Listeners are notified of this change.
   * Following the change, <code>getNextValue()</code> and
   * <code>getPreviousValue()</code> return the objects following
   * and prior to the supplied value, respectively. 
   *
   * @param value The requested new value of the list.
   *
   * @throws IllegalArgumentException if the supplied value does
   *         not exist in the backing list.
   *
   * @see SpinnerListModel#getPreviousValue()
   * @see SpinnerListModel#getNextValue()
   */
  public void setValue(Object value)
  {
    int valueIndex;

    // Search for the value in the list.
    valueIndex = list.indexOf(value);
    // Check for the value being found.
    if (valueIndex == -1)
      throw new IllegalArgumentException("The supplied value does not "
                                         + "exist in this list");
    // Make the indices match.
    index = valueIndex;
    // Notify the listeners.
    fireStateChanged();
  }

}
