package qlProject.gui.input_response_visitors; import java.util.List; import java.util.Map; import qlProject.ast.Questionnaire; import qlProject.ast.expression.IExpression; import qlProject.ast.statement.IStatement; import qlProject.ast.statement.IStatementsVisitor; import qlProject.ast.statement.IfStatement; import qlProject.ast.statement.assignment.Assignment; import qlProject.ast.statement.assignment.ComputedAssignment; import qlProject.ast.statement.assignment.DirectAssignment; import qlProject.ast.value.BoolValue; import qlProject.ast.value.NullValue; import qlProject.ast.value.Value; import qlProject.auxiliary_expression_visitors.ExpressionEvaluationVisitor; import qlProject.gui.gui_building_visitors.QuestionWidget; public class SetEditabilityVisitor implements IStatementsVisitor { private Map <String, Value> valuesEnvironment; private Map<String, QuestionWidget> questionWidgetsMap; private boolean enabled; public SetEditabilityVisitor(Map <String, Value> valuesEnvironment, Map<String, QuestionWidget> questionWidgetsMap, boolean enabled){ this.questionWidgetsMap = questionWidgetsMap; this.enabled = enabled; this.valuesEnvironment = valuesEnvironment; } @Override public void visit(Questionnaire q) { for (IStatement s : q.getStatements()){ s.accept(this); } } @Override public void visit(IfStatement s) { boolean nestedCondition = evaluateCondition(s.getCondition()); manageTrueAndFalseNestedSs(s, nestedCondition); } @Override public void visit(ComputedAssignment a) { } @Override public void visit(DirectAssignment a) { setEnabled(a); } public Value evaluateExpression(IExpression e){ return (Value)(e.accept(new ExpressionEvaluationVisitor(valuesEnvironment))); } public boolean evaluateCondition(IExpression e) { Value v = evaluateExpression(e); if (v.equals(new NullValue())) return false; else return ((BoolValue)v).getValue(); } public void enableNestedStatements(List<IStatement> statementsList, boolean nestedCondition){ for(IStatement nestedS : statementsList){ nestedS.accept(new SetEditabilityVisitor(valuesEnvironment, questionWidgetsMap, nestedCondition && enabled)); } } public void manageTrueAndFalseNestedSs(IfStatement s, boolean nestedCondition){ enableNestedStatements(s.getIfTrueStatements(), nestedCondition); enableNestedStatements(s.getIfFalseStatements(), !nestedCondition); } public void setEnabled(Assignment a){ questionWidgetsMap.get(a.getId()).getLabel().setEnabled(enabled); questionWidgetsMap.get(a.getId()).getComponent().setEnabled(enabled); } }