// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.lakewalker;
import java.beans.PropertyChangeListener;
/**
* A property editor class. Wraps an Object value and provides
* methods for saving and restoring the Object from a String. Also
* includes a {@link java.awt.Component} that can be placed into a
* property editing window, allowing the user to change the value
* interactively.
* */
public abstract class Configurer {
// FIXME: maybe parameterize this so that value can have the right type
// in subclasses?
public static final String NAME_PROPERTY = "Configurer.name";
// public static final String VALUE_PROPERTY = "value";
/** A String the uniquely identifies this property */
protected String key;
/** A String that provides a short description of the property to the user */
protected String name;
/** The value */
protected Object value;
protected java.beans.PropertyChangeSupport changeSupport;
/** When noUpdate is true, setting the value programmatically will not
* result in an update of the GUI Component */
protected boolean noUpdate = false;
/** When frozen is true, setting the value programmatically will not
* result in a PropertyChangeEvent being fired */
protected boolean frozen = false;
public Configurer(String key, String name) {
this(key, name, null);
}
public Configurer(String key, String name, Object val) {
this.key = key;
this.name = name;
changeSupport = new java.beans.PropertyChangeSupport(this);
setValue(val);
}
/**
* Unique identifier
*/
public String getKey() {
return key;
}
/**
* Plain English description of the Object
*/
public String getName() {
return name;
}
public void setName(String s) {
String oldName = name;
name = s;
if (!frozen) {
changeSupport.firePropertyChange(NAME_PROPERTY, oldName, name);
}
}
/**
* The Object value
* May be null if the Object has not been initialized
*/
public Object getValue() {
return value;
}
/**
* @return a String representation of the Object value
*/
public abstract String getValueString();
/**
* Set the Object value
*/
public void setValue(Object o) {
Object oldValue = getValue();
value = o;
if (!frozen) {
changeSupport.firePropertyChange(key, oldValue, value);
}
}
/**
* If true, then don't fire PropertyChangeEvents when the value is reset
*/
public void setFrozen(boolean val) {
frozen = val;
}
public boolean isFrozen() {
return frozen;
}
/**
* Fire a PropertyChangeEvent as if the value had been set from null
*/
public void fireUpdate() {
changeSupport.firePropertyChange(key, null, value);
}
/**
* Set the Object value from a String
*/
public abstract void setValue(String s);
/**
* GUI interface for setting the option in an editing window
*/
public abstract java.awt.Component getControls();
/**
* Add a listener to be notified when the Object state changes
*/
public void addPropertyChangeListener(java.beans.PropertyChangeListener l) {
changeSupport.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
changeSupport.removePropertyChangeListener(l);
}
}