package ql.ast.form.stat; import java.util.List; import javax.swing.JPanel; import ql.ast.environment.Environment; import ql.ast.expr.exprType.Expr; import ql.ast.form.Form; import ql.ast.form.FormItems; import ql.ast.message.Error; import ql.ast.type.BoolType; import ql.ast.value.Bool; import ql.ast.value.Value; public class IfStatement extends Statement{ private final Expr expr; private final List<FormItems> ifBody; public IfStatement(Expr expr, List<FormItems> ifBody) { this.expr = expr; this.ifBody = ifBody; } public Expr getExpr() { return expr; } public List<FormItems> getIfBody() { return ifBody; } @Override public boolean validate(Environment environment) { boolean valid = true; errors.addAll(expr.checkType(environment)); if (expr.getType(environment) != null && !(expr.getType(environment).equals(new BoolType()))) { errors.add(new Error("Ifstatement: the expression should be a boolean type")); } for (FormItems f : ifBody) { if (!f.validate(environment.getScopeEnvironment(this))) valid = false; } return errors.size() == 0 && valid; } @Override public void buildForm(JPanel panel, Environment environment, Form form) { for (FormItems f : ifBody) { f.buildForm(panel, environment.getScopeEnvironment(this), form); } } @Override public void eval(Environment environment) { setVisible(isExprValid(environment)); evalIfBody(environment); } @Override public void setVisible(Boolean visible) { for (FormItems f : ifBody) { f.setVisible(visible); } } protected boolean isExprValid(Environment environment) { Value expressionValue = expr.eval(environment); return ((Bool)expressionValue).getValue(); } protected void evalIfBody(Environment environment) { if (isExprValid(environment)) { for (FormItems f : ifBody) { f.eval(environment.getScopeEnvironment(this)); } } } }