[gui][PATCH] MenuSelectionManager

Olga Rodimina rodimina@redhat.com
Wed Apr 21 21:23:00 GMT 2004


Hi,

Here is the patch that adds and implements most of the methods in
MenuSelectionManager.java. 

I will be committing this patch to java-gui-branch.

Olga.
-------------- next part --------------
? .snprj
? libjava.proj
? patch
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.2660.2.68
diff -c -p -u -r1.2660.2.68 ChangeLog
--- ChangeLog	19 Apr 2004 19:46:04 -0000	1.2660.2.68
+++ ChangeLog	21 Apr 2004 19:35:35 -0000
@@ -1,3 +1,15 @@
+2004-04-21  Olga Rodimina  <rodimina@redhat.com>
+
+	* javax/swing/MenuSelectionManager.java
+	(componentForPoint): Added new method. 
+	(defaultManager): New Method. Implemented.
+	(getSelectedPath): Ditto.
+	(isComponentPartOfCurrentMenu): Ditto.
+	(processKeyEvent): Added new method.
+	(processMouseEvent): New Method. Implemented.
+	(setSelectedPath): Ditto.
+	(getPath): Ditto.
+
 2004-04-19  Kim Ho  <kho@redhat.com>
 
 	* java/awt/Container.java: 
Index: javax/swing/MenuSelectionManager.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/MenuSelectionManager.java,v
retrieving revision 1.2
diff -c -p -u -r1.2 MenuSelectionManager.java
--- javax/swing/MenuSelectionManager.java	19 Jun 2003 16:30:09 -0000	1.2
+++ javax/swing/MenuSelectionManager.java	21 Apr 2004 19:35:36 -0000
@@ -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


More information about the Java-patches mailing list