Frames | No Frames |
1: /* CheckboxMenuItem.java -- A menu option with a checkbox on it. 2: Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2, or (at your option) 9: any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; see the file COPYING. If not, write to the 18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19: 02110-1301 USA. 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: 39: package java.awt; 40: 41: import java.awt.event.ItemEvent; 42: import java.awt.event.ItemListener; 43: import java.awt.peer.CheckboxMenuItemPeer; 44: import java.util.EventListener; 45: 46: import javax.accessibility.Accessible; 47: import javax.accessibility.AccessibleAction; 48: import javax.accessibility.AccessibleContext; 49: import javax.accessibility.AccessibleValue; 50: 51: /** 52: * This class implements a menu item that has a checkbox on it indicating 53: * the selected state of some option. 54: * 55: * @author Aaron M. Renn (arenn@urbanophile.com) 56: * @author Tom Tromey (tromey@redhat.com) 57: */ 58: public class CheckboxMenuItem extends MenuItem 59: implements ItemSelectable, Accessible 60: { 61: 62: /* 63: * Static Variables 64: */ 65: 66: /** 67: * The number used to generate the name returned by getName. 68: */ 69: private static transient long next_chkmenuitem_number; 70: 71: // Serialization constant 72: private static final long serialVersionUID = 6190621106981774043L; 73: 74: /* 75: * Instance Variables 76: */ 77: 78: /** 79: * @serial The state of the checkbox, with <code>true</code> being on and 80: * <code>false</code> being off. 81: */ 82: private boolean state; 83: 84: // List of registered ItemListeners 85: private transient ItemListener item_listeners; 86: 87: /*************************************************************************/ 88: 89: /* 90: * Constructors 91: */ 92: 93: /** 94: * Initializes a new instance of <code>CheckboxMenuItem</code> with no 95: * label and an initial state of off. 96: * 97: * @exception HeadlessException If GraphicsEnvironment.isHeadless() 98: * returns true. 99: */ 100: public 101: CheckboxMenuItem() 102: { 103: this("", false); 104: } 105: 106: /*************************************************************************/ 107: 108: /** 109: * Initializes a new instance of <code>CheckboxMenuItem</code> with the 110: * specified label and an initial state of off. 111: * 112: * @param label The label of the menu item. 113: * 114: * @exception HeadlessException If GraphicsEnvironment.isHeadless() 115: * returns true. 116: */ 117: public 118: CheckboxMenuItem(String label) 119: { 120: this(label, false); 121: } 122: 123: /*************************************************************************/ 124: 125: /** 126: * Initializes a new instance of <code>CheckboxMenuItem</code> with the 127: * specified label and initial state. 128: * 129: * @param label The label of the menu item. 130: * @param state The initial state of the menu item, where <code>true</code> 131: * is on, and <code>false</code> is off. 132: * 133: * @exception HeadlessException If GraphicsEnvironment.isHeadless() 134: * returns true. 135: */ 136: public 137: CheckboxMenuItem(String label, boolean state) 138: { 139: super(label); 140: this.state = state; 141: 142: if (GraphicsEnvironment.isHeadless()) 143: throw new HeadlessException (); 144: } 145: 146: /*************************************************************************/ 147: 148: /* 149: * Instance Methods 150: */ 151: 152: /** 153: * Returns the state of this menu item. 154: * 155: * @return The state of this menu item. 156: */ 157: public boolean 158: getState() 159: { 160: return(state); 161: } 162: 163: /*************************************************************************/ 164: 165: /** 166: * Sets the state of this menu item. 167: * 168: * @param state The initial state of the menu item, where <code>true</code> 169: * is on, and <code>false</code> is off. 170: */ 171: public synchronized void 172: setState(boolean state) 173: { 174: this.state = state; 175: if (peer != null) 176: { 177: CheckboxMenuItemPeer cp = (CheckboxMenuItemPeer) peer; 178: cp.setState (state); 179: } 180: } 181: 182: /*************************************************************************/ 183: 184: /** 185: * Returns an array of length 1 with the menu item label for this object 186: * if the state is on. Otherwise <code>null</code> is returned. 187: * 188: * @return An array with this menu item's label if it has a state of on, 189: * or <code>null</code> otherwise. 190: */ 191: public Object[] 192: getSelectedObjects() 193: { 194: if (state == false) 195: return(null); 196: 197: Object[] obj = new Object[1]; 198: obj[0] = getLabel(); 199: 200: return(obj); 201: } 202: 203: /*************************************************************************/ 204: 205: /** 206: * Create's this object's native peer 207: */ 208: public synchronized void 209: addNotify() 210: { 211: if (peer == null) 212: peer = getToolkit().createCheckboxMenuItem(this); 213: 214: super.addNotify (); 215: } 216: 217: /*************************************************************************/ 218: 219: /** 220: * Adds the specified listener to the list of registered item listeners 221: * for this object. 222: * 223: * @param listener The listener to add. 224: */ 225: public synchronized void 226: addItemListener(ItemListener listener) 227: { 228: item_listeners = AWTEventMulticaster.add(item_listeners, listener); 229: 230: enableEvents(AWTEvent.ITEM_EVENT_MASK); 231: } 232: 233: /*************************************************************************/ 234: 235: /** 236: * Removes the specified listener from the list of registered item 237: * listeners for this object. 238: * 239: * @param listener The listener to remove. 240: */ 241: public synchronized void 242: removeItemListener(ItemListener listener) 243: { 244: item_listeners = AWTEventMulticaster.remove(item_listeners, listener); 245: } 246: 247: /*************************************************************************/ 248: 249: /** 250: * Processes the specified event by calling <code>processItemEvent()</code> 251: * if it is an instance of <code>ItemEvent</code> or calling the superclass 252: * method otherwise. 253: * 254: * @param event The event to process. 255: */ 256: protected void 257: processEvent(AWTEvent event) 258: { 259: if (event instanceof ItemEvent) 260: processItemEvent((ItemEvent)event); 261: else 262: super.processEvent(event); 263: } 264: 265: /*************************************************************************/ 266: 267: /** 268: * Processes the specified event by dispatching it to any registered listeners. 269: * 270: * @param event The event to process. 271: */ 272: protected void 273: processItemEvent(ItemEvent event) 274: { 275: if (item_listeners != null) 276: item_listeners.itemStateChanged(event); 277: } 278: 279: void 280: dispatchEventImpl(AWTEvent e) 281: { 282: if (e instanceof ItemEvent) 283: { 284: synchronized (this) 285: { 286: state = (((ItemEvent) e).getStateChange() == ItemEvent.SELECTED); 287: } 288: } 289: 290: if (e.id <= ItemEvent.ITEM_LAST 291: && e.id >= ItemEvent.ITEM_FIRST 292: && (item_listeners != null 293: || (eventMask & AWTEvent.ITEM_EVENT_MASK) != 0)) 294: processEvent(e); 295: else 296: super.dispatchEventImpl(e); 297: } 298: 299: /*************************************************************************/ 300: 301: /** 302: * Returns a debugging string for this object. 303: * 304: * @return A debugging string for this object. 305: */ 306: public String 307: paramString() 308: { 309: return ("label=" + getLabel() + ",state=" + state 310: + "," + super.paramString()); 311: } 312: 313: /** 314: * Returns an array of all the objects currently registered as FooListeners 315: * upon this <code>CheckboxMenuItem</code>. FooListeners are registered using 316: * the addFooListener method. 317: * 318: * @exception ClassCastException If listenerType doesn't specify a class or 319: * interface that implements java.util.EventListener. 320: */ 321: public <T extends EventListener> T[] getListeners (Class<T> listenerType) 322: { 323: if (listenerType == ItemListener.class) 324: return AWTEventMulticaster.getListeners (item_listeners, listenerType); 325: 326: return super.getListeners (listenerType); 327: } 328: 329: /** 330: * Returns an aray of all item listeners currently registered to this 331: * <code>CheckBoxMenuItem</code>. 332: */ 333: public ItemListener[] getItemListeners () 334: { 335: return (ItemListener[]) getListeners (ItemListener.class); 336: } 337: 338: 339: protected class AccessibleAWTCheckboxMenuItem extends AccessibleAWTMenuItem 340: implements AccessibleAction, AccessibleValue 341: { 342: // I think the base class provides the necessary implementation 343: 344: private static final long serialVersionUID = -1122642964303476L; 345: } 346: 347: /** 348: * Gets the AccessibleContext associated with this <code>CheckboxMenuItem</code>. 349: * The context is created, if necessary. 350: * 351: * @return the associated context 352: */ 353: public AccessibleContext getAccessibleContext() 354: { 355: /* Create the context if this is the first request */ 356: if (accessibleContext == null) 357: accessibleContext = new AccessibleAWTCheckboxMenuItem(); 358: return accessibleContext; 359: } 360: 361: /** 362: * Generate a unique name for this <code>CheckboxMenuItem</code>. 363: * 364: * @return A unique name for this <code>CheckboxMenuItem</code>. 365: */ 366: String generateName() 367: { 368: return "chkmenuitem" + getUniqueLong(); 369: } 370: 371: private static synchronized long getUniqueLong() 372: { 373: return next_chkmenuitem_number++; 374: } 375: 376: } // class CheckboxMenuItem