/**
 * 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 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Jose C. Dominguez - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.strategy.impl;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.InternalEObject;

import org.eclipse.emf.ecore.impl.EPackageImpl;

import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;

import org.eclipse.osbp.xtext.strategy.FocusingEnhancer;
import org.eclipse.osbp.xtext.strategy.FocusingEnum;
import org.eclipse.osbp.xtext.strategy.FocusingStrategy;
import org.eclipse.osbp.xtext.strategy.LayoutingEnum;
import org.eclipse.osbp.xtext.strategy.LayoutingStrategy;
import org.eclipse.osbp.xtext.strategy.Strategy;
import org.eclipse.osbp.xtext.strategy.StrategyBase;
import org.eclipse.osbp.xtext.strategy.StrategyDSLFactory;
import org.eclipse.osbp.xtext.strategy.StrategyDSLPackage;
import org.eclipse.osbp.xtext.strategy.StrategyDefault;
import org.eclipse.osbp.xtext.strategy.StrategyLazyResolver;
import org.eclipse.osbp.xtext.strategy.StrategyModel;
import org.eclipse.osbp.xtext.strategy.StrategyPackage;
import org.eclipse.osbp.xtext.strategy.StrategyTarget;

import org.eclipse.xtext.xtype.XtypePackage;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Package</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class StrategyDSLPackageImpl extends EPackageImpl implements StrategyDSLPackage {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass strategyModelEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass strategyLazyResolverEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass strategyBaseEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass strategyPackageEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass strategyEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass strategyTargetEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass layoutingStrategyEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass focusingStrategyEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass focusingEnhancerEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass strategyDefaultEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum layoutingEnumEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum focusingEnumEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EDataType internalEObjectEDataType = null;

	/**
	 * Creates an instance of the model <b>Package</b>, registered with
	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
	 * package URI value.
	 * <p>Note: the correct way to create the package is via the static
	 * factory method {@link #init init()}, which also performs
	 * initialization of the package, or returns the registered package,
	 * if one already exists.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.EPackage.Registry
	 * @see org.eclipse.osbp.xtext.strategy.StrategyDSLPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private StrategyDSLPackageImpl() {
		super(eNS_URI, StrategyDSLFactory.eINSTANCE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static boolean isInited = false;

	/**
	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
	 * 
	 * <p>This method is used to initialize {@link StrategyDSLPackage#eINSTANCE} when that field is accessed.
	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #eNS_URI
	 * @see #createPackageContents()
	 * @see #initializePackageContents()
	 * @generated
	 */
	public static StrategyDSLPackage init() {
		if (isInited) return (StrategyDSLPackage)EPackage.Registry.INSTANCE.getEPackage(StrategyDSLPackage.eNS_URI);

		// Obtain or create and register package
		StrategyDSLPackageImpl theStrategyDSLPackage = (StrategyDSLPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof StrategyDSLPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new StrategyDSLPackageImpl());

		isInited = true;

		// Initialize simple dependencies
		OSBPTypesPackage.eINSTANCE.eClass();

		// Create package meta-data objects
		theStrategyDSLPackage.createPackageContents();

		// Initialize created meta-data
		theStrategyDSLPackage.initializePackageContents();

		// Mark meta-data to indicate it can't be changed
		theStrategyDSLPackage.freeze();

  
		// Update the registry and return the package
		EPackage.Registry.INSTANCE.put(StrategyDSLPackage.eNS_URI, theStrategyDSLPackage);
		return theStrategyDSLPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getStrategyModel() {
		return strategyModelEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getStrategyModel_ImportSection() {
		return (EReference)strategyModelEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getStrategyModel_Packages() {
		return (EReference)strategyModelEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getStrategyLazyResolver() {
		return strategyLazyResolverEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EOperation getStrategyLazyResolver__EResolveProxy__InternalEObject() {
		return strategyLazyResolverEClass.getEOperations().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getStrategyBase() {
		return strategyBaseEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getStrategyBase_Name() {
		return (EAttribute)strategyBaseEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getStrategyPackage() {
		return strategyPackageEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getStrategyPackage_Strategy() {
		return (EReference)strategyPackageEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getStrategy() {
		return strategyEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getStrategy_Targets() {
		return (EReference)strategyEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getStrategy_StrategyDefault() {
		return (EReference)strategyEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getStrategyTarget() {
		return strategyTargetEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getStrategyTarget_LayoutingStrategies() {
		return (EReference)strategyTargetEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getStrategyTarget_FocusingStrategies() {
		return (EReference)strategyTargetEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getStrategyTarget_FocusingEnhancer() {
		return (EReference)strategyTargetEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getStrategyTarget_StrategyDefault() {
		return (EReference)strategyTargetEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getLayoutingStrategy() {
		return layoutingStrategyEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getLayoutingStrategy_Layout() {
		return (EAttribute)layoutingStrategyEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getFocusingStrategy() {
		return focusingStrategyEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFocusingStrategy_EcviewFocusingId() {
		return (EAttribute)focusingStrategyEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFocusingStrategy_Focus() {
		return (EAttribute)focusingStrategyEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFocusingStrategy_KeyCode() {
		return (EAttribute)focusingStrategyEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFocusingStrategy_ModifierKeys() {
		return (EAttribute)focusingStrategyEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getFocusingEnhancer() {
		return focusingEnhancerEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getFocusingEnhancer_FocusingStrategies() {
		return (EReference)focusingEnhancerEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getStrategyDefault() {
		return strategyDefaultEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getStrategyDefault_DefaultLayouting() {
		return (EReference)strategyDefaultEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getStrategyDefault_DefaultFocusing() {
		return (EReference)strategyDefaultEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getLayoutingEnum() {
		return layoutingEnumEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getFocusingEnum() {
		return focusingEnumEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EDataType getInternalEObject() {
		return internalEObjectEDataType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StrategyDSLFactory getStrategyDSLFactory() {
		return (StrategyDSLFactory)getEFactoryInstance();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isCreated = false;

	/**
	 * Creates the meta-model objects for the package.  This method is
	 * guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void createPackageContents() {
		if (isCreated) return;
		isCreated = true;

		// Create classes and their features
		strategyModelEClass = createEClass(STRATEGY_MODEL);
		createEReference(strategyModelEClass, STRATEGY_MODEL__IMPORT_SECTION);
		createEReference(strategyModelEClass, STRATEGY_MODEL__PACKAGES);

		strategyLazyResolverEClass = createEClass(STRATEGY_LAZY_RESOLVER);
		createEOperation(strategyLazyResolverEClass, STRATEGY_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT);

		strategyBaseEClass = createEClass(STRATEGY_BASE);
		createEAttribute(strategyBaseEClass, STRATEGY_BASE__NAME);

		strategyPackageEClass = createEClass(STRATEGY_PACKAGE);
		createEReference(strategyPackageEClass, STRATEGY_PACKAGE__STRATEGY);

		strategyEClass = createEClass(STRATEGY);
		createEReference(strategyEClass, STRATEGY__TARGETS);
		createEReference(strategyEClass, STRATEGY__STRATEGY_DEFAULT);

		strategyTargetEClass = createEClass(STRATEGY_TARGET);
		createEReference(strategyTargetEClass, STRATEGY_TARGET__LAYOUTING_STRATEGIES);
		createEReference(strategyTargetEClass, STRATEGY_TARGET__FOCUSING_STRATEGIES);
		createEReference(strategyTargetEClass, STRATEGY_TARGET__FOCUSING_ENHANCER);
		createEReference(strategyTargetEClass, STRATEGY_TARGET__STRATEGY_DEFAULT);

		layoutingStrategyEClass = createEClass(LAYOUTING_STRATEGY);
		createEAttribute(layoutingStrategyEClass, LAYOUTING_STRATEGY__LAYOUT);

		focusingStrategyEClass = createEClass(FOCUSING_STRATEGY);
		createEAttribute(focusingStrategyEClass, FOCUSING_STRATEGY__ECVIEW_FOCUSING_ID);
		createEAttribute(focusingStrategyEClass, FOCUSING_STRATEGY__FOCUS);
		createEAttribute(focusingStrategyEClass, FOCUSING_STRATEGY__KEY_CODE);
		createEAttribute(focusingStrategyEClass, FOCUSING_STRATEGY__MODIFIER_KEYS);

		focusingEnhancerEClass = createEClass(FOCUSING_ENHANCER);
		createEReference(focusingEnhancerEClass, FOCUSING_ENHANCER__FOCUSING_STRATEGIES);

		strategyDefaultEClass = createEClass(STRATEGY_DEFAULT);
		createEReference(strategyDefaultEClass, STRATEGY_DEFAULT__DEFAULT_LAYOUTING);
		createEReference(strategyDefaultEClass, STRATEGY_DEFAULT__DEFAULT_FOCUSING);

		// Create enums
		layoutingEnumEEnum = createEEnum(LAYOUTING_ENUM);
		focusingEnumEEnum = createEEnum(FOCUSING_ENUM);

		// Create data types
		internalEObjectEDataType = createEDataType(INTERNAL_EOBJECT);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isInitialized = false;

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void initializePackageContents() {
		if (isInitialized) return;
		isInitialized = true;

		// Initialize package
		setName(eNAME);
		setNsPrefix(eNS_PREFIX);
		setNsURI(eNS_URI);

		// Obtain other dependent packages
		XtypePackage theXtypePackage = (XtypePackage)EPackage.Registry.INSTANCE.getEPackage(XtypePackage.eNS_URI);
		EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
		OSBPTypesPackage theOSBPTypesPackage = (OSBPTypesPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPTypesPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		strategyBaseEClass.getESuperTypes().add(this.getStrategyLazyResolver());
		strategyPackageEClass.getESuperTypes().add(theOSBPTypesPackage.getLPackage());
		layoutingStrategyEClass.getESuperTypes().add(this.getStrategyBase());
		focusingStrategyEClass.getESuperTypes().add(this.getStrategyBase());
		focusingEnhancerEClass.getESuperTypes().add(this.getStrategyBase());

		// Initialize classes, features, and operations; add parameters
		initEClass(strategyModelEClass, StrategyModel.class, "StrategyModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getStrategyModel_ImportSection(), theXtypePackage.getXImportSection(), null, "importSection", null, 0, 1, StrategyModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getStrategyModel_Packages(), this.getStrategyPackage(), null, "packages", null, 0, -1, StrategyModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(strategyLazyResolverEClass, StrategyLazyResolver.class, "StrategyLazyResolver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		EOperation op = initEOperation(getStrategyLazyResolver__EResolveProxy__InternalEObject(), theEcorePackage.getEObject(), "eResolveProxy", 0, 1, !IS_UNIQUE, IS_ORDERED);
		addEParameter(op, this.getInternalEObject(), "proxy", 0, 1, !IS_UNIQUE, IS_ORDERED);

		initEClass(strategyBaseEClass, StrategyBase.class, "StrategyBase", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getStrategyBase_Name(), theEcorePackage.getEString(), "name", null, 0, 1, StrategyBase.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(strategyPackageEClass, StrategyPackage.class, "StrategyPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getStrategyPackage_Strategy(), this.getStrategy(), null, "strategy", null, 0, 1, StrategyPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(strategyEClass, Strategy.class, "Strategy", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getStrategy_Targets(), this.getStrategyTarget(), null, "targets", null, 0, 1, Strategy.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getStrategy_StrategyDefault(), this.getStrategyDefault(), null, "strategyDefault", null, 0, 1, Strategy.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(strategyTargetEClass, StrategyTarget.class, "StrategyTarget", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getStrategyTarget_LayoutingStrategies(), this.getLayoutingStrategy(), null, "layoutingStrategies", null, 0, -1, StrategyTarget.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getStrategyTarget_FocusingStrategies(), this.getFocusingStrategy(), null, "focusingStrategies", null, 0, -1, StrategyTarget.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getStrategyTarget_FocusingEnhancer(), this.getFocusingEnhancer(), null, "focusingEnhancer", null, 0, -1, StrategyTarget.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getStrategyTarget_StrategyDefault(), this.getStrategyDefault(), null, "strategyDefault", null, 0, 1, StrategyTarget.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(layoutingStrategyEClass, LayoutingStrategy.class, "LayoutingStrategy", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getLayoutingStrategy_Layout(), this.getLayoutingEnum(), "layout", null, 0, 1, LayoutingStrategy.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(focusingStrategyEClass, FocusingStrategy.class, "FocusingStrategy", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getFocusingStrategy_EcviewFocusingId(), theEcorePackage.getEString(), "ecviewFocusingId", null, 0, 1, FocusingStrategy.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getFocusingStrategy_Focus(), this.getFocusingEnum(), "focus", null, 0, 1, FocusingStrategy.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getFocusingStrategy_KeyCode(), theEcorePackage.getEString(), "keyCode", null, 0, 1, FocusingStrategy.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getFocusingStrategy_ModifierKeys(), theEcorePackage.getEString(), "modifierKeys", null, 0, -1, FocusingStrategy.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(focusingEnhancerEClass, FocusingEnhancer.class, "FocusingEnhancer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getFocusingEnhancer_FocusingStrategies(), this.getFocusingStrategy(), null, "focusingStrategies", null, 0, -1, FocusingEnhancer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(strategyDefaultEClass, StrategyDefault.class, "StrategyDefault", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getStrategyDefault_DefaultLayouting(), this.getLayoutingStrategy(), null, "defaultLayouting", null, 0, 1, StrategyDefault.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getStrategyDefault_DefaultFocusing(), this.getFocusingEnhancer(), null, "defaultFocusing", null, 0, 1, StrategyDefault.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Initialize enums and add enum literals
		initEEnum(layoutingEnumEEnum, LayoutingEnum.class, "LayoutingEnum");
		addEEnumLiteral(layoutingEnumEEnum, LayoutingEnum.HORIZONTAL);
		addEEnumLiteral(layoutingEnumEEnum, LayoutingEnum.VERTICAL);
		addEEnumLiteral(layoutingEnumEEnum, LayoutingEnum.GRID);
		addEEnumLiteral(layoutingEnumEEnum, LayoutingEnum.FORM);
		addEEnumLiteral(layoutingEnumEEnum, LayoutingEnum.FORM2);
		addEEnumLiteral(layoutingEnumEEnum, LayoutingEnum.FORM3);
		addEEnumLiteral(layoutingEnumEEnum, LayoutingEnum.CSS);

		initEEnum(focusingEnumEEnum, FocusingEnum.class, "FocusingEnum");
		addEEnumLiteral(focusingEnumEEnum, FocusingEnum.FORWARD);
		addEEnumLiteral(focusingEnumEEnum, FocusingEnum.BACKWARD);

		// Initialize data types
		initEDataType(internalEObjectEDataType, InternalEObject.class, "InternalEObject", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);

		// Create resource
		createResource(eNS_URI);

		// Create annotations
		// http://www.eclipse.org/emf/2002/Ecore
		createEcoreAnnotations();
	}

	/**
	 * Initializes the annotations for <b>http://www.eclipse.org/emf/2002/Ecore</b>.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void createEcoreAnnotations() {
		String source = "http://www.eclipse.org/emf/2002/Ecore";	
		addAnnotation
		  (this, 
		   source, 
		   new String[] {
			 "rootPackage", "strategydsl"
		   });
	}

} //StrategyDSLPackageImpl
