/*******************************************************************************
 * Copyright (c) 2003, 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 org.eclipse.ui.navigator.internal.extensions;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.commands.common.EventManager;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.ui.navigator.IExtensionStateModel;

/**
 * 
 * <p>
 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as part of a work in
 * progress. There is a guarantee neither that this API will work nor that it will remain the same.
 * Please do not use this API without consulting with the Platform/UI team.
 * </p>
 * 
 * @since 3.2 
 *
 */
public class ExtensionStateModel extends EventManager implements
		IExtensionStateModel {

	private final String id;

	private final String viewerId;

	private final Map values = new HashMap();

	public ExtensionStateModel(String anId, String aViewerId) {
		id = anId;
		viewerId = aViewerId;
	}

	public String getId() {
		return id;
	}

	public String getViewerId() {
		return viewerId;
	}

	public String getStringProperty(String aPropertyName) {
		return (String) values.get(aPropertyName);
	}

	public boolean getBooleanProperty(String aPropertyName) {

		Boolean b = (Boolean) values.get(aPropertyName);
		return b != null ? b.booleanValue() : false;
	}

	public int getIntProperty(String aPropertyName) {
		Integer i = (Integer) values.get(aPropertyName);
		return i != null ? i.intValue() : -1;
	}

	public void setStringProperty(String aPropertyName, String aPropertyValue) {
		String oldValue = (String) values.get(aPropertyName);
		String newValue = aPropertyValue;
		if(hasPropertyChanged(oldValue, newValue)) {
			values.put(aPropertyName, newValue);
			firePropertyChangeEvent(new PropertyChangeEvent(this, aPropertyName, oldValue, newValue));
		}
	}

	public void setBooleanProperty(String aPropertyName, boolean aPropertyValue) {
		Boolean oldValue = (Boolean) values.get(aPropertyName);
		Boolean newValue = aPropertyValue ? Boolean.TRUE : Boolean.FALSE;
		if(hasPropertyChanged(oldValue, newValue)) {

			values
					.put(aPropertyName, aPropertyValue ? Boolean.TRUE
							: Boolean.FALSE); 
			firePropertyChangeEvent(new PropertyChangeEvent(this, aPropertyName, oldValue, newValue));
		}		
	}

	public void setIntProperty(String aPropertyName, int aPropertyValue) {
		Integer oldValue = (Integer) values.get(aPropertyName);
		Integer newValue = new Integer(aPropertyValue);
		if(hasPropertyChanged(oldValue, newValue)) {
			values.put(aPropertyName, newValue);
			firePropertyChangeEvent(new PropertyChangeEvent(this, aPropertyName, oldValue, newValue));
		}
	}

	public void addPropertyChangeListener(IPropertyChangeListener aListener) {
		addListenerObject(aListener);
	}

	public void removePropertyChangeListener(IPropertyChangeListener aListener) {
		removeListenerObject(aListener);
	}

	public Object getProperty(String aPropertyName) {
		return values.get(aPropertyName);
	}

	public void setProperty(String aPropertyName, Object aPropertyValue) {

		Object oldValue = values.get(aPropertyName);
		Object newValue = aPropertyValue;
		if(hasPropertyChanged(oldValue, newValue)) {
			values.put(aPropertyName, newValue);
			firePropertyChangeEvent(new PropertyChangeEvent(this, aPropertyName, oldValue, newValue));
		}
	}

	/**
	 * @param oldValue
	 * @param newValue
	 * @return
	 */
	private boolean hasPropertyChanged(Object oldValue, Object newValue) {
		return oldValue == null || !oldValue.equals(newValue);
	}

	protected void firePropertyChangeEvent(PropertyChangeEvent anEvent) {
		Object[] listeners = getListeners();
		for (int i = 0; i < listeners.length; ++i)
			((IPropertyChangeListener) listeners[i]).propertyChange(anEvent);
	}

}
