package org.eclipse.stem.definitions.labels.provider;

/*******************************************************************************
 * Copyright (c) 2006 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
 *******************************************************************************/

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.IItemPropertySource;
import org.eclipse.emf.edit.provider.INotifyChangedListener;
import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.stem.definitions.labels.util.LabelsAdapterFactory;

/**
 * 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.
 * <!-- begin-user-doc --> <!--
 * end-user-doc -->
 * @generated
 */
public class LabelsItemProviderAdapterFactory extends LabelsAdapterFactory
		implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
	/**
	 * This keeps track of the root adapter factory that delegates to this adapter factory.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected ComposedAdapterFactory parentAdapterFactory;

	/**
	 * This is used to implement
	 * {@link org.eclipse.emf.edit.provider.IChangeNotifier}. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @generated
	 */
	protected IChangeNotifier changeNotifier = new ChangeNotifier();

	/**
	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
	 * <!-- begin-user-doc --> <!--
	 * end-user-doc -->
	 * @generated
	 */
	protected Collection<Object> supportedTypes = new ArrayList<Object>();

	/**
	 * This constructs an instance. <!-- begin-user-doc --> <!-- end-user-doc
	 * -->
	 * 
	 * @generated
	 */
	public LabelsItemProviderAdapterFactory() {
		supportedTypes.add(IEditingDomainItemProvider.class);
		supportedTypes.add(IStructuredItemContentProvider.class);
		supportedTypes.add(ITreeItemContentProvider.class);
		supportedTypes.add(IItemLabelProvider.class);
		supportedTypes.add(IItemPropertySource.class);
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.PopulationLabel} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected PopulationLabelItemProvider populationLabelItemProvider;

	/**
	 * This creates an adapter for a
	 * {@link org.eclipse.stem.definitions.labels.PopulationLabel}. <!--
	 * begin-user-doc -->
	 * 
	 * @return
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createPopulationLabelAdapter() {
		if (populationLabelItemProvider == null) {
			populationLabelItemProvider = new PopulationLabelItemProvider(this);
		}

		return populationLabelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.PopulationLabelValue} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected PopulationLabelValueItemProvider populationLabelValueItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.stem.definitions.labels.PopulationLabelValue}.
	 * <!-- begin-user-doc -->
	 * 
	 * @return
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createPopulationLabelValueAdapter() {
		if (populationLabelValueItemProvider == null) {
			populationLabelValueItemProvider = new PopulationLabelValueItemProvider(this);
		}

		return populationLabelValueItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all
	 * {@link org.eclipse.stem.definitions.labels.AreaLabel} instances. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @generated
	 */
	protected AreaLabelItemProvider areaLabelItemProvider;

	/**
	 * This creates an adapter for a
	 * {@link org.eclipse.stem.definitions.labels.AreaLabel}. <!--
	 * begin-user-doc -->
	 * 
	 * @return
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createAreaLabelAdapter() {
		if (areaLabelItemProvider == null) {
			areaLabelItemProvider = new AreaLabelItemProvider(this);
		}

		return areaLabelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.AreaLabelValue} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected AreaLabelValueItemProvider areaLabelValueItemProvider;

	/**
	 * This creates an adapter for a
	 * {@link org.eclipse.stem.definitions.labels.AreaLabelValue}. <!--
	 * begin-user-doc -->
	 * 
	 * @return
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createAreaLabelValueAdapter() {
		if (areaLabelValueItemProvider == null) {
			areaLabelValueItemProvider = new AreaLabelValueItemProvider(this);
		}

		return areaLabelValueItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.RelativePhysicalRelationshipLabel} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected RelativePhysicalRelationshipLabelItemProvider relativePhysicalRelationshipLabelItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.stem.definitions.labels.RelativePhysicalRelationshipLabel}.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createRelativePhysicalRelationshipLabelAdapter() {
		if (relativePhysicalRelationshipLabelItemProvider == null) {
			relativePhysicalRelationshipLabelItemProvider = new RelativePhysicalRelationshipLabelItemProvider(this);
		}

		return relativePhysicalRelationshipLabelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.RelativePhysicalRelationshipLabelValue} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected RelativePhysicalRelationshipLabelValueItemProvider relativePhysicalRelationshipLabelValueItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.stem.definitions.labels.RelativePhysicalRelationshipLabelValue}.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createRelativePhysicalRelationshipLabelValueAdapter() {
		if (relativePhysicalRelationshipLabelValueItemProvider == null) {
			relativePhysicalRelationshipLabelValueItemProvider = new RelativePhysicalRelationshipLabelValueItemProvider(this);
		}

		return relativePhysicalRelationshipLabelValueItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.CommonBorderRelationshipLabel} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected CommonBorderRelationshipLabelItemProvider commonBorderRelationshipLabelItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.stem.definitions.labels.CommonBorderRelationshipLabel}.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createCommonBorderRelationshipLabelAdapter() {
		if (commonBorderRelationshipLabelItemProvider == null) {
			commonBorderRelationshipLabelItemProvider = new CommonBorderRelationshipLabelItemProvider(this);
		}

		return commonBorderRelationshipLabelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.CommonBorderRelationshipLabelValue} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected CommonBorderRelationshipLabelValueItemProvider commonBorderRelationshipLabelValueItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.stem.definitions.labels.CommonBorderRelationshipLabelValue}.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createCommonBorderRelationshipLabelValueAdapter() {
		if (commonBorderRelationshipLabelValueItemProvider == null) {
			commonBorderRelationshipLabelValueItemProvider = new CommonBorderRelationshipLabelValueItemProvider(this);
		}

		return commonBorderRelationshipLabelValueItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.TransportRelationshipLabel} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected TransportRelationshipLabelItemProvider transportRelationshipLabelItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.stem.definitions.labels.TransportRelationshipLabel}.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createTransportRelationshipLabelAdapter() {
		if (transportRelationshipLabelItemProvider == null) {
			transportRelationshipLabelItemProvider = new TransportRelationshipLabelItemProvider(this);
		}

		return transportRelationshipLabelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.TransportRelationshipLabelValue} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected TransportRelationshipLabelValueItemProvider transportRelationshipLabelValueItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.stem.definitions.labels.TransportRelationshipLabelValue}.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createTransportRelationshipLabelValueAdapter() {
		if (transportRelationshipLabelValueItemProvider == null) {
			transportRelationshipLabelValueItemProvider = new TransportRelationshipLabelValueItemProvider(this);
		}

		return transportRelationshipLabelValueItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.PhysicalRelationshipLabelValue} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected PhysicalRelationshipLabelValueItemProvider physicalRelationshipLabelValueItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.stem.definitions.labels.PhysicalRelationshipLabelValue}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createPhysicalRelationshipLabelValueAdapter() {
		if (physicalRelationshipLabelValueItemProvider == null) {
			physicalRelationshipLabelValueItemProvider = new PhysicalRelationshipLabelValueItemProvider(this);
		}

		return physicalRelationshipLabelValueItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.RoadTransportRelationshipLabel} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected RoadTransportRelationshipLabelItemProvider roadTransportRelationshipLabelItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.stem.definitions.labels.RoadTransportRelationshipLabel}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createRoadTransportRelationshipLabelAdapter() {
		if (roadTransportRelationshipLabelItemProvider == null) {
			roadTransportRelationshipLabelItemProvider = new RoadTransportRelationshipLabelItemProvider(this);
		}

		return roadTransportRelationshipLabelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.stem.definitions.labels.RoadTransportRelationshipLabelValue} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected RoadTransportRelationshipLabelValueItemProvider roadTransportRelationshipLabelValueItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.stem.definitions.labels.RoadTransportRelationshipLabelValue}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createRoadTransportRelationshipLabelValueAdapter() {
		if (roadTransportRelationshipLabelValueItemProvider == null) {
			roadTransportRelationshipLabelValueItemProvider = new RoadTransportRelationshipLabelValueItemProvider(this);
		}

		return roadTransportRelationshipLabelValueItemProvider;
	}

	/**
	 * This returns the root adapter factory that contains this factory. <!--
	 * begin-user-doc -->
	 * 
	 * @return
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ComposeableAdapterFactory getRootAdapterFactory() {
		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
	}

	/**
	 * This sets the composed adapter factory that contains this factory. <!--
	 * begin-user-doc -->
	 * 
	 * @param parentAdapterFactory
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setParentAdapterFactory(
			ComposedAdapterFactory parentAdapterFactory) {
		this.parentAdapterFactory = parentAdapterFactory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * 
	 * @param type
	 * 
	 * @return
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean isFactoryForType(Object type) {
		return supportedTypes.contains(type) || super.isFactoryForType(type);
	}

	/**
	 * This implementation substitutes the factory itself as the key for the adapter.
	 * <!-- begin-user-doc -->
	 * 
	 * @param notifier
	 * @param type
	 * 
	 * @return
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter adapt(Notifier notifier, Object type) {
		return super.adapt(notifier, this);
	}

	/**
	 * <!-- begin-user-doc -->
	 * 
	 * @param object
	 * @param type
	 * @return
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	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.
	 * <!-- begin-user-doc -->
	 * 
	 * @param notifyChangedListener
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void addListener(INotifyChangedListener notifyChangedListener) {
		changeNotifier.addListener(notifyChangedListener);
	}

	/**
	 * This removes a listener.
	 * <!-- begin-user-doc -->
	 * 
	 * @param notifyChangedListener
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void removeListener(INotifyChangedListener notifyChangedListener) {
		changeNotifier.removeListener(notifyChangedListener);
	}

	/**
	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
	 * <!-- begin-user-doc -->
	 * 
	 * @param notification
	 * 
	 * <!-- end-user-doc -->
	 * @generated
	 */
	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. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @generated
	 */
	public void dispose() {
		if (areaLabelItemProvider != null) areaLabelItemProvider.dispose();
		if (areaLabelValueItemProvider != null) areaLabelValueItemProvider.dispose();
		if (commonBorderRelationshipLabelItemProvider != null) commonBorderRelationshipLabelItemProvider.dispose();
		if (commonBorderRelationshipLabelValueItemProvider != null) commonBorderRelationshipLabelValueItemProvider.dispose();
		if (populationLabelItemProvider != null) populationLabelItemProvider.dispose();
		if (populationLabelValueItemProvider != null) populationLabelValueItemProvider.dispose();
		if (relativePhysicalRelationshipLabelItemProvider != null) relativePhysicalRelationshipLabelItemProvider.dispose();
		if (relativePhysicalRelationshipLabelValueItemProvider != null) relativePhysicalRelationshipLabelValueItemProvider.dispose();
		if (transportRelationshipLabelItemProvider != null) transportRelationshipLabelItemProvider.dispose();
		if (transportRelationshipLabelValueItemProvider != null) transportRelationshipLabelValueItemProvider.dispose();
		if (physicalRelationshipLabelValueItemProvider != null) physicalRelationshipLabelValueItemProvider.dispose();
		if (roadTransportRelationshipLabelItemProvider != null) roadTransportRelationshipLabelItemProvider.dispose();
		if (roadTransportRelationshipLabelValueItemProvider != null) roadTransportRelationshipLabelValueItemProvider.dispose();
	}

}
