package prefuse.data.expression;
import prefuse.data.Tuple;
import prefuse.data.event.ExpressionListener;
import prefuse.util.collections.CopyOnWriteArrayList;
/**
* Abstract base class for Expression implementations. Provides support for
* listeners and defaults every Expression evaluation method to an
* unsupported operation.
*
* @author jeffrey heer
*/
public abstract class AbstractExpression
implements Expression, ExpressionListener
{
private CopyOnWriteArrayList m_listeners = new CopyOnWriteArrayList();
/**
* @see prefuse.data.expression.Expression#visit(prefuse.data.expression.ExpressionVisitor)
*/
public void visit(ExpressionVisitor v) {
v.visitExpression(this);
}
/**
* @see prefuse.data.expression.Expression#addExpressionListener(prefuse.data.event.ExpressionListener)
*/
public final void addExpressionListener(ExpressionListener lstnr) {
if ( !m_listeners.contains(lstnr) ) {
m_listeners.add(lstnr);
addChildListeners();
}
}
/**
* @see prefuse.data.expression.Expression#removeExpressionListener(prefuse.data.event.ExpressionListener)
*/
public final void removeExpressionListener(ExpressionListener lstnr) {
m_listeners.remove(lstnr);
if ( m_listeners.size() == 0 )
removeChildListeners();
}
/**
* Indicates if any listeners are registered with this Expression.
* @return true if listeners are registered, false otherwise
*/
protected final boolean hasListeners() {
return m_listeners != null && m_listeners.size() > 0;
}
/**
* Fire an expression change.
*/
protected final void fireExpressionChange() {
Object[] lstnrs = m_listeners.getArray();
for ( int i=0; i