|  | /* | 
|  | *  Licensed to the Apache Software Foundation (ASF) under one or more | 
|  | *  contributor license agreements.  See the NOTICE file distributed with | 
|  | *  this work for additional information regarding copyright ownership. | 
|  | *  The ASF licenses this file to You under the Apache License, Version 2.0 | 
|  | *  (the "License"); you may not use this file except in compliance with | 
|  | *  the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | *  Unless required by applicable law or agreed to in writing, software | 
|  | *  distributed under the License is distributed on an "AS IS" BASIS, | 
|  | *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | *  See the License for the specific language governing permissions and | 
|  | *  limitations under the License. | 
|  | */ | 
|  |  | 
|  | package java.awt; | 
|  |  | 
|  | import java.awt.event.FocusListener; | 
|  | import java.awt.event.MouseEvent; | 
|  | import java.awt.peer.MenuComponentPeer; | 
|  | import java.io.Serializable; | 
|  | import java.util.Locale; //import javax.accessibility.Accessible; | 
|  | //import javax.accessibility.AccessibleComponent; | 
|  | //import javax.accessibility.AccessibleContext; | 
|  | //import javax.accessibility.AccessibleRole; | 
|  | //import javax.accessibility.AccessibleSelection; | 
|  | //import javax.accessibility.AccessibleStateSet; | 
|  | import org.apache.harmony.awt.gl.MultiRectArea; | 
|  | import org.apache.harmony.awt.state.MenuItemState; | 
|  | import org.apache.harmony.awt.state.MenuState; | 
|  | import org.apache.harmony.luni.util.NotImplementedException; | 
|  |  | 
|  | /** | 
|  | * The MenuComponent abstract class is the superclass for menu components. Menu | 
|  | * components receive and process AWT events. | 
|  | * | 
|  | * @since Android 1.0 | 
|  | */ | 
|  | public abstract class MenuComponent implements Serializable { | 
|  |  | 
|  | /** | 
|  | * The Constant serialVersionUID. | 
|  | */ | 
|  | private static final long serialVersionUID = -4536902356223894379L; | 
|  |  | 
|  | /** | 
|  | * The name. | 
|  | */ | 
|  | private String name; | 
|  |  | 
|  | /** | 
|  | * The font. | 
|  | */ | 
|  | private Font font; | 
|  |  | 
|  | /** | 
|  | * The parent. | 
|  | */ | 
|  | MenuContainer parent; | 
|  |  | 
|  | /** | 
|  | * The deprecated event handler. | 
|  | */ | 
|  | boolean deprecatedEventHandler = true; | 
|  |  | 
|  | /** | 
|  | * The selected item index. | 
|  | */ | 
|  | private int selectedItemIndex; | 
|  |  | 
|  | // ???AWT: private AccessibleContext accessibleContext; | 
|  |  | 
|  | /** | 
|  | * The toolkit. | 
|  | */ | 
|  | final Toolkit toolkit = Toolkit.getDefaultToolkit(); | 
|  |  | 
|  | // ???AWT | 
|  | /* | 
|  | * protected abstract class AccessibleAWTMenuComponent extends | 
|  | * AccessibleContext implements Serializable, AccessibleComponent, | 
|  | * AccessibleSelection { private static final long serialVersionUID = | 
|  | * -4269533416223798698L; public void addFocusListener(FocusListener | 
|  | * listener) { } public boolean contains(Point pt) { return false; } public | 
|  | * Accessible getAccessibleAt(Point pt) { return null; } public Color | 
|  | * getBackground() { return null; } public Rectangle getBounds() { return | 
|  | * null; } public Cursor getCursor() { return null; } public Font getFont() | 
|  | * { return MenuComponent.this.getFont(); } public FontMetrics | 
|  | * getFontMetrics(Font font) { return null; } public Color getForeground() { | 
|  | * return null; } public Point getLocation() { return null; } public Point | 
|  | * getLocationOnScreen() { return null; } public Dimension getSize() { | 
|  | * return null; } public boolean isEnabled() { return true; // always | 
|  | * enabled } public boolean isFocusTraversable() { return true; // always | 
|  | * focus traversable } public boolean isShowing() { return true;// always | 
|  | * showing } public boolean isVisible() { return true; // always visible } | 
|  | * public void removeFocusListener(FocusListener listener) { } public void | 
|  | * requestFocus() { } public void setBackground(Color color) { } public void | 
|  | * setBounds(Rectangle rect) { } public void setCursor(Cursor cursor) { } | 
|  | * public void setEnabled(boolean enabled) { } public void setFont(Font | 
|  | * font) { MenuComponent.this.setFont(font); } public void | 
|  | * setForeground(Color color) { } public void setLocation(Point pt) { } | 
|  | * public void setSize(Dimension pt) { } public void setVisible(boolean | 
|  | * visible) { } public void addAccessibleSelection(int index) { } public | 
|  | * void clearAccessibleSelection() { } public Accessible | 
|  | * getAccessibleSelection(int index) { return null; } public int | 
|  | * getAccessibleSelectionCount() { return 0; } public boolean | 
|  | * isAccessibleChildSelected(int index) { return false; } public void | 
|  | * removeAccessibleSelection(int index) { } public void | 
|  | * selectAllAccessibleSelection() { } | 
|  | * @Override public Accessible getAccessibleChild(int index) { return null; | 
|  | * } | 
|  | * @Override public int getAccessibleChildrenCount() { return 0; } | 
|  | * @Override public AccessibleComponent getAccessibleComponent() { return | 
|  | * this; } | 
|  | * @Override public String getAccessibleDescription() { return | 
|  | * super.getAccessibleDescription(); } | 
|  | * @Override public int getAccessibleIndexInParent() { toolkit.lockAWT(); | 
|  | * try { Accessible aParent = getAccessibleParent(); int aIndex = -1; if | 
|  | * (aParent instanceof MenuComponent) { MenuComponent parent = | 
|  | * (MenuComponent) aParent; int count = parent.getItemCount(); for (int i = | 
|  | * 0; i < count; i++) { MenuComponent comp = parent.getItem(i); if (comp | 
|  | * instanceof Accessible) { aIndex++; if (comp == MenuComponent.this) { | 
|  | * return aIndex; } } } } return -1; } finally { toolkit.unlockAWT(); } } | 
|  | * @Override public String getAccessibleName() { return | 
|  | * super.getAccessibleName(); } | 
|  | * @Override public Accessible getAccessibleParent() { toolkit.lockAWT(); | 
|  | * try { Accessible aParent = super.getAccessibleParent(); if (aParent != | 
|  | * null) { return aParent; } MenuContainer parent = getParent(); if (parent | 
|  | * instanceof Accessible) { aParent = (Accessible) parent; } return aParent; | 
|  | * } finally { toolkit.unlockAWT(); } } | 
|  | * @Override public AccessibleRole getAccessibleRole() { return | 
|  | * AccessibleRole.AWT_COMPONENT; } | 
|  | * @Override public AccessibleSelection getAccessibleSelection() { return | 
|  | * this; } | 
|  | * @Override public AccessibleStateSet getAccessibleStateSet() { return new | 
|  | * AccessibleStateSet(); } | 
|  | * @Override public Locale getLocale() { return Locale.getDefault(); } } | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * The accessor to MenuComponent internal state, utilized by the visual | 
|  | * theme. | 
|  | * | 
|  | * @throws HeadlessException | 
|  | *             the headless exception. | 
|  | */ | 
|  | // ???AWT | 
|  | /* | 
|  | * class State implements MenuState { Dimension size; Dimension getSize() { | 
|  | * if (size == null) { calculate(); } return size; } public int getWidth() { | 
|  | * return getSize().width; } public int getHeight() { return | 
|  | * getSize().height; } public Font getFont() { return | 
|  | * MenuComponent.this.getFont(); } public int getItemCount() { return | 
|  | * MenuComponent.this.getItemCount(); } public int getSelectedItemIndex() { | 
|  | * return MenuComponent.this.getSelectedItemIndex(); } public boolean | 
|  | * isFontSet() { return MenuComponent.this.isFontSet(); } | 
|  | * @SuppressWarnings("deprecation") public FontMetrics getFontMetrics(Font | 
|  | * f) { return MenuComponent.this.toolkit.getFontMetrics(f); } public Point | 
|  | * getLocation() { return MenuComponent.this.getLocation(); } public | 
|  | * MenuItemState getItem(int index) { MenuItem item = | 
|  | * MenuComponent.this.getItem(index); return item.itemState; } public void | 
|  | * setSize(int w, int h) { this.size = new Dimension(w, h); } void | 
|  | * calculate() { size = new Dimension(); | 
|  | * size.setSize(toolkit.theme.calculateMenuSize(this)); } void reset() { for | 
|  | * (int i = 0; i < getItemCount(); i++) { ((MenuItem.State) | 
|  | * getItem(i)).reset(); } } } | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * Pop-up box for menu. It transfers the paint events, keyboard and mouse | 
|  | * events to the menu component itself. | 
|  | */ | 
|  | // ???AWT | 
|  | /* | 
|  | * class MenuPopupBox extends PopupBox { private final Point lastMousePos = | 
|  | * new Point(); | 
|  | * @Override boolean isMenu() { return true; } | 
|  | * @Override void paint(Graphics gr) { MenuComponent.this.paint(gr); } | 
|  | * @Override void onKeyEvent(int eventId, int vKey, long when, int | 
|  | * modifiers) { MenuComponent.this.onKeyEvent(eventId, vKey, when, | 
|  | * modifiers); } | 
|  | * @Override void onMouseEvent(int eventId, Point where, int mouseButton, | 
|  | * long when, int modifiers, int wheelRotation) { // prevent conflict of | 
|  | * mouse and keyboard // when sub-menu drops down due to keyboard navigation | 
|  | * if (lastMousePos.equals(where) && (eventId == MouseEvent.MOUSE_MOVED || | 
|  | * eventId == MouseEvent.MOUSE_ENTERED)) { return; } | 
|  | * lastMousePos.setLocation(where); MenuComponent.this.onMouseEvent(eventId, | 
|  | * where, mouseButton, when, modifiers); } } | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * Instantiates a new MenuComponent object. | 
|  | * | 
|  | * @throws HeadlessException | 
|  | *             if the graphical interface environment can't support | 
|  | *             MenuComponents. | 
|  | */ | 
|  | public MenuComponent() throws HeadlessException { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | Toolkit.checkHeadless(); | 
|  | name = autoName(); | 
|  | selectedItemIndex = -1; | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets the name of the MenuComponent object. | 
|  | * | 
|  | * @return the name of the MenuComponent object. | 
|  | */ | 
|  | public String getName() { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | return name; | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns a String representation of the MenuComponent object. | 
|  | * | 
|  | * @return a String representation of the MenuComponent object. | 
|  | */ | 
|  | @Override | 
|  | public String toString() { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | return getClass().getName() + "[" + paramString() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets the parent menu container. | 
|  | * | 
|  | * @return the parent. | 
|  | */ | 
|  | public MenuContainer getParent() { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | return parent; | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Sets the name of the MenuComponent to the specified string. | 
|  | * | 
|  | * @param name | 
|  | *            the new name of the MenuComponent object. | 
|  | */ | 
|  | public void setName(String name) { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | this.name = name; | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Dispatches AWT event. | 
|  | * | 
|  | * @param event | 
|  | *            the AWTEvent. | 
|  | */ | 
|  | public final void dispatchEvent(AWTEvent event) { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | processEvent(event); | 
|  | if (deprecatedEventHandler) { | 
|  | postDeprecatedEvent(event); | 
|  | } | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Post deprecated event. | 
|  | * | 
|  | * @param event | 
|  | *            the event. | 
|  | */ | 
|  | void postDeprecatedEvent(AWTEvent event) { | 
|  | Event evt = event.getEvent(); | 
|  | if (evt != null) { | 
|  | postEvent(evt); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets the peer of the MenuComponent; an application must not use this | 
|  | * method directly. | 
|  | * | 
|  | * @return the MenuComponentPeer object. | 
|  | * @throws NotImplementedException | 
|  | *             if this method is not implemented by a subclass. | 
|  | * @deprecated an application must not use this method directly. | 
|  | */ | 
|  | @Deprecated | 
|  | public MenuComponentPeer getPeer() throws org.apache.harmony.luni.util.NotImplementedException { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | if (true) { | 
|  | throw new RuntimeException("Method is not implemented"); //TODO: implement //$NON-NLS-1$ | 
|  | } | 
|  | return null; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets the locking object of this MenuComponent. | 
|  | * | 
|  | * @return the locking object of this MenuComponent. | 
|  | */ | 
|  | protected final Object getTreeLock() { | 
|  | return toolkit.awtTreeLock; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Posts the Event to the MenuComponent. | 
|  | * | 
|  | * @param e | 
|  | *            the Event. | 
|  | * @return true, if the event is posted successfully, false otherwise. | 
|  | * @deprecated Replaced dispatchEvent method. | 
|  | */ | 
|  | @SuppressWarnings("deprecation") | 
|  | @Deprecated | 
|  | public boolean postEvent(Event e) { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | if (parent != null) { | 
|  | return parent.postEvent(e); | 
|  | } | 
|  | return false; | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns the string representation of the MenuComponent state. | 
|  | * | 
|  | * @return returns the string representation of the MenuComponent state. | 
|  | */ | 
|  | protected String paramString() { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | return getName(); | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | // ???AWT | 
|  | /* | 
|  | * public AccessibleContext getAccessibleContext() { toolkit.lockAWT(); try | 
|  | * { if (accessibleContext == null) { accessibleContext = | 
|  | * createAccessibleContext(); } return accessibleContext; } finally { | 
|  | * toolkit.unlockAWT(); } } | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * Gets the font of the MenuComponent object. | 
|  | * | 
|  | * @return the Font of the MenuComponent object. | 
|  | */ | 
|  | public Font getFont() { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | if (font == null && hasDefaultFont()) { | 
|  | return toolkit.getDefaultFont(); | 
|  | } | 
|  | if (font == null && parent != null) { | 
|  | return parent.getFont(); | 
|  | } | 
|  | return font; | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Checks if is font set. | 
|  | * | 
|  | * @return true, if is font set | 
|  | */ | 
|  | boolean isFontSet() { | 
|  | return font != null | 
|  | || ((parent instanceof MenuComponent) && ((MenuComponent)parent).isFontSet()); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Checks for default font. | 
|  | * | 
|  | * @return true, if successful. | 
|  | */ | 
|  | boolean hasDefaultFont() { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Processes an AWTEevent on this menu component. | 
|  | * | 
|  | * @param event | 
|  | *            the AWTEvent. | 
|  | */ | 
|  | protected void processEvent(AWTEvent event) { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | // do nothing | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Removes the peer of the MenuComponent. | 
|  | */ | 
|  | public void removeNotify() { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Sets the Font for this MenuComponent object. | 
|  | * | 
|  | * @param font | 
|  | *            the new Font to be used for this MenuComponent. | 
|  | */ | 
|  | public void setFont(Font font) { | 
|  | toolkit.lockAWT(); | 
|  | try { | 
|  | this.font = font; | 
|  | } finally { | 
|  | toolkit.unlockAWT(); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Sets the parent. | 
|  | * | 
|  | * @param parent | 
|  | *            the new parent. | 
|  | */ | 
|  | void setParent(MenuContainer parent) { | 
|  | this.parent = parent; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets the location. | 
|  | * | 
|  | * @return the location. | 
|  | */ | 
|  | Point getLocation() { | 
|  | // to be overridden | 
|  | return new Point(0, 0); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets the width. | 
|  | * | 
|  | * @return the width. | 
|  | */ | 
|  | int getWidth() { | 
|  | // to be overridden | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets the height. | 
|  | * | 
|  | * @return the height. | 
|  | */ | 
|  | int getHeight() { | 
|  | // to be overridden | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Recursively find the menu item for a menu shortcut. | 
|  | * | 
|  | * @param gr | 
|  | *            the gr. | 
|  | * @return the menu item; or null if the item is not available for this | 
|  | *         shortcut. | 
|  | */ | 
|  | // ???AWT | 
|  | /* | 
|  | * MenuItem getShortcutMenuItemImpl(MenuShortcut ms) { if (ms == null) { | 
|  | * return null; } for (int i = 0; i < getItemCount(); i++) { MenuItem mi = | 
|  | * getItem(i); if (mi instanceof Menu) { mi = ((Menu) | 
|  | * mi).getShortcutMenuItemImpl(ms); if (mi != null) { return mi; } } else if | 
|  | * (ms.equals(mi.getShortcut())) { return mi; } } return null; } | 
|  | */ | 
|  |  | 
|  | void paint(Graphics gr) { | 
|  | gr.setColor(Color.LIGHT_GRAY); | 
|  | gr.fillRect(0, 0, getWidth(), getHeight()); | 
|  | gr.setColor(Color.BLACK); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Mouse events handler. | 
|  | * | 
|  | * @param eventId | 
|  | *            one of the MouseEvent.MOUSE_* constants. | 
|  | * @param where | 
|  | *            mouse location. | 
|  | * @param mouseButton | 
|  | *            mouse button that was pressed or released. | 
|  | * @param when | 
|  | *            event time. | 
|  | * @param modifiers | 
|  | *            input event modifiers. | 
|  | */ | 
|  | void onMouseEvent(int eventId, Point where, int mouseButton, long when, int modifiers) { | 
|  | // to be overridden | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Keyboard event handler. | 
|  | * | 
|  | * @param eventId | 
|  | *            one of the KeyEvent.KEY_* constants. | 
|  | * @param vKey | 
|  | *            the key code. | 
|  | * @param when | 
|  | *            event time. | 
|  | * @param modifiers | 
|  | *            input event modifiers. | 
|  | */ | 
|  | void onKeyEvent(int eventId, int vKey, long when, int modifiers) { | 
|  | // to be overridden | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Post the ActionEvent or ItemEvent, depending on type of the menu item. | 
|  | * | 
|  | * @param index | 
|  | *            the index. | 
|  | * @return the item rect. | 
|  | */ | 
|  | // ???AWT | 
|  | /* | 
|  | * void fireItemAction(int item, long when, int modifiers) { MenuItem mi = | 
|  | * getItem(item); mi.itemSelected(when, modifiers); } MenuItem getItem(int | 
|  | * index) { // to be overridden return null; } int getItemCount() { return | 
|  | * 0; } | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * @return The sub-menu of currently selecetd item, or null if such a | 
|  | *         sub-menu is not available. | 
|  | */ | 
|  | // ???AWT | 
|  | /* | 
|  | * Menu getSelectedSubmenu() { if (selectedItemIndex < 0) { return null; } | 
|  | * MenuItem item = getItem(selectedItemIndex); return (item instanceof Menu) | 
|  | * ? (Menu) item : null; } | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * Convenience method for selectItem(index, true). | 
|  | */ | 
|  | // ???AWT | 
|  | /* | 
|  | * void selectItem(int index) { selectItem(index, true); } | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * Change the selection in the menu. | 
|  | * | 
|  | * @param index | 
|  | *            new selecetd item's index. | 
|  | * @param showSubMenu | 
|  | *            if new selected item has a sub-menu, should that sub-menu be | 
|  | *            displayed. | 
|  | */ | 
|  | // ???AWT | 
|  | /* | 
|  | * void selectItem(int index, boolean showSubMenu) { if (selectedItemIndex | 
|  | * == index) { return; } if (selectedItemIndex >= 0 && | 
|  | * getItem(selectedItemIndex) instanceof Menu) { ((Menu) | 
|  | * getItem(selectedItemIndex)).hide(); } MultiRectArea clip = | 
|  | * getUpdateClip(index, selectedItemIndex); selectedItemIndex = index; | 
|  | * Graphics gr = getGraphics(clip); if (gr != null) { paint(gr); } if | 
|  | * (showSubMenu) { showSubMenu(selectedItemIndex); } } | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * Change the selected item to the next one in the requested direction | 
|  | * moving cyclically, skipping separators | 
|  | * | 
|  | * @param forward | 
|  | *            the direction to move the selection. | 
|  | * @param showSubMenu | 
|  | *            if new selected item has a sub-menu, should that sub-menu be | 
|  | *            displayed. | 
|  | */ | 
|  | // ???AWT | 
|  | /* | 
|  | * void selectNextItem(boolean forward, boolean showSubMenu) { int selected | 
|  | * = getSelectedItemIndex(); int count = getItemCount(); if (count == 0) { | 
|  | * return; } if (selected < 0) { selected = (forward ? count - 1 : 0); } int | 
|  | * i = selected; do { i = (forward ? (i + 1) : (i + count - 1)) % count; i | 
|  | * %= count; MenuItem item = getItem(i); if (!"-".equals(item.getLabel())) { | 
|  | * //$NON-NLS-1$ selectItem(i, showSubMenu); return; } } while (i != | 
|  | * selected); } void showSubMenu(int index) { if ((index < 0) || | 
|  | * !isActive()) { return; } MenuItem item = getItem(index); if (item | 
|  | * instanceof Menu) { Menu menu = ((Menu) getItem(index)); if | 
|  | * (menu.getItemCount() == 0) { return; } Point location = | 
|  | * getSubmenuLocation(index); menu.show(location.x, location.y, false); } } | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * @return the menu bar which is the root of current menu's hierarchy; or | 
|  | *         null if the hierarchy root is not a menu bar. | 
|  | */ | 
|  | // ???AWT | 
|  | /* | 
|  | * MenuBar getMenuBar() { if (parent instanceof MenuBar) { return (MenuBar) | 
|  | * parent; } if (parent instanceof MenuComponent) { return ((MenuComponent) | 
|  | * parent).getMenuBar(); } return null; } PopupBox getPopupBox() { return | 
|  | * null; } | 
|  | */ | 
|  |  | 
|  | Rectangle getItemRect(int index) { | 
|  | // to be overridden | 
|  | return null; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Determine the clip region when menu selection is changed from index1 to | 
|  | * index2. | 
|  | * | 
|  | * @param index1 | 
|  | *            old selected item. | 
|  | * @param index2 | 
|  | *            new selected item. | 
|  | * @return the region to repaint. | 
|  | */ | 
|  | final MultiRectArea getUpdateClip(int index1, int index2) { | 
|  | MultiRectArea clip = new MultiRectArea(); | 
|  | if (index1 >= 0) { | 
|  | clip.add(getItemRect(index1)); | 
|  | } | 
|  | if (index2 >= 0) { | 
|  | clip.add(getItemRect(index2)); | 
|  | } | 
|  | return clip; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets the submenu location. | 
|  | * | 
|  | * @param index | 
|  | *            the index. | 
|  | * @return the submenu location. | 
|  | */ | 
|  | Point getSubmenuLocation(int index) { | 
|  | // to be overridden | 
|  | return new Point(0, 0); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets the selected item index. | 
|  | * | 
|  | * @return the selected item index. | 
|  | */ | 
|  | int getSelectedItemIndex() { | 
|  | return selectedItemIndex; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Hide. | 
|  | */ | 
|  | void hide() { | 
|  | selectedItemIndex = -1; | 
|  | if (parent instanceof MenuComponent) { | 
|  | ((MenuComponent)parent).itemHidden(this); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Item hidden. | 
|  | * | 
|  | * @param mc | 
|  | *            the mc. | 
|  | */ | 
|  | void itemHidden(MenuComponent mc) { | 
|  | // to be overridden | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Checks if is visible. | 
|  | * | 
|  | * @return true, if is visible. | 
|  | */ | 
|  | boolean isVisible() { | 
|  | return true; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Checks if is active. | 
|  | * | 
|  | * @return true, if is active. | 
|  | */ | 
|  | boolean isActive() { | 
|  | return true; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Hide all menu hierarchy. | 
|  | */ | 
|  | void endMenu() { | 
|  | // ???AWT: toolkit.dispatcher.popupDispatcher.deactivateAll(); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Handle the mouse click or Enter key event on a menu's item. | 
|  | * | 
|  | * @param when | 
|  | *            the event time. | 
|  | * @param modifiers | 
|  | *            input event modifiers. | 
|  | */ | 
|  | void itemSelected(long when, int modifiers) { | 
|  | endMenu(); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Auto name. | 
|  | * | 
|  | * @return the string. | 
|  | */ | 
|  | String autoName() { | 
|  | String name = getClass().getName(); | 
|  | if (name.indexOf("$") != -1) { //$NON-NLS-1$ | 
|  | return null; | 
|  | } | 
|  | // ???AWT: int number = toolkit.autoNumber.nextMenuComponent++; | 
|  | int number = 0; | 
|  | name = name.substring(name.lastIndexOf(".") + 1) + Integer.toString(number); //$NON-NLS-1$ | 
|  | return name; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Creates the Graphics object for the pop-up box of this menu component. | 
|  | * | 
|  | * @param clip | 
|  | *            the clip to set on this Graphics. | 
|  | * @return the created Graphics object, or null if such object is not | 
|  | *         available. | 
|  | */ | 
|  | Graphics getGraphics(MultiRectArea clip) { | 
|  | // to be overridden | 
|  | return null; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @return accessible context specific for particular menu component. | 
|  | */ | 
|  | // ???AWT | 
|  | /* | 
|  | * AccessibleContext createAccessibleContext() { return null; } | 
|  | */ | 
|  | } |