/*******************************************************************************
 * Copyright (c) 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jface.resource;

import java.util.Set;

import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.ListenerList;
import org.eclipse.jface.util.PropertyChangeEvent;


/**
 * Abstract baseclass for various JFace registries.
 * 
 * @since 3.0
 */
public abstract class ResourceRegistry {

    /**
	 * List of property change listeners (element type: <code>org.eclipse.jface.util.IPropertyChangeListener</code>).
	 */
	private ListenerList listeners = new ListenerList();
	    
    /**
	 * Adds a property change listener to this registry.
	 * 
	 * @param listener a property change listener
	 */
	public void addListener(IPropertyChangeListener listener) {
		listeners.add(listener);
	}
	
	/**
	 * Disposes all currently allocated resources.
	 */
	protected abstract void clearCaches();	
	
	/** 
	 * @return the set of keys this manager knows about.  This collection 
	 * should be immutable.
	 */
	public abstract Set getKeySet();
	
	/**
	 * Return whether or not the receiver has a value for the supplied key.
	 * 
	 * @param key the key
	 * @return <code>true</code> if there is a value for this key
	 */
	public abstract boolean hasValueFor(String key);
	
	/**
	 * Fires a <code>PropertyChangeEvent</code>.
	 * 
	 * @param name the name of the symbolic value that is changing.
	 * @param oldValue the old value.
	 * @param newValue the new value.
	 */
	protected void fireMappingChanged(
		String name,
		Object oldValue,
		Object newValue) {
		final Object[] myListeners = this.listeners.getListeners();
		if (myListeners.length > 0) {
			PropertyChangeEvent event =
				new PropertyChangeEvent(this, name, oldValue, newValue);
			for (int i = 0; i < myListeners.length; ++i) {
				try {
					((IPropertyChangeListener) myListeners[i]).propertyChange(
						event);
				} catch (Exception e) {
					// TODO: how to log?
				}
			}
		}
	}	
	
	/**
	 * Removes the given listener from this registry. Has no affect if the
	 * listener is not registered.
	 * 
	 * @param listener a property change listener
	 */
	public void removeListener(IPropertyChangeListener listener) {
		listeners.remove(listener);
	}	
}
