/**
 * 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:  
 *  		Joerg Riegel - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.chart.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.chart.Chart;
import org.eclipse.osbp.xtext.chart.ChartAxis;
import org.eclipse.osbp.xtext.chart.ChartBar;
import org.eclipse.osbp.xtext.chart.ChartBase;
import org.eclipse.osbp.xtext.chart.ChartBubble;
import org.eclipse.osbp.xtext.chart.ChartDSLFactory;
import org.eclipse.osbp.xtext.chart.ChartDSLPackage;
import org.eclipse.osbp.xtext.chart.ChartDatamart;
import org.eclipse.osbp.xtext.chart.ChartDonut;
import org.eclipse.osbp.xtext.chart.ChartElement;
import org.eclipse.osbp.xtext.chart.ChartGauge;
import org.eclipse.osbp.xtext.chart.ChartHighlighter;
import org.eclipse.osbp.xtext.chart.ChartInterval;
import org.eclipse.osbp.xtext.chart.ChartLazyResolver;
import org.eclipse.osbp.xtext.chart.ChartLegend;
import org.eclipse.osbp.xtext.chart.ChartLine;
import org.eclipse.osbp.xtext.chart.ChartModel;
import org.eclipse.osbp.xtext.chart.ChartNumberInterval;
import org.eclipse.osbp.xtext.chart.ChartOption;
import org.eclipse.osbp.xtext.chart.ChartPackage;
import org.eclipse.osbp.xtext.chart.ChartPie;
import org.eclipse.osbp.xtext.chart.ChartRangeElement;
import org.eclipse.osbp.xtext.chart.ChartSegmentColor;
import org.eclipse.osbp.xtext.chart.ChartTree;
import org.eclipse.osbp.xtext.chart.LegendPlacementEnum;
import org.eclipse.osbp.xtext.chart.RenderTypeEnum;
import org.eclipse.osbp.xtext.chart.ToggleTypeEnum;
import org.eclipse.osbp.xtext.chart.TooltipLocationEnum;

import org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage;

import org.eclipse.xtext.xtype.XtypePackage;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum renderTypeEnumEEnum = 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.chart.ChartDSLPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private ChartDSLPackageImpl() {
		super(eNS_URI, ChartDSLFactory.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 ChartDSLPackage#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 ChartDSLPackage init() {
		if (isInited) return (ChartDSLPackage)EPackage.Registry.INSTANCE.getEPackage(ChartDSLPackage.eNS_URI);

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

		isInited = true;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getChart_Source() {
		return (EReference)chartEClass.getEStructuralFeatures().get(4);
	}

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getChartLine_Cursor() {
		return (EAttribute)chartLineEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getChartLine_Tooltip() {
		return (EAttribute)chartLineEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getChartLine_FillToZero() {
		return (EAttribute)chartLineEClass.getEStructuralFeatures().get(6);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getChartLine_FillArea() {
		return (EAttribute)chartLineEClass.getEStructuralFeatures().get(7);
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getChartGauge_MaxValue() {
		return (EAttribute)chartGaugeEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getChartGauge_HasIntervals() {
		return (EAttribute)chartGaugeEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getChartGauge_Intervals() {
		return (EReference)chartGaugeEClass.getEStructuralFeatures().get(6);
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ChartDSLFactory getChartDSLFactory() {
		return (ChartDSLFactory)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
		chartModelEClass = createEClass(CHART_MODEL);
		createEReference(chartModelEClass, CHART_MODEL__IMPORT_SECTION);
		createEReference(chartModelEClass, CHART_MODEL__PACKAGES);

		chartLazyResolverEClass = createEClass(CHART_LAZY_RESOLVER);
		createEOperation(chartLazyResolverEClass, CHART_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT);

		chartBaseEClass = createEClass(CHART_BASE);
		createEAttribute(chartBaseEClass, CHART_BASE__NAME);

		chartPackageEClass = createEClass(CHART_PACKAGE);
		createEReference(chartPackageEClass, CHART_PACKAGE__CHARTS);

		chartEClass = createEClass(CHART);
		createEAttribute(chartEClass, CHART__SELECT_BY_ID);
		createEAttribute(chartEClass, CHART__DESCRIPTION);
		createEAttribute(chartEClass, CHART__DESCRIPTION_VALUE);
		createEReference(chartEClass, CHART__CHARTTYPE);
		createEReference(chartEClass, CHART__SOURCE);

		chartOptionEClass = createEClass(CHART_OPTION);

		chartBarEClass = createEClass(CHART_BAR);
		createEAttribute(chartBarEClass, CHART_BAR__SHADOW);
		createEAttribute(chartBarEClass, CHART_BAR__ANIMATED);
		createEAttribute(chartBarEClass, CHART_BAR__SWAPPED);
		createEAttribute(chartBarEClass, CHART_BAR__STACKED);

		chartLineEClass = createEClass(CHART_LINE);
		createEAttribute(chartLineEClass, CHART_LINE__ANIMATED);
		createEAttribute(chartLineEClass, CHART_LINE__SHOW_MARKER);
		createEAttribute(chartLineEClass, CHART_LINE__TREND_LINE);
		createEAttribute(chartLineEClass, CHART_LINE__ZOOM);
		createEAttribute(chartLineEClass, CHART_LINE__CURSOR);
		createEAttribute(chartLineEClass, CHART_LINE__TOOLTIP);
		createEAttribute(chartLineEClass, CHART_LINE__FILL_TO_ZERO);
		createEAttribute(chartLineEClass, CHART_LINE__FILL_AREA);

		chartPieEClass = createEClass(CHART_PIE);
		createEAttribute(chartPieEClass, CHART_PIE__EMPTY);

		chartDonutEClass = createEClass(CHART_DONUT);

		chartBubbleEClass = createEClass(CHART_BUBBLE);
		createEAttribute(chartBubbleEClass, CHART_BUBBLE__MULTIPLIER);
		createEAttribute(chartBubbleEClass, CHART_BUBBLE__MULTIPLIER_VALUE);
		createEAttribute(chartBubbleEClass, CHART_BUBBLE__GRADIENT);
		createEAttribute(chartBubbleEClass, CHART_BUBBLE__TRANSPARENT);

		chartGaugeEClass = createEClass(CHART_GAUGE);
		createEAttribute(chartGaugeEClass, CHART_GAUGE__LABELED);
		createEAttribute(chartGaugeEClass, CHART_GAUGE__LABEL_VALUE);
		createEAttribute(chartGaugeEClass, CHART_GAUGE__HAS_TICKS);
		createEAttribute(chartGaugeEClass, CHART_GAUGE__MIN_VALUE);
		createEAttribute(chartGaugeEClass, CHART_GAUGE__MAX_VALUE);
		createEAttribute(chartGaugeEClass, CHART_GAUGE__HAS_INTERVALS);
		createEReference(chartGaugeEClass, CHART_GAUGE__INTERVALS);

		chartTreeEClass = createEClass(CHART_TREE);
		createEAttribute(chartTreeEClass, CHART_TREE__MAP);
		createEAttribute(chartTreeEClass, CHART_TREE__COLLAPSIBLE);

		chartIntervalEClass = createEClass(CHART_INTERVAL);

		chartNumberIntervalEClass = createEClass(CHART_NUMBER_INTERVAL);
		createEAttribute(chartNumberIntervalEClass, CHART_NUMBER_INTERVAL__NUMBER_INTERVAL_VALUE);
		createEReference(chartNumberIntervalEClass, CHART_NUMBER_INTERVAL__NUMBER_RANGE);

		chartDatamartEClass = createEClass(CHART_DATAMART);
		createEReference(chartDatamartEClass, CHART_DATAMART__DATAMART_REF);
		createEReference(chartDatamartEClass, CHART_DATAMART__ELEMENTS);

		chartElementEClass = createEClass(CHART_ELEMENT);

		chartLegendEClass = createEClass(CHART_LEGEND);
		createEAttribute(chartLegendEClass, CHART_LEGEND__PLACEMENT);
		createEAttribute(chartLegendEClass, CHART_LEGEND__TOGGLE);
		createEAttribute(chartLegendEClass, CHART_LEGEND__REPLOT);
		createEAttribute(chartLegendEClass, CHART_LEGEND__TOGGLE_TYPE);

		chartHighlighterEClass = createEClass(CHART_HIGHLIGHTER);
		createEAttribute(chartHighlighterEClass, CHART_HIGHLIGHTER__LOCATION);
		createEAttribute(chartHighlighterEClass, CHART_HIGHLIGHTER__TOOLTIP_ALWAYS);
		createEAttribute(chartHighlighterEClass, CHART_HIGHLIGHTER__INSIDE_CHART);

		chartAxisEClass = createEClass(CHART_AXIS);
		createEReference(chartAxisEClass, CHART_AXIS__AXIS);
		createEAttribute(chartAxisEClass, CHART_AXIS__RENDER_TYPE);
		createEAttribute(chartAxisEClass, CHART_AXIS__SHORT_LABEL);
		createEAttribute(chartAxisEClass, CHART_AXIS__ANGLE);

		chartRangeElementEClass = createEClass(CHART_RANGE_ELEMENT);

		chartSegmentColorEClass = createEClass(CHART_SEGMENT_COLOR);
		createEAttribute(chartSegmentColorEClass, CHART_SEGMENT_COLOR__RGB);

		// Create enums
		legendPlacementEnumEEnum = createEEnum(LEGEND_PLACEMENT_ENUM);
		toggleTypeEnumEEnum = createEEnum(TOGGLE_TYPE_ENUM);
		tooltipLocationEnumEEnum = createEEnum(TOOLTIP_LOCATION_ENUM);
		renderTypeEnumEEnum = createEEnum(RENDER_TYPE_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);
		DatamartDSLPackage theDatamartDSLPackage = (DatamartDSLPackage)EPackage.Registry.INSTANCE.getEPackage(DatamartDSLPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		chartBaseEClass.getESuperTypes().add(this.getChartLazyResolver());
		chartPackageEClass.getESuperTypes().add(theOSBPTypesPackage.getLPackage());
		chartEClass.getESuperTypes().add(this.getChartBase());
		chartOptionEClass.getESuperTypes().add(this.getChartLazyResolver());
		chartBarEClass.getESuperTypes().add(this.getChartOption());
		chartLineEClass.getESuperTypes().add(this.getChartOption());
		chartPieEClass.getESuperTypes().add(this.getChartOption());
		chartDonutEClass.getESuperTypes().add(this.getChartOption());
		chartBubbleEClass.getESuperTypes().add(this.getChartOption());
		chartGaugeEClass.getESuperTypes().add(this.getChartOption());
		chartTreeEClass.getESuperTypes().add(this.getChartOption());
		chartIntervalEClass.getESuperTypes().add(this.getChartLazyResolver());
		chartNumberIntervalEClass.getESuperTypes().add(this.getChartInterval());
		chartDatamartEClass.getESuperTypes().add(this.getChartLazyResolver());
		chartElementEClass.getESuperTypes().add(this.getChartLazyResolver());
		chartLegendEClass.getESuperTypes().add(this.getChartElement());
		chartHighlighterEClass.getESuperTypes().add(this.getChartElement());
		chartAxisEClass.getESuperTypes().add(this.getChartElement());
		chartRangeElementEClass.getESuperTypes().add(this.getChartLazyResolver());
		chartSegmentColorEClass.getESuperTypes().add(this.getChartRangeElement());

		// Initialize classes, features, and operations; add parameters
		initEClass(chartModelEClass, ChartModel.class, "ChartModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getChartModel_ImportSection(), theXtypePackage.getXImportSection(), null, "importSection", null, 0, 1, ChartModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getChartModel_Packages(), this.getChartPackage(), null, "packages", null, 0, -1, ChartModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartLazyResolverEClass, ChartLazyResolver.class, "ChartLazyResolver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

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

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

		initEClass(chartPackageEClass, ChartPackage.class, "ChartPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getChartPackage_Charts(), this.getChart(), null, "charts", null, 0, -1, ChartPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartEClass, Chart.class, "Chart", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getChart_SelectById(), theEcorePackage.getEBoolean(), "selectById", null, 0, 1, Chart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChart_Description(), theEcorePackage.getEBoolean(), "description", null, 0, 1, Chart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChart_DescriptionValue(), theEcorePackage.getEString(), "descriptionValue", null, 0, 1, Chart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getChart_Charttype(), this.getChartOption(), null, "charttype", null, 0, 1, Chart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getChart_Source(), this.getChartDatamart(), null, "source", null, 0, 1, Chart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartOptionEClass, ChartOption.class, "ChartOption", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(chartBarEClass, ChartBar.class, "ChartBar", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getChartBar_Shadow(), theEcorePackage.getEBoolean(), "shadow", null, 0, 1, ChartBar.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartBar_Animated(), theEcorePackage.getEBoolean(), "animated", null, 0, 1, ChartBar.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartBar_Swapped(), theEcorePackage.getEBoolean(), "swapped", null, 0, 1, ChartBar.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartBar_Stacked(), theEcorePackage.getEBoolean(), "stacked", null, 0, 1, ChartBar.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartLineEClass, ChartLine.class, "ChartLine", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getChartLine_Animated(), theEcorePackage.getEBoolean(), "animated", null, 0, 1, ChartLine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartLine_ShowMarker(), theEcorePackage.getEBoolean(), "showMarker", null, 0, 1, ChartLine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartLine_TrendLine(), theEcorePackage.getEBoolean(), "trendLine", null, 0, 1, ChartLine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartLine_Zoom(), theEcorePackage.getEBoolean(), "zoom", null, 0, 1, ChartLine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartLine_Cursor(), theEcorePackage.getEBoolean(), "cursor", null, 0, 1, ChartLine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartLine_Tooltip(), theEcorePackage.getEBoolean(), "tooltip", null, 0, 1, ChartLine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartLine_FillToZero(), theEcorePackage.getEBoolean(), "fillToZero", null, 0, 1, ChartLine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartLine_FillArea(), theEcorePackage.getEBoolean(), "fillArea", null, 0, 1, ChartLine.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartPieEClass, ChartPie.class, "ChartPie", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getChartPie_Empty(), theEcorePackage.getEBoolean(), "empty", null, 0, 1, ChartPie.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartDonutEClass, ChartDonut.class, "ChartDonut", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(chartBubbleEClass, ChartBubble.class, "ChartBubble", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getChartBubble_Multiplier(), theEcorePackage.getEBoolean(), "multiplier", null, 0, 1, ChartBubble.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartBubble_MultiplierValue(), theEcorePackage.getEString(), "multiplierValue", null, 0, 1, ChartBubble.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartBubble_Gradient(), theEcorePackage.getEBoolean(), "gradient", null, 0, 1, ChartBubble.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartBubble_Transparent(), theEcorePackage.getEBoolean(), "transparent", null, 0, 1, ChartBubble.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartGaugeEClass, ChartGauge.class, "ChartGauge", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getChartGauge_Labeled(), theEcorePackage.getEBoolean(), "labeled", null, 0, 1, ChartGauge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartGauge_LabelValue(), theEcorePackage.getEString(), "labelValue", null, 0, 1, ChartGauge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartGauge_HasTicks(), theEcorePackage.getEBoolean(), "hasTicks", null, 0, 1, ChartGauge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartGauge_MinValue(), theEcorePackage.getEInt(), "minValue", null, 0, 1, ChartGauge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartGauge_MaxValue(), theEcorePackage.getEInt(), "maxValue", null, 0, 1, ChartGauge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartGauge_HasIntervals(), theEcorePackage.getEBoolean(), "hasIntervals", null, 0, 1, ChartGauge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getChartGauge_Intervals(), this.getChartInterval(), null, "intervals", null, 0, -1, ChartGauge.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartTreeEClass, ChartTree.class, "ChartTree", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getChartTree_Map(), theEcorePackage.getEBoolean(), "map", null, 0, 1, ChartTree.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartTree_Collapsible(), theEcorePackage.getEBoolean(), "collapsible", null, 0, 1, ChartTree.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartIntervalEClass, ChartInterval.class, "ChartInterval", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(chartNumberIntervalEClass, ChartNumberInterval.class, "ChartNumberInterval", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getChartNumberInterval_NumberIntervalValue(), theEcorePackage.getEInt(), "numberIntervalValue", null, 0, 1, ChartNumberInterval.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getChartNumberInterval_NumberRange(), this.getChartRangeElement(), null, "numberRange", null, 0, 1, ChartNumberInterval.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartDatamartEClass, ChartDatamart.class, "ChartDatamart", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getChartDatamart_DatamartRef(), theDatamartDSLPackage.getDatamartDefinition(), null, "datamartRef", null, 0, 1, ChartDatamart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getChartDatamart_Elements(), this.getChartElement(), null, "elements", null, 0, -1, ChartDatamart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartElementEClass, ChartElement.class, "ChartElement", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(chartLegendEClass, ChartLegend.class, "ChartLegend", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getChartLegend_Placement(), this.getLegendPlacementEnum(), "placement", null, 0, 1, ChartLegend.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartLegend_Toggle(), theEcorePackage.getEBoolean(), "toggle", null, 0, 1, ChartLegend.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartLegend_Replot(), theEcorePackage.getEBoolean(), "replot", null, 0, 1, ChartLegend.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartLegend_ToggleType(), this.getToggleTypeEnum(), "toggleType", null, 0, 1, ChartLegend.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartHighlighterEClass, ChartHighlighter.class, "ChartHighlighter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getChartHighlighter_Location(), this.getTooltipLocationEnum(), "location", null, 0, 1, ChartHighlighter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartHighlighter_TooltipAlways(), theEcorePackage.getEBoolean(), "tooltipAlways", null, 0, 1, ChartHighlighter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartHighlighter_InsideChart(), theEcorePackage.getEBoolean(), "insideChart", null, 0, 1, ChartHighlighter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartAxisEClass, ChartAxis.class, "ChartAxis", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getChartAxis_Axis(), theDatamartDSLPackage.getDatamartAxis(), null, "axis", null, 0, 1, ChartAxis.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartAxis_RenderType(), this.getRenderTypeEnum(), "renderType", null, 0, 1, ChartAxis.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartAxis_ShortLabel(), theEcorePackage.getEBoolean(), "shortLabel", null, 0, 1, ChartAxis.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartAxis_Angle(), theEcorePackage.getEInt(), "angle", null, 0, 1, ChartAxis.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(chartRangeElementEClass, ChartRangeElement.class, "ChartRangeElement", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(chartSegmentColorEClass, ChartSegmentColor.class, "ChartSegmentColor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getChartSegmentColor_Rgb(), theEcorePackage.getEString(), "rgb", null, 0, 1, ChartSegmentColor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Initialize enums and add enum literals
		initEEnum(legendPlacementEnumEEnum, LegendPlacementEnum.class, "LegendPlacementEnum");
		addEEnumLiteral(legendPlacementEnumEEnum, LegendPlacementEnum.INSIDE);
		addEEnumLiteral(legendPlacementEnumEEnum, LegendPlacementEnum.INSIDE_GRID);
		addEEnumLiteral(legendPlacementEnumEEnum, LegendPlacementEnum.OUTSIDE);
		addEEnumLiteral(legendPlacementEnumEEnum, LegendPlacementEnum.OUTSIDE_GRID);

		initEEnum(toggleTypeEnumEEnum, ToggleTypeEnum.class, "ToggleTypeEnum");
		addEEnumLiteral(toggleTypeEnumEEnum, ToggleTypeEnum.NORMAL);
		addEEnumLiteral(toggleTypeEnumEEnum, ToggleTypeEnum.SLOW);
		addEEnumLiteral(toggleTypeEnumEEnum, ToggleTypeEnum.FAST);

		initEEnum(tooltipLocationEnumEEnum, TooltipLocationEnum.class, "TooltipLocationEnum");
		addEEnumLiteral(tooltipLocationEnumEEnum, TooltipLocationEnum.NORTH);
		addEEnumLiteral(tooltipLocationEnumEEnum, TooltipLocationEnum.NORTH_EAST);
		addEEnumLiteral(tooltipLocationEnumEEnum, TooltipLocationEnum.EAST);
		addEEnumLiteral(tooltipLocationEnumEEnum, TooltipLocationEnum.SOUTH_EAST);
		addEEnumLiteral(tooltipLocationEnumEEnum, TooltipLocationEnum.SOUTH);
		addEEnumLiteral(tooltipLocationEnumEEnum, TooltipLocationEnum.SOUTH_WEST);
		addEEnumLiteral(tooltipLocationEnumEEnum, TooltipLocationEnum.WEST);
		addEEnumLiteral(tooltipLocationEnumEEnum, TooltipLocationEnum.NORTH_WEST);

		initEEnum(renderTypeEnumEEnum, RenderTypeEnum.class, "RenderTypeEnum");
		addEEnumLiteral(renderTypeEnumEEnum, RenderTypeEnum.CATEGORY);
		addEEnumLiteral(renderTypeEnumEEnum, RenderTypeEnum.LINEAR);
		addEEnumLiteral(renderTypeEnumEEnum, RenderTypeEnum.DATE);
		addEEnumLiteral(renderTypeEnumEEnum, RenderTypeEnum.LOG);
		addEEnumLiteral(renderTypeEnumEEnum, RenderTypeEnum.PYRAMID);

		// 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", "chartdsl"
		   });
	}

} //ChartDSLPackageImpl
