package org.freehep.util.parameterdatabase.selector; import java.util.Iterator; import javax.swing.JComboBox; /** * This provides a class which allows the user to choose between a small number * of different choices. Instances of this class and subclasses should be * immutable. This is intended to work within a table context. For everything to * work correctly, the subclasses must provide a constructor which takes an * Object as an argument and one which takes a String as an argument. The String * constructor must work with the Strings produced from the getTag() method. * * For some of the utility routines to work, the iterator over all of the * possible selector values must be provided. The initialization of the * underlying data structure and the filling with possible values should be done * in a static context. */ abstract public class Selector { /** * The internal value giving the selected state. */ private Object value; /** * The internal value giving the tag of the selected state. */ private String tag; /** * This protected constructor unconditionally creates a Selector with the * given value. This is necessary for subclasses which wish to create * statically a list of all possible Selectors of a particular class. */ protected Selector(String tag, Object value) { this.tag = tag; this.value = value; } /** * This constructor will create a Selector with the given value. Subclasses * must provide a constructor with this signature. */ public Selector(Object value) { Selector selector = getSelectorFromValue(value); if (selector != null) { this.value = selector.value; this.tag = selector.tag; } else { String message = "illegal value: " + value.toString(); throw new IllegalArgumentException(message); } } /** * This constructor will create a Selector from the given tag. Subclasses * must provide a constructor with this signature. */ public Selector(String tag) { Selector selector = getSelectorFromTag(tag); if (selector != null) { this.value = selector.value; this.tag = selector.tag; } else { String message = "illegal tag: " + tag; throw new IllegalArgumentException(message); } } /** * Return a Selector object which corresponds to the given value. */ protected Selector getSelectorFromValue(Object value) { for (Iterator i = iterator(); i.hasNext();) { Selector selector = (Selector) i.next(); try { if (selector.getValue().equals(value)) return selector; } catch (ClassCastException e) { // If the equality throws an exception, then simply treat this // as being not equal. } } return null; } /** * Return a Selector object which corresponds to the given tag. */ protected Selector getSelectorFromTag(String tag) { for (Iterator i = iterator(); i.hasNext();) { Selector selector = (Selector) i.next(); if (selector.getTag().equals(tag)) return selector; } return null; } /** * This returns an iterator over all of the possible Selector objects of * this class. */ abstract public Iterator iterator(); /** * This returns the associated tag for this Selector. */ public String getTag() { return tag; } /** * This returns the value associated with this Selector as an Object. */ public Object getValue() { return value; } /** * This returns the value associated with this Selector as an int. This will * throw a ClassCastException if the underlying value is not an Integer. */ public int getIntValue() { return ((Integer) value).intValue(); } /** * This returns the value associated with this Selector as a double. This * will throw a ClassCastException if the underlying value is not an Double. */ public double getDoubleValue() { return ((Double) value).doubleValue(); } /** * This returns the value associated with this Selector as a boolean. This * will throw a ClassCastException if the underlying value is not a Boolean. */ public boolean getBooleanValue() { return ((Boolean) value).booleanValue(); } /** * Return the tag associated with this selector's value. */ public String toString() { return getTag(); } /** * Initialize a JComboBox with all of the possible values. */ public void initialize(JComboBox comboBox) { comboBox.removeAllItems(); for (Iterator i = iterator(); i.hasNext();) { comboBox.addItem(i.next()); } comboBox.setSelectedItem(getSelectorFromValue(value)); } /** * For equality, the two objects must have the same class and the same * underlying value (compared with equals()). */ public boolean equals(Object obj) { if (obj == null || getClass() != obj.getClass()) { return false; } else { Selector selector = (Selector) obj; return value.equals(selector.value); } } /** * The hashcode for this object is the one from the underlying value. */ public int hashCode() { return value.hashCode(); } }