package nl.uva.polyql.ast; import java.awt.Component; import nl.uva.polyql.ast.expressions.Expression; import nl.uva.polyql.validation.InvalidTypeError; import nl.uva.polyql.validation.ValidationErrors; import nl.uva.polyql.view.QuestionView; public class CalculatedQuestion extends Question implements Question.ValueListener { private final Expression mExpression; protected CalculatedQuestion(final String id, final String label, final String type, final Expression expression) { super(id, label, type); mExpression = expression; for (final Question question : mExpression.getReferencedQuestions()) { question.addUpdateListener(this); } } @Override public void onQuestionUpdate(final Question question) { mExpression.validate(); setValue(mExpression.getValue()); } @Override public Component getView() { final QuestionView view = getValue().getView(this); addUpdateListener(view); return view.getComponent(); } @Override public ValidationErrors validate() { final ValidationErrors errors = mExpression.validate(); if (!errors.isFatal()) { if (mExpression.getReturnType() != getType()) { errors.add(new InvalidTypeError(this)); } else { setValue(mExpression.getValue()); } } return errors; } public Expression getExpression() { return mExpression; } @Override public boolean isEditable() { return false; } }