/*******************************************************************************
* Copyright (c) 2014 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.utilbox.fields;
import java.util.Iterator;
import melnorme.utilbox.collections.ArrayList2;
import melnorme.utilbox.collections.Indexable;
/**
* Helper to manage a listener list, then used to fire events.
* This class is designed to be thread safe.
* @see also {@link org.eclipse.core.runtime.ListenerList}
*/
public class ListenerListHelper<LISTENER> {
private volatile Indexable<LISTENER> listeners;
public ListenerListHelper() {
this.listeners = new ArrayList2<LISTENER>();
}
protected ListenerListHelper(Indexable<LISTENER> listeners) {
this.listeners = listeners; // listeners must be unmodifiable
}
public synchronized Indexable<LISTENER> getListeners() {
return listeners;
}
public synchronized void addListener(LISTENER listener) {
ArrayList2<LISTENER> newListeners = new ArrayList2<>(listeners);
newListeners.add(listener);
setNewListeners(newListeners);
}
public synchronized void removeListener(LISTENER listener) {
ArrayList2<LISTENER> newListeners = new ArrayList2<LISTENER>(listeners);
for (Iterator<LISTENER> iter = newListeners.iterator(); iter.hasNext(); ) {
LISTENER iterElem = iter.next();
if(iterElem == listener) {
iter.remove();
break;
}
}
setNewListeners(newListeners);
}
public synchronized void setNewListeners(Indexable<LISTENER> newListeners) {
listeners = newListeners;
}
public void clear() {
setNewListeners(new ArrayList2<LISTENER>());
}
}