/**
 * 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.action.ActionDSLPackage;

import org.eclipse.osbp.xtext.chart.CanvasFontFamilyEnum;
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.SeriesColor;
import org.eclipse.osbp.xtext.chart.TextColor;
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 seriesColorEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass textColorEClass = 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 EEnum canvasFontFamilyEnumEEnum = 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
		ActionDSLPackage.eINSTANCE.eClass();
		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 EAttribute getChartPackage_HasColors() {
		return (EAttribute)chartPackageEClass.getEStructuralFeatures().get(0);
	}

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getTextColor_Rgb() {
		return (EAttribute)textColorEClass.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 EReference getChart_Toolbar() {
		return (EReference)chartEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- 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_NoLegend() {
		return (EAttribute)chartLegendEClass.getEStructuralFeatures().get(0);
	}

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

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

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

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

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

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

	/**
	 * <!-- 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_LabelAngle() {
		return (EAttribute)chartAxisEClass.getEStructuralFeatures().get(3);
	}

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

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

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

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

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

	/**
	 * <!-- 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 EEnum getCanvasFontFamilyEnum() {
		return canvasFontFamilyEnumEEnum;
	}

	/**
	 * <!-- 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);
		createEAttribute(chartPackageEClass, CHART_PACKAGE__HAS_COLORS);
		createEReference(chartPackageEClass, CHART_PACKAGE__COLORS);
		createEAttribute(chartPackageEClass, CHART_PACKAGE__DEFAULT_FONT_FAMILY);
		createEReference(chartPackageEClass, CHART_PACKAGE__CHARTS);

		seriesColorEClass = createEClass(SERIES_COLOR);
		createEAttribute(seriesColorEClass, SERIES_COLOR__RGB);

		textColorEClass = createEClass(TEXT_COLOR);
		createEAttribute(textColorEClass, TEXT_COLOR__RGB);

		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);
		createEReference(chartEClass, CHART__TOOLBAR);

		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__NO_LEGEND);
		createEAttribute(chartLegendEClass, CHART_LEGEND__PLACEMENT);
		createEAttribute(chartLegendEClass, CHART_LEGEND__TOGGLE);
		createEAttribute(chartLegendEClass, CHART_LEGEND__REPLOT);
		createEAttribute(chartLegendEClass, CHART_LEGEND__TOGGLE_TYPE);
		createEAttribute(chartLegendEClass, CHART_LEGEND__FONT_SIZE);
		createEAttribute(chartLegendEClass, CHART_LEGEND__TEXT_COLOR);

		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__LABEL_ANGLE);
		createEAttribute(chartAxisEClass, CHART_AXIS__LABEL_FONT_SIZE);
		createEAttribute(chartAxisEClass, CHART_AXIS__LABEL_TEXT_COLOR);
		createEAttribute(chartAxisEClass, CHART_AXIS__TICK_ANGLE);
		createEAttribute(chartAxisEClass, CHART_AXIS__TICK_FONT_SIZE);
		createEAttribute(chartAxisEClass, CHART_AXIS__TICK_TEXT_COLOR);

		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);
		canvasFontFamilyEnumEEnum = createEEnum(CANVAS_FONT_FAMILY_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);
		ActionDSLPackage theActionDSLPackage = (ActionDSLPackage)EPackage.Registry.INSTANCE.getEPackage(ActionDSLPackage.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());
		seriesColorEClass.getESuperTypes().add(this.getChartLazyResolver());
		textColorEClass.getESuperTypes().add(this.getChartLazyResolver());
		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);
		initEAttribute(getChartPackage_HasColors(), theEcorePackage.getEBoolean(), "hasColors", null, 0, 1, ChartPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getChartPackage_Colors(), this.getSeriesColor(), null, "colors", null, 0, -1, ChartPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartPackage_DefaultFontFamily(), this.getCanvasFontFamilyEnum(), "defaultFontFamily", null, 0, 1, ChartPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		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(seriesColorEClass, SeriesColor.class, "SeriesColor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getSeriesColor_Rgb(), theEcorePackage.getEString(), "rgb", null, 0, 1, SeriesColor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(textColorEClass, TextColor.class, "TextColor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getTextColor_Rgb(), theEcorePackage.getEString(), "rgb", null, 0, 1, TextColor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !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);
		initEReference(getChart_Toolbar(), theActionDSLPackage.getActionToolbar(), null, "toolbar", 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_NoLegend(), theEcorePackage.getEBoolean(), "noLegend", null, 0, 1, ChartLegend.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		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);
		initEAttribute(getChartLegend_FontSize(), theEcorePackage.getEInt(), "fontSize", null, 0, 1, ChartLegend.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartLegend_TextColor(), theEcorePackage.getEString(), "textColor", 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_LabelAngle(), theEcorePackage.getEInt(), "labelAngle", null, 0, 1, ChartAxis.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartAxis_LabelFontSize(), theEcorePackage.getEInt(), "labelFontSize", null, 0, 1, ChartAxis.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartAxis_LabelTextColor(), theEcorePackage.getEString(), "labelTextColor", null, 0, 1, ChartAxis.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartAxis_TickAngle(), theEcorePackage.getEInt(), "tickAngle", null, 0, 1, ChartAxis.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartAxis_TickFontSize(), theEcorePackage.getEInt(), "tickFontSize", null, 0, 1, ChartAxis.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getChartAxis_TickTextColor(), theEcorePackage.getEString(), "tickTextColor", 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);

		initEEnum(canvasFontFamilyEnumEEnum, CanvasFontFamilyEnum.class, "CanvasFontFamilyEnum");
		addEEnumLiteral(canvasFontFamilyEnumEEnum, CanvasFontFamilyEnum.DEFAULT);
		addEEnumLiteral(canvasFontFamilyEnumEEnum, CanvasFontFamilyEnum.ARIAL);
		addEEnumLiteral(canvasFontFamilyEnumEEnum, CanvasFontFamilyEnum.VERDANA);
		addEEnumLiteral(canvasFontFamilyEnumEEnum, CanvasFontFamilyEnum.TIMESNEWROMAN);
		addEEnumLiteral(canvasFontFamilyEnumEEnum, CanvasFontFamilyEnum.COURIERNEW);
		addEEnumLiteral(canvasFontFamilyEnumEEnum, CanvasFontFamilyEnum.SERIF);
		addEEnumLiteral(canvasFontFamilyEnumEEnum, CanvasFontFamilyEnum.SANSERIF);

		// 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
