diff options
Diffstat (limited to 'libjava/javax/swing/MenuSelectionManager.java')
-rw-r--r-- | libjava/javax/swing/MenuSelectionManager.java | 224 |
1 files changed, 223 insertions, 1 deletions
diff --git a/libjava/javax/swing/MenuSelectionManager.java b/libjava/javax/swing/MenuSelectionManager.java index 9088968..d722b0b 100644 --- a/libjava/javax/swing/MenuSelectionManager.java +++ b/libjava/javax/swing/MenuSelectionManager.java @@ -1,5 +1,5 @@ /* MenuSelectionManager.java -- - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,6 +38,15 @@ exception statement from your version. */ package javax.swing; +import java.awt.Component; +import java.awt.Point; +import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; + +import java.util.Vector; + +import javax.swing.JMenu; +import javax.swing.JMenuItem; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.EventListenerList; @@ -48,6 +57,10 @@ public class MenuSelectionManager protected EventListenerList listenerList = new EventListenerList (); + private static final MenuSelectionManager manager = new MenuSelectionManager(); + + private Vector selection = new Vector(); + protected void fireStateChanged () { ChangeListener[] listeners = getChangeListeners (); @@ -73,4 +86,213 @@ public class MenuSelectionManager { return (ChangeListener[]) listenerList.getListeners (ChangeListener.class); } + + /** + * Unselects all the menu elements on the selection path + */ + public void clearSelectedPath () + { + for (int i = 0; i < selection.size (); i++) + ((MenuElement) selection.get (i)).menuSelectionChanged (false); + + selection.clear (); + } + + public Component componentForPoint (Component source, Point sourcePoint) + { + throw new UnsupportedOperationException("not implemented"); + } + + /** + * Returns shared instance of MenuSelection Manager + * + * @return default Manager + */ + public static MenuSelectionManager defaultManager () + { + return manager; + } + + /** + * Returns path representing current menu selection + * + * @return Current selection path + */ + public MenuElement[] getSelectedPath () + { + MenuElement[] path = new MenuElement[selection.size ()]; + + for (int i = 0; i < path.length; i++) + path[i] = (MenuElement) selection.get (i); + + return path; + } + + /** + * Returns true if specified component is part of current menu + * heirarchy and false otherwise + * + * @param c Component for which to check + * @return True if specified component is part of current menu + */ + boolean isComponentPartOfCurrentMenu (Component c) + { + MenuElement[] subElements; + for (int i = 0; i < selection.size (); i++) + { + subElements = ((MenuElement) selection.get (i)).getSubElements (); + for (int j = 0; j < subElements.length; j++) + { + if ((subElements[j].getComponent ()).equals (c)) + return true; + } + } + + return false; + } + + /** + * DOCUMENT ME! + * + * @param e DOCUMENT ME! + */ + public void processKeyEvent (KeyEvent e) + { + throw new UnsupportedOperationException("not implemented"); + } + + /** + * Forwards given mouse event to all of the source subcomponents. + * + * @param event Mouse event + */ + public void processMouseEvent (MouseEvent event) + { + + Component c = ((MenuElement) event.getSource ()).getComponent (); + if (selection.size () == 0) + { + ((MenuElement) event.getSource ()).processMouseEvent (event, + getPath (c), + manager); + return; + } + + // find the index of the source component in the current menu hierarchy + int i = 0; + for (i = 0; i < selection.size (); i++) + { + MenuElement me = (MenuElement) selection.get (i); + if (me.getComponent ().equals (c)) + break; + } + + // Forward event to all subcomponents of the source + Component subComp; + for (int j = i; j < selection.size (); j++) + { + subComp = ((MenuElement)selection.get (j)).getComponent (); + ((MenuElement) selection.get (j)).processMouseEvent (event, + getPath (subComp), + manager); + } + } + + /** + * Sets menu selection to the specified path + * + * @param path new selection path + */ + public void setSelectedPath (MenuElement[] path) + { + if (path == null) + { + clearSelectedPath (); + return; + } + + int i; + int minSize = path.length; // size of the smaller path. + + if (path.length > selection.size ()) + { + // if new selected path contains more elements then current + // selection then first add all elements at + // the indexes > selection.size + + for (i = selection.size (); i < path.length; i++) + { + selection.add (path[i]); + path[i].menuSelectionChanged (true); + } + + minSize = selection.size (); + } + + else if (path.length < selection.size ()) + { + // if new selected path contains less elements then current + // selection then first remove all elements from the selection + // at the indexes > path.length + + for (i = selection.size () - 1; i >= path.length; i--) + { + ((MenuElement) selection.get (i)).menuSelectionChanged (false); + selection.remove (i); + } + + minSize = path.length; + } + + // Now compare elements in new and current selection path at the + // same location and adjust selection until + // same menu elements will be encountered at the + // same index in both current and new selection path. + + MenuElement oldSelection; + + for (i = minSize - 1; i >= 0; i--) + { + oldSelection = (MenuElement) selection.get (i); + + if (path[i].equals (oldSelection)) + break; + + oldSelection.menuSelectionChanged (false); + path[i].menuSelectionChanged (true); + selection.setElementAt (path[i], i); + } + } + + + /** + * Returns path to the specified component + * + * @param c component for which to find path for + * + * @return path to the specified component + */ + private MenuElement[] getPath (Component c) + { + Vector path = new Vector(); + path.add (c); + + Component parent = c.getParent (); + + while (parent instanceof JMenu + || parent instanceof JPopupMenu + || parent instanceof JMenuItem + || parent instanceof JMenuBar) + { + path.add (parent); + parent = parent.getParent (); + } + + MenuElement[] pathArray = new MenuElement[path.size ()]; + + for (int i = 0; i < path.size (); i++) + pathArray[i] = (MenuElement) path.get (path.size () - i - 1); + return pathArray; + } + } // class MenuSelectionManager |