/**
 * 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.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.xtext.chart.ChartAxis;
import org.eclipse.osbp.xtext.chart.ChartDSLPackage;
import org.eclipse.osbp.xtext.chart.RenderTypeEnum;

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

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Chart Axis</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.chart.impl.ChartAxisImpl#getAxis <em>Axis</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.impl.ChartAxisImpl#getRenderType <em>Render Type</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.impl.ChartAxisImpl#isShortLabel <em>Short Label</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.impl.ChartAxisImpl#getAngle <em>Angle</em>}</li>
 * </ul>
 *
 * @generated
 */
public class ChartAxisImpl extends ChartLazyResolverImpl implements ChartAxis {
	/**
	 * The cached value of the '{@link #getAxis() <em>Axis</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getAxis()
	 * @generated
	 * @ordered
	 */
	protected DatamartAxis axis;

	/**
	 * The default value of the '{@link #getRenderType() <em>Render Type</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getRenderType()
	 * @generated
	 * @ordered
	 */
	protected static final RenderTypeEnum RENDER_TYPE_EDEFAULT = RenderTypeEnum.CATEGORY;

	/**
	 * The cached value of the '{@link #getRenderType() <em>Render Type</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getRenderType()
	 * @generated
	 * @ordered
	 */
	protected RenderTypeEnum renderType = RENDER_TYPE_EDEFAULT;

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

	/**
	 * The cached value of the '{@link #isShortLabel() <em>Short Label</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isShortLabel()
	 * @generated
	 * @ordered
	 */
	protected boolean shortLabel = SHORT_LABEL_EDEFAULT;

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartAxis getAxis() {
		if (axis != null && axis.eIsProxy()) {
			InternalEObject oldAxis = (InternalEObject)axis;
			axis = (DatamartAxis)eResolveProxy(oldAxis);
			if (axis != oldAxis) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ChartDSLPackage.CHART_AXIS__AXIS, oldAxis, axis));
			}
		}
		return axis;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DatamartAxis basicGetAxis() {
		return axis;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setAxis(DatamartAxis newAxis) {
		DatamartAxis oldAxis = axis;
		axis = newAxis;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ChartDSLPackage.CHART_AXIS__AXIS, oldAxis, axis));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RenderTypeEnum getRenderType() {
		return renderType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setRenderType(RenderTypeEnum newRenderType) {
		RenderTypeEnum oldRenderType = renderType;
		renderType = newRenderType == null ? RENDER_TYPE_EDEFAULT : newRenderType;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ChartDSLPackage.CHART_AXIS__RENDER_TYPE, oldRenderType, renderType));
	}

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setShortLabel(boolean newShortLabel) {
		boolean oldShortLabel = shortLabel;
		shortLabel = newShortLabel;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ChartDSLPackage.CHART_AXIS__SHORT_LABEL, oldShortLabel, shortLabel));
	}

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setAngle(int newAngle) {
		int oldAngle = angle;
		angle = newAngle;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ChartDSLPackage.CHART_AXIS__ANGLE, oldAngle, angle));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case ChartDSLPackage.CHART_AXIS__AXIS:
				if (resolve) return getAxis();
				return basicGetAxis();
			case ChartDSLPackage.CHART_AXIS__RENDER_TYPE:
				return getRenderType();
			case ChartDSLPackage.CHART_AXIS__SHORT_LABEL:
				return isShortLabel();
			case ChartDSLPackage.CHART_AXIS__ANGLE:
				return getAngle();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case ChartDSLPackage.CHART_AXIS__AXIS:
				setAxis((DatamartAxis)newValue);
				return;
			case ChartDSLPackage.CHART_AXIS__RENDER_TYPE:
				setRenderType((RenderTypeEnum)newValue);
				return;
			case ChartDSLPackage.CHART_AXIS__SHORT_LABEL:
				setShortLabel((Boolean)newValue);
				return;
			case ChartDSLPackage.CHART_AXIS__ANGLE:
				setAngle((Integer)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case ChartDSLPackage.CHART_AXIS__AXIS:
				setAxis((DatamartAxis)null);
				return;
			case ChartDSLPackage.CHART_AXIS__RENDER_TYPE:
				setRenderType(RENDER_TYPE_EDEFAULT);
				return;
			case ChartDSLPackage.CHART_AXIS__SHORT_LABEL:
				setShortLabel(SHORT_LABEL_EDEFAULT);
				return;
			case ChartDSLPackage.CHART_AXIS__ANGLE:
				setAngle(ANGLE_EDEFAULT);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case ChartDSLPackage.CHART_AXIS__AXIS:
				return axis != null;
			case ChartDSLPackage.CHART_AXIS__RENDER_TYPE:
				return renderType != RENDER_TYPE_EDEFAULT;
			case ChartDSLPackage.CHART_AXIS__SHORT_LABEL:
				return shortLabel != SHORT_LABEL_EDEFAULT;
			case ChartDSLPackage.CHART_AXIS__ANGLE:
				return angle != ANGLE_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(" (renderType: ");
		result.append(renderType);
		result.append(", shortLabel: ");
		result.append(shortLabel);
		result.append(", angle: ");
		result.append(angle);
		result.append(')');
		return result.toString();
	}

} //ChartAxisImpl
