package ql.gui.renderer; import java.util.Iterator; import ql.ast.expression.IExpression; import ql.ast.expression_evaluator.ValueEnvironment; import ql.ast.statement.Assignment; import ql.ast.statement.ComputedAssignment; import ql.ast.statement.IStatement; import ql.ast.statement.IfStatement; import ql.ast.visitor_elements.IStatementElementVisitor; import ql.gui.Label; import ql.gui.QuestionnaireFrame; import ql.gui.input_field.IInput; import ql.gui.input_field.InputBuilderVisitor; import ql.gui.input_listener.InputListenerLinker; import ql.gui.widget.ComputedLabelInputPair; import ql.gui.widget.IWidget; import ql.gui.widget.IfElse; import ql.gui.widget.LabelInputPair; /** * @author orosu */ public class GuiRendererVisitor implements IStatementElementVisitor<IWidget> { private final QuestionnaireFrame _questionnaireFrame; private final ValueEnvironment _valueEnvironment; public GuiRendererVisitor(QuestionnaireFrame questionnaireFrame, ValueEnvironment valueEnvironment) { this._questionnaireFrame = questionnaireFrame; this._valueEnvironment = valueEnvironment; } @Override public LabelInputPair visit(Assignment assignment) { LabelInputPair widget = new LabelInputPair( this._questionnaireFrame, assignment.getId(), this._createLabel(assignment), this._createInput(assignment) ); this._addWidget(assignment, widget); return widget; } @Override public ComputedLabelInputPair visit(ComputedAssignment computedAssignment) { ComputedLabelInputPair widget = new ComputedLabelInputPair( this._questionnaireFrame, computedAssignment.getId(), this._createLabel(computedAssignment), this._createInput(computedAssignment), this._createInputListenerLinker(computedAssignment.getExpression()) ); this._addWidget(computedAssignment, widget); widget.attachInputListener(); return widget; } @Override public IfElse visit(IfStatement ifStatement) { IfElse widget = new IfElse( this._createInputListenerLinker(ifStatement.getExpression()) ); // Visit if statements Iterator<IStatement> ifStatementsIterator = ifStatement.getIfStatementList().iterator(); while(ifStatementsIterator.hasNext()) { widget.addIfWidget(ifStatementsIterator.next().accept(this)); } // Visit else statements Iterator<IStatement> elseStatementsIterator = ifStatement.getElseStatementList().iterator(); while(elseStatementsIterator.hasNext()) { widget.addElseWidget(elseStatementsIterator.next().accept(this)); } widget.attachInputListener(); return widget; } private Label _createLabel(Assignment assignment) { return new Label(assignment.getLabel()); } private IInput _createInput(Assignment assignment) { return assignment.getType().accept(new InputBuilderVisitor( this._valueEnvironment, assignment.getId()) ); } private InputListenerLinker _createInputListenerLinker(IExpression expression) { return new InputListenerLinker( this._questionnaireFrame, this._valueEnvironment, expression ); } private void _addWidget(Assignment assignment, LabelInputPair widget) { this._questionnaireFrame.addLabelInputPair(assignment.getId(), widget); } }