/* Alloy Analyzer 4 -- Copyright (c) 2006-2009, Felix Chang * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package edu.mit.csail.sdg.alloy4; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; /** Graphical checkbox. * * <p><b>Thread Safety:</b> Can be called only by the AWT event thread. */ public abstract class OurCheckbox extends JPanel { /** This ensures the class can be serialized reliably. */ private static final long serialVersionUID = 0; /** The icon to use when the checkbox is off. */ public static final Icon OFF = OurUtil.loadIcon("images/cb0.gif"); /** The icon to use when the checkbox is on. */ public static final Icon ON = OurUtil.loadIcon("images/cb1.gif"); /** The icon to use when the checkbox is off entirely. */ public static final Icon ALL_OFF = OurUtil.loadIcon("images/tcb01.gif"); /** The icon to use when the checkbox is on entirely. */ public static final Icon ALL_ON = OurUtil.loadIcon("images/tcb02.gif"); /** The icon to use when the checkbox is off due to inheritance. */ public static final Icon INH_OFF = OurUtil.loadIcon("images/tcb03.gif"); /** The icon to use when the checkbox is on due to inheritance. */ public static final Icon INH_ON = OurUtil.loadIcon("images/tcb04.gif"); /** The underlying JCheckBox object. */ private final JCheckBox jbox; /** The JLabel object for displaying a label next to the checkbox. */ private final JLabel jlabel; /** Constructs a OurCheckbox object. * @param label - the label to display next to the checkbox * @param tooltip - the tool tip to show when the mouse hovers over this checkbox * @param icon - the initial icon to display (should be one of ON/OFF/ALL_ON/ALL_OFF/INH_ON/INH_OFF) */ public OurCheckbox(String label, String tooltip, Icon icon) { setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); jbox = new JCheckBox(icon); jbox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Icon icon = do_action(); if (icon != jbox.getIcon()) jbox.setIcon(icon); } }); jbox.setMaximumSize(jbox.getPreferredSize()); jbox.setToolTipText(tooltip); jlabel = OurUtil.label(label, tooltip); if (icon==ON || icon==OFF) { add(jbox); add(jlabel); } else { add(jlabel); add(jbox); } setAlignmentX(RIGHT_ALIGNMENT); } /** This method is called when the user clicks on the checkbox; subclasses should override this to provide the custom behavior. */ public abstract Icon do_action(); /** This method is called by Swing to enable/disable a component. */ @Override public final void setEnabled(boolean enabled) { if (jbox != null) jbox.setEnabled(enabled); if (jlabel != null) jlabel.setEnabled(enabled); // jbox and jlabel may be null if during the constructor, some method call causes Swing to call this method early } /** This method is called by Swing to change its background color. */ @Override public final void setBackground(Color color) { super.setBackground(color); if (jbox != null) jbox.setBackground(color); if (jlabel != null) jlabel.setBackground(color); // jbox and jlabel may be null if during the constructor, some method call causes Swing to call this method early } }