package gui.component;
import expr.Ident;
import expr.operation.Operation;
import gui.render.Renderer;
import gui.render.State;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Map;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import ast.evaluate.Bool;
import ast.evaluate.Value;
import ast.form.Form;
import ast.form.IfElse;
import ast.form.Ifstate;
import ast.form.Statement;
public class CheckBox extends Control implements ItemListener {
private JCheckBox checkBox;
private Form form;
private State state;
private Ident id;
Ident elseLHS;
Ifstate ElseIfNode;
public CheckBox(String description, Ident id, Form form, State state) {
super();
this.form = form;
this.state = state;
this.id = id;
checkBox = new JCheckBox(description, false);
checkBox.setName(id.id);
checkBox.addItemListener(this);
}
@Override
public void itemStateChanged(ItemEvent arg0) {
publishEventChange();
JPanel frame1 = (JPanel)checkBox.getParent();
Component[] components = frame1.getComponents();
Component jcomponent = null;
for (int j = 0; j < components.length; j++) {
jcomponent = components[j];
if (jcomponent instanceof JCheckBox) {
if(!((JCheckBox) jcomponent).isSelected())
{
jcomponent.setEnabled(false);
}
}
}
Renderer r = new Renderer(state, form);
ArrayList<Statement> formStatement = form.getStatements().getList();
JComponent currPanel = null;
JPanel frame = (JPanel) checkBox.getParent().getParent();
Map<String, Value> env = state.getEnvValues();
// System.out.println(((Bool)env.get(id.id)).getValue());
frame.setLayout(new GridBagLayout());
if (checkBox.isSelected() == true) {
for (int i = 0; i < formStatement.size(); i++) {
if (formStatement.get(i).getClass() == IfElse.class) {
IfElse IfNode = (IfElse) formStatement.get(i);
Operation EqExpression = (Operation) IfNode.getExpr();
Ident ifLHS = ((Ident) EqExpression.getLhs());
ArrayList<Statement> elseNode = IfNode.getStatement1()
.getList();
for (int j = 0; j < elseNode.size(); j++) {
if (elseNode.get(j).getClass() == Ifstate.class) {
ElseIfNode = (Ifstate) elseNode.get(j);
Operation EqExpression1 = (Operation) ElseIfNode
.getExpr();
elseLHS = ((Ident) EqExpression1.getLhs());
}
if (checkBox.getName().equals(ifLHS.id)
&& ((Bool) env.get(id.id)).getValue() == true) {
ArrayList<Statement> ifStatement = IfNode
.getStatements().getList();
for (int k = 0; k < ifStatement.size(); k++) {
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 1;
currPanel = ifStatement.get(k).accept(r);
frame.add(currPanel, c);
frame.revalidate();
frame.repaint();
}
} else if (checkBox.getName().equals(elseLHS.id)
&& ((Bool) env.get(id.id)).getValue() == true) {
ArrayList<Statement> elseStatement = ElseIfNode
.getStatements().getList();
for (int g = 0; g < elseStatement.size(); g++) {
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 1;
currPanel = elseStatement.get(g).accept(r);
frame.add(currPanel, c);
frame.revalidate();
frame.repaint();
}
}
// }
}
}
}
} else if (checkBox.isSelected() == false) {
for (int j = 0; j < components.length; j++) {
jcomponent = components[j];
if (jcomponent instanceof JCheckBox) {
if(!((JCheckBox) jcomponent).isSelected())
{
jcomponent.setEnabled(true);
}
}
}
Component[] comp = frame.getComponents();
Component component = null;
for (int j = 1; j < comp.length; j++) {
component = comp[j];
frame.remove(component);
}
}
frame.revalidate();
frame.repaint();
// parentPanel.getComponent(n).setVisible(false);
}
@Override
public JComponent getComponent() {
return checkBox;
}
@Override
public Value getValue() {
return new Bool(checkBox.isSelected());
}
}