Mercurial > projects > dwt-addons
annotate dwtx/core/runtime/ListenerList.d @ 3:6518c18a01f7
eclipse.core package without osgi dependencies
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Wed, 26 Mar 2008 00:57:19 +0100 |
parents | |
children |
rev | line source |
---|---|
3
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1 /******************************************************************************* |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2 * Copyright (c) 2004, 2006 IBM Corporation and others. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3 * All rights reserved. This program and the accompanying materials |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
4 * are made available under the terms of the Eclipse Public License v1.0 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
5 * which accompanies this distribution, and is available at |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
6 * http://www.eclipse.org/legal/epl-v10.html |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
7 * |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
8 * Contributors: |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
9 * IBM Corporation - initial API and implementation |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
10 * Port to the D programming language: |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
11 * Frank Benoit <benoit@tionex.de> |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
12 *******************************************************************************/ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
13 module dwtx.core.runtime.ListenerList; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
14 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
15 import dwt.dwthelper.utils; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
16 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
17 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
18 * This class is a thread safe list that is designed for storing lists of listeners. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
19 * The implementation is optimized for minimal memory footprint, frequent reads |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
20 * and infrequent writes. Modification of the list is synchronized and relatively |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
21 * expensive, while accessing the listeners is very fast. Readers are given access |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
22 * to the underlying array data structure for reading, with the trust that they will |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
23 * not modify the underlying array. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
24 * <p> |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
25 * <a name="same">A listener list handles the <i>same</i> listener being added |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
26 * multiple times, and tolerates removal of listeners that are the same as other |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
27 * listeners in the list. For this purpose, listeners can be compared with each other |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
28 * using either equality or identity, as specified in the list constructor. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
29 * </p> |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
30 * <p> |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
31 * Use the <code>getListeners</code> method when notifying listeners. The recommended |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
32 * code sequence for notifying all registered listeners of say, |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
33 * <code>FooListener.eventHappened</code>, is: |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
34 * |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
35 * <pre> |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
36 * Object[] listeners = myListenerList.getListeners(); |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
37 * for (int i = 0; i < listeners.length; ++i) { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
38 * ((FooListener) listeners[i]).eventHappened(event); |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
39 * } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
40 * </pre> |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
41 * |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
42 * </p><p> |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
43 * This class can be used without OSGi running. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
44 * </p> |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
45 * @since dwtx.equinox.common 3.2 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
46 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
47 public class ListenerList { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
48 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
49 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
50 * The empty array singleton instance. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
51 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
52 private static const Object[] EmptyArray; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
53 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
54 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
55 * Mode constant (value 0) indicating that listeners should be considered |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
56 * the <a href="#same">same</a> if they are equal. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
57 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
58 public static const int EQUALITY = 0; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
59 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
60 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
61 * Mode constant (value 1) indicating that listeners should be considered |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
62 * the <a href="#same">same</a> if they are identical. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
63 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
64 public static const int IDENTITY = 1; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
65 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
66 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
67 * Indicates the comparison mode used to determine if two |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
68 * listeners are equivalent |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
69 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
70 private final bool identity; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
71 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
72 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
73 * The list of listeners. Initially empty but initialized |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
74 * to an array of size capacity the first time a listener is added. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
75 * Maintains invariant: listeners !is null |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
76 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
77 private Object[] listeners; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
78 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
79 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
80 * Creates a listener list in which listeners are compared using equality. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
81 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
82 public this() { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
83 this(EQUALITY); |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
84 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
85 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
86 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
87 * Creates a listener list using the provided comparison mode. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
88 * |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
89 * @param mode The mode used to determine if listeners are the <a href="#same">same</a>. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
90 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
91 public this(int mode) { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
92 if (mode !is EQUALITY && mode !is IDENTITY) |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
93 throw new IllegalArgumentException( null ); |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
94 this.identity = mode is IDENTITY; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
95 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
96 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
97 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
98 * Adds a listener to this list. This method has no effect if the <a href="#same">same</a> |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
99 * listener is already registered. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
100 * |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
101 * @param listener the non-<code>null</code> listener to add |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
102 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
103 public synchronized void add(Object listener) { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
104 // This method is synchronized to protect against multiple threads adding |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
105 // or removing listeners concurrently. This does not block concurrent readers. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
106 if (listener is null) |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
107 throw new IllegalArgumentException( null ); |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
108 // check for duplicates |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
109 final int oldSize = listeners.length; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
110 for (int i = 0; i < oldSize; ++i) { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
111 Object listener2 = listeners[i]; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
112 if (identity ? listener is listener2 : listener.opEquals(listener2)) |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
113 return; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
114 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
115 // Thread safety: create new array to avoid affecting concurrent readers |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
116 Object[] newListeners = new Object[oldSize + 1]; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
117 System.arraycopy(listeners, 0, newListeners, 0, oldSize); |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
118 newListeners[oldSize] = listener; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
119 //atomic assignment |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
120 this.listeners = newListeners; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
121 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
122 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
123 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
124 * Returns an array containing all the registered listeners. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
125 * The resulting array is unaffected by subsequent adds or removes. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
126 * If there are no listeners registered, the result is an empty array. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
127 * Use this method when notifying listeners, so that any modifications |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
128 * to the listener list during the notification will have no effect on |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
129 * the notification itself. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
130 * <p> |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
131 * Note: Callers of this method <b>must not</b> modify the returned array. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
132 * |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
133 * @return the list of registered listeners |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
134 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
135 public Object[] getListeners() { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
136 return listeners; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
137 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
138 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
139 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
140 * Returns whether this listener list is empty. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
141 * |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
142 * @return <code>true</code> if there are no registered listeners, and |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
143 * <code>false</code> otherwise |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
144 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
145 public bool isEmpty() { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
146 return listeners.length is 0; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
147 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
148 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
149 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
150 * Removes a listener from this list. Has no effect if the <a href="#same">same</a> |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
151 * listener was not already registered. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
152 * |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
153 * @param listener the non-<code>null</code> listener to remove |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
154 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
155 public synchronized void remove(Object listener) { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
156 // This method is synchronized to protect against multiple threads adding |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
157 // or removing listeners concurrently. This does not block concurrent readers. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
158 if (listener is null) |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
159 throw new IllegalArgumentException( null ); |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
160 int oldSize = listeners.length; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
161 for (int i = 0; i < oldSize; ++i) { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
162 Object listener2 = listeners[i]; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
163 if (identity ? listener is listener2 : listener.opEquals(listener2)) { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
164 if (oldSize is 1) { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
165 listeners = EmptyArray; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
166 } else { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
167 // Thread safety: create new array to avoid affecting concurrent readers |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
168 Object[] newListeners = new Object[oldSize - 1]; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
169 System.arraycopy(listeners, 0, newListeners, 0, i); |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
170 System.arraycopy(listeners, i + 1, newListeners, i, oldSize - i - 1); |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
171 //atomic assignment to field |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
172 this.listeners = newListeners; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
173 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
174 return; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
175 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
176 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
177 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
178 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
179 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
180 * Returns the number of registered listeners. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
181 * |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
182 * @return the number of registered listeners |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
183 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
184 public int size() { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
185 return listeners.length; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
186 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
187 |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
188 /** |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
189 * Removes all listeners from this list. |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
190 */ |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
191 public synchronized void clear() { |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
192 listeners = EmptyArray; |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
193 } |
6518c18a01f7
eclipse.core package without osgi dependencies
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
194 } |