package prefuse.data.expression;
import prefuse.data.Schema;
import prefuse.data.Tuple;
import prefuse.util.TypeLib;
/**
* Expression instance representing an "if then else" clause in the prefuse
* expression language.
*
* @author <a href="http://jheer.org">jeffrey heer</a>
*/
public class IfExpression extends AbstractExpression {
private Predicate m_test;
private Expression m_then;
private Expression m_else;
/**
* Create a new IfExpression.
* @param test the predicate test for the if statement
* @param thenExpr the expression to evaluate if the test predicate
* evaluates to true
* @param elseExpr the expression to evaluate if the test predicate
* evaluates to false
*/
public IfExpression(Predicate test,
Expression thenExpr, Expression elseExpr)
{
m_test = test;
m_then = thenExpr;
m_else = elseExpr;
}
// ------------------------------------------------------------------------
/**
* Get the test predicate.
* @return the test predicate
*/
public Predicate getTestPredicate() {
return m_test;
}
/**
* Get the then expression
* @return the then expression
*/
public Expression getThenExpression() {
return m_then;
}
/**
* Get the else expression
* @return the else expression
*/
public Expression getElseExpression() {
return m_else;
}
/**
* Set the test predicate.
* @param p the test predicate
*/
public void setTestPredicate(Predicate p) {
m_test.removeExpressionListener(this);
m_test = p;
if ( hasListeners() ) p.addExpressionListener(this);
fireExpressionChange();
}
/**
* Set the then expression
* @param e the then expression to set
*/
public void setThenExpression(Expression e) {
m_then.removeExpressionListener(this);
m_then = e;
if ( hasListeners() ) e.addExpressionListener(this);
fireExpressionChange();
}
/**
* Set the else expression
* @param e the else expression to set
*/
public void setElseExpression(Expression e) {
m_else.removeExpressionListener(this);
m_else = e;
if ( hasListeners() ) e.addExpressionListener(this);
fireExpressionChange();
}
// ------------------------------------------------------------------------
/**
* @see prefuse.data.expression.Expression#getType(prefuse.data.Schema)
*/
public Class getType(Schema s) {
Class type1 = m_then.getType(s);
Class type2 = m_else.getType(s);
return TypeLib.getSharedType(type1, type2);
}
/**
* @see prefuse.data.expression.Expression#get(prefuse.data.Tuple)
*/
public Object get(Tuple t) {
return (m_test.getBoolean(t) ? m_then : m_else).get(t);
}
/**
* @see prefuse.data.expression.Expression#getBoolean(prefuse.data.Tuple)
*/
public boolean getBoolean(Tuple t) {
return (m_test.getBoolean(t) ? m_then : m_else).getBoolean(t);
}
/**
* @see prefuse.data.expression.Expression#getDouble(prefuse.data.Tuple)
*/
public double getDouble(Tuple t) {
return (m_test.getBoolean(t) ? m_then : m_else).getDouble(t);
}
/**
* @see prefuse.data.expression.Expression#getFloat(prefuse.data.Tuple)
*/
public float getFloat(Tuple t) {
return (m_test.getBoolean(t) ? m_then : m_else).getFloat(t);
}
/**
* @see prefuse.data.expression.Expression#getInt(prefuse.data.Tuple)
*/
public int getInt(Tuple t) {
return (m_test.getBoolean(t) ? m_then : m_else).getInt(t);
}
/**
* @see prefuse.data.expression.Expression#getLong(prefuse.data.Tuple)
*/
public long getLong(Tuple t) {
return (m_test.getBoolean(t) ? m_then : m_else).getLong(t);
}
// ------------------------------------------------------------------------
/**
* @see prefuse.data.expression.Expression#visit(prefuse.data.expression.ExpressionVisitor)
*/
public void visit(ExpressionVisitor v) {
v.visitExpression(this);
v.down(); m_test.visit(v); v.up();
v.down(); m_then.visit(v); v.up();
v.down(); m_else.visit(v); v.up();
}
/**
* @see prefuse.data.expression.AbstractExpression#addChildListeners()
*/
protected void addChildListeners() {
m_test.addExpressionListener(this);
m_then.addExpressionListener(this);
m_else.addExpressionListener(this);
}
/**
* @see prefuse.data.expression.AbstractExpression#removeChildListeners()
*/
protected void removeChildListeners() {
m_test.removeExpressionListener(this);
m_then.removeExpressionListener(this);
m_else.removeExpressionListener(this);
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return "IF " + m_test.toString()
+ " THEN " + m_then.toString()
+ " ELSE " + m_else.toString();
}
} // end of class IfExpression