package gui.render; import gui.component.ComputedWidget; import gui.component.TypeToWidget; import gui.component.Widget; import gui.observers.ComputedQuestionObserver; import gui.observers.FormSubmission; import gui.observers.IfElseObserver; import gui.observers.IfObserver; import gui.observers.WidgetChangeHandler; import gui.observers.WidgetObserver; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import net.miginfocom.swing.MigLayout; import ast.expr.Identifier; import ast.expr.literal.StrLiteral; import ast.statement.Block; import ast.statement.ComputedQuestion; import ast.statement.Form; import ast.statement.IfStatement; import ast.statement.IfelseStatement; import ast.statement.Question; import ast.statement.Statement; import ast.statement.StatementList; import ast.types.Type; import ast.visitors.StatementVisitor; public class Renderer implements StatementVisitor<JComponent>{ private State state; public Renderer(State state) { this.state = state; } private JPanel createNewPanel(){ MigLayout layout = new MigLayout("hidemode 2, fillx"); return new JPanel(layout); } public JComponent render(final Form form){ final Renderer renderer = new Renderer(new State()); JComponent comp = renderer.visit(form); return new JScrollPane(comp); } private void registerObservers(WidgetObserver obs){ state.addAllObservers(obs); obs.evaluate(); } private void registerControlChangeHandler(Identifier ident, Widget widget){ WidgetChangeHandler handler = new WidgetChangeHandler(ident, widget, state); state.putObserver(ident, handler); } private void addLabel(JPanel panel, StrLiteral label){ panel.add(new JLabel(label.getVal().replace("\"", ""))); } private Widget typeToWidget(Type t){ TypeToWidget vis = new TypeToWidget(); return t.accept(vis); } private void addComponent(JPanel panel, Widget comp){ panel.add(comp.getComponent(), "wrap"); } @Override public JComponent visit(Form node) { JPanel panel = createNewPanel(); panel.add(node.getStatements().accept(this)); JButton submit = new JButton("Submit"); submit.addActionListener(new FormSubmission(node.getId(), state)); panel.add(submit, "wrap"); return new JScrollPane(panel); } @Override public JComponent visit(StatementList node) { State currentState = state.currentState(); JPanel panel = createNewPanel(); Renderer render = new Renderer(currentState); for(Statement s: node.getList()){ panel.add(s.accept(render), "wrap"); } return panel; } @Override public JComponent visit(Block node) { return visit(node.getStatements()); } @Override public JComponent visit(Question node) { JPanel panel = createNewPanel(); Widget comp = typeToWidget(node.getType()); state.addValue(node.getId(), comp.getValue()); registerControlChangeHandler(node.getId(), comp); addLabel(panel, node.getLabel()); addComponent(panel, comp); return panel; } @Override public JComponent visit(ComputedQuestion node) { ComputedWidget comp = new ComputedWidget(); JPanel panel = createNewPanel(); registerControlChangeHandler(node.getId(), comp); ComputedQuestionObserver obs = new ComputedQuestionObserver(node, comp, state); registerObservers(obs); addLabel(panel, node.getLabel()); addComponent(panel, comp); return panel; } @Override public JComponent visit(IfStatement node) { JPanel panel = createNewPanel(); JComponent ifComp = node.getStatements().accept(this); ifComp.setVisible(false); panel.add(ifComp); IfObserver obs = new IfObserver(node, ifComp, state); registerObservers(obs); return panel; } @Override public JComponent visit(IfelseStatement node) { JPanel panel = createNewPanel(); JComponent ifComp = node.getStatements().accept(this); JComponent elseComp = node.getElseStatements().accept(this); ifComp.setVisible(false); elseComp.setVisible(false); panel.add(ifComp); panel.add(elseComp); IfElseObserver obs = new IfElseObserver(node, ifComp, elseComp, state); registerObservers(obs); return panel; } }