PatchSet 4306 
Date: 2004/01/10 18:35:52
Author: dalibor
Branch: HEAD
Tag: (none) 
Log:
Resynced with GNU Classpath

2004-01-09  Dalibor Topic <[EMAIL PROTECTED]>

        Resynced with GNU Classpath.

        2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>

        * javax/swing/event/EventListenerList.java (toString): Implemented.

        2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>

        * javax/swing/event/EventListenerList.java: Document typical usage.
        (getListeners): Re-written.

        2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>

        Fix for Classpath bug #7105.
        * javax/swing/event/EventListenerList.java (remove): Re-written.

        2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>

        Fix for Classpath bug #7104.
        * javax/swing/event/EventListenerList.java (add): Re-written.

        2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>

        * javax/swing/event/EventListenerList.java (NO_LISTENERS): New
        singleton field.
        (listenerList): Declare as transient; document.
        (serialVersionUID): Document.

        2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>

        Fix for Classpath bug #7099.
        * javax/swing/event/EventListenerList.java (getListenerCount(Class)):
        More efficient implementation, also accepts null argument.
        Improve Javadoc.

        2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>

        * javax/swing/event/EventListenerList.java: Reformatted.

Members: 
        ChangeLog:1.1893->1.1894 
        libraries/javalib/javax/swing/event/EventListenerList.java:1.1->1.2 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1893 kaffe/ChangeLog:1.1894
--- kaffe/ChangeLog:1.1893      Sat Jan 10 18:29:28 2004
+++ kaffe/ChangeLog     Sat Jan 10 18:35:52 2004
@@ -2,6 +2,47 @@
 
         Resynced with GNU Classpath.
 
+       2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>
+
+        * javax/swing/event/EventListenerList.java (toString): Implemented.
+
+       2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>
+
+        * javax/swing/event/EventListenerList.java: Document typical usage.
+        (getListeners): Re-written.
+
+       2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>
+
+        Fix for Classpath bug #7105.
+        * javax/swing/event/EventListenerList.java (remove): Re-written.
+
+       2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>
+
+        Fix for Classpath bug #7104.
+        * javax/swing/event/EventListenerList.java (add): Re-written.
+
+       2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>
+
+        * javax/swing/event/EventListenerList.java (NO_LISTENERS): New
+        singleton field.
+        (listenerList): Declare as transient; document.
+        (serialVersionUID): Document.
+
+       2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>
+
+        Fix for Classpath bug #7099.
+        * javax/swing/event/EventListenerList.java (getListenerCount(Class)):
+        More efficient implementation, also accepts null argument.
+        Improve Javadoc.
+
+       2004-01-06  Sascha Brawer  <[EMAIL PROTECTED]>
+
+        * javax/swing/event/EventListenerList.java: Reformatted.
+
+2004-01-09  Dalibor Topic <[EMAIL PROTECTED]>
+
+        Resynced with GNU Classpath.
+
        2004-01-04  Michael Koch  <[EMAIL PROTECTED]>
 
         * java/util/HashMap.java (HashMap(Map)): As above.
Index: kaffe/libraries/javalib/javax/swing/event/EventListenerList.java
diff -u kaffe/libraries/javalib/javax/swing/event/EventListenerList.java:1.1 
kaffe/libraries/javalib/javax/swing/event/EventListenerList.java:1.2
--- kaffe/libraries/javalib/javax/swing/event/EventListenerList.java:1.1        Mon 
Nov  3 01:01:10 2003
+++ kaffe/libraries/javalib/javax/swing/event/EventListenerList.java    Sat Jan 10 
18:35:53 2004
@@ -1,5 +1,5 @@
 /* EventListenerList.java --
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -37,206 +37,266 @@
 
 package javax.swing.event;
 
-// Imports
 import java.io.Serializable;
+import java.lang.reflect.Array;
 import java.util.EventListener;
 
+
 /**
- * EventListenerList
- * @author Andrew Selkirk
+ * A utility class for keeping track of [EMAIL PROTECTED] EventListener}s.
+ *
+ * <p><b>Example for using this class:</b>
+ *
+ * <blockquote><pre> import java.util.EventListener;
+ * import javax.swing.event.EventListenerList;
+ *
+ * class Foo
+ * {
+ *   protected final EventListenerList listeners = new EventListenerList();
+ *   protected BarClosedEvent barClosedEvent = null;
+ *
+ *   public void addBarListener(BarListener l)
+ *   {
+ *     listeners.<a href="#add(java.lang.Class, java.util.EventListener)"
+ *               >add</a>(BarListener.class, l);
+ *   }
+ *
+ *   public void removeBarListener(BarListener l)
+ *   {
+ *     listeners.<a href="#remove(java.lang.Class, java.util.EventListener)"
+ *               >remove</a>(BarListener.class, l);
+ *   }
+ *
+ *   protected void fireBarClosedEvent()
+ *   {
+ *     Object[] l = listeners.<a href="#getListenerList()"
+ *                            >getListenerList()</a>;
+ *
+ *     for (int i = l.length - 2; i >= 0; i -= 2)
+ *       if (l[i] == BarListener.class)
+ *         {
+ *           // Create the event on demand, when it is needed the first time.
+ *           if (barClosedEvent == null)
+ *             barClosedEvent = new BarClosedEvent(this);
+ *
+ *           ((BarClosedListener) l[i + 1]).barClosed(barClosedEvent);
+ *         }
+ *   }
+ * }</pre></blockquote>
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Andrew Selkirk</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Sascha Brawer</a>
  */
-public class EventListenerList extends Object implements Serializable
+public class EventListenerList
+  implements Serializable
 {
+  /**
+   * An ID for serializing instances of this class; verified with the
+   * serialver tool of Sun J2SE 1.4.1_01.
+   */
   static final long serialVersionUID = -5677132037850737084L;
 
-       //-------------------------------------------------------------
-       // Variables --------------------------------------------------
-       //-------------------------------------------------------------
-       
-       /**
-        * Listener list
-        */
-       protected       Object[]        listenerList    = null;
-
-
-       //-------------------------------------------------------------
-       // Initialization ---------------------------------------------
-       //-------------------------------------------------------------
-       
-       /**
-        * EventListenerList constructor
-        */
-       public EventListenerList() {
-               listenerList = new Object[0];
-       } // EventListenerList()
-
-       
-       //-------------------------------------------------------------
-       // Methods ----------------------------------------------------
-       //-------------------------------------------------------------
-
-       /**
-        * Add Listener
-        * @param t Class type
-        * @param listener Listener to add
-        */
-       public void add(Class t, EventListener listener) {
-
-               // Variables
-               Object[]                list;
-               int                             index;
-               Class                   checkClass;
-               EventListener   checkListener;
-
-               // Create New list in anticipation that listener is not present
-               list = new Object[listenerList.length + 2];
-
-               // Search through list looking for listener
-               for (index = 0; index < listenerList.length; index += 2) {
-                       checkClass = (Class) listenerList[index];
-                       checkListener = (EventListener) listenerList[index + 1];
-                       if (checkClass.equals(t) == true &&
-                               checkListener.equals(listener) == true) {
-                               return;
-                       } // if
-               } // for
-
-               // Add Listener
-               list[listenerList.length] = t;
-               list[listenerList.length + 1] = listener;
-
-               // Replace Listener List
-               listenerList = list;
-
-       } // add()
-
-       /**
-        * Get the total number of listeners
-        * @return Count of listeners
-        */
-       public int getListenerCount() {
-               return (int) listenerList.length / 2;
-       } // getListenerCount
-
-       /**
-        * Get the number of listeners of a particular type
-        * @param t Class type to count
-        * @returns Count of the specified listeners
-        */
-       public int getListenerCount(Class t) {
-
-               // Variables
-               int             index;
-               int             count;
-               String  name;
-
-               // Loop through entire list
-               count = 0;
-               name  = t.getName();
-               for (index = 0; index < listenerList.length; index += 2) {
-                       if (((Class) listenerList[index]).getName().equals(name) == 
true) {
-                               count += 1;
-                       }
-               } // for: index
-
-               // Return Count
-               return count;
-
-       } // getListenerCount()
-
-       /**
-        * Get a list of listenerType/listener pairs
-        * @returns Listener list
-        */
-       public Object[] getListenerList() {
-               return listenerList;
-       } // getListenerList()
-
-       /**
-        * Get list of listeners of a particular type
-        * @param c Class type
-        * @returns List of listeners of the specified type
-        */
-       public EventListener[] getListeners(Class c) {
-
-               // Variables
-               int                                     count;
-               EventListener[]         list;
-               String                          name;
-               int                                     index;
-
-               // Get count of listeners
-               count = getListenerCount(c);
-
-               // Create Event Listener list
-               list = new EventListener[count];
-
-               // Construct List
-               count = 0;
-               name  = c.getName();
-               for (index = 0; index < listenerList.length; index += 2) {
-                       if (((Class) listenerList[index]).getName().equals(name) == 
true) {
-                               list[count] = (EventListener) listenerList[index];
-                               count += 1;
-                       } // if
-               } // for: index
-
-               // Return List
-               return list;
-
-       } // getListeners()
-
-       /**
-        * Remove a listener
-        * @param t Class type
-        * @param listener Listener to be removed
-        */
-       public void remove(Class t, EventListener listener) {
-
-               // Variables
-               Object[]                list;
-               int                             index;
-               Class                   checkClass;
-               EventListener   checkListener;
-               int                             pointer;
-               boolean                 found;
-
-               // Create New list in anticipation that listener is not present
-               if (listenerList.length == 0) {
-                       return;
-               } // if
-               list = new Object[listenerList.length - 2];
-
-               // Search through list looking for listener
-               pointer = 0;
-               found = false;
-               for (index = 0; index < listenerList.length - 2; index += 2) {
-                       checkClass = (Class) listenerList[index];
-                       checkListener = (EventListener) listenerList[index + 1];
-                       if (checkClass.equals(t) == false ||
-                               checkListener.equals(listener) == false) {
-                               list[pointer] = checkClass;
-                               list[pointer + 1] = checkListener;
-                               pointer += 2;
-                       } else {
-                               found = true;
-                       } // if
-               } // for
-
-               // Replace Listener List
-               if (found == true) {
-                       listenerList = list;
-               } // if
-
-       } // remove()
-
-       /**
-        * Get a string representation
-        * @returns String representation
-        */
-       public String toString() {
-               return null; // TODO
-       } // toString()
-
 
-} // EventListenerList
+  /**
+   * An empty array that is shared by all instances of this class that
+   * have no listeners.
+   */
+  private static final Object[] NO_LISTENERS = new Object[0];
+  
+  
+  /**
+   * An array with all currently registered listeners.  The array has
+   * twice as many elements as there are listeners.  For an even
+   * integer <code>i</code>, <code>listenerList[i]</code> indicates
+   * the registered class, and <code>listenerList[i+1]</code> is the
+   * listener.
+   */
+  protected transient Object[] listenerList = NO_LISTENERS;
+
+  
+  /**
+   * EventListenerList constructor
+   */
+  public EventListenerList()
+  {
+  }
+
+
+  /**
+   * Registers a listener of a specific type.
+   *
+   * @param t the type of the listener.
+   *
+   * @param listener the listener to add, which must be an instance of
+   * <code>t</code>, or of a subclass of <code>t</code>.
+   *
+   * @throws IllegalArgumentException if <code>listener</code> is not
+   * an instance of <code>t</code> (or a subclass thereof).
+   *
+   * @throws Exception if <code>t</code> is <code>null</code>.
+   */
+  public void add(Class t, EventListener listener)
+  {
+    int oldLength;
+    Object[] newList;
+
+    if (listener == null)
+      return;
+
+    if (!t.isInstance(listener))
+      throw new IllegalArgumentException();
+
+    oldLength = listenerList.length;
+    newList = new Object[oldLength + 2];
+    if (oldLength > 0)
+      System.arraycopy(listenerList, 0, newList, 0, oldLength);
+
+    newList[oldLength] = t;
+    newList[oldLength + 1] = listener;
+    listenerList = newList;
+  }
+
+
+  /**
+   * Determines the number of listeners.
+   */
+  public int getListenerCount()
+  {
+    return listenerList.length / 2;
+  }
+
+
+  /**
+   * Determines the number of listeners of a particular class.
+   *
+   * @param t the type of listeners to be counted. In order to get
+   * counted, a subscribed listener must be exactly of class
+   * <code>t</code>. Thus, subclasses of <code>t</code> will not be
+   * counted.
+   */
+  public int getListenerCount(Class t)
+  {
+    int result = 0;
+    for (int i = 0; i < listenerList.length; i += 2)
+      if (t == listenerList[i])
+        ++result;
+
+    return result;
+  }
+
+
+  /**
+   * Get a list of listenerType/listener pairs
+   * @returns Listener list
+   */
+  public Object[] getListenerList()
+  {
+    return listenerList;
+  }
+
+
+  /**
+   * Retrieves the currently subscribed listeners of a particular
+   * type.  For a listener to be returned, it must have been
+   * registered with exactly the type <code>c</code>; subclasses are
+   * not considered equal.
+   *
+   * <p>The returned array can always be cast to <code>c[]</code>.
+   * Since it is a newly allocated copy, the caller may arbitrarily
+   * modify the array.
+   *
+   * @param c the class which was passed to [EMAIL PROTECTED] #add}.
+   *
+   * @throws ClassCastException if <code>c</code> does not implement
+   * the [EMAIL PROTECTED] EventListener} interface.
+   *
+   * @throws NullPointerException if <code>c</code> is
+   * <code>null</code>.
+   *
+   * @returns an array of <code>c</code> whose elements are the
+   * currently subscribed listeners of the specified type.  If there
+   * are no such listeners, an empty array is returned.
+   *
+   * @since 1.3
+   */
+  public EventListener[] getListeners(Class c)
+  {
+    int count, f;
+    EventListener[] result;
+
+    count = getListenerCount(c);
+    result = (EventListener[]) Array.newInstance(c, count);
+    f = 0;
+    for (int i = 0; i < listenerList.length; i += 2)
+      if (listenerList[i] == c)
+        result[f++] = (EventListener) listenerList[i + 1];
+    
+    return result;
+  }
+
+
+  /**
+   * Removes a listener of a specific type.
+   *
+   * @param t the type of the listener.
+   *
+   * @param listener the listener to remove, which must be an instance
+   * of <code>t</code>, or of a subclass of <code>t</code>.
+   *
+   * @throws IllegalArgumentException if <code>listener</code> is not
+   * an instance of <code>t</code> (or a subclass thereof).
+   *
+   * @throws Exception if <code>t</code> is <code>null</code>.
+   */
+  public void remove(Class t, EventListener listener)
+  {
+    Object[] oldList, newList;
+    int oldLength;
+
+    if (listener == null)
+      return;
+
+    if (!t.isInstance(listener))
+      throw new IllegalArgumentException();
+
+    oldList = listenerList;
+    oldLength = oldList.length;
+    for (int i = 0; i < oldLength; i += 2)
+      if (oldList[i] == t && oldList[i + 1] == listener)
+        {
+          if (oldLength == 2)
+            newList = NO_LISTENERS;
+          else
+            {
+              newList = new Object[oldLength - 2];
+              if (i > 0)
+                System.arraycopy(oldList, 0, newList, 0, i);
+              if (i < oldLength - 2)
+                System.arraycopy(oldList, i + 2, newList, i,
+                                 oldLength - 2 - i);
+            }
+          listenerList = newList;
+          return;
+        }
+  }
+
+
+  /**
+   * Returns a string representation of this object that may be useful
+   * for debugging purposes.
+   */
+  public String toString()
+  {
+    StringBuffer buf = new StringBuffer("EventListenerList: ");
+    buf.append(listenerList.length / 2);
+    buf.append(" listeners: ");
+    for (int i = 0; i < listenerList.length; i += 2)
+      {
+        buf.append(" type ");
+        buf.append(((Class) listenerList[i]).getName());
+        buf.append(" listener ");
+        buf.append(listenerList[i + 1]);
+      }
+    return buf.toString();
+  }
+}

_______________________________________________
kaffe mailing list
[EMAIL PROTECTED]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to