/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - 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.extension.grid.provider;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

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.common.util.ResourceLocator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.ChangeNotifier;
import org.eclipse.emf.edit.provider.ChildCreationExtenderManager;
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.IChildCreationExtender;
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.core.common.model.core.CoreModelPackage;
import org.eclipse.osbp.ecview.core.common.model.core.YDialog;
import org.eclipse.osbp.ecview.core.common.model.core.YLayout;
import org.eclipse.osbp.ecview.core.common.model.core.YView;
import org.eclipse.osbp.ecview.core.common.model.core.util.CoreModelSwitch;
import org.eclipse.osbp.ecview.core.extension.model.extension.ExtensionModelPackage;
import org.eclipse.osbp.ecview.core.extension.model.extension.YMasterDetail;
import org.eclipse.osbp.ecview.core.extension.model.extension.YTab;
import org.eclipse.osbp.ecview.core.extension.model.extension.util.ExtensionModelSwitch;
import org.eclipse.osbp.ecview.extension.grid.CxGridFactory;
import org.eclipse.osbp.ecview.extension.grid.CxGridPackage;
import org.eclipse.osbp.ecview.extension.grid.util.CxGridAdapterFactory;

/**
 * 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 CxGridItemProviderAdapterFactory extends CxGridAdapterFactory
		implements ComposeableAdapterFactory, IChangeNotifier, IDisposable,
		IChildCreationExtender {

	/**
	 * 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 helps manage the child creation extenders.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected ChildCreationExtenderManager childCreationExtenderManager = new ChildCreationExtenderManager(CxGridEditPlugin.INSTANCE, CxGridPackage.eNS_URI);

	/**
	 * 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 CxGridItemProviderAdapterFactory() {
		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.extension.grid.CxGrid} instances. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @generated
	 */
	protected CxGridItemProvider cxGridItemProvider;

	/**
	 * This creates an adapter for a
	 * {@link org.eclipse.osbp.ecview.extension.grid.CxGrid}. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 *
	 * @return the adapter
	 * @generated
	 */
	@Override
	public Adapter createCxGridAdapter() {
		if (cxGridItemProvider == null) {
			cxGridItemProvider = new CxGridItemProvider(this);
		}

		return cxGridItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.extension.grid.CxGridHeaderRow} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected CxGridHeaderRowItemProvider cxGridHeaderRowItemProvider;

	/**
	 * This creates an adapter for a
	 * {@link org.eclipse.osbp.ecview.extension.grid.CxGridHeaderRow}. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 *
	 * @return the adapter
	 * @generated
	 */
	@Override
	public Adapter createCxGridHeaderRowAdapter() {
		if (cxGridHeaderRowItemProvider == null) {
			cxGridHeaderRowItemProvider = new CxGridHeaderRowItemProvider(this);
		}

		return cxGridHeaderRowItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.extension.grid.CxGridFooterRow} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected CxGridFooterRowItemProvider cxGridFooterRowItemProvider;

	/**
	 * This creates an adapter for a
	 * {@link org.eclipse.osbp.ecview.extension.grid.CxGridFooterRow}. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 *
	 * @return the adapter
	 * @generated
	 */
	@Override
	public Adapter createCxGridFooterRowAdapter() {
		if (cxGridFooterRowItemProvider == null) {
			cxGridFooterRowItemProvider = new CxGridFooterRowItemProvider(this);
		}

		return cxGridFooterRowItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.extension.grid.CxGridFilterRow} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected CxGridFilterRowItemProvider cxGridFilterRowItemProvider;

	/**
	 * This creates an adapter for a
	 * {@link org.eclipse.osbp.ecview.extension.grid.CxGridFilterRow}. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 *
	 * @return the adapter
	 * @generated
	 */
	@Override
	public Adapter createCxGridFilterRowAdapter() {
		if (cxGridFilterRowItemProvider == null) {
			cxGridFilterRowItemProvider = new CxGridFilterRowItemProvider(this);
		}

		return cxGridFilterRowItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.extension.grid.CxGridMetaCell} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected CxGridMetaCellItemProvider cxGridMetaCellItemProvider;

	/**
	 * This creates an adapter for a
	 * {@link org.eclipse.osbp.ecview.extension.grid.CxGridMetaCell}. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 *
	 * @return the adapter
	 * @generated
	 */
	@Override
	public Adapter createCxGridMetaCellAdapter() {
		if (cxGridMetaCellItemProvider == null) {
			cxGridMetaCellItemProvider = new CxGridMetaCellItemProvider(this);
		}

		return cxGridMetaCellItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.extension.grid.CxGridGroupedCell} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected CxGridGroupedCellItemProvider cxGridGroupedCellItemProvider;

	/**
	 * This creates an adapter for a
	 * {@link org.eclipse.osbp.ecview.extension.grid.CxGridGroupedCell}. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 *
	 * @return the adapter
	 * @generated
	 */
	@Override
	public Adapter createCxGridGroupedCellAdapter() {
		if (cxGridGroupedCellItemProvider == null) {
			cxGridGroupedCellItemProvider = new CxGridGroupedCellItemProvider(this);
		}

		return cxGridGroupedCellItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.extension.grid.CxGridColumn} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected CxGridColumnItemProvider cxGridColumnItemProvider;

	/**
	 * This creates an adapter for a
	 * {@link org.eclipse.osbp.ecview.extension.grid.CxGridColumn}. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 *
	 * @return the adapter
	 * @generated
	 */
	@Override
	public Adapter createCxGridColumnAdapter() {
		if (cxGridColumnItemProvider == null) {
			cxGridColumnItemProvider = new CxGridColumnItemProvider(this);
		}

		return cxGridColumnItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.extension.grid.CxGridDelegateCellStyleGenerator} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected CxGridDelegateCellStyleGeneratorItemProvider cxGridDelegateCellStyleGeneratorItemProvider;

	/**
	 * This creates an adapter for a {@link org.eclipse.osbp.ecview.extension.grid.CxGridDelegateCellStyleGenerator}.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Adapter createCxGridDelegateCellStyleGeneratorAdapter() {
		if (cxGridDelegateCellStyleGeneratorItemProvider == null) {
			cxGridDelegateCellStyleGeneratorItemProvider = new CxGridDelegateCellStyleGeneratorItemProvider(this);
		}

		return cxGridDelegateCellStyleGeneratorItemProvider;
	}

	/**
	 * This keeps track of the one adapter used for all {@link org.eclipse.osbp.ecview.extension.grid.CxGridSortable} instances.
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected CxGridSortableItemProvider cxGridSortableItemProvider;

	/**
	 * This creates an adapter for a
	 * {@link org.eclipse.osbp.ecview.extension.grid.CxGridSortable}. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 *
	 * @return the adapter
	 * @generated
	 */
	@Override
	public Adapter createCxGridSortableAdapter() {
		if (cxGridSortableItemProvider == null) {
			cxGridSortableItemProvider = new CxGridSortableItemProvider(this);
		}

		return cxGridSortableItemProvider;
	}

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

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->.
	 *
	 * @param type
	 *            the type
	 * @return true, if is factory for type
	 * @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 -->.
	 *
	 * @param object
	 *            the object
	 * @param type
	 *            the type
	 * @return the object
	 * @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;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->.
	 *
	 * @return the child creation extenders
	 * @generated
	 */
	public List<IChildCreationExtender> getChildCreationExtenders() {
		return childCreationExtenderManager.getChildCreationExtenders();
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->.
	 *
	 * @param object
	 *            the object
	 * @param editingDomain
	 *            the editing domain
	 * @return the new child descriptors
	 * @generated
	 */
	public Collection<?> getNewChildDescriptors(Object object,
			EditingDomain editingDomain) {
		return childCreationExtenderManager.getNewChildDescriptors(object, editingDomain);
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->.
	 *
	 * @return the resource locator
	 * @generated
	 */
	public ResourceLocator getResourceLocator() {
		return childCreationExtenderManager;
	}

	/**
	 * 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
	 * -->
	 *
	 * @param notification
	 *            the notification
	 * @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 (cxGridItemProvider != null) cxGridItemProvider.dispose();
		if (cxGridHeaderRowItemProvider != null) cxGridHeaderRowItemProvider.dispose();
		if (cxGridFooterRowItemProvider != null) cxGridFooterRowItemProvider.dispose();
		if (cxGridFilterRowItemProvider != null) cxGridFilterRowItemProvider.dispose();
		if (cxGridMetaCellItemProvider != null) cxGridMetaCellItemProvider.dispose();
		if (cxGridGroupedCellItemProvider != null) cxGridGroupedCellItemProvider.dispose();
		if (cxGridColumnItemProvider != null) cxGridColumnItemProvider.dispose();
		if (cxGridDelegateCellStyleGeneratorItemProvider != null) cxGridDelegateCellStyleGeneratorItemProvider.dispose();
		if (cxGridSortableItemProvider != null) cxGridSortableItemProvider.dispose();
	}

	/**
	 * A child creation extender for the {@link CoreModelPackage}. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @generated
	 */
	public static class CoreModelChildCreationExtender implements
			IChildCreationExtender {
		/**
		 * The switch for creating child descriptors specific to each extended class.
		 * <!-- begin-user-doc --> <!-- end-user-doc -->
		 * @generated
		 */
		protected static class CreationSwitch extends CoreModelSwitch<Object> {
			/**
			 * The child descriptors being populated.
			 * <!-- begin-user-doc -->
			 * <!-- end-user-doc -->
			 * @generated
			 */
			protected List<Object> newChildDescriptors;

			/**
			 * The domain in which to create the children.
			 * <!-- begin-user-doc
			 * --> <!-- end-user-doc -->
			 * @generated
			 */
			protected EditingDomain editingDomain;

			/**
			 * Creates the a switch for populating child descriptors in the given domain.
			 * <!-- begin-user-doc --> <!-- end-user-doc -->
			 * @generated
			 */
			CreationSwitch(List<Object> newChildDescriptors,
					EditingDomain editingDomain) {
				this.newChildDescriptors = newChildDescriptors;
				this.editingDomain = editingDomain;
			}

			/**
			 *
			 * @param object
			 *            the object
			 * @return the object
			 * @generated
			 */
			@Override
			public Object caseYLayout(YLayout object) {
				newChildDescriptors.add
					(createChildParameter
						(CoreModelPackage.Literals.YLAYOUT__ELEMENTS,
						 CxGridFactory.eINSTANCE.createCxGrid()));

				return null;
			}

			/**
			 *
			 * @param object
			 *            the object
			 * @return the object
			 * @generated
			 */
			@Override
			public Object caseYView(YView object) {
				newChildDescriptors.add
					(createChildParameter
						(CoreModelPackage.Literals.YVIEW__CONTENT,
						 CxGridFactory.eINSTANCE.createCxGrid()));

				return null;
			}

			/**
			 *
			 * @param object
			 *            the object
			 * @return the object
			 * @generated
			 */
			@Override
			public Object caseYDialog(YDialog object) {
				newChildDescriptors.add
					(createChildParameter
						(CoreModelPackage.Literals.YDIALOG__CONTENT,
						 CxGridFactory.eINSTANCE.createCxGrid()));

				return null;
			}

			/**
			 *
			 * @param feature
			 *            the feature
			 * @param child
			 *            the child
			 * @return the command parameter
			 * @generated
			 */
			protected CommandParameter createChildParameter(Object feature,
					Object child) {
				return new CommandParameter(null, feature, child);
			}

		}

		/**
		 * <!-- begin-user-doc --> <!-- end-user-doc -->.
		 *
		 * @param object
		 *            the object
		 * @param editingDomain
		 *            the editing domain
		 * @return the new child descriptors
		 * @generated
		 */
		public Collection<Object> getNewChildDescriptors(Object object,
				EditingDomain editingDomain) {
			ArrayList<Object> result = new ArrayList<Object>();
			new CreationSwitch(result, editingDomain).doSwitch((EObject)object);
			return result;
		}

		/**
		 * <!-- begin-user-doc --> <!-- end-user-doc -->.
		 *
		 * @return the resource locator
		 * @generated
		 */
		public ResourceLocator getResourceLocator() {
			return CxGridEditPlugin.INSTANCE;
		}
	}

	/**
	 * A child creation extender for the {@link ExtensionModelPackage}. <!--
	 * begin-user-doc --> <!-- end-user-doc -->
	 * 
	 * @generated
	 */
	public static class ExtensionModelChildCreationExtender implements
			IChildCreationExtender {
		/**
		 * The switch for creating child descriptors specific to each extended class.
		 * <!-- begin-user-doc --> <!-- end-user-doc -->
		 * @generated
		 */
		protected static class CreationSwitch extends
				ExtensionModelSwitch<Object> {
			/**
			 * The child descriptors being populated.
			 * <!-- begin-user-doc -->
			 * <!-- end-user-doc -->
			 * @generated
			 */
			protected List<Object> newChildDescriptors;

			/**
			 * The domain in which to create the children.
			 * <!-- begin-user-doc
			 * --> <!-- end-user-doc -->
			 * @generated
			 */
			protected EditingDomain editingDomain;

			/**
			 * Creates the a switch for populating child descriptors in the given domain.
			 * <!-- begin-user-doc --> <!-- end-user-doc -->
			 * @generated
			 */
			CreationSwitch(List<Object> newChildDescriptors,
					EditingDomain editingDomain) {
				this.newChildDescriptors = newChildDescriptors;
				this.editingDomain = editingDomain;
			}

			/**
			 *
			 * @param object
			 *            the object
			 * @return the object
			 * @generated
			 */
			@Override
			public Object caseYTab(YTab object) {
				newChildDescriptors.add
					(createChildParameter
						(ExtensionModelPackage.Literals.YTAB__EMBEDDABLE,
						 CxGridFactory.eINSTANCE.createCxGrid()));

				return null;
			}

			/**
			 *
			 * @param object
			 *            the object
			 * @return the object
			 * @generated
			 */
			@Override
			public Object caseYMasterDetail(YMasterDetail object) {
				newChildDescriptors.add
					(createChildParameter
						(ExtensionModelPackage.Literals.YMASTER_DETAIL__MASTER_ELEMENT,
						 CxGridFactory.eINSTANCE.createCxGrid()));

				newChildDescriptors.add
					(createChildParameter
						(ExtensionModelPackage.Literals.YMASTER_DETAIL__DETAIL_ELEMENT,
						 CxGridFactory.eINSTANCE.createCxGrid()));

				return null;
			}

			/**
			 *
			 * @param feature
			 *            the feature
			 * @param child
			 *            the child
			 * @return the command parameter
			 * @generated
			 */
			protected CommandParameter createChildParameter(Object feature,
					Object child) {
				return new CommandParameter(null, feature, child);
			}

		}

		/**
		 * <!-- begin-user-doc --> <!-- end-user-doc -->.
		 *
		 * @param object
		 *            the object
		 * @param editingDomain
		 *            the editing domain
		 * @return the new child descriptors
		 * @generated
		 */
		public Collection<Object> getNewChildDescriptors(Object object,
				EditingDomain editingDomain) {
			ArrayList<Object> result = new ArrayList<Object>();
			new CreationSwitch(result, editingDomain).doSwitch((EObject)object);
			return result;
		}

		/**
		 * <!-- begin-user-doc --> <!-- end-user-doc -->.
		 *
		 * @return the resource locator
		 * @generated
		 */
		public ResourceLocator getResourceLocator() {
			return CxGridEditPlugin.INSTANCE;
		}
	}

}
