package qlProject.gui.input_response_visitors; import qlProject.ast.Questionnaire; import qlProject.ast.statement.IStatement; import qlProject.ast.statement.IStatementsVisitor; import qlProject.ast.statement.IfStatement; import qlProject.ast.statement.assignment.ComputedAssignment; import qlProject.ast.statement.assignment.DirectAssignment; import qlProject.ast.type.Type; import qlProject.ast.value.Value; import qlProject.gui.gui_building_visitors.QuestionWidget; import qlProject.gui.listeners.ListenerSelector; import qlProject.util.QuestionDetails; import java.util.Map; import java.util.Set; public class TrackChangesVisitor implements IStatementsVisitor { private final Map<String, QuestionDetails> questionsDetails; private final Map<String,Set<String>> deps; private final Map<String, QuestionWidget> questionWidgetsMap; private final Map<String,Set<String>> awaitingCalculationIds; private final Map<String, Value> valuesEnvironment; public TrackChangesVisitor(Map<String, QuestionDetails> questionsDetails, Map<String, Value> valuesEnvironment, Map<String, Set<String>> deps, Map<String, QuestionWidget> questionWidgetsMap, Map<String,Set<String>> awaitingCalculationIds){ this.questionsDetails = questionsDetails; this.deps = deps; this.questionWidgetsMap = questionWidgetsMap; this.awaitingCalculationIds = awaitingCalculationIds; this.valuesEnvironment = valuesEnvironment; } @Override public void visit(Questionnaire q) { for (IStatement statement : q.getStatements()){ statement.accept(this); } } public void visit(IfStatement ifStatement){ for (IStatement nestedTrueS : ifStatement.getIfTrueStatements()) { nestedTrueS.accept(this); } for (IStatement nestedFalseS : ifStatement.getIfFalseStatements()) { nestedFalseS.accept(this); } Set<String> variablesIds = ifStatement.getExpressionVariables(); for (String observed : variablesIds){ Type variableType = questionsDetails.get(observed).getType(); ListenerSelector selector = (ListenerSelector)variableType.accept(new WidgetBindingVisitor(questionsDetails, questionWidgetsMap, observed, valuesEnvironment, awaitingCalculationIds)); ifStatement.accept(selector); } } public void visit (ComputedAssignment assignment){ for (String observed : deps.get(assignment.getId())){ Type variableType = questionsDetails.get(observed).getType(); ListenerSelector selector = (ListenerSelector)variableType.accept(new WidgetBindingVisitor(questionsDetails, questionWidgetsMap, observed, valuesEnvironment, awaitingCalculationIds)); assignment.accept(selector); } } public void visit (DirectAssignment question){ Type t = question.getType(); ListenerSelector selector = (ListenerSelector)t.accept(new WidgetBindingVisitor(questionsDetails, questionWidgetsMap, question.getId(), valuesEnvironment, awaitingCalculationIds)); question.accept(selector); } }