package org.eclipse.jpt.ui.internal.java.structure;

import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.edit.provider.ChangeNotifier;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IChangeNotifier;
import org.eclipse.emf.edit.provider.IDisposable;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.INotifyChangedListener;
import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.jpt.core.internal.content.java.util.JpaJavaAdapterFactory;

/**
 * This is the factory that is used to provide the interfaces needed to support Viewers.
 * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
 * The adapters also support Eclipse property sheets.
 * Note that most of the adapters are shared among multiple instances.
 */
public class JpaCoreJavaItemProviderAdapterFactory
	extends JpaJavaAdapterFactory
	implements ComposeableAdapterFactory, 
		IChangeNotifier, 
		IDisposable
{
	/**
	 * This keeps track of the root adapter factory that delegates to this adapter factory.
	 */
	protected ComposedAdapterFactory parentAdapterFactory;

	/**
	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
	 */
	protected IChangeNotifier changeNotifier = new ChangeNotifier();

	/**
	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
	 */
	protected Collection supportedTypes = new ArrayList();

	
	public JpaCoreJavaItemProviderAdapterFactory() {
		supportedTypes.add(IEditingDomainItemProvider.class);
		supportedTypes.add(IStructuredItemContentProvider.class);
		supportedTypes.add(ITreeItemContentProvider.class);
		supportedTypes.add(IItemLabelProvider.class);
	}
	
	
	protected JavaCompilationUnitItemProvider javaCompilationUnitItemProvider;
	
	public Adapter createJpaCompilationUnitAdapter() {
		if (javaCompilationUnitItemProvider == null) {
			javaCompilationUnitItemProvider = new JavaCompilationUnitItemProvider(this);
		}
		
		return javaCompilationUnitItemProvider;
	}
	
	protected JavaPersistentTypeItemProvider javaPersistentTypeItemProvider;
	
	public Adapter createJavaPersistentTypeAdapter() {
		if (javaPersistentTypeItemProvider == null) {
			javaPersistentTypeItemProvider = new JavaPersistentTypeItemProvider(this);
		}
		
		return javaPersistentTypeItemProvider;
	}
	
	protected JavaPersistentAttributeItemProvider javaPersistentAttributeItemProvider;
	
	public Adapter createJavaPersistentAttributeAdapter() {
		if (javaPersistentAttributeItemProvider == null) {
			javaPersistentAttributeItemProvider = new JavaPersistentAttributeItemProvider(
					this);
		}
		
		return javaPersistentAttributeItemProvider;
	}
	
	/**
	 * This returns the root adapter factory that contains this factory.
	 */
	public ComposeableAdapterFactory getRootAdapterFactory() {
		return parentAdapterFactory == null ? 
			this : 
			parentAdapterFactory.getRootAdapterFactory();
	}
	
	/**
	 * This sets the composed adapter factory that contains this factory.
	 */
	public void setParentAdapterFactory(
			ComposedAdapterFactory parentAdapterFactory) {
		this.parentAdapterFactory = parentAdapterFactory;
	}
	
	public boolean isFactoryForType(Object type) {
		return supportedTypes.contains(type) || super.isFactoryForType(type);
	}
	
	/**
	 * This implementation substitutes the factory itself as the key for the adapter.
	 */
	public Adapter adapt(Notifier notifier, Object type) {
		return super.adapt(notifier, this);
	}
	
	public Object adapt(Object object, Object type) {
		if (isFactoryForType(type)) {
			Object adapter = super.adapt(object, type);
			if (!(type instanceof Class)
					|| (((Class) type).isInstance(adapter))) {
				return adapter;
			}
		}
		
		return null;
	}
	
	/**
	 * This adds a listener.
	 */
	public void addListener(INotifyChangedListener notifyChangedListener) {
		changeNotifier.addListener(notifyChangedListener);
	}
	
	/**
	 * This removes a listener.
	 */
	public void removeListener(INotifyChangedListener notifyChangedListener) {
		changeNotifier.removeListener(notifyChangedListener);
	}
	
	/**
	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
	 */
	public void fireNotifyChanged(Notification notification) {
		changeNotifier.fireNotifyChanged(notification);
		
		if (parentAdapterFactory != null) {
			parentAdapterFactory.fireNotifyChanged(notification);
		}
	}
	
	/**
	 * This disposes all of the item providers created by this factory. 
	 */
	public void dispose() {
		if (javaCompilationUnitItemProvider != null) {
			javaCompilationUnitItemProvider.dispose();
		}
		if (javaPersistentTypeItemProvider != null) {
			javaPersistentTypeItemProvider.dispose();
		}
		if (javaPersistentAttributeItemProvider != null) {
			javaPersistentAttributeItemProvider.dispose();
		}
	}
}