package jp.kshoji.javax.swing.event; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.lang.reflect.Array; import java.util.ArrayList; public class EventListenerList implements Serializable { protected transient Object[] listenerList = new Object[0]; public synchronized <T extends java.util.EventListener> void remove( final Class<T> listenerClass, final T listener ) { if (listener == null) { return; } int position = -1; for (int i = listenerList.length - 1; i > 0; i -= 2) { if (listenerClass == listenerList[i - 1] && listener.equals(listenerList[i])) { position = i - 1; break; } } if (position >= 0) { Object[] newList = new Object[listenerList.length - 2]; System.arraycopy(listenerList, 0, newList, 0, position); System.arraycopy(listenerList, position + 2, newList, position, listenerList.length - position - 2); listenerList = newList; } } public synchronized <T extends java.util.EventListener> void add( final Class<T> listenerClass, final T listener ) { if (listener == null) { return; } Object[] newList = new Object[listenerList.length + 2]; System.arraycopy(listenerList, 0, newList, 0, listenerList.length); newList[listenerList.length] = listenerClass; newList[listenerList.length + 1] = listener; listenerList = newList; } public <T extends java.util.EventListener> T[] getListeners(final Class<T> listenerClass) { int numClassListeners = getListenerCount(listenerClass); T[] listeners = (T[]) (Array.newInstance( listenerClass, numClassListeners)); if (numClassListeners > 0) { for (int innerIndex = 0, outerIndex = 0; outerIndex < numClassListeners; innerIndex += 2) { if (listenerList[innerIndex] == listenerClass) { listeners[numClassListeners - 1 - outerIndex] = (T) listenerList[innerIndex + 1]; ++outerIndex; } } } return listeners; } /* * The format of the string is based on 1.5 release behavior * which can be revealed using the following code: * * EventListenerList obj = new EventListenerList(); * obj.add(BasicButtonListener.class, new BasicButtonListener(new JButton())); * System.out.println(obj.toString()); */ public String toString() { String str = "EventListenerList: "; str += getListenerCount() + " listeners:"; for (int i = 0; i < listenerList.length; i += 2) { str += " type " + ((Class) listenerList[i]).getName() + " listener " + listenerList[i + 1].toString(); } return str; } public Object[] getListenerList() { return listenerList; } public int getListenerCount(final Class<?> listenerClass) { int counter = 0; for (int i = 0; i < listenerList.length; i += 2) { if (listenerList[i] == listenerClass) { counter++; } } return counter; } public int getListenerCount() { return listenerList.length >> 1; } private void writeObject(final ObjectOutputStream outStream) throws IOException { outStream.defaultWriteObject(); for (int i = 0; i < listenerList.length; i += 2) { Object listener = listenerList[i + 1]; if ((listener != null) && (listener instanceof Serializable)) { outStream.writeObject(listenerList[i]); outStream.writeObject(listener); } } outStream.writeObject(null); } private void readObject(final ObjectInputStream inStream) throws IOException, ClassNotFoundException { inStream.defaultReadObject(); ArrayList list = new ArrayList(); Object markerObject = null; while ((markerObject = inStream.readObject()) != null) { list.add(markerObject); list.add(inStream.readObject()); } listenerList = list.toArray(); } }