/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0 
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 */
package org.eclipse.osbp.ecview.semantic.uisemantics.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.osbp.ecview.semantic.uisemantics.util.UiSemanticsAdapterFactory;

/**
 * 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 UiSemanticsItemProviderAdapterFactory extends UiSemanticsAdapterFactory 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 UiSemanticsItemProviderAdapterFactory() {
		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.osbp.ecview.semantic.uisemantics.UxModel} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxModelItemProvider uxModelItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxModel}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxModelAdapter() {
		if (uxModelItemProvider == null) {
			uxModelItemProvider = new UxModelItemProvider(this);
		}

		return uxModelItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxImportSectionDeclaration} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxImportSectionDeclarationItemProvider uxImportSectionDeclarationItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxImportSectionDeclaration}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxImportSectionDeclarationAdapter() {
		if (uxImportSectionDeclarationItemProvider == null) {
			uxImportSectionDeclarationItemProvider = new UxImportSectionDeclarationItemProvider(this);
		}

		return uxImportSectionDeclarationItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxEPackageImport} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxEPackageImportItemProvider uxEPackageImportItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxEPackageImport}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxEPackageImportAdapter() {
		if (uxEPackageImportItemProvider == null) {
			uxEPackageImportItemProvider = new UxEPackageImportItemProvider(this);
		}

		return uxEPackageImportItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxElementDefinition} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxElementDefinitionItemProvider uxElementDefinitionItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxElementDefinition}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxElementDefinitionAdapter() {
		if (uxElementDefinitionItemProvider == null) {
			uxElementDefinitionItemProvider = new UxElementDefinitionItemProvider(this);
		}

		return uxElementDefinitionItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxElementURI} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxElementURIItemProvider uxElementURIItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxElementURI}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxElementURIAdapter() {
		if (uxElementURIItemProvider == null) {
			uxElementURIItemProvider = new UxElementURIItemProvider(this);
		}

		return uxElementURIItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxAvailableBindingsItemProvider uxAvailableBindingsItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableBindings}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxAvailableBindingsAdapter() {
		if (uxAvailableBindingsItemProvider == null) {
			uxAvailableBindingsItemProvider = new UxAvailableBindingsItemProvider(this);
		}

		return uxAvailableBindingsItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableVisibilityOptions} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxAvailableVisibilityOptionsItemProvider uxAvailableVisibilityOptionsItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableVisibilityOptions}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxAvailableVisibilityOptionsAdapter() {
		if (uxAvailableVisibilityOptionsItemProvider == null) {
			uxAvailableVisibilityOptionsItemProvider = new UxAvailableVisibilityOptionsItemProvider(this);
		}

		return uxAvailableVisibilityOptionsItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxValueBindingEndpointDef} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxValueBindingEndpointDefItemProvider uxValueBindingEndpointDefItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxValueBindingEndpointDef}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxValueBindingEndpointDefAdapter() {
		if (uxValueBindingEndpointDefItemProvider == null) {
			uxValueBindingEndpointDefItemProvider = new UxValueBindingEndpointDefItemProvider(this);
		}

		return uxValueBindingEndpointDefItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableValidatorProperties} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxAvailableValidatorPropertiesItemProvider uxAvailableValidatorPropertiesItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAvailableValidatorProperties}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxAvailableValidatorPropertiesAdapter() {
		if (uxAvailableValidatorPropertiesItemProvider == null) {
			uxAvailableValidatorPropertiesItemProvider = new UxAvailableValidatorPropertiesItemProvider(this);
		}

		return uxAvailableValidatorPropertiesItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxValidatorProperty} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxValidatorPropertyItemProvider uxValidatorPropertyItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxValidatorProperty}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxValidatorPropertyAdapter() {
		if (uxValidatorPropertyItemProvider == null) {
			uxValidatorPropertyItemProvider = new UxValidatorPropertyItemProvider(this);
		}

		return uxValidatorPropertyItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxBindingableOption} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxBindingableOptionItemProvider uxBindingableOptionItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxBindingableOption}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxBindingableOptionAdapter() {
		if (uxBindingableOptionItemProvider == null) {
			uxBindingableOptionItemProvider = new UxBindingableOptionItemProvider(this);
		}

		return uxBindingableOptionItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxVisibleableOption} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxVisibleableOptionItemProvider uxVisibleableOptionItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxVisibleableOption}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxVisibleableOptionAdapter() {
		if (uxVisibleableOptionItemProvider == null) {
			uxVisibleableOptionItemProvider = new UxVisibleableOptionItemProvider(this);
		}

		return uxVisibleableOptionItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAction} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxActionItemProvider uxActionItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxAction}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxActionAdapter() {
		if (uxActionItemProvider == null) {
			uxActionItemProvider = new UxActionItemProvider(this);
		}

		return uxActionItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxViewCategory} instances.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected UxViewCategoryItemProvider uxViewCategoryItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.semantic.uisemantics.UxViewCategory}.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createUxViewCategoryAdapter() {
		if (uxViewCategoryItemProvider == null) {
			uxViewCategoryItemProvider = new UxViewCategoryItemProvider(this);
		}

		return uxViewCategoryItemProvider;
	}

	/**
	 * This returns the root adapter factory that contains this factory.
	 * <!-- begin-user-doc -->
	 * <!-- 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 -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
		this.parentAdapterFactory = parentAdapterFactory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- 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 -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter adapt(Notifier notifier, Object type) {
		return super.adapt(notifier, this);
	}

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

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

	/**
	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
	 * <!-- begin-user-doc -->
	 * <!-- 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 (uxModelItemProvider != null) uxModelItemProvider.dispose();
		if (uxImportSectionDeclarationItemProvider != null) uxImportSectionDeclarationItemProvider.dispose();
		if (uxEPackageImportItemProvider != null) uxEPackageImportItemProvider.dispose();
		if (uxElementDefinitionItemProvider != null) uxElementDefinitionItemProvider.dispose();
		if (uxElementURIItemProvider != null) uxElementURIItemProvider.dispose();
		if (uxAvailableBindingsItemProvider != null) uxAvailableBindingsItemProvider.dispose();
		if (uxAvailableVisibilityOptionsItemProvider != null) uxAvailableVisibilityOptionsItemProvider.dispose();
		if (uxValueBindingEndpointDefItemProvider != null) uxValueBindingEndpointDefItemProvider.dispose();
		if (uxAvailableValidatorPropertiesItemProvider != null) uxAvailableValidatorPropertiesItemProvider.dispose();
		if (uxValidatorPropertyItemProvider != null) uxValidatorPropertyItemProvider.dispose();
		if (uxBindingableOptionItemProvider != null) uxBindingableOptionItemProvider.dispose();
		if (uxVisibleableOptionItemProvider != null) uxVisibleableOptionItemProvider.dispose();
		if (uxActionItemProvider != null) uxActionItemProvider.dispose();
		if (uxViewCategoryItemProvider != null) uxViewCategoryItemProvider.dispose();
	}

}
