package gui;
import evaluator.ValueRepository;
import gui.listeners.Updater;
import gui.questions.ComputedQuestionUI;
import gui.questions.IQuestionUI;
import gui.questions.IfElseQuestionUI;
import gui.questions.SimpleQuestionUI;
import gui.widgets.IWidgetComponent;
import gui.widgets.WidgetVisitor;
import javax.swing.JLabel;
import ast.expression.Expression;
import ast.question.ComputationQuestion;
import ast.question.IQuestionVisitor;
import ast.question.IfElseStatement;
import ast.question.IfStatement;
import ast.question.Question;
import ast.question.SimpleQuestion;
public class GUIVisitor implements IQuestionVisitor<IQuestionUI>{
private final GUIRenderer gui;
private final ValueRepository valueRepository;
public GUIVisitor(GUIRenderer gui, ValueRepository valueRepository) {
this.gui = gui;
this.valueRepository = valueRepository;
}
public IWidgetComponent widget(SimpleQuestion simpleQuestion) {
return simpleQuestion.getQuestionType().accept(
new WidgetVisitor(
simpleQuestion.getQuestionId().getID(),
simpleQuestion.getQuestionType(),
this.valueRepository
)
);
}
public Updater sendToUpdater(Expression expression) {
return new Updater(expression, gui, valueRepository);
}
@Override
public IQuestionUI visit(SimpleQuestion simpleQuestion) {
SimpleQuestionUI sq = new SimpleQuestionUI(
simpleQuestion.getQuestionId().getID(),
new JLabel(simpleQuestion.getQuestionText()),
this.widget(simpleQuestion)
);
gui.putWidgetRepository(simpleQuestion.getQuestionId().getID(), sq);
return sq;
}
@Override
public IQuestionUI visit(ComputationQuestion calQuestion) {
ComputedQuestionUI sq = new ComputedQuestionUI(
calQuestion.getQuestionId().getID(),
new JLabel(calQuestion.getQuestionText()),
this.widget(calQuestion),
this.sendToUpdater(calQuestion.getExpression())
);
gui.putWidgetRepository(calQuestion.getQuestionId().getID(), sq);
sq.updateGUI();
return sq;
}
@Override
public IQuestionUI visit(IfStatement ifStatement) {
IfElseQuestionUI ifq = new IfElseQuestionUI(this.sendToUpdater(ifStatement.getExpression()));
for(Question q : ifStatement.getIfStatement()) {
ifq.showIfBody(q.accept(this));
}
ifq.updateGUI();
return ifq;
}
@Override
public IQuestionUI visit(IfElseStatement ifElseStatement) {
IfElseQuestionUI ifq = new IfElseQuestionUI(this.sendToUpdater(ifElseStatement.getExpression()));
for(Question q : ifElseStatement.getIfStatement()) {
ifq.showIfBody(q.accept(this));
}
for(Question q : ifElseStatement.getElseStatement()) {
ifq.showElseBody(q.accept(this));
}
ifq.updateGUI();
return ifq;
}
}