aboutsummaryrefslogtreecommitdiff
path: root/libjava/javax/swing/MenuSelectionManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/javax/swing/MenuSelectionManager.java')
-rw-r--r--libjava/javax/swing/MenuSelectionManager.java224
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