1 11 package org.eclipse.core.internal.runtime; 12 13 26 public class ListenerList { 27 28 31 private static final Object [] EmptyArray = new Object [0]; 32 36 public static final int EQUALITY = 0; 37 41 public static final int IDENTITY = 1; 42 43 47 private final int compareMode; 48 49 54 private volatile Object [] listeners = EmptyArray; 55 56 59 public ListenerList() { 60 this(EQUALITY); 61 } 62 63 66 public ListenerList(int mode) { 67 this.compareMode = mode; 68 } 69 70 80 public synchronized void add(Object listener) { 81 if (listener == null) 82 throw new IllegalArgumentException (); 83 final int oldSize = listeners.length; 85 for (int i = 0; i < oldSize; ++i) 86 if (same(listener, listeners[i])) 87 return; 88 Object [] newListeners = new Object [oldSize+1]; 90 System.arraycopy(listeners, 0, newListeners, 0, oldSize); 91 newListeners[oldSize] = listener; 92 this.listeners = newListeners; 94 } 95 96 109 public Object [] getListeners() { 110 return listeners; 111 } 112 113 119 public boolean isEmpty() { 120 return listeners.length == 0; 121 } 122 123 133 public synchronized void remove(Object listener) { 134 if (listener == null) 135 throw new IllegalArgumentException (); 136 int oldSize = listeners.length; 137 for (int i = 0; i < oldSize; ++i) { 138 if (same(listener, listeners[i])) { 139 if (oldSize == 1) { 140 listeners = EmptyArray; 141 } else { 142 Object [] newListeners = new Object [oldSize-1]; 144 System.arraycopy(listeners, 0, newListeners, 0, i); 145 System.arraycopy(listeners, i+1, newListeners, i, oldSize-i-1); 146 this.listeners = newListeners; 148 } 149 return; 150 } 151 } 152 } 153 154 159 private boolean same(Object listener1, Object listener2) { 160 return compareMode == IDENTITY ? listener1 == listener2 : listener1.equals(listener2); 161 } 162 163 168 public int size() { 169 return listeners.length; 170 } 171 } 172 | Popular Tags |