package net.iplantevin.ql.gui.formcomponents; import net.iplantevin.ql.evaluation.BoolVal; import javax.swing.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; /** * Checkbox widget to put in a AbstractWidgetContainer. An itemStateChanged event will * propagate the value change to the container and then further to the form frame. * * @author Ivan */ public class BoolWidget extends JCheckBox implements IWidget { /** * Constructs a new checkbox widget with the desired dimensions, sets the * default value and adds the ItemListener. * * @param container the AbstractWidgetContainer to use. */ public BoolWidget(AbstractWidgetContainer container) { super("No"); setPreferredSize(container.getPreferredWidgetSize()); setMaximumSize(container.getPreferredWidgetSize()); setDefaultValue(container); addItemListener(new BoolWidgetListener(this, container)); } @Override public void setJComponentValue(Object value) { } @Override public void setDefaultValue(AbstractWidgetContainer container) { setSelected(false); container.setValue(new BoolVal(false)); } /** * Inner ItemListener subclass that performs the necessary actions when * the checkbox is (un)checked by the user. */ class BoolWidgetListener implements ItemListener { final BoolWidget widget; final AbstractWidgetContainer container; final BoolVal TRUE = new BoolVal(true); final BoolVal FALSE = new BoolVal(false); /** * Constructs a new listener for the given BoolWidget and AbstractWidgetContainer. */ public BoolWidgetListener(BoolWidget widget, AbstractWidgetContainer container) { this.widget = widget; this.container = container; } /** * When the checkbox is (un)checked, its text is changed, the container's * value is changed and reEvaluate is called on the container. */ @Override public void itemStateChanged(ItemEvent e) { if (widget.isSelected()) { widget.setText("Yes"); container.setValue(TRUE); } else { widget.setText("No"); container.setValue(FALSE); } container.reEvaluate(); } } }