package gui.render; import expr.Ident; import expr.conditional.And; import expr.conditional.Or; import expr.operation.Add; import expr.operation.Div; import expr.operation.Mul; import expr.operation.Sub; import expr.relational.Eq; import expr.relational.GEq; import expr.relational.GT; import expr.relational.LEq; import expr.relational.LT; import expr.relational.NEq; import expr.unary.Neg; import expr.unary.Not; import expr.unary.Pos; import gui.component.ComputedControl; import gui.component.Control; import gui.component.TypeToWidget; import gui.observers.ComputedQuestionObserver; import gui.observers.ControlChangeHandler; import gui.observers.ControlObserver; import gui.observers.IfElseObserver; import gui.observers.IfObserver; 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.ASTNode; import ast.Visitor; import ast.form.Block; import ast.form.Computedquest; import ast.form.Form; import ast.form.IfElse; import ast.form.Ifstate; import ast.form.Question; import ast.form.Statement; import ast.form.StatementList; import ast.literals.BoolLiteral; import ast.literals.IntLiteral; import ast.literals.StrLiteral; import ast.type.Booltype; import ast.type.Inttype; import ast.type.Strtype; import ast.type.Type; public class Renderer implements Visitor<JComponent>{ private State state; private final JPanel panel; private Form form; public static JPanel render(ASTNode node, State states, Form form) { Renderer r= new Renderer(states, form); node.accept(r); return r.getPanel(); } private JPanel getPanel(){ return panel; } public Renderer(State state, Form form) { this.state = state; this.form=form; this.panel=new JPanel(); } public JPanel createNewPanel(){ MigLayout layout = new MigLayout(); return new JPanel(layout); } public JComponent render(final Form form){ this.form=form; final Renderer renderer = new Renderer(new State(), form); JComponent comp = renderer.visit(form); comp.add(new JButton("Submit")); return new JScrollPane(comp); } public void registerObservers(ControlObserver obs){ state.addAllObservers(obs); //obs.evaluate(); //System.out.println("obs evaluate " + state.addAllObservers(obs) ); } public void registerControlChangeHandler(Ident ident, Control control){ ControlChangeHandler handler = new ControlChangeHandler(ident, control, state); state.putObserver(ident, handler); } public void addLabel(String str){ panel.add(new JLabel(str.replace("\"", ""))); } public Control typeToWidget(Type t, String description, Ident id, Form form, State state, Boolean bool){ panel.setVisible(bool); TypeToWidget vis = new TypeToWidget(description, id, form, state); return t.accept(vis); } public void addComponent(Control comp){ panel.add(comp.getComponent(), "wrap"); } @Override public JComponent visit(Form node) { JPanel panel = createNewPanel(); panel.add(node.getStatements().accept(this)); return new JScrollPane(panel); } @Override public JComponent visit(StatementList node) { State currentState = state.currentState(); //JPanel panel = createNewPanel(); Renderer render = new Renderer(currentState, form); 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) { Control comp = typeToWidget(node.getType(),node.getDescription(),node.getId(),form, state, true); registerControlChangeHandler(node.getId(), comp); state.addValue(node.getId(), comp.getValue()); addComponent(comp); return panel; } @Override public JComponent visit(Computedquest node) { ComputedControl comp = new ComputedControl(); JPanel panel = createNewPanel(); registerControlChangeHandler(node.getId(), comp); ComputedQuestionObserver obs = new ComputedQuestionObserver(node, comp, state); registerObservers(obs); addLabel(node.getStatement().getValue()); addComponent( comp); return panel; } @Override public JComponent visit(Ifstate 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(IfElse node) { JPanel panel = createNewPanel(); JComponent ifComp = node.getStatements().accept(this); JComponent elseComp = node.getStatement1().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; } @Override public JComponent visit(Pos node) { return null; } @Override public JComponent visit(Neg node) { return null; } @Override public JComponent visit(Not node) { return null; } @Override public JComponent visit(Add node) { return null; } @Override public JComponent visit(And node) { return null; } @Override public JComponent visit(Div node) { return null; } @Override public JComponent visit(Eq node) { return null; } @Override public JComponent visit(GEq node) { return null; } @Override public JComponent visit(GT node) { return null; } @Override public JComponent visit(LEq node) { return null; } @Override public JComponent visit(LT node) { return null; } @Override public JComponent visit(Mul node) { return null; } @Override public JComponent visit(NEq node) { return null; } @Override public JComponent visit(Or node) { return null; } @Override public JComponent visit(Sub node) { return null; } @Override public JComponent visit(BoolLiteral node) { return null; } @Override public JComponent visit(Ident node) { return null; } @Override public JComponent visit(IntLiteral node) { return null; } @Override public JComponent visit(StrLiteral node) { return null; } @Override public JComponent visit(Booltype node) { return null; } @Override public JComponent visit(Inttype node) { return null; } @Override public JComponent visit(Strtype node) { return null; } }