/** * $Id: mxEventSource.java,v 1.1 2012/11/15 13:26:39 gaudenz Exp $ * Copyright (c) 2007, Gaudenz Alder */ package com.mxgraph.util; import java.util.ArrayList; import java.util.List; /** * Base class for objects that dispatch named events. */ public class mxEventSource { /** * Defines the requirements for an object that listens to an event source. */ public interface mxIEventListener { /** * Called when the graph model has changed. * * @param sender Reference to the source of the event. * @param evt Event object to be dispatched. */ void invoke(Object sender, mxEventObject evt); } /** * Holds the event names and associated listeners in an array. The array * contains the event name followed by the respective listener for each * registered listener. */ protected transient List<Object> eventListeners = null; /** * Holds the source object for this event source. */ protected Object eventSource; /** * Specifies if events can be fired. Default is true. */ protected boolean eventsEnabled = true; /** * Constructs a new event source using this as the source object. */ public mxEventSource() { this(null); } /** * Constructs a new event source for the given source object. */ public mxEventSource(Object source) { setEventSource(source); } /** * */ public Object getEventSource() { return eventSource; } /** * */ public void setEventSource(Object value) { this.eventSource = value; } /** * */ public boolean isEventsEnabled() { return eventsEnabled; } /** * */ public void setEventsEnabled(boolean eventsEnabled) { this.eventsEnabled = eventsEnabled; } /** * Binds the specified function to the given event name. If no event name * is given, then the listener is registered for all events. */ public void addListener(String eventName, mxIEventListener listener) { if (eventListeners == null) { eventListeners = new ArrayList<Object>(); } eventListeners.add(eventName); eventListeners.add(listener); } /** * Function: removeListener * * Removes all occurances of the given listener from the list of listeners. */ public void removeListener(mxIEventListener listener) { removeListener(listener, null); } /** * Function: removeListener * * Removes all occurances of the given listener from the list of listeners. */ public void removeListener(mxIEventListener listener, String eventName) { if (eventListeners != null) { for (int i = eventListeners.size() - 2; i > -1; i -= 2) { if (eventListeners.get(i + 1) == listener && (eventName == null || String.valueOf( eventListeners.get(i)).equals(eventName))) { eventListeners.remove(i + 1); eventListeners.remove(i); } } } } /** * Dispatches the given event name with this object as the event source. * <code>fireEvent(new mxEventObject("eventName", key1, val1, .., keyN, valN))</code> * */ public void fireEvent(mxEventObject evt) { fireEvent(evt, null); } /** * Dispatches the given event name, passing all arguments after the given * name to the registered listeners for the event. */ public void fireEvent(mxEventObject evt, Object sender) { if (eventListeners != null && !eventListeners.isEmpty() && isEventsEnabled()) { if (sender == null) { sender = getEventSource(); } if (sender == null) { sender = this; } for (int i = 0; i < eventListeners.size(); i += 2) { String listen = (String) eventListeners.get(i); if (listen == null || listen.equals(evt.getName())) { ((mxIEventListener) eventListeners.get(i + 1)).invoke( sender, evt); } } } } }