/**
 * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
 *  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.datainterchange.impl;

import org.eclipse.emf.common.notify.Notification;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;

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

import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;

import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Data Interchange Fixed Column Mapping</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#getProperty <em>Property</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#getData <em>Data</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#getLength <em>Length</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isTrim <em>Trim</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isLeftTrim <em>Left Trim</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isRightTrim <em>Right Trim</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isUpperCase <em>Upper Case</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isLowerCase <em>Lower Case</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isCapFirst <em>Cap First</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isUncapFirst <em>Uncap First</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isCapitalize <em>Capitalize</em>}</li>
 * </ul>
 *
 * @generated
 */
public class DataInterchangeFixedColumnMappingImpl extends DataInterchangeLazyResolverImpl implements DataInterchangeFixedColumnMapping {
	/**
	 * The cached value of the '{@link #getProperty() <em>Property</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getProperty()
	 * @generated
	 * @ordered
	 */
	protected LEntityAttribute property;

	/**
	 * The default value of the '{@link #getData() <em>Data</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getData()
	 * @generated
	 * @ordered
	 */
	protected static final String DATA_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getData() <em>Data</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getData()
	 * @generated
	 * @ordered
	 */
	protected String data = DATA_EDEFAULT;

	/**
	 * The default value of the '{@link #getLength() <em>Length</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLength()
	 * @generated
	 * @ordered
	 */
	protected static final int LENGTH_EDEFAULT = 0;

	/**
	 * The cached value of the '{@link #getLength() <em>Length</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLength()
	 * @generated
	 * @ordered
	 */
	protected int length = LENGTH_EDEFAULT;

	/**
	 * The default value of the '{@link #isTrim() <em>Trim</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isTrim()
	 * @generated
	 * @ordered
	 */
	protected static final boolean TRIM_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isTrim() <em>Trim</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isTrim()
	 * @generated
	 * @ordered
	 */
	protected boolean trim = TRIM_EDEFAULT;

	/**
	 * The default value of the '{@link #isLeftTrim() <em>Left Trim</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isLeftTrim()
	 * @generated
	 * @ordered
	 */
	protected static final boolean LEFT_TRIM_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isLeftTrim() <em>Left Trim</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isLeftTrim()
	 * @generated
	 * @ordered
	 */
	protected boolean leftTrim = LEFT_TRIM_EDEFAULT;

	/**
	 * The default value of the '{@link #isRightTrim() <em>Right Trim</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isRightTrim()
	 * @generated
	 * @ordered
	 */
	protected static final boolean RIGHT_TRIM_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isRightTrim() <em>Right Trim</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isRightTrim()
	 * @generated
	 * @ordered
	 */
	protected boolean rightTrim = RIGHT_TRIM_EDEFAULT;

	/**
	 * The default value of the '{@link #isUpperCase() <em>Upper Case</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isUpperCase()
	 * @generated
	 * @ordered
	 */
	protected static final boolean UPPER_CASE_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isUpperCase() <em>Upper Case</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isUpperCase()
	 * @generated
	 * @ordered
	 */
	protected boolean upperCase = UPPER_CASE_EDEFAULT;

	/**
	 * The default value of the '{@link #isLowerCase() <em>Lower Case</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isLowerCase()
	 * @generated
	 * @ordered
	 */
	protected static final boolean LOWER_CASE_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isLowerCase() <em>Lower Case</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isLowerCase()
	 * @generated
	 * @ordered
	 */
	protected boolean lowerCase = LOWER_CASE_EDEFAULT;

	/**
	 * The default value of the '{@link #isCapFirst() <em>Cap First</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isCapFirst()
	 * @generated
	 * @ordered
	 */
	protected static final boolean CAP_FIRST_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isCapFirst() <em>Cap First</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isCapFirst()
	 * @generated
	 * @ordered
	 */
	protected boolean capFirst = CAP_FIRST_EDEFAULT;

	/**
	 * The default value of the '{@link #isUncapFirst() <em>Uncap First</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isUncapFirst()
	 * @generated
	 * @ordered
	 */
	protected static final boolean UNCAP_FIRST_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isUncapFirst() <em>Uncap First</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isUncapFirst()
	 * @generated
	 * @ordered
	 */
	protected boolean uncapFirst = UNCAP_FIRST_EDEFAULT;

	/**
	 * The default value of the '{@link #isCapitalize() <em>Capitalize</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isCapitalize()
	 * @generated
	 * @ordered
	 */
	protected static final boolean CAPITALIZE_EDEFAULT = false;

	/**
	 * The cached value of the '{@link #isCapitalize() <em>Capitalize</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isCapitalize()
	 * @generated
	 * @ordered
	 */
	protected boolean capitalize = CAPITALIZE_EDEFAULT;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected DataInterchangeFixedColumnMappingImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return DataDSLPackage.Literals.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LEntityAttribute getProperty() {
		if (property != null && property.eIsProxy()) {
			InternalEObject oldProperty = (InternalEObject)property;
			property = (LEntityAttribute)eResolveProxy(oldProperty);
			if (property != oldProperty) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY, oldProperty, property));
			}
		}
		return property;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LEntityAttribute basicGetProperty() {
		return property;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setProperty(LEntityAttribute newProperty) {
		LEntityAttribute oldProperty = property;
		property = newProperty;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY, oldProperty, property));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getData() {
		return data;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setData(String newData) {
		String oldData = data;
		data = newData;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__DATA, oldData, data));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public int getLength() {
		return length;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setLength(int newLength) {
		int oldLength = length;
		length = newLength;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH, oldLength, length));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isTrim() {
		return trim;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setTrim(boolean newTrim) {
		boolean oldTrim = trim;
		trim = newTrim;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM, oldTrim, trim));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isLeftTrim() {
		return leftTrim;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setLeftTrim(boolean newLeftTrim) {
		boolean oldLeftTrim = leftTrim;
		leftTrim = newLeftTrim;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM, oldLeftTrim, leftTrim));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isRightTrim() {
		return rightTrim;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setRightTrim(boolean newRightTrim) {
		boolean oldRightTrim = rightTrim;
		rightTrim = newRightTrim;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM, oldRightTrim, rightTrim));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isUpperCase() {
		return upperCase;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setUpperCase(boolean newUpperCase) {
		boolean oldUpperCase = upperCase;
		upperCase = newUpperCase;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE, oldUpperCase, upperCase));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isLowerCase() {
		return lowerCase;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setLowerCase(boolean newLowerCase) {
		boolean oldLowerCase = lowerCase;
		lowerCase = newLowerCase;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE, oldLowerCase, lowerCase));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isCapFirst() {
		return capFirst;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setCapFirst(boolean newCapFirst) {
		boolean oldCapFirst = capFirst;
		capFirst = newCapFirst;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST, oldCapFirst, capFirst));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isUncapFirst() {
		return uncapFirst;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setUncapFirst(boolean newUncapFirst) {
		boolean oldUncapFirst = uncapFirst;
		uncapFirst = newUncapFirst;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST, oldUncapFirst, uncapFirst));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public boolean isCapitalize() {
		return capitalize;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setCapitalize(boolean newCapitalize) {
		boolean oldCapitalize = capitalize;
		capitalize = newCapitalize;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE, oldCapitalize, capitalize));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY:
				if (resolve) return getProperty();
				return basicGetProperty();
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__DATA:
				return getData();
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH:
				return getLength();
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM:
				return isTrim();
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM:
				return isLeftTrim();
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM:
				return isRightTrim();
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE:
				return isUpperCase();
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE:
				return isLowerCase();
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST:
				return isCapFirst();
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST:
				return isUncapFirst();
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE:
				return isCapitalize();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY:
				setProperty((LEntityAttribute)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__DATA:
				setData((String)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH:
				setLength((Integer)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM:
				setTrim((Boolean)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM:
				setLeftTrim((Boolean)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM:
				setRightTrim((Boolean)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE:
				setUpperCase((Boolean)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE:
				setLowerCase((Boolean)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST:
				setCapFirst((Boolean)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST:
				setUncapFirst((Boolean)newValue);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE:
				setCapitalize((Boolean)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY:
				setProperty((LEntityAttribute)null);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__DATA:
				setData(DATA_EDEFAULT);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH:
				setLength(LENGTH_EDEFAULT);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM:
				setTrim(TRIM_EDEFAULT);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM:
				setLeftTrim(LEFT_TRIM_EDEFAULT);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM:
				setRightTrim(RIGHT_TRIM_EDEFAULT);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE:
				setUpperCase(UPPER_CASE_EDEFAULT);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE:
				setLowerCase(LOWER_CASE_EDEFAULT);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST:
				setCapFirst(CAP_FIRST_EDEFAULT);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST:
				setUncapFirst(UNCAP_FIRST_EDEFAULT);
				return;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE:
				setCapitalize(CAPITALIZE_EDEFAULT);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY:
				return property != null;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__DATA:
				return DATA_EDEFAULT == null ? data != null : !DATA_EDEFAULT.equals(data);
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH:
				return length != LENGTH_EDEFAULT;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM:
				return trim != TRIM_EDEFAULT;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM:
				return leftTrim != LEFT_TRIM_EDEFAULT;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM:
				return rightTrim != RIGHT_TRIM_EDEFAULT;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE:
				return upperCase != UPPER_CASE_EDEFAULT;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE:
				return lowerCase != LOWER_CASE_EDEFAULT;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST:
				return capFirst != CAP_FIRST_EDEFAULT;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST:
				return uncapFirst != UNCAP_FIRST_EDEFAULT;
			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE:
				return capitalize != CAPITALIZE_EDEFAULT;
		}
		return super.eIsSet(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		if (eIsProxy()) return super.toString();

		StringBuffer result = new StringBuffer(super.toString());
		result.append(" (data: ");
		result.append(data);
		result.append(", length: ");
		result.append(length);
		result.append(", trim: ");
		result.append(trim);
		result.append(", leftTrim: ");
		result.append(leftTrim);
		result.append(", rightTrim: ");
		result.append(rightTrim);
		result.append(", upperCase: ");
		result.append(upperCase);
		result.append(", lowerCase: ");
		result.append(lowerCase);
		result.append(", capFirst: ");
		result.append(capFirst);
		result.append(", uncapFirst: ");
		result.append(uncapFirst);
		result.append(", capitalize: ");
		result.append(capitalize);
		result.append(')');
		return result.toString();
	}

} //DataInterchangeFixedColumnMappingImpl
