[kaffe] CVS kaffe (dalibor): Resynced with GNU Classpath

Kaffe CVS cvs-commits at kaffe.org
Sat Jan 10 10:39:02 PST 2004


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 <robilad at kaffe.org>

        Resynced with GNU Classpath.

        2004-01-06  Sascha Brawer  <brawer at dandelis.ch>

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

        2004-01-06  Sascha Brawer  <brawer at dandelis.ch>

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

        2004-01-06  Sascha Brawer  <brawer at dandelis.ch>

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

        2004-01-06  Sascha Brawer  <brawer at dandelis.ch>

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

        2004-01-06  Sascha Brawer  <brawer at dandelis.ch>

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

        2004-01-06  Sascha Brawer  <brawer at dandelis.ch>

        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  <brawer at dandelis.ch>

        * 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  <brawer at dandelis.ch>
+
+        * javax/swing/event/EventListenerList.java (toString): Implemented.
+
+	2004-01-06  Sascha Brawer  <brawer at dandelis.ch>
+
+        * javax/swing/event/EventListenerList.java: Document typical usage.
+        (getListeners): Re-written.
+
+	2004-01-06  Sascha Brawer  <brawer at dandelis.ch>
+
+        Fix for Classpath bug #7105.
+        * javax/swing/event/EventListenerList.java (remove): Re-written.
+
+	2004-01-06  Sascha Brawer  <brawer at dandelis.ch>
+
+        Fix for Classpath bug #7104.
+        * javax/swing/event/EventListenerList.java (add): Re-written.
+
+	2004-01-06  Sascha Brawer  <brawer at dandelis.ch>
+
+        * javax/swing/event/EventListenerList.java (NO_LISTENERS): New
+        singleton field.
+        (listenerList): Declare as transient; document.
+        (serialVersionUID): Document.
+
+	2004-01-06  Sascha Brawer  <brawer at dandelis.ch>
+
+        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  <brawer at dandelis.ch>
+
+        * javax/swing/event/EventListenerList.java: Reformatted.
+
+2004-01-09  Dalibor Topic <robilad at kaffe.org>
+
+        Resynced with GNU Classpath.
+
 	2004-01-04  Michael Koch  <konqueror at gmx.de>
 
         * 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 {@link 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:aselkirk at sympatico.ca">Andrew Selkirk</a>
+ * @author <a href="mailto:brawer at dandelis.ch">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 {@link #add}.
+   *
+   * @throws ClassCastException if <code>c</code> does not implement
+   * the {@link 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();
+  }
+}




More information about the kaffe mailing list