1 11 package org.eclipse.core.internal.events; 12 13 import org.eclipse.core.resources.IResourceChangeListener; 14 import org.eclipse.core.runtime.Assert; 15 16 30 public class ResourceChangeListenerList { 31 32 static class ListenerEntry { 33 int eventMask; 34 IResourceChangeListener listener; 35 36 ListenerEntry(IResourceChangeListener listener, int eventMask) { 37 this.listener = listener; 38 this.eventMask = eventMask; 39 } 40 } 41 42 45 private static final ListenerEntry[] EMPTY_ARRAY = new ListenerEntry[0]; 46 47 private int count1 = 0; 48 private int count2 = 0; 49 private int count4 = 0; 50 private int count8 = 0; 51 private int count16 = 0; 52 53 56 private volatile ListenerEntry[] listeners = EMPTY_ARRAY; 57 58 65 public synchronized void add(IResourceChangeListener listener, int mask) { 66 Assert.isNotNull(listener); 67 if (mask == 0) { 68 remove(listener); 69 return; 70 } 71 ResourceChangeListenerList.ListenerEntry entry = new ResourceChangeListenerList.ListenerEntry(listener, mask); 72 final int oldSize = listeners.length; 73 for (int i = 0; i < oldSize; ++i) { 75 if (listeners[i].listener == listener) { 76 removing(listeners[i].eventMask); 77 adding(mask); 78 listeners[i] = entry; 79 return; 80 } 81 } 82 adding(mask); 83 ListenerEntry[] newListeners = new ListenerEntry[oldSize + 1]; 85 System.arraycopy(listeners, 0, newListeners, 0, oldSize); 86 newListeners[oldSize] = entry; 87 this.listeners = newListeners; 89 } 90 91 private void adding(int mask) { 92 if ((mask & 1) != 0) 93 count1++; 94 if ((mask & 2) != 0) 95 count2++; 96 if ((mask & 4) != 0) 97 count4++; 98 if ((mask & 8) != 0) 99 count8++; 100 if ((mask & 16) != 0) 101 count16++; 102 } 103 104 116 public ListenerEntry[] getListeners() { 117 return listeners; 118 } 119 120 public boolean hasListenerFor(int event) { 121 if (event == 1) 122 return count1 > 0; 123 if (event == 2) 124 return count2 > 0; 125 if (event == 4) 126 return count4 > 0; 127 if (event == 8) 128 return count8 > 0; 129 if (event == 16) 130 return count16 > 0; 131 return false; 132 } 133 134 140 public synchronized void remove(IResourceChangeListener listener) { 141 Assert.isNotNull(listener); 142 final int oldSize = listeners.length; 143 for (int i = 0; i < oldSize; ++i) { 144 if (listeners[i].listener == listener) { 145 removing(listeners[i].eventMask); 146 if (oldSize == 1) { 147 listeners = EMPTY_ARRAY; 148 } else { 149 ListenerEntry[] newListeners = new ListenerEntry[oldSize - 1]; 151 System.arraycopy(listeners, 0, newListeners, 0, i); 152 System.arraycopy(listeners, i + 1, newListeners, i, oldSize - i - 1); 153 this.listeners = newListeners; 155 } 156 return; 157 } 158 } 159 } 160 161 private void removing(int mask) { 162 if ((mask & 1) != 0) 163 count1--; 164 if ((mask & 2) != 0) 165 count2--; 166 if ((mask & 4) != 0) 167 count4--; 168 if ((mask & 8) != 0) 169 count8--; 170 if ((mask & 16) != 0) 171 count16--; 172 } 173 } 174 | Popular Tags |