/******************************************************************************* * Copyright (c) 2000, 2005 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package net.sourceforge.phpeclipse.xdebug.core; import java.util.HashMap; /** * Local version of org.eclipse.jface.util.ListenerList (modified)s */ public class ListenerMap { /** * The current number of listeners. * Maintains invariant: 0 <= fSize <= listeners.length. */ private int fSize; /** * The map of listeners. Initially null but initialized * to an array of size capacity the first time a listener is added. * Maintains invariant: listeners != null if and only if fSize != 0 */ private HashMap fListeners = null; // private HashMap fListeners = null; /** * Creates a listener map with the given initial capacity. * * @param capacity the number of listeners which this list can initially accept * without growing its internal representation; must be at least 1 */ public ListenerMap(int capacity) { if (capacity < 1) { throw new IllegalArgumentException(); } fListeners = new HashMap(capacity); fSize = 0; } /** * Adds a listener to the Map. * Overwrites an existing listener with the same IDE_Key. * * @param listener a listener * @param ideKey IDE-key of the listener */ public synchronized void add(Object listener,String ideKey) { if (listener == null) { throw new IllegalArgumentException(); } // check for duplicates using identity if (fListeners.get(ideKey) == null) fSize++; fListeners.put(ideKey,listener); } /** * Returns a map containing all the registered listeners. * The resulting map is unaffected by subsequent adds or removes. * If there are no listeners registered, the result is an empty map. * Use this method when notifying listeners, so that any modifications * to the listener list during the notification will have no effect on the * notification itself. */ public synchronized HashMap getListeners() { if (fSize == 0) { return null; } HashMap result = new HashMap(fListeners); return result; } /** * Returns the listener associated with the ideKey. * If there is no listener registered, the result is null. * Use this method when notifying listeners, so that any modifications * to the listener list during the notification will have no effect on the * notification itself. */ public synchronized Object getListener(String ideKey) { return fListeners.get(ideKey); } /** * Removes a listener from the list. * Has no effect if an identical listener was not already registered. * * @param listener a listener */ public synchronized void remove(Object listener,String ideKey) { if (listener == null) { throw new IllegalArgumentException(); } if (fListeners.get(ideKey) == listener) { fListeners.remove(ideKey); fSize--; } } /** * Removes all the listeners from the list. */ public synchronized void removeAll() { fListeners.clear(); fSize = 0; } /** * Returns the number of registered listeners * * @return the number of registered listeners */ public int size() { return fSize; } }