package org.fugazi.ql.gui.ui_element.visitors;
import org.fugazi.ql.ast.statement.ComputedQuestion;
import org.fugazi.ql.ast.statement.IStatementVisitor;
import org.fugazi.ql.ast.statement.IfStatement;
import org.fugazi.ql.ast.statement.Question;
import org.fugazi.ql.evaluator.ValueStorage;
import org.fugazi.ql.evaluator.expression_value.ExpressionValue;
import org.fugazi.ql.gui.GUIEvaluator;
import org.fugazi.ql.gui.mediator.IMediator;
import org.fugazi.ql.gui.ui_element.ui_questions.UIComputedQuestion;
import org.fugazi.ql.gui.ui_element.ui_questions.UIQuestion;
import org.fugazi.ql.gui.widgets.IWidget;
import org.fugazi.ql.gui.widgets.WidgetsFactory;
public class UIQuestionBuilder implements IStatementVisitor <UIQuestion>{
private final IMediator mediator;
private final GUIEvaluator guiEvaluator;
private final WidgetsFactory widgetsFactory;
public UIQuestionBuilder(
IMediator _med, ValueStorage _valueStorage, WidgetsFactory _widgetsFactory)
{
this.mediator = _med;
this.guiEvaluator = new GUIEvaluator(_valueStorage);
this.widgetsFactory = _widgetsFactory;
}
public UIQuestion visitQuestion(Question _question) {
IWidget widget = this.widgetsFactory.getWidgetForQuestion(_question);
TypeToUIQuestionVisitor typeToUIQuestionVisitor =
new TypeToUIQuestionVisitor(this.mediator, _question, widget);
return _question.getType().accept(typeToUIQuestionVisitor);
}
public UIQuestion visitIfStatement(IfStatement _ifStatement) {
throw new AssertionError(); // Should never go in here, this is used as a factory.
}
public UIQuestion visitComputedQuestion(ComputedQuestion _computedQuestion) {
ExpressionValue result = guiEvaluator.evaluateComputedExpression(_computedQuestion);
IWidget widget = this.widgetsFactory.getWidgetForQuestion(_computedQuestion, result);
return new UIComputedQuestion(mediator, _computedQuestion, widget, result);
}
}