package uva.ql.interpreter.gui;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import uva.ql.ast.Node;
import uva.ql.ast.Form;
import uva.ql.ast.Prog;
import uva.ql.ast.expression.evaluation.ValueTable;
import uva.ql.ast.expressions.literals.Identifier;
import uva.ql.ast.statements.Assign;
import uva.ql.ast.statements.IfStatement;
import uva.ql.ast.statements.Question;
import uva.ql.ast.statements.Statement;
import uva.ql.ast.value.GenericValue;
import uva.ql.ast.visitor.StatementVisitor;
import uva.ql.interpreter.gui.elements.UIFrame;
import uva.ql.interpreter.gui.elements.UIScrollPanel;
import uva.ql.interpreter.gui.elements.UIWidget;
import uva.ql.interpreter.gui.supporting.Size;
import uva.ql.interpreter.gui.supporting.UpdateValue;
public class Renderer implements StatementVisitor<Void>, Observer{
private UIScrollPanel scrollPanel;
private ValueTable valueTable;
private Identifier lastFocus;
private JFrame frame;
private Prog prog;
public Renderer(Prog prog){
this.valueTable = new ValueTable(prog);
this.prog = prog;
this.setFrame();
}
private void setFrame(){
this.scrollPanel = new UIScrollPanel();
this.frame = new UIFrame().randerFrame(new Size(500,400));
this.frame.add(this.scrollPanel.randerScrollPane(new Size(500,400)));
this.frame.revalidate();
}
@Override
public void update(Observable o, Object arg) {
UpdateValue value = (UpdateValue)arg;
this.valueTable.updateValueTable(value.getIdentifier(), value.getUpdateValue());
this.valueTable.refreshValueTable();
this.scrollPanel.removeAll();
this.scrollPanel.revalidateLayout();
this.lastFocus = value.getIdentifier();
this.visitProg(this.prog);
}
private boolean hasFocus(Identifier identifier){
return identifier.equals(lastFocus);
}
@Override
public Void visitProg(Prog prog) {
prog.getForm().accept(this);
return null;
}
@Override
public Void visitForm(Form form) {
for (Statement statement : form.getFormStatements()){
statement.accept(this);
}
return null;
}
@Override
public Void visitASTNode(Node node) {
return null;
}
@Override
public Void visitStatement(Statement statement) {
statement.accept(this);
return null;
}
@Override
public Void visitSimpleQuestion(Question question) {
this.randerQuestion(question);
return null;
}
@Override
public Void visitComputedQuestion(Question question) {
this.randerQuestion(question);
return null;
}
private void randerQuestion(Question question){
Identifier id = question.getQuestionIdentifier();
String identifier = question.getQuestionIdentifierValue();
GenericValue<?> value = this.valueTable.getValue(identifier);
UIWidget widget = new UIWidget(question, value, this);
this.scrollPanel.addComponent(widget.randerUIWidget());
this.scrollPanel.revalidateMasterPanel();
widget.requestFocus(this.hasFocus(id));
}
@Override
public Void visitIfStatement(IfStatement ifStatement) {
boolean conditionIsTrue = this.valueTable.conditionalExpression(ifStatement.getIfStatementExpression());
if (conditionIsTrue){
for (Statement statement : ifStatement.getStatements()){
statement.accept(this);
}
}
return null;
}
@Override
public Void visitAssign(Assign assign) {
return null;
}
}