/**
 * 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 v1.0 
 *  which accompanies this distribution, and is available at 
 *  http://www.eclipse.org/legal/epl-v10.html 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.reportdsl.impl;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.InternalEObject;

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

import org.eclipse.emf.ecore.plugin.EcorePlugin;

import org.eclipse.osbp.xtext.reportdsl.*;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Factory</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class ReportDSLFactoryImpl extends EFactoryImpl implements ReportDSLFactory {
	/**
	 * Creates the default factory implementation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public static ReportDSLFactory init() {
		try {
			ReportDSLFactory theReportDSLFactory = (ReportDSLFactory)EPackage.Registry.INSTANCE.getEFactory(ReportDSLPackage.eNS_URI);
			if (theReportDSLFactory != null) {
				return theReportDSLFactory;
			}
		}
		catch (Exception exception) {
			EcorePlugin.INSTANCE.log(exception);
		}
		return new ReportDSLFactoryImpl();
	}

	/**
	 * Creates an instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ReportDSLFactoryImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EObject create(EClass eClass) {
		switch (eClass.getClassifierID()) {
			case ReportDSLPackage.REPORT_MODEL: return createReportModel();
			case ReportDSLPackage.REPORT_LAZY_RESOLVER: return createReportLazyResolver();
			case ReportDSLPackage.REPORT_BASE: return createReportBase();
			case ReportDSLPackage.REPORT_PACKAGE: return createReportPackage();
			case ReportDSLPackage.PAGE_TEMPLATES: return createPageTemplates();
			case ReportDSLPackage.SOME_FORMATS: return createSomeFormats();
			case ReportDSLPackage.COLORS: return createColors();
			case ReportDSLPackage.FONTS: return createFonts();
			case ReportDSLPackage.MEDIAS: return createMedias();
			case ReportDSLPackage.STYLES: return createStyles();
			case ReportDSLPackage.PAGE_TEMPLATE: return createPageTemplate();
			case ReportDSLPackage.COLOR: return createColor();
			case ReportDSLPackage.FONT: return createFont();
			case ReportDSLPackage.BUILD_IN_FONT_FAMILY: return createBuildInFontFamily();
			case ReportDSLPackage.CUSTOM_FONT_FAMILY: return createCustomFontFamily();
			case ReportDSLPackage.MEDIA: return createMedia();
			case ReportDSLPackage.BORDER_STYLE: return createBorderStyle();
			case ReportDSLPackage.BASE_STYLE: return createBaseStyle();
			case ReportDSLPackage.MEDIA_STYLE: return createMediaStyle();
			case ReportDSLPackage.STYLE: return createStyle();
			case ReportDSLPackage.SOME_FORMAT: return createSomeFormat();
			case ReportDSLPackage.UOMO_FORMAT: return createUomoFormat();
			case ReportDSLPackage.NUMBER_FORMAT: return createNumberFormat();
			case ReportDSLPackage.CURRENCY_FORMAT: return createCurrencyFormat();
			case ReportDSLPackage.DATE_FORMAT: return createDateFormat();
			case ReportDSLPackage.DATE_TIME_FORMAT: return createDateTimeFormat();
			case ReportDSLPackage.TIME_FORMAT: return createTimeFormat();
			case ReportDSLPackage.REPORT: return createReport();
			case ReportDSLPackage.REPORT_DESIGN_FILE: return createReportDesignFile();
			case ReportDSLPackage.REPORT_DESIGN_TEMPLATE: return createReportDesignTemplate();
			case ReportDSLPackage.CONTAINER: return createContainer();
			case ReportDSLPackage.PAGE_HEADER: return createPageHeader();
			case ReportDSLPackage.PAGE_DETAIL: return createPageDetail();
			case ReportDSLPackage.PAGE_FOOTER: return createPageFooter();
			case ReportDSLPackage.WITH_STYLE: return createWithStyle();
			case ReportDSLPackage.TEXT_ELEMENT: return createTextElement();
			case ReportDSLPackage.TITLE: return createTitle();
			case ReportDSLPackage.SUB_TITLE: return createSubTitle();
			case ReportDSLPackage.SUB_SUB_TITLE: return createSubSubTitle();
			case ReportDSLPackage.LABEL: return createLabel();
			case ReportDSLPackage.TEXT: return createText();
			case ReportDSLPackage.AUTO_TEXT: return createAutoText();
			case ReportDSLPackage.IMAGE: return createImage();
			case ReportDSLPackage.WITH_HEADER_FOOTER: return createWithHeaderFooter();
			case ReportDSLPackage.DATAMART_TABLE: return createDatamartTable();
			case ReportDSLPackage.DATAMART_TABLE_GROUP: return createDatamartTableGroup();
			case ReportDSLPackage.SOME_GRID: return createSomeGrid();
			case ReportDSLPackage.DATAMART_TABLE_GROUP_HEADER: return createDatamartTableGroupHeader();
			case ReportDSLPackage.DATAMART_TABLE_GROUP_FOOTER: return createDatamartTableGroupFooter();
			case ReportDSLPackage.DATAMART_TABLE_DETAIL: return createDatamartTableDetail();
			case ReportDSLPackage.DATAMART_TABLE_PROPERTY: return createDatamartTableProperty();
			case ReportDSLPackage.TABLE_FORMATTER: return createTableFormatter();
			case ReportDSLPackage.TABLE_IMAGE: return createTableImage();
			case ReportDSLPackage.TABLE_PROPERTY: return createTableProperty();
			case ReportDSLPackage.TABLE_AGGREGATION: return createTableAggregation();
			case ReportDSLPackage.TABLE_BASE_AGGREGATION: return createTableBaseAggregation();
			case ReportDSLPackage.TABLE_PURE_AGGREGATION: return createTablePureAggregation();
			case ReportDSLPackage.TABLE_UNARY_AGGREGATION: return createTableUnaryAggregation();
			case ReportDSLPackage.TABLE_MULTIPLE_AGGREGATION: return createTableMultipleAggregation();
			case ReportDSLPackage.TABLE_BINARY_AGGREGATION: return createTableBinaryAggregation();
			case ReportDSLPackage.TABLE_NUMBER_INTERVAL: return createTableNumberInterval();
			case ReportDSLPackage.TABLE_DATE_DAY_INTERVAL: return createTableDateDayInterval();
			case ReportDSLPackage.TABLE_NUMBER_LOOKUP: return createTableNumberLookup();
			case ReportDSLPackage.TABLE_STRING_LOOKUP: return createTableStringLookup();
			case ReportDSLPackage.TABLE_DATE_DAY_LOOKUP: return createTableDateDayLookup();
			case ReportDSLPackage.TABLE_TEXT_COLOR: return createTableTextColor();
			case ReportDSLPackage.TABLE_CELL_COLOR: return createTableCellColor();
			case ReportDSLPackage.TABLE_ICON: return createTableIcon();
			case ReportDSLPackage.TABLE_TREND: return createTableTrend();
			case ReportDSLPackage.TABLE_TOOLTIP: return createTableTooltip();
			case ReportDSLPackage.GRID: return createGrid();
			case ReportDSLPackage.GRID_ROW: return createGridRow();
			case ReportDSLPackage.GRID_CELL: return createGridCell();
			default:
				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object createFromString(EDataType eDataType, String initialValue) {
		switch (eDataType.getClassifierID()) {
			case ReportDSLPackage.UNIT_ENUM:
				return createUnitEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.PAGE_SIZE_ENUM:
				return createPageSizeEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.ORIENTATION_ENUM:
				return createOrientationEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.FONT_STYLE_ENUM:
				return createFontStyleEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.BUILD_IN_FONT_FAMILY_ENUM:
				return createBuildInFontFamilyEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.BORDER_TYPE_ENUM:
				return createBorderTypeEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.TEXT_ALIGN_ENUM:
				return createTextAlignEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.NUMBER_FORMAT_CATEGORY_ENUM:
				return createNumberFormatCategoryEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.CURRENCY_FORMAT_CATEGORY_ENUM:
				return createCurrencyFormatCategoryEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.DATE_FORMAT_CATEGORY_ENUM:
				return createDateFormatCategoryEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.DATE_TIME_FORMAT_CATEGORY_ENUM:
				return createDateTimeFormatCategoryEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.TIME_FORMAT_CATEGORY_ENUM:
				return createTimeFormatCategoryEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.AUTO_TEXT_ENUM:
				return createAutoTextEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.IMAGE_SIZE_ENUM:
				return createImageSizeEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.IMAGE_SOURCE_ENUM:
				return createImageSourceEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.PURE_AGGREGATION_TYPE_ENUM:
				return createPureAggregationTypeEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.UNARY_AGGREGATION_TYPE_ENUM:
				return createUnaryAggregationTypeEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.BINARY_AGGREGATION_TYPE_ENUM:
				return createBinaryAggregationTypeEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.MULTIPLE_AGGREGATION_TYPE_ENUM:
				return createMultipleAggregationTypeEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.TREND_ICON_ENUM:
				return createTrendIconEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.RENDERING_ENUM:
				return createRenderingEnumFromString(eDataType, initialValue);
			case ReportDSLPackage.INTERNAL_EOBJECT:
				return createInternalEObjectFromString(eDataType, initialValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String convertToString(EDataType eDataType, Object instanceValue) {
		switch (eDataType.getClassifierID()) {
			case ReportDSLPackage.UNIT_ENUM:
				return convertUnitEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.PAGE_SIZE_ENUM:
				return convertPageSizeEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.ORIENTATION_ENUM:
				return convertOrientationEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.FONT_STYLE_ENUM:
				return convertFontStyleEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.BUILD_IN_FONT_FAMILY_ENUM:
				return convertBuildInFontFamilyEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.BORDER_TYPE_ENUM:
				return convertBorderTypeEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.TEXT_ALIGN_ENUM:
				return convertTextAlignEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.NUMBER_FORMAT_CATEGORY_ENUM:
				return convertNumberFormatCategoryEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.CURRENCY_FORMAT_CATEGORY_ENUM:
				return convertCurrencyFormatCategoryEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.DATE_FORMAT_CATEGORY_ENUM:
				return convertDateFormatCategoryEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.DATE_TIME_FORMAT_CATEGORY_ENUM:
				return convertDateTimeFormatCategoryEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.TIME_FORMAT_CATEGORY_ENUM:
				return convertTimeFormatCategoryEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.AUTO_TEXT_ENUM:
				return convertAutoTextEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.IMAGE_SIZE_ENUM:
				return convertImageSizeEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.IMAGE_SOURCE_ENUM:
				return convertImageSourceEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.PURE_AGGREGATION_TYPE_ENUM:
				return convertPureAggregationTypeEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.UNARY_AGGREGATION_TYPE_ENUM:
				return convertUnaryAggregationTypeEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.BINARY_AGGREGATION_TYPE_ENUM:
				return convertBinaryAggregationTypeEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.MULTIPLE_AGGREGATION_TYPE_ENUM:
				return convertMultipleAggregationTypeEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.TREND_ICON_ENUM:
				return convertTrendIconEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.RENDERING_ENUM:
				return convertRenderingEnumToString(eDataType, instanceValue);
			case ReportDSLPackage.INTERNAL_EOBJECT:
				return convertInternalEObjectToString(eDataType, instanceValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ReportModel createReportModel() {
		ReportModelImpl reportModel = new ReportModelImpl();
		return reportModel;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ReportLazyResolver createReportLazyResolver() {
		ReportLazyResolverImpl reportLazyResolver = new ReportLazyResolverImpl();
		return reportLazyResolver;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ReportBase createReportBase() {
		ReportBaseImpl reportBase = new ReportBaseImpl();
		return reportBase;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ReportPackage createReportPackage() {
		ReportPackageImpl reportPackage = new ReportPackageImpl();
		return reportPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PageTemplates createPageTemplates() {
		PageTemplatesImpl pageTemplates = new PageTemplatesImpl();
		return pageTemplates;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SomeFormats createSomeFormats() {
		SomeFormatsImpl someFormats = new SomeFormatsImpl();
		return someFormats;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Colors createColors() {
		ColorsImpl colors = new ColorsImpl();
		return colors;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Fonts createFonts() {
		FontsImpl fonts = new FontsImpl();
		return fonts;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Medias createMedias() {
		MediasImpl medias = new MediasImpl();
		return medias;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Styles createStyles() {
		StylesImpl styles = new StylesImpl();
		return styles;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PageTemplate createPageTemplate() {
		PageTemplateImpl pageTemplate = new PageTemplateImpl();
		return pageTemplate;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Color createColor() {
		ColorImpl color = new ColorImpl();
		return color;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Font createFont() {
		FontImpl font = new FontImpl();
		return font;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BuildInFontFamily createBuildInFontFamily() {
		BuildInFontFamilyImpl buildInFontFamily = new BuildInFontFamilyImpl();
		return buildInFontFamily;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CustomFontFamily createCustomFontFamily() {
		CustomFontFamilyImpl customFontFamily = new CustomFontFamilyImpl();
		return customFontFamily;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Media createMedia() {
		MediaImpl media = new MediaImpl();
		return media;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BorderStyle createBorderStyle() {
		BorderStyleImpl borderStyle = new BorderStyleImpl();
		return borderStyle;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BaseStyle createBaseStyle() {
		BaseStyleImpl baseStyle = new BaseStyleImpl();
		return baseStyle;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MediaStyle createMediaStyle() {
		MediaStyleImpl mediaStyle = new MediaStyleImpl();
		return mediaStyle;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Style createStyle() {
		StyleImpl style = new StyleImpl();
		return style;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SomeFormat createSomeFormat() {
		SomeFormatImpl someFormat = new SomeFormatImpl();
		return someFormat;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public UomoFormat createUomoFormat() {
		UomoFormatImpl uomoFormat = new UomoFormatImpl();
		return uomoFormat;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NumberFormat createNumberFormat() {
		NumberFormatImpl numberFormat = new NumberFormatImpl();
		return numberFormat;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CurrencyFormat createCurrencyFormat() {
		CurrencyFormatImpl currencyFormat = new CurrencyFormatImpl();
		return currencyFormat;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DateFormat createDateFormat() {
		DateFormatImpl dateFormat = new DateFormatImpl();
		return dateFormat;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DateTimeFormat createDateTimeFormat() {
		DateTimeFormatImpl dateTimeFormat = new DateTimeFormatImpl();
		return dateTimeFormat;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TimeFormat createTimeFormat() {
		TimeFormatImpl timeFormat = new TimeFormatImpl();
		return timeFormat;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Report createReport() {
		ReportImpl report = new ReportImpl();
		return report;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ReportDesignFile createReportDesignFile() {
		ReportDesignFileImpl reportDesignFile = new ReportDesignFileImpl();
		return reportDesignFile;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ReportDesignTemplate createReportDesignTemplate() {
		ReportDesignTemplateImpl reportDesignTemplate = new ReportDesignTemplateImpl();
		return reportDesignTemplate;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public org.eclipse.osbp.xtext.reportdsl.Container createContainer() {
		ContainerImpl container = new ContainerImpl();
		return container;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PageHeader createPageHeader() {
		PageHeaderImpl pageHeader = new PageHeaderImpl();
		return pageHeader;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PageDetail createPageDetail() {
		PageDetailImpl pageDetail = new PageDetailImpl();
		return pageDetail;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PageFooter createPageFooter() {
		PageFooterImpl pageFooter = new PageFooterImpl();
		return pageFooter;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public WithStyle createWithStyle() {
		WithStyleImpl withStyle = new WithStyleImpl();
		return withStyle;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TextElement createTextElement() {
		TextElementImpl textElement = new TextElementImpl();
		return textElement;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Title createTitle() {
		TitleImpl title = new TitleImpl();
		return title;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SubTitle createSubTitle() {
		SubTitleImpl subTitle = new SubTitleImpl();
		return subTitle;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SubSubTitle createSubSubTitle() {
		SubSubTitleImpl subSubTitle = new SubSubTitleImpl();
		return subSubTitle;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Label createLabel() {
		LabelImpl label = new LabelImpl();
		return label;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Text createText() {
		TextImpl text = new TextImpl();
		return text;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AutoText createAutoText() {
		AutoTextImpl autoText = new AutoTextImpl();
		return autoText;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Image createImage() {
		ImageImpl image = new ImageImpl();
		return image;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public WithHeaderFooter createWithHeaderFooter() {
		WithHeaderFooterImpl withHeaderFooter = new WithHeaderFooterImpl();
		return withHeaderFooter;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartTable createDatamartTable() {
		DatamartTableImpl datamartTable = new DatamartTableImpl();
		return datamartTable;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartTableGroup createDatamartTableGroup() {
		DatamartTableGroupImpl datamartTableGroup = new DatamartTableGroupImpl();
		return datamartTableGroup;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SomeGrid createSomeGrid() {
		SomeGridImpl someGrid = new SomeGridImpl();
		return someGrid;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartTableGroupHeader createDatamartTableGroupHeader() {
		DatamartTableGroupHeaderImpl datamartTableGroupHeader = new DatamartTableGroupHeaderImpl();
		return datamartTableGroupHeader;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartTableGroupFooter createDatamartTableGroupFooter() {
		DatamartTableGroupFooterImpl datamartTableGroupFooter = new DatamartTableGroupFooterImpl();
		return datamartTableGroupFooter;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartTableDetail createDatamartTableDetail() {
		DatamartTableDetailImpl datamartTableDetail = new DatamartTableDetailImpl();
		return datamartTableDetail;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartTableProperty createDatamartTableProperty() {
		DatamartTablePropertyImpl datamartTableProperty = new DatamartTablePropertyImpl();
		return datamartTableProperty;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableFormatter createTableFormatter() {
		TableFormatterImpl tableFormatter = new TableFormatterImpl();
		return tableFormatter;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableImage createTableImage() {
		TableImageImpl tableImage = new TableImageImpl();
		return tableImage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableProperty createTableProperty() {
		TablePropertyImpl tableProperty = new TablePropertyImpl();
		return tableProperty;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableAggregation createTableAggregation() {
		TableAggregationImpl tableAggregation = new TableAggregationImpl();
		return tableAggregation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableBaseAggregation createTableBaseAggregation() {
		TableBaseAggregationImpl tableBaseAggregation = new TableBaseAggregationImpl();
		return tableBaseAggregation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TablePureAggregation createTablePureAggregation() {
		TablePureAggregationImpl tablePureAggregation = new TablePureAggregationImpl();
		return tablePureAggregation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableUnaryAggregation createTableUnaryAggregation() {
		TableUnaryAggregationImpl tableUnaryAggregation = new TableUnaryAggregationImpl();
		return tableUnaryAggregation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableMultipleAggregation createTableMultipleAggregation() {
		TableMultipleAggregationImpl tableMultipleAggregation = new TableMultipleAggregationImpl();
		return tableMultipleAggregation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableBinaryAggregation createTableBinaryAggregation() {
		TableBinaryAggregationImpl tableBinaryAggregation = new TableBinaryAggregationImpl();
		return tableBinaryAggregation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableNumberInterval createTableNumberInterval() {
		TableNumberIntervalImpl tableNumberInterval = new TableNumberIntervalImpl();
		return tableNumberInterval;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableDateDayInterval createTableDateDayInterval() {
		TableDateDayIntervalImpl tableDateDayInterval = new TableDateDayIntervalImpl();
		return tableDateDayInterval;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableNumberLookup createTableNumberLookup() {
		TableNumberLookupImpl tableNumberLookup = new TableNumberLookupImpl();
		return tableNumberLookup;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableStringLookup createTableStringLookup() {
		TableStringLookupImpl tableStringLookup = new TableStringLookupImpl();
		return tableStringLookup;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableDateDayLookup createTableDateDayLookup() {
		TableDateDayLookupImpl tableDateDayLookup = new TableDateDayLookupImpl();
		return tableDateDayLookup;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableTextColor createTableTextColor() {
		TableTextColorImpl tableTextColor = new TableTextColorImpl();
		return tableTextColor;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableCellColor createTableCellColor() {
		TableCellColorImpl tableCellColor = new TableCellColorImpl();
		return tableCellColor;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableIcon createTableIcon() {
		TableIconImpl tableIcon = new TableIconImpl();
		return tableIcon;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableTrend createTableTrend() {
		TableTrendImpl tableTrend = new TableTrendImpl();
		return tableTrend;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TableTooltip createTableTooltip() {
		TableTooltipImpl tableTooltip = new TableTooltipImpl();
		return tableTooltip;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Grid createGrid() {
		GridImpl grid = new GridImpl();
		return grid;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public GridRow createGridRow() {
		GridRowImpl gridRow = new GridRowImpl();
		return gridRow;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public GridCell createGridCell() {
		GridCellImpl gridCell = new GridCellImpl();
		return gridCell;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public UnitEnum createUnitEnumFromString(EDataType eDataType, String initialValue) {
		UnitEnum result = UnitEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertUnitEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PageSizeEnum createPageSizeEnumFromString(EDataType eDataType, String initialValue) {
		PageSizeEnum result = PageSizeEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertPageSizeEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public OrientationEnum createOrientationEnumFromString(EDataType eDataType, String initialValue) {
		OrientationEnum result = OrientationEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertOrientationEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FontStyleEnum createFontStyleEnumFromString(EDataType eDataType, String initialValue) {
		FontStyleEnum result = FontStyleEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertFontStyleEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BuildInFontFamilyEnum createBuildInFontFamilyEnumFromString(EDataType eDataType, String initialValue) {
		BuildInFontFamilyEnum result = BuildInFontFamilyEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertBuildInFontFamilyEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BorderTypeEnum createBorderTypeEnumFromString(EDataType eDataType, String initialValue) {
		BorderTypeEnum result = BorderTypeEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertBorderTypeEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TextAlignEnum createTextAlignEnumFromString(EDataType eDataType, String initialValue) {
		TextAlignEnum result = TextAlignEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertTextAlignEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NumberFormatCategoryEnum createNumberFormatCategoryEnumFromString(EDataType eDataType, String initialValue) {
		NumberFormatCategoryEnum result = NumberFormatCategoryEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertNumberFormatCategoryEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public CurrencyFormatCategoryEnum createCurrencyFormatCategoryEnumFromString(EDataType eDataType, String initialValue) {
		CurrencyFormatCategoryEnum result = CurrencyFormatCategoryEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertCurrencyFormatCategoryEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DateFormatCategoryEnum createDateFormatCategoryEnumFromString(EDataType eDataType, String initialValue) {
		DateFormatCategoryEnum result = DateFormatCategoryEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertDateFormatCategoryEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DateTimeFormatCategoryEnum createDateTimeFormatCategoryEnumFromString(EDataType eDataType, String initialValue) {
		DateTimeFormatCategoryEnum result = DateTimeFormatCategoryEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertDateTimeFormatCategoryEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TimeFormatCategoryEnum createTimeFormatCategoryEnumFromString(EDataType eDataType, String initialValue) {
		TimeFormatCategoryEnum result = TimeFormatCategoryEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertTimeFormatCategoryEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AutoTextEnum createAutoTextEnumFromString(EDataType eDataType, String initialValue) {
		AutoTextEnum result = AutoTextEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertAutoTextEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ImageSizeEnum createImageSizeEnumFromString(EDataType eDataType, String initialValue) {
		ImageSizeEnum result = ImageSizeEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertImageSizeEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ImageSourceEnum createImageSourceEnumFromString(EDataType eDataType, String initialValue) {
		ImageSourceEnum result = ImageSourceEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertImageSourceEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PureAggregationTypeEnum createPureAggregationTypeEnumFromString(EDataType eDataType, String initialValue) {
		PureAggregationTypeEnum result = PureAggregationTypeEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertPureAggregationTypeEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public UnaryAggregationTypeEnum createUnaryAggregationTypeEnumFromString(EDataType eDataType, String initialValue) {
		UnaryAggregationTypeEnum result = UnaryAggregationTypeEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertUnaryAggregationTypeEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BinaryAggregationTypeEnum createBinaryAggregationTypeEnumFromString(EDataType eDataType, String initialValue) {
		BinaryAggregationTypeEnum result = BinaryAggregationTypeEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertBinaryAggregationTypeEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MultipleAggregationTypeEnum createMultipleAggregationTypeEnumFromString(EDataType eDataType, String initialValue) {
		MultipleAggregationTypeEnum result = MultipleAggregationTypeEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertMultipleAggregationTypeEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TrendIconEnum createTrendIconEnumFromString(EDataType eDataType, String initialValue) {
		TrendIconEnum result = TrendIconEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertTrendIconEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RenderingEnum createRenderingEnumFromString(EDataType eDataType, String initialValue) {
		RenderingEnum result = RenderingEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertRenderingEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InternalEObject createInternalEObjectFromString(EDataType eDataType, String initialValue) {
		return (InternalEObject)super.createFromString(eDataType, initialValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertInternalEObjectToString(EDataType eDataType, Object instanceValue) {
		return super.convertToString(eDataType, instanceValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ReportDSLPackage getReportDSLPackage() {
		return (ReportDSLPackage)getEPackage();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @deprecated
	 * @generated
	 */
	@Deprecated
	public static ReportDSLPackage getPackage() {
		return ReportDSLPackage.eINSTANCE;
	}

} //ReportDSLFactoryImpl
