package qls.ast.visitor.domaincreator;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import ql.Value;
import ql.ast.Expression;
import ql.ast.expression.booleanalgebra.And;
import ql.ast.visitor.evaluator.Evaluator;
import ql.ast.visitor.evaluator.ValueEnvironment;
import ql.gui.Component;
import ql.value.BooleanValue;
public class ConditionalDomain {
private Expression conditionalExpression;
private ValueEnvironment valueEnvironment;
private List<Component> ifComponents, elseComponents;
public ConditionalDomain(Expression conditionalExpression, ValueEnvironment valueEnvironment) {
this.conditionalExpression = conditionalExpression;
this.valueEnvironment = valueEnvironment;
ifComponents = new ArrayList<Component>();
elseComponents = new ArrayList<Component>();
}
public void setPrerequisites(List<Expression> prerequisites) {
conditionalExpression =
prerequisites.stream()
.reduce(conditionalExpression, (x, y) -> new And(x, y));
}
public void setIfComponent(List<Component> ifComponents) {
this.ifComponents.addAll(ifComponents);
}
public void setElseComponent(List<Component> elseComponents) {
this.elseComponents.addAll(elseComponents);
}
public void activateIfPanel() {
ifComponents.stream()
.forEach(component -> component.getComponent().setVisible(true));
elseComponents.stream()
.forEach(component -> component.getComponent().setVisible(false));
}
public void activateElsePanel() {
ifComponents.stream()
.forEach(component -> component.getComponent().setVisible(false));
elseComponents.stream()
.forEach(component -> component.getComponent().setVisible(true));
}
public void updateDomain() {
Value value = Evaluator.check(conditionalExpression, valueEnvironment);
if(value.isUndefined()) {
activateElsePanel();
return;
}
if(((BooleanValue) value).getPrimitive()) {
activateIfPanel();
} else {
activateElsePanel();
}
}
@Override
public String toString() {
String ifComps = "-- IF --\n"
+ ifComponents.stream()
.map(Component::toString)
.collect(Collectors.joining("\n"));
String elseComps = "\n-- ELSE --\n"
+ elseComponents.stream()
.map(Component::toString)
.collect(Collectors.joining("\n"));
return ifComps + elseComps;
}
}