package flash.events;
import com.badlogic.gdx.utils.Pool;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* The EventDispatcher class is the base class for all classes that dispatch events.
*
* @author Ka Wing Chin
* @author Thomas Weston
*/
public class EventDispatcher implements IEventDispatcher
{
/**
* All the listeners registered with this EventDispatcher.
*/
private Map<String, List<IEventListener>> _listeners;
/**
* Used when creating a copy of the listeners list, so that it can be modified while being iterated over.
*/
private Pool<List<IEventListener>> _listenersForTypeCopyPool;
/**
* Aggregates an instance of the EventDispatcher class.
*/
public EventDispatcher()
{
_listeners = new HashMap<String, List<IEventListener>>();
_listenersForTypeCopyPool = new Pool<List<IEventListener>>()
{
@Override
protected List<IEventListener> newObject()
{
return new LinkedList<IEventListener>();
}
};
}
@Override
public void addEventListener(String type, IEventListener listener, boolean useCapture, int priority, boolean useWeakReference)
{
List<IEventListener> listenersForType = _listeners.get(type);
if(listenersForType == null)
{
listenersForType = new LinkedList<IEventListener>();
_listeners.put(type, listenersForType);
}
listenersForType.add(listener);
}
@Override
public void addEventListener(String type, IEventListener listener, boolean useCapture, int priority)
{
addEventListener(type, listener, useCapture, priority, false);
}
@Override
public void addEventListener(String type, IEventListener listener, boolean useCapture)
{
addEventListener(type, listener, useCapture, 0, false);
}
@Override
public void addEventListener(String type, IEventListener listener)
{
addEventListener(type, listener, false, 0, false);
}
@Override
public boolean dispatchEvent(Event event)
{
List<IEventListener> listenersForType = _listeners.get(event.type);
if(listenersForType == null || listenersForType.size() <= 0)
return false;
final List<IEventListener> listenersForTypeCopy = _listenersForTypeCopyPool.obtain();
listenersForTypeCopy.addAll(listenersForType);
for(IEventListener listener : listenersForTypeCopy)
listener.onEvent(event);
listenersForTypeCopy.clear();
_listenersForTypeCopyPool.free(listenersForTypeCopy);
return true;
}
@Override
public boolean hasEventListener(String type)
{
List<IEventListener> listenersForType = _listeners.get(type);
return listenersForType != null && listenersForType.size() > 0;
}
@Override
public void removeEventListener(String type, IEventListener listener, boolean useCapture)
{
List<IEventListener> listenersForType = _listeners.get(type);
if(listenersForType == null)
return;
while(listenersForType.remove(listener));
}
@Override
public void removeEventListener(String type, IEventListener listener)
{
removeEventListener(type, listener, false);
}
}