GNU Classpath (0.20) | |
Frames | No Frames |
1: /* Menu.java -- A Java AWT Menu 2: Copyright (C) 1999, 2002, 2004 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.peer.MenuPeer; 42: import java.io.Serializable; 43: import java.util.Enumeration; 44: import java.util.Vector; 45: 46: import javax.accessibility.AccessibleContext; 47: import javax.accessibility.AccessibleRole; 48: 49: /** 50: * This class represents a pull down or tear off menu in Java's AWT. 51: * 52: * @author Aaron M. Renn (arenn@urbanophile.com) 53: */ 54: public class Menu extends MenuItem implements MenuContainer, Serializable 55: { 56: 57: /* 58: * Static Variables 59: */ 60: 61: // Serialization Constant 62: private static final long serialVersionUID = -8809584163345499784L; 63: 64: /*************************************************************************/ 65: 66: /* 67: * Instance Variables 68: */ 69: 70: /** 71: * @serial The actual items in the menu 72: */ 73: private Vector items = new Vector(); 74: 75: /** 76: * @serial Flag indicating whether or not this menu is a tear off 77: */ 78: private boolean tearOff; 79: 80: /** 81: * @serial Indicates whether or not this is a help menu. 82: */ 83: private boolean isHelpMenu; 84: 85: /* 86: * @serial Unused in this implementation, but present in Sun's 87: * serialization spec. Value obtained via reflection. 88: */ 89: private int menuSerializedDataVersion = 1; 90: 91: static final transient String separatorLabel = "-"; 92: 93: /*************************************************************************/ 94: 95: /* 96: * Constructors 97: */ 98: 99: /** 100: * Initializes a new instance of <code>Menu</code> with no label and that 101: * is not a tearoff; 102: * 103: * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 104: */ 105: public 106: Menu() 107: { 108: } 109: 110: /*************************************************************************/ 111: 112: /** 113: * Initializes a new instance of <code>Menu</code> that is not a tearoff and 114: * that has the specified label. 115: * 116: * @param label The menu label. 117: * 118: * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 119: */ 120: public 121: Menu(String label) 122: { 123: this(label, false); 124: } 125: 126: /*************************************************************************/ 127: 128: /** 129: * Initializes a new instance of <code>Menu</code> with the specified 130: * label and tearoff status. 131: * 132: * @param label The label for this menu 133: * @param isTearOff <code>true</code> if this menu is a tear off menu, 134: * <code>false</code> otherwise. 135: * 136: * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true. 137: */ 138: public 139: Menu(String label, boolean isTearOff) 140: { 141: super(label); 142: 143: tearOff = isTearOff; 144: 145: if (label.equals("Help")) 146: isHelpMenu = true; 147: 148: if (GraphicsEnvironment.isHeadless()) 149: throw new HeadlessException (); 150: } 151: 152: /*************************************************************************/ 153: 154: /* 155: * Instance Methods 156: */ 157: 158: /** 159: * Tests whether or not this menu is a tearoff. 160: * 161: * @return <code>true</code> if this menu is a tearoff, <code>false</code> 162: * otherwise. 163: */ 164: public boolean 165: isTearOff() 166: { 167: return(tearOff); 168: } 169: 170: /*************************************************************************/ 171: 172: /** 173: * Returns the number of items in this menu. 174: * 175: * @return The number of items in this menu. 176: */ 177: public int 178: getItemCount() 179: { 180: return countItems (); 181: } 182: 183: /** 184: * Returns the number of items in this menu. 185: * 186: * @return The number of items in this menu. 187: * 188: * @deprecated As of JDK 1.1, replaced by getItemCount(). 189: */ 190: public int countItems () 191: { 192: return items.size (); 193: } 194: 195: /*************************************************************************/ 196: 197: /** 198: * Returns the item at the specified index. 199: * 200: * @return The item at the specified index. 201: * 202: * @exception ArrayIndexOutOfBoundsException If the index value is not valid. 203: */ 204: public MenuItem 205: getItem(int index) 206: { 207: return((MenuItem)items.elementAt(index)); 208: } 209: 210: /*************************************************************************/ 211: 212: /** 213: * Adds the specified item to this menu. If it was previously part of 214: * another menu, it is first removed from that menu. 215: * 216: * @param item The new item to add. 217: * 218: * @return The item that was added. 219: */ 220: public MenuItem 221: add(MenuItem item) 222: { 223: items.addElement(item); 224: if (item.parent != null) 225: { 226: item.parent.remove(item); 227: } 228: item.parent = this; 229: 230: if (peer != null) 231: { 232: MenuPeer mp = (MenuPeer) peer; 233: mp.addItem(item); 234: } 235: 236: return item; 237: } 238: 239: /*************************************************************************/ 240: 241: /** 242: * Add an item with the specified label to this menu. 243: * 244: * @param label The label of the menu item to add. 245: */ 246: public void 247: add(String label) 248: { 249: add(new MenuItem(label)); 250: } 251: 252: /*************************************************************************/ 253: 254: /** 255: * Inserts the specified menu item into this menu at the specified index. 256: * 257: * @param item The menu item to add. 258: * @param index The index of the menu item. 259: * 260: * @exception IllegalArgumentException If the index is less than zero. 261: * @exception ArrayIndexOutOfBoundsException If the index is otherwise invalid. 262: */ 263: public void 264: insert(MenuItem item, int index) 265: { 266: if (index < 0) 267: throw new IllegalArgumentException("Index is less than zero"); 268: 269: MenuPeer peer = (MenuPeer) getPeer(); 270: if (peer == null) 271: return; 272: 273: int count = getItemCount (); 274: 275: if (index >= count) 276: peer.addItem (item); 277: else 278: { 279: for (int i = count - 1; i >= index; i--) 280: peer.delItem (i); 281: 282: peer.addItem (item); 283: 284: for (int i = index; i < count; i++) 285: peer.addItem ((MenuItem) items.elementAt (i)); 286: } 287: 288: items.insertElementAt(item, index); 289: } 290: 291: /*************************************************************************/ 292: 293: /** 294: * Inserts an item with the specified label into this menu at the specified index. 295: * 296: * @param label The label of the item to add. 297: * @param index The index of the menu item. 298: * 299: * @exception IllegalArgumentException If the index is less than zero. 300: * @exception ArrayIndexOutOfBoundsException If the index is otherwise invalid. 301: */ 302: public void 303: insert(String label, int index) 304: { 305: insert(new MenuItem(label), index); 306: } 307: 308: /*************************************************************************/ 309: 310: /** 311: * Adds a separator bar at the current menu location. 312: */ 313: public void 314: addSeparator() 315: { 316: add(new MenuItem(separatorLabel)); 317: } 318: 319: /*************************************************************************/ 320: 321: /** 322: * Inserts a separator bar at the specified index value. 323: * 324: * @param index The index at which to insert a separator bar. 325: * 326: * @exception IllegalArgumentException If the index is less than zero. 327: * @exception ArrayIndexOutOfBoundsException If the index is otherwise invalid. 328: */ 329: public void 330: insertSeparator(int index) 331: { 332: insert(new MenuItem(separatorLabel), index); 333: } 334: 335: /*************************************************************************/ 336: 337: /** 338: * Deletes the item at the specified index from this menu. 339: * 340: * @param index The index of the item to remove. 341: * 342: * @exception ArrayIndexOutOfBoundsException If the index is otherwise invalid. 343: */ 344: public synchronized void 345: remove(int index) 346: { 347: items.removeElementAt(index); 348: 349: MenuPeer mp = (MenuPeer)getPeer(); 350: if (mp != null) 351: mp.delItem(index); 352: } 353: 354: /*************************************************************************/ 355: 356: /** 357: * Removes the specifed item from the menu. If the specified component 358: * does not exist, this method does nothing. 359: * 360: * @param item The component to remove. 361: */ 362: public void 363: remove(MenuComponent item) 364: { 365: int index = items.indexOf(item); 366: if (index == -1) 367: return; 368: 369: remove(index); 370: } 371: 372: /*************************************************************************/ 373: 374: /** 375: * Removes all the elements from this menu. 376: */ 377: public synchronized void 378: removeAll() 379: { 380: int count = getItemCount(); 381: for(int i = 0; i < count; i++) 382: { 383: // We must always remove item 0. 384: remove(0); 385: } 386: } 387: 388: /*************************************************************************/ 389: 390: /** 391: * Creates the native peer for this object. 392: */ 393: public void 394: addNotify() 395: { 396: if (peer == null) 397: peer = getToolkit().createMenu(this); 398: Enumeration e = items.elements(); 399: while (e.hasMoreElements()) 400: { 401: MenuItem mi = (MenuItem)e.nextElement(); 402: mi.addNotify(); 403: } 404: super.addNotify (); 405: } 406: 407: /*************************************************************************/ 408: 409: /** 410: * Destroys the native peer for this object. 411: */ 412: public void 413: removeNotify() 414: { 415: Enumeration e = items.elements(); 416: while (e.hasMoreElements()) 417: { 418: MenuItem mi = (MenuItem) e.nextElement(); 419: mi.removeNotify(); 420: } 421: super.removeNotify(); 422: } 423: 424: /*************************************************************************/ 425: 426: /** 427: * Returns a debugging string for this menu. 428: * 429: * @return A debugging string for this menu. 430: */ 431: public String 432: paramString() 433: { 434: return (",tearOff=" + tearOff + ",isHelpMenu=" + isHelpMenu 435: + super.paramString()); 436: } 437: 438: /** 439: * Basic Accessibility class for Menu. Details get provided in derived 440: * classes. 441: */ 442: protected class AccessibleAWTMenu extends AccessibleAWTMenuItem 443: { 444: private static final long serialVersionUID = 5228160894980069094L; 445: 446: protected AccessibleAWTMenu() 447: { 448: } 449: 450: public AccessibleRole getAccessibleRole() 451: { 452: return AccessibleRole.MENU; 453: } 454: } 455: 456: /** 457: * Gets the AccessibleContext associated with this <code>Menu</code>. 458: * The context is created, if necessary. 459: * 460: * @return the associated context 461: */ 462: public AccessibleContext getAccessibleContext() 463: { 464: /* Create the context if this is the first request */ 465: if (accessibleContext == null) 466: accessibleContext = new AccessibleAWTMenu(); 467: return accessibleContext; 468: } 469: 470: } // class Menu
GNU Classpath (0.20) |