package ql.gui;
import ql.ast.Expression;
import ql.ast.Statement;
import ql.ast.expression.Identifier;
import ql.ast.expression.literal.BooleanLiteral;
import ql.ast.expression.literal.FloatLiteral;
import ql.ast.expression.literal.IntegerLiteral;
import ql.ast.expression.literal.MoneyLiteral;
import ql.ast.expression.literal.StringLiteral;
import ql.ast.statement.Block;
import ql.ast.statement.ComputedQuestion;
import ql.ast.statement.Form;
import ql.ast.statement.If;
import ql.ast.statement.IfElse;
import ql.ast.statement.Question;
import ql.ast.type.QLBoolean;
import ql.ast.type.QLFloat;
import ql.ast.type.QLInteger;
import ql.ast.type.QLMoney;
import ql.ast.type.QLString;
import ql.ast.visitor.ExpressionVisitor;
import ql.ast.visitor.StatementVisitor;
import ql.ast.visitor.TypeVisitor;
import ql.ast.visitor.evaluator.ValueEnvironment;
import ql.gui.content.UIComputedQuestion;
import ql.gui.content.UIConditional;
import ql.gui.content.UIQuestion;
import ql.gui.structure.Label;
import ql.gui.structure.Panel;
import ql.gui.widget.InputWidget;
import ql.gui.widget.input.RadioButton;
import ql.gui.widget.input.field.TextField;
import ql.gui.widget.input.spinbox.FloatSpinbox;
import ql.gui.widget.input.spinbox.IntegerSpinbox;
import ql.gui.widget.input.spinbox.MoneySpinbox;
public class ComponentCreator extends StatementVisitor<Component> implements ExpressionVisitor<Component>, TypeVisitor<Component> {
private ValueEnvironment valueEnvironment;
private ComponentCreator(ValueEnvironment valueEnvironment) {
this.valueEnvironment = valueEnvironment;
}
public static Component check(Expression tree, ValueEnvironment valueEnvironment) {
ComponentCreator creator = new ComponentCreator(valueEnvironment);
return tree.accept(creator);
}
public static Component check(Statement tree, ValueEnvironment valueEnvironment) {
ComponentCreator creator = new ComponentCreator(valueEnvironment);
return tree.accept(creator);
}
@Override
public Component visit(Identifier identifier) {
return new Panel();
}
@Override
public Component visit(QLBoolean booleanNode) {
return new RadioButton();
}
@Override
public Component visit(QLFloat floatNode) {
return new FloatSpinbox();
}
@Override
public Component visit(QLMoney moneyNode) {
return new MoneySpinbox();
}
@Override
public Component visit(QLInteger integerNode) {
return new IntegerSpinbox();
}
@Override
public Component visit(QLString integerNode) {
return new TextField();
}
@Override
public Component visit(BooleanLiteral booleanLiteral) {
return new RadioButton(booleanLiteral.getValue());
}
@Override
public Component visit(FloatLiteral floatLiteral) {
return new FloatSpinbox(floatLiteral.getValue());
}
@Override
public Component visit(MoneyLiteral moneyNode) {
return new MoneySpinbox(moneyNode.getValue());
}
@Override
public Component visit(IntegerLiteral integerLiteral) {
return new IntegerSpinbox(integerLiteral.getValue());
}
@Override
public Component visit(StringLiteral stringNode) {
return new Label(stringNode.getValue());
}
/**
* Statements
*/
@Override
public Component visit(Block blockNode) {
Panel widgetPanel = new Panel();
Component statementWidget;
for(Statement statement : blockNode.getStatements()) {
statementWidget = statement.accept(this);
widgetPanel.addComponent(statementWidget);
}
return widgetPanel;
}
@Override
public Component visit(ComputedQuestion compQuestionNode) {
Component questionText = compQuestionNode.getText().accept(this);
InputWidget<?> questionWidget = (InputWidget<?>) compQuestionNode.getType().accept(this);
return new UIComputedQuestion(compQuestionNode.getIdentifier(), questionText,
questionWidget, compQuestionNode.getExpression(), valueEnvironment);
}
@Override
public Component visit(Question questionNode) {
Component questionText = questionNode.getText().accept(this);
Component questionWidget = questionNode.getType().accept(this);
return new UIQuestion(questionNode.getIdentifier(), questionText, questionWidget, valueEnvironment);
}
@Override
public Component visit(Form formNode) {
Panel formSection = new Panel();
formSection.addComponent(formNode.getBlock().accept(this));
return formSection;
}
@Override
public Component visit(If ifNode) {
return new UIConditional(ifNode.getExpression(), valueEnvironment, (Panel) ifNode.getBlock().accept(this));
}
@Override
public Component visit(IfElse ifElseNode) {
Panel elsePanel = (Panel) ifElseNode.getElseBranch().accept(this);
Panel ifPanel = (Panel) ifElseNode.getIfBranch().accept(this);
return new UIConditional(ifElseNode.getExpression(), valueEnvironment, ifPanel, elsePanel);
}
}