/*
* Ext GWT - Ext for GWT
* Copyright(c) 2007-2009, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.event;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Default implementation of the <code>Observable</code> interface.
*
* <pre>
* Observable observable = new BaseObservable();
* observable.addListener(Events.Select, new Listener<BaseEvent>() {
* public void handleEvent(BaseEvent be) {
*
* }
* });
* observable.fireEvent(Events.Select, new BaseEvent());
* </pre>
*/
public class BaseObservable implements Observable {
private boolean firesEvents = true;
private Map<EventType, List<Listener<BaseEvent>>> listeners;
private boolean activeEvent;
/**
* Adds a listener bound by the given event type.
*
* @param eventType the eventType
* @param listener the listener to be added
*/
@SuppressWarnings("unchecked")
public void addListener(EventType eventType, Listener<? extends BaseEvent> listener) {
if (listener == null) return;
if (listeners == null) {
listeners = new HashMap<EventType, List<Listener<BaseEvent>>>();
}
List<Listener<BaseEvent>> list = listeners.get(eventType);
if (list == null) {
list = new ArrayList<Listener<BaseEvent>>();
listeners.put(eventType, list);
}
if (!list.contains(listener)) {
list.add((Listener) listener);
}
}
@SuppressWarnings("unchecked")
public List<Listener<? extends BaseEvent>> getListeners(EventType eventType) {
if (listeners == null) {
listeners = new HashMap<EventType, List<Listener<BaseEvent>>>();
}
List<Listener<BaseEvent>> list = listeners.get(eventType);
if (list == null) {
list = new ArrayList<Listener<BaseEvent>>();
listeners.put(eventType, list);
}
return (List) list;
}
/**
* Fires an event.
*
* @param eventType the event type
* @return <code>true</code> if any listeners cancel the event.
*/
public boolean fireEvent(EventType eventType) {
return fireEvent(eventType, new BaseEvent(this));
}
/**
* Fires an event.
*
* @param eventType eventType the event type
* @param be the base event
* @return <code>true</code> if any listeners cancel the event.
*/
public boolean fireEvent(EventType eventType, BaseEvent be) {
if (firesEvents && hasListeners(eventType) && listeners != null) {
activeEvent = true;
be.setType(eventType);
List<Listener<BaseEvent>> list = listeners.get(eventType);
if (list != null) {
List<Listener<BaseEvent>> copy = new ArrayList<Listener<BaseEvent>>(list);
for (Listener<BaseEvent> l : copy) {
callListener(l, be);
}
}
activeEvent = false;
return !be.isCancelled();
}
return true;
}
/**
* Returns true if events are being fired.
*
* @return the fire event state
*/
public boolean getFiresEvents() {
return firesEvents;
}
/**
* Returns true if there is an active event
*
* @return the active event start
*/
public boolean hasActiveEvent() {
return activeEvent;
}
public boolean hasListeners() {
return listeners != null && listeners.size() > 0;
}
public boolean hasListeners(EventType eventType) {
if (listeners != null && listeners.containsKey(eventType)) {
List<Listener<BaseEvent>> list = listeners.get(eventType);
if (list.size() != 0) {
return true;
}
}
return false;
}
/**
* Removes all listeners.
*/
public void removeAllListeners() {
if (listeners != null) {
listeners.clear();
}
}
/**
* Removes a listener.
*
* @param eventType the event type
* @param listener the listener to be removed
*/
public void removeListener(final EventType eventType, final Listener<? extends BaseEvent> listener) {
if (listeners == null) {
return;
}
List<Listener<BaseEvent>> list = listeners.get(eventType);
if (list != null) {
list.remove(listener);
if (list.isEmpty()) {
listeners.remove(eventType);
}
}
}
/**
* Sets whether events should be fired (defaults to true).
*
* @param firesEvents true to fire events, false to disable events
*/
public void setFiresEvents(boolean firesEvents) {
this.firesEvents = firesEvents;
}
protected void callListener(Listener<BaseEvent> listener, BaseEvent be) {
listener.handleEvent(be);
}
}