/**
 * 
 * Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
 * 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:
 * Thales Corporate Services S.A.S - initial API and implementation
 * 
 */
package org.eclipse.egf.model.pattern.provider;

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

import org.eclipse.egf.common.helper.ClassHelper;
import org.eclipse.egf.model.edit.EGFModelEditPlugin;
import org.eclipse.egf.model.fcore.Contract;
import org.eclipse.egf.model.fcore.FcorePackage;
import org.eclipse.egf.model.fcore.InvocationContract;
import org.eclipse.egf.model.fcore.OrchestrationParameter;
import org.eclipse.egf.model.fcore.ViewpointContainer;
import org.eclipse.egf.model.fcore.util.FcoreSwitch;
import org.eclipse.egf.model.pattern.PatternFactory;
import org.eclipse.egf.model.pattern.TypePatternCallBackHandler;
import org.eclipse.egf.model.pattern.TypePatternDomainVisitor;
import org.eclipse.egf.model.pattern.TypePatternExecutionReporter;
import org.eclipse.egf.model.pattern.TypePatternList;
import org.eclipse.egf.model.pattern.util.PatternAdapterFactory;
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.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.IItemColorProvider;
import org.eclipse.emf.edit.provider.IItemFontProvider;
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.ITableItemColorProvider;
import org.eclipse.emf.edit.provider.ITableItemFontProvider;
import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;

/**
 * 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 PatternItemProviderAdapterFactory extends PatternAdapterFactory 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 PatternItemProviderAdapterFactory() {
        supportedTypes.add(IEditingDomainItemProvider.class);
        supportedTypes.add(IStructuredItemContentProvider.class);
        supportedTypes.add(ITreeItemContentProvider.class);
        supportedTypes.add(IItemLabelProvider.class);
        supportedTypes.add(IItemPropertySource.class);
        supportedTypes.add(ITableItemLabelProvider.class);
        supportedTypes.add(ITableItemColorProvider.class);
        supportedTypes.add(ITableItemFontProvider.class);
        supportedTypes.add(IItemColorProvider.class);
        supportedTypes.add(IItemFontProvider.class);
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.Pattern} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected PatternItemProvider patternItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.Pattern}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createPatternAdapter() {
        if (patternItemProvider == null) {
            patternItemProvider = new PatternItemProvider(this);
        }

        return patternItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.PatternMethod} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected PatternMethodItemProvider patternMethodItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.PatternMethod}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createPatternMethodAdapter() {
        if (patternMethodItemProvider == null) {
            patternMethodItemProvider = new PatternMethodItemProvider(this);
        }

        return patternMethodItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.PatternParameter} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected PatternParameterItemProvider patternParameterItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.PatternParameter}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createPatternParameterAdapter() {
        if (patternParameterItemProvider == null) {
            patternParameterItemProvider = new PatternParameterItemProvider(this);
        }

        return patternParameterItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.PatternLibrary} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected PatternLibraryItemProvider patternLibraryItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.PatternLibrary}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createPatternLibraryAdapter() {
        if (patternLibraryItemProvider == null) {
            patternLibraryItemProvider = new PatternLibraryItemProvider(this);
        }

        return patternLibraryItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.PatternViewpoint} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected PatternViewpointItemProvider patternViewpointItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.PatternViewpoint}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createPatternViewpointAdapter() {
        if (patternViewpointItemProvider == null) {
            patternViewpointItemProvider = new PatternViewpointItemProvider(this);
        }

        return patternViewpointItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.PatternCall} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected PatternCallItemProvider patternCallItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.PatternCall}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createPatternCallAdapter() {
        if (patternCallItemProvider == null) {
            patternCallItemProvider = new PatternCallItemProvider(this);
        }

        return patternCallItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.SuperCall} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected SuperCallItemProvider superCallItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.SuperCall}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createSuperCallAdapter() {
        if (superCallItemProvider == null) {
            superCallItemProvider = new SuperCallItemProvider(this);
        }

        return superCallItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link java.util.Map.Entry} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected Paramerter2ParameterMapItemProvider paramerter2ParameterMapItemProvider;

    /**
     * This creates an adapter for a {@link java.util.Map.Entry}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createParamerter2ParameterMapAdapter() {
        if (paramerter2ParameterMapItemProvider == null) {
            paramerter2ParameterMapItemProvider = new Paramerter2ParameterMapItemProvider(this);
        }

        return paramerter2ParameterMapItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.MethodCall} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected MethodCallItemProvider methodCallItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.MethodCall}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createMethodCallAdapter() {
        if (methodCallItemProvider == null) {
            methodCallItemProvider = new MethodCallItemProvider(this);
        }

        return methodCallItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.PatternVariable} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected PatternVariableItemProvider patternVariableItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.PatternVariable}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createPatternVariableAdapter() {
        if (patternVariableItemProvider == null) {
            patternVariableItemProvider = new PatternVariableItemProvider(this);
        }

        return patternVariableItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.PatternInjectedCall} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected PatternInjectedCallItemProvider patternInjectedCallItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.PatternInjectedCall}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createPatternInjectedCallAdapter() {
        if (patternInjectedCallItemProvider == null) {
            patternInjectedCallItemProvider = new PatternInjectedCallItemProvider(this);
        }

        return patternInjectedCallItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.BasicQuery} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected BasicQueryItemProvider basicQueryItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.BasicQuery}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createBasicQueryAdapter() {
        if (basicQueryItemProvider == null) {
            basicQueryItemProvider = new BasicQueryItemProvider(this);
        }

        return basicQueryItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.StringQuery} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected StringQueryItemProvider stringQueryItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.StringQuery}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createStringQueryAdapter() {
        if (stringQueryItemProvider == null) {
            stringQueryItemProvider = new StringQueryItemProvider(this);
        }

        return stringQueryItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.CustomQuery} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected CustomQueryItemProvider customQueryItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.CustomQuery}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createCustomQueryAdapter() {
        if (customQueryItemProvider == null) {
            customQueryItemProvider = new CustomQueryItemProvider(this);
        }

        return customQueryItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link java.util.Map.Entry} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected String2PatternListItemProvider string2PatternListItemProvider;

    /**
     * This creates an adapter for a {@link java.util.Map.Entry}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createString2PatternListAdapter() {
        if (string2PatternListItemProvider == null) {
            string2PatternListItemProvider = new String2PatternListItemProvider(this);
        }

        return string2PatternListItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link java.util.Map.Entry} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected String2StringItemProvider string2StringItemProvider;

    /**
     * This creates an adapter for a {@link java.util.Map.Entry}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createString2StringAdapter() {
        if (string2StringItemProvider == null) {
            string2StringItemProvider = new String2StringItemProvider(this);
        }

        return string2StringItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.TypePatternExecutionReporter} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected TypePatternExecutionReporterItemProvider typePatternExecutionReporterItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.TypePatternExecutionReporter}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createTypePatternExecutionReporterAdapter() {
        if (typePatternExecutionReporterItemProvider == null) {
            typePatternExecutionReporterItemProvider = new TypePatternExecutionReporterItemProvider(this);
        }

        return typePatternExecutionReporterItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.BackCall} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected BackCallItemProvider backCallItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.BackCall}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createBackCallAdapter() {
        if (backCallItemProvider == null) {
            backCallItemProvider = new BackCallItemProvider(this);
        }

        return backCallItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.TypePatternCallBackHandler} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected TypePatternCallBackHandlerItemProvider typePatternCallBackHandlerItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.TypePatternCallBackHandler}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createTypePatternCallBackHandlerAdapter() {
        if (typePatternCallBackHandlerItemProvider == null) {
            typePatternCallBackHandlerItemProvider = new TypePatternCallBackHandlerItemProvider(this);
        }

        return typePatternCallBackHandlerItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.TypePatternDomainVisitor} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected TypePatternDomainVisitorItemProvider typePatternDomainVisitorItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.TypePatternDomainVisitor}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createTypePatternDomainVisitorAdapter() {
        if (typePatternDomainVisitorItemProvider == null) {
            typePatternDomainVisitorItemProvider = new TypePatternDomainVisitorItemProvider(this);
        }

        return typePatternDomainVisitorItemProvider;
    }

    /**
     * This keeps track of the one adapter used for all {@link org.eclipse.egf.model.pattern.TypePatternList} instances.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    protected TypePatternListItemProvider typePatternListItemProvider;

    /**
     * This creates an adapter for a {@link org.eclipse.egf.model.pattern.TypePatternList}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    @Override
    public Adapter createTypePatternListAdapter() {
        if (typePatternListItemProvider == null) {
            typePatternListItemProvider = new TypePatternListItemProvider(this);
        }

        return typePatternListItemProvider;
    }

    /**
     * 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 (patternItemProvider != null)
            patternItemProvider.dispose();
        if (patternMethodItemProvider != null)
            patternMethodItemProvider.dispose();
        if (patternParameterItemProvider != null)
            patternParameterItemProvider.dispose();
        if (patternLibraryItemProvider != null)
            patternLibraryItemProvider.dispose();
        if (patternViewpointItemProvider != null)
            patternViewpointItemProvider.dispose();
        if (patternCallItemProvider != null)
            patternCallItemProvider.dispose();
        if (superCallItemProvider != null)
            superCallItemProvider.dispose();
        if (paramerter2ParameterMapItemProvider != null)
            paramerter2ParameterMapItemProvider.dispose();
        if (methodCallItemProvider != null)
            methodCallItemProvider.dispose();
        if (patternVariableItemProvider != null)
            patternVariableItemProvider.dispose();
        if (patternInjectedCallItemProvider != null)
            patternInjectedCallItemProvider.dispose();
        if (basicQueryItemProvider != null)
            basicQueryItemProvider.dispose();
        if (stringQueryItemProvider != null)
            stringQueryItemProvider.dispose();
        if (customQueryItemProvider != null)
            customQueryItemProvider.dispose();
        if (string2PatternListItemProvider != null)
            string2PatternListItemProvider.dispose();
        if (string2StringItemProvider != null)
            string2StringItemProvider.dispose();
        if (typePatternExecutionReporterItemProvider != null)
            typePatternExecutionReporterItemProvider.dispose();
        if (backCallItemProvider != null)
            backCallItemProvider.dispose();
        if (typePatternCallBackHandlerItemProvider != null)
            typePatternCallBackHandlerItemProvider.dispose();
        if (typePatternDomainVisitorItemProvider != null)
            typePatternDomainVisitorItemProvider.dispose();
        if (typePatternListItemProvider != null)
            typePatternListItemProvider.dispose();
    }

    /**
     * A child creation extender for the {@link FcorePackage}.
     * <!-- begin-user-doc -->
     * <!-- end-user-doc -->
     * @generated
     */
    public static class FcoreChildCreationExtender 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 FcoreSwitch<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;
            }

            /**
             * <!-- begin-user-doc -->
             * <!-- end-user-doc -->
             * @generated
             */
            @Override
            public Object caseContract(Contract object) {
                newChildDescriptors.add(createChildParameter(FcorePackage.Literals.CONTRACT__TYPE, PatternFactory.eINSTANCE.createTypePatternExecutionReporter()));

                newChildDescriptors.add(createChildParameter(FcorePackage.Literals.CONTRACT__TYPE, PatternFactory.eINSTANCE.createTypePatternCallBackHandler()));

                newChildDescriptors.add(createChildParameter(FcorePackage.Literals.CONTRACT__TYPE, PatternFactory.eINSTANCE.createTypePatternDomainVisitor()));

                newChildDescriptors.add(createChildParameter(FcorePackage.Literals.CONTRACT__TYPE, PatternFactory.eINSTANCE.createTypePatternList()));

                return null;
            }

            /**
             * <!-- begin-user-doc -->
             * <!-- end-user-doc -->
             * @generated
             */
            @Override
            public Object caseViewpointContainer(ViewpointContainer object) {
                newChildDescriptors.add(createChildParameter(FcorePackage.Literals.VIEWPOINT_CONTAINER__VIEWPOINTS, PatternFactory.eINSTANCE.createPatternViewpoint()));

                return null;
            }

            /**
             * <!-- begin-user-doc -->
             * <!-- end-user-doc -->
             * @generated
             */
            @Override
            public Object caseOrchestrationParameter(OrchestrationParameter object) {
                newChildDescriptors.add(createChildParameter(FcorePackage.Literals.ORCHESTRATION_PARAMETER__TYPE, PatternFactory.eINSTANCE.createTypePatternExecutionReporter()));

                newChildDescriptors.add(createChildParameter(FcorePackage.Literals.ORCHESTRATION_PARAMETER__TYPE, PatternFactory.eINSTANCE.createTypePatternCallBackHandler()));

                newChildDescriptors.add(createChildParameter(FcorePackage.Literals.ORCHESTRATION_PARAMETER__TYPE, PatternFactory.eINSTANCE.createTypePatternDomainVisitor()));

                newChildDescriptors.add(createChildParameter(FcorePackage.Literals.ORCHESTRATION_PARAMETER__TYPE, PatternFactory.eINSTANCE.createTypePatternList()));

                return null;
            }

            /**
             * <!-- begin-user-doc -->
             * <!-- end-user-doc -->
             * 
             * @generated NOT
             */
            @Override
            public Object caseInvocationContract(InvocationContract object) {

                if (object.getInvokedContract() == null || object.getInvokedContract().getType() == null) {
                    return null;
                }

                {
                    TypePatternExecutionReporter type = PatternFactory.eINSTANCE.createTypePatternExecutionReporter();
                    if (ClassHelper.asSubClass(type.getType(), object.getInvokedContract().getType().getType())) {
                        newChildDescriptors.add(createChildParameter(FcorePackage.Literals.INVOCATION_CONTRACT__TYPE, type));
                    }
                }
                {
                    TypePatternList type = PatternFactory.eINSTANCE.createTypePatternList();
                    if (ClassHelper.asSubClass(type.getType(), object.getInvokedContract().getType().getType())) {
                        newChildDescriptors.add(createChildParameter(FcorePackage.Literals.INVOCATION_CONTRACT__TYPE, type));
                    }
                }
                {
                    TypePatternCallBackHandler type = PatternFactory.eINSTANCE.createTypePatternCallBackHandler();
                    if (ClassHelper.asSubClass(type.getType(), object.getInvokedContract().getType().getType())) {
                        newChildDescriptors.add(createChildParameter(FcorePackage.Literals.INVOCATION_CONTRACT__TYPE, type));
                    }
                }
                {
                    TypePatternDomainVisitor type = PatternFactory.eINSTANCE.createTypePatternDomainVisitor();
                    if (ClassHelper.asSubClass(type.getType(), object.getInvokedContract().getType().getType())) {
                        newChildDescriptors.add(createChildParameter(FcorePackage.Literals.INVOCATION_CONTRACT__TYPE, type));
                    }
                }

                return null;
            }

            /**
             * <!-- begin-user-doc -->
             * <!-- end-user-doc -->
             * @generated
             */
            protected CommandParameter createChildParameter(Object feature, Object child) {
                return new CommandParameter(null, feature, child);
            }

        }

        /**
         * <!-- begin-user-doc -->
         * <!-- end-user-doc -->
         * @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 -->
         * @generated
         */
        public ResourceLocator getResourceLocator() {
            return EGFModelEditPlugin.INSTANCE;
        }
    }

}
