package nl.uva.se.ql.gui.mediators;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import nl.uva.se.ql.ast.form.Form;
import nl.uva.se.ql.ast.statement.Question;
import nl.uva.se.ql.evaluation.*;
import nl.uva.se.ql.evaluation.value.*;
import nl.uva.se.ql.gui.builders.GuiBuilder;
import nl.uva.se.ql.gui.widgets.boxes.ConditionBox;
import nl.uva.se.ql.gui.widgets.panes.QuestionPane;
import nl.uva.se.ql.gui.widgets.questions.calculated.BaseCalculatedQuestion;
public class GuiMediator implements Mediator {
private ValueTable values;
private final QuestionPane questionPane;
private List<ConditionBox> conditions = new ArrayList<ConditionBox>();
private Map<String, BaseCalculatedQuestion> calculations = new HashMap<String, BaseCalculatedQuestion>();
public GuiMediator(ValueTable values, Form ast) {
this.values = values;
GuiBuilder guiBuilder = new GuiBuilder(this);
guiBuilder.visit(ast);
this.questionPane = guiBuilder.getQuestionPane();
evaluteConditions();
updateCalculatedQuestions();
}
@Override
public void update(Question question, Value value) {
values.addValue(question.getId(), value);
this.values = Evaluator.evaluate(questionPane.getForm(), values);
evaluteConditions();
updateCalculatedQuestions();
}
@Override
public void registerCondition(ConditionBox conditionBox) {
conditions.add(conditionBox);
}
@SuppressWarnings("rawtypes")
private void updateCalculatedQuestions() {
for (Entry<String, BaseCalculatedQuestion> entry : calculations
.entrySet()) {
BaseCalculatedQuestion calculatedQuestion = entry.getValue();
Value value = values.getValue(entry.getKey());
calculatedQuestion.setValue(value);
}
}
private void evaluteConditions() {
for (ConditionBox conditionBox : conditions) {
BooleanValue isVisible = (BooleanValue) ExpressionEvaluator
.evaluate(conditionBox.getCondition().getExpression(),
values);
conditionBox.setVisible(isVisible.getValue());
}
}
@Override
public QuestionPane getQuestionPane() {
return this.questionPane;
}
@Override
public void registerCalculated(String identifier,
BaseCalculatedQuestion baseCalculatedQuestion) {
calculations.put(identifier, baseCalculatedQuestion);
}
}