package org.uva.sea.ql.gui.questionaire;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
import org.uva.sea.ql.ast.Expression;
import org.uva.sea.ql.ast.StatementVisitor;
import org.uva.sea.ql.ast.literal.StringLiteral;
import org.uva.sea.ql.ast.statement.ExpressionQuestion;
import org.uva.sea.ql.ast.statement.Form;
import org.uva.sea.ql.ast.statement.IfElseStatement;
import org.uva.sea.ql.ast.statement.IfStatement;
import org.uva.sea.ql.ast.statement.Question;
import org.uva.sea.ql.ast.statement.Questions;
import org.uva.sea.ql.ast.statement.Statement;
import org.uva.sea.ql.gui.widget.Widget;
public class Renderer implements StatementVisitor {
private final JPanel mainpanel;
private final State state;
public static JPanel render(Statement statement, State state){
Renderer renderer = new Renderer(state);
statement.accept(renderer);
return renderer.getPanel();
}
public Renderer(State state){
this.state = state;
this.mainpanel = new JPanel();
mainpanel.setLayout(new MigLayout("wrap 2"));
}
public JPanel getPanel() {
return mainpanel;
}
private void addLabel(StringLiteral label){
JLabel questionLabel = new JLabel(label.toString());
mainpanel.add(questionLabel, " grow");
}
private void addWidget(Widget widget){
mainpanel.add(widget.UIElement(), "width 50%, grow");
}
private Widget typeToWidget(Question question, boolean isEnabled){
Widget widget = question.getType().accept( new TypeToWidget(question.getIdentifier(), state) );
widget.setEnabled(isEnabled);
return widget;
}
private void registerHandler(Question question, Widget widget){
state.addObservable(question.getIdentifier(), widget);
}
private void registerExprQuestion(ExpressionQuestion exprquestion, Widget widget){
ExpressionObserver exprObserver = new ExpressionObserver(widget, state, exprquestion);
state.addGlobalObservers(exprObserver);
state.addObservable(exprquestion.getIdentifier(), widget);
}
public void visit(ExpressionQuestion exprquestion) {
addLabel(exprquestion.getLabel());
Widget widget = typeToWidget(exprquestion, false);
registerExprQuestion(exprquestion, widget);
addWidget(widget);
}
public void visit(Question question) {
addLabel(question.getLabel());
Widget widget = typeToWidget(question, true);
registerHandler(question,widget);
addWidget(widget);
}
public void visit(IfStatement ifconditional) {
JPanel trueIf = render(ifconditional.getIfBody(), state);
registerConditionDeps(ifconditional.getConditional(), trueIf, null);
trueIf.setVisible(false);
this.mainpanel.add(trueIf, "span");
}
public void visit(IfElseStatement ifelseconditional) {
JPanel trueIf = render(ifelseconditional.getIfBody(), state);
JPanel falseIf = render(ifelseconditional.getElseBody(),state);
registerConditionDeps(ifelseconditional.getConditional(), trueIf, falseIf);
trueIf.setVisible(false);
falseIf.setVisible(true);
this.mainpanel.add(trueIf, "span");
this.mainpanel.add(falseIf, "span");
}
private void registerConditionDeps(Expression conditional, JPanel trueIf,
JPanel falseIf) {
ConditionalObserver conditionalObserver = new ConditionalObserver(conditional,state,trueIf,falseIf);
state.addGlobalObservers(conditionalObserver);
}
public void visit(Form form) {
form.getBody().accept(this);
}
public void visit(Questions body) {
for(Statement s : body){
s.accept(this);
}
}
}