package qlProject.gui.gui_building_visitors;
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.type.Type;
import qlProject.ast.value.BoolValue;
import qlProject.ast.value.NullValue;
import qlProject.ast.value.Value;
import qlProject.auxiliary_expression_visitors.ExpressionEvaluationVisitor;
import qlProject.gui.input_response_visitors.SetEditabilityVisitor;
import javax.swing.*;
import java.util.LinkedHashMap;
import java.util.Map;
public class WidgetsCreationVisitor implements IStatementsVisitor {
private final Map<String, QuestionWidget> questionWidgetsMap = new LinkedHashMap<String, QuestionWidget>();
private final Map<String, Value> valuesEnvironment;
public WidgetsCreationVisitor(Map<String, Value> valuesEnvironment) {
this.valuesEnvironment = valuesEnvironment;
}
public Map<String, QuestionWidget> getQuestionWidgets(){
return this.questionWidgetsMap;
}
@Override
public void visit(Questionnaire q) {
for (IStatement statement : q.getStatements()){
statement.accept(this);
}
}
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();
}
@Override
public void visit(IfStatement s){
boolean enabled = evaluateCondition(s.getCondition());
for (IStatement nestedTrueS : s.getIfTrueStatements()){
nestedTrueS.accept(this);
}
for (IStatement nestedFalseS : s.getIfFalseStatements()){
nestedFalseS.accept(this);
}
s.accept(new SetEditabilityVisitor(valuesEnvironment, questionWidgetsMap, enabled));
}
@Override
public void visit (ComputedAssignment assignment){
createWidgets(assignment, false);
}
@Override
public void visit (DirectAssignment assignment){
createWidgets(assignment, true);
}
public void createWidgets(Assignment a, boolean editable){
Type t = a.getType();
JComponent component = (JComponent)(t.accept(new TypeWidgetMatchingVisitor()));
component.setEnabled(editable);
QuestionWidget qw = new QuestionWidget(new JLabel(a.getQuestionText()), component);
questionWidgetsMap.put(a.getId(), qw);
}
}