/*=============================================================================#
 # Copyright (c) 2012, 2020 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.rtm.ggplot.provider;

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.statet.rtm.ggplot.util.GGPlotAdapterFactory;

/**
 * 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 GGPlotItemProviderAdapterFactory extends GGPlotAdapterFactory 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<>();

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

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GGPlot} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GGPlotItemProvider ggPlotItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GGPlot}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGGPlotAdapter() {
		if (this.ggPlotItemProvider == null) {
			this.ggPlotItemProvider= new GGPlotItemProvider(this);
		}

		return this.ggPlotItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GeomPointLayer} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GeomPointLayerItemProvider geomPointLayerItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GeomPointLayer}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGeomPointLayerAdapter() {
		if (this.geomPointLayerItemProvider == null) {
			this.geomPointLayerItemProvider= new GeomPointLayerItemProvider(this);
		}

		return this.geomPointLayerItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GeomBarLayer} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GeomBarLayerItemProvider geomBarLayerItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GeomBarLayer}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGeomBarLayerAdapter() {
		if (this.geomBarLayerItemProvider == null) {
			this.geomBarLayerItemProvider= new GeomBarLayerItemProvider(this);
		}

		return this.geomBarLayerItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GeomTextLayer} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GeomTextLayerItemProvider geomTextLayerItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GeomTextLayer}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGeomTextLayerAdapter() {
		if (this.geomTextLayerItemProvider == null) {
			this.geomTextLayerItemProvider= new GeomTextLayerItemProvider(this);
		}

		return this.geomTextLayerItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GeomSmoothLayer} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GeomSmoothLayerItemProvider geomSmoothLayerItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GeomSmoothLayer}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGeomSmoothLayerAdapter() {
		if (this.geomSmoothLayerItemProvider == null) {
			this.geomSmoothLayerItemProvider= new GeomSmoothLayerItemProvider(this);
		}

		return this.geomSmoothLayerItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GeomViolinLayer} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GeomViolinLayerItemProvider geomViolinLayerItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GeomViolinLayer}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGeomViolinLayerAdapter() {
		if (this.geomViolinLayerItemProvider == null) {
			this.geomViolinLayerItemProvider= new GeomViolinLayerItemProvider(this);
		}

		return this.geomViolinLayerItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GridFacetLayout} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GridFacetLayoutItemProvider gridFacetLayoutItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GridFacetLayout}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGridFacetLayoutAdapter() {
		if (this.gridFacetLayoutItemProvider == null) {
			this.gridFacetLayoutItemProvider= new GridFacetLayoutItemProvider(this);
		}

		return this.gridFacetLayoutItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.WrapFacetLayout} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected WrapFacetLayoutItemProvider wrapFacetLayoutItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.WrapFacetLayout}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createWrapFacetLayoutAdapter() {
		if (this.wrapFacetLayoutItemProvider == null) {
			this.wrapFacetLayoutItemProvider= new WrapFacetLayoutItemProvider(this);
		}

		return this.wrapFacetLayoutItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.TextStyle} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected TextStyleItemProvider textStyleItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.TextStyle}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createTextStyleAdapter() {
		if (this.textStyleItemProvider == null) {
			this.textStyleItemProvider= new TextStyleItemProvider(this);
		}

		return this.textStyleItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.IdentityStat} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected IdentityStatItemProvider identityStatItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.IdentityStat}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createIdentityStatAdapter() {
		if (this.identityStatItemProvider == null) {
			this.identityStatItemProvider= new IdentityStatItemProvider(this);
		}

		return this.identityStatItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.SummaryStat} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected SummaryStatItemProvider summaryStatItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.SummaryStat}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createSummaryStatAdapter() {
		if (this.summaryStatItemProvider == null) {
			this.summaryStatItemProvider= new SummaryStatItemProvider(this);
		}

		return this.summaryStatItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GeomBoxplotLayer} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GeomBoxplotLayerItemProvider geomBoxplotLayerItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GeomBoxplotLayer}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGeomBoxplotLayerAdapter() {
		if (this.geomBoxplotLayerItemProvider == null) {
			this.geomBoxplotLayerItemProvider= new GeomBoxplotLayerItemProvider(this);
		}

		return this.geomBoxplotLayerItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GeomHistogramLayer} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GeomHistogramLayerItemProvider geomHistogramLayerItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GeomHistogramLayer}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGeomHistogramLayerAdapter() {
		if (this.geomHistogramLayerItemProvider == null) {
			this.geomHistogramLayerItemProvider= new GeomHistogramLayerItemProvider(this);
		}

		return this.geomHistogramLayerItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GeomLineLayer} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GeomLineLayerItemProvider geomLineLayerItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GeomLineLayer}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGeomLineLayerAdapter() {
		if (this.geomLineLayerItemProvider == null) {
			this.geomLineLayerItemProvider= new GeomLineLayerItemProvider(this);
		}

		return this.geomLineLayerItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GeomAblineLayer} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GeomAblineLayerItemProvider geomAblineLayerItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GeomAblineLayer}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGeomAblineLayerAdapter() {
		if (this.geomAblineLayerItemProvider == null) {
			this.geomAblineLayerItemProvider= new GeomAblineLayerItemProvider(this);
		}

		return this.geomAblineLayerItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.statet.rtm.ggplot.GeomTileLayer} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected GeomTileLayerItemProvider geomTileLayerItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.statet.rtm.ggplot.GeomTileLayer}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createGeomTileLayerAdapter() {
		if (this.geomTileLayerItemProvider == null) {
			this.geomTileLayerItemProvider= new GeomTileLayerItemProvider(this);
		}

		return this.geomTileLayerItemProvider;
	}

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object adapt(final Object object, final Object type) {
		if (isFactoryForType(type)) {
			final 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 -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void addListener(final INotifyChangedListener notifyChangedListener) {
		this.changeNotifier.addListener(notifyChangedListener);
	}

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

	/**
	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void fireNotifyChanged(final Notification notification) {
		this.changeNotifier.fireNotifyChanged(notification);

		if (this.parentAdapterFactory != null) {
			this.parentAdapterFactory.fireNotifyChanged(notification);
		}
	}

	/**
	 * This disposes all of the item providers created by this factory. 
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void dispose() {
		if (this.ggPlotItemProvider != null) {
			this.ggPlotItemProvider.dispose();
		}
		if (this.geomAblineLayerItemProvider != null) {
			this.geomAblineLayerItemProvider.dispose();
		}
		if (this.geomBarLayerItemProvider != null) {
			this.geomBarLayerItemProvider.dispose();
		}
		if (this.geomBoxplotLayerItemProvider != null) {
			this.geomBoxplotLayerItemProvider.dispose();
		}
		if (this.geomHistogramLayerItemProvider != null) {
			this.geomHistogramLayerItemProvider.dispose();
		}
		if (this.geomLineLayerItemProvider != null) {
			this.geomLineLayerItemProvider.dispose();
		}
		if (this.geomPointLayerItemProvider != null) {
			this.geomPointLayerItemProvider.dispose();
		}
		if (this.geomTextLayerItemProvider != null) {
			this.geomTextLayerItemProvider.dispose();
		}
		if (this.geomSmoothLayerItemProvider != null) {
			this.geomSmoothLayerItemProvider.dispose();
		}
		if (this.geomTileLayerItemProvider != null) {
			this.geomTileLayerItemProvider.dispose();
		}
		if (this.geomViolinLayerItemProvider != null) {
			this.geomViolinLayerItemProvider.dispose();
		}
		if (this.gridFacetLayoutItemProvider != null) {
			this.gridFacetLayoutItemProvider.dispose();
		}
		if (this.wrapFacetLayoutItemProvider != null) {
			this.wrapFacetLayoutItemProvider.dispose();
		}
		if (this.identityStatItemProvider != null) {
			this.identityStatItemProvider.dispose();
		}
		if (this.summaryStatItemProvider != null) {
			this.summaryStatItemProvider.dispose();
		}
		if (this.textStyleItemProvider != null) {
			this.textStyleItemProvider.dispose();
		}
	}

}
