All Downloads are FREE. Search and download functionalities are using the official Maven repository.

flash.events.EventDispatcher Maven / Gradle / Ivy

The newest version!
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> _listeners;
	/**
	 * Used when creating a copy of the listeners list, so that it can be modified while being iterated over.
	 */
	private Pool> _listenersForTypeCopyPool;

	/**
	 * Aggregates an instance of the EventDispatcher class.
	 */
	public EventDispatcher()
	{
		_listeners = new HashMap>();
		_listenersForTypeCopyPool = new Pool>()
		{
			@Override
			protected List newObject()
			{
				return new LinkedList();
			}
		};
	}

	@Override
	public void addEventListener(String type, IEventListener listener, boolean useCapture, int priority, boolean useWeakReference)
	{
		List listenersForType = _listeners.get(type);

		if(listenersForType == null)
		{
			listenersForType = new LinkedList();
			_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 listenersForType = _listeners.get(event.type);

		if(listenersForType == null || listenersForType.size() <= 0)
			return false;

		final List 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 listenersForType = _listeners.get(type);
		return listenersForType != null && listenersForType.size() > 0;
	}

	@Override
	public void removeEventListener(String type, IEventListener listener, boolean useCapture)
	{
		List listenersForType = _listeners.get(type);

		if(listenersForType == null)
			return;

		while(listenersForType.remove(listener));
	}

	@Override
	public void removeEventListener(String type, IEventListener listener)
	{
		removeEventListener(type, listener, false);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy