/**
 * 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
 *  
 *  Contributors:                                                      
 *     Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 *  
 *  generated from ActionDSL.xcore
 * 
 *  
 */
package org.eclipse.osbp.xtext.action.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.action.ActionDSLPackage;
import org.eclipse.osbp.xtext.action.ActionFunction;

import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryActionGroup;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryCanExecute;
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryExecute;

import org.eclipse.osbp.xtext.messagedsl.MessageCategory;
import org.eclipse.osbp.xtext.messagedsl.MessageItem;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Action Function</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#getActionGroup <em>Action Group</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#getCanExecute <em>Can Execute</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#isHasExecuteImmediate <em>Has Execute Immediate</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#isHasExecuteLater <em>Has Execute Later</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#getExecuteImmediate <em>Execute Immediate</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#getExecuteLater <em>Execute Later</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#isHasMessage <em>Has Message</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#getMessageCategory <em>Message Category</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#getOnFailMessage <em>On Fail Message</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#isHasSuccessMessage <em>Has Success Message</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#getOnSuccessMessage <em>On Success Message</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#isHasStartedMessage <em>Has Started Message</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.impl.ActionFunctionImpl#getOnStartedMessage <em>On Started Message</em>}</li>
 * </ul>
 *
 * @generated
 */
public class ActionFunctionImpl extends ActionLazyResolverImpl implements ActionFunction {
	/**
	 * The cached value of the '{@link #getActionGroup() <em>Action Group</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getActionGroup()
	 * @generated
	 * @ordered
	 */
	protected FunctionLibraryActionGroup actionGroup;

	/**
	 * The cached value of the '{@link #getCanExecute() <em>Can Execute</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCanExecute()
	 * @generated
	 * @ordered
	 */
	protected FunctionLibraryCanExecute canExecute;

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

	/**
	 * The cached value of the '{@link #isHasExecuteImmediate() <em>Has Execute Immediate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isHasExecuteImmediate()
	 * @generated
	 * @ordered
	 */
	protected boolean hasExecuteImmediate = HAS_EXECUTE_IMMEDIATE_EDEFAULT;

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

	/**
	 * The cached value of the '{@link #isHasExecuteLater() <em>Has Execute Later</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isHasExecuteLater()
	 * @generated
	 * @ordered
	 */
	protected boolean hasExecuteLater = HAS_EXECUTE_LATER_EDEFAULT;

	/**
	 * The cached value of the '{@link #getExecuteImmediate() <em>Execute Immediate</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getExecuteImmediate()
	 * @generated
	 * @ordered
	 */
	protected FunctionLibraryExecute executeImmediate;

	/**
	 * The cached value of the '{@link #getExecuteLater() <em>Execute Later</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getExecuteLater()
	 * @generated
	 * @ordered
	 */
	protected FunctionLibraryExecute executeLater;

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

	/**
	 * The cached value of the '{@link #isHasMessage() <em>Has Message</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isHasMessage()
	 * @generated
	 * @ordered
	 */
	protected boolean hasMessage = HAS_MESSAGE_EDEFAULT;

	/**
	 * The cached value of the '{@link #getMessageCategory() <em>Message Category</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getMessageCategory()
	 * @generated
	 * @ordered
	 */
	protected MessageCategory messageCategory;

	/**
	 * The cached value of the '{@link #getOnFailMessage() <em>On Fail Message</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getOnFailMessage()
	 * @generated
	 * @ordered
	 */
	protected MessageItem onFailMessage;

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

	/**
	 * The cached value of the '{@link #isHasSuccessMessage() <em>Has Success Message</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isHasSuccessMessage()
	 * @generated
	 * @ordered
	 */
	protected boolean hasSuccessMessage = HAS_SUCCESS_MESSAGE_EDEFAULT;

	/**
	 * The cached value of the '{@link #getOnSuccessMessage() <em>On Success Message</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getOnSuccessMessage()
	 * @generated
	 * @ordered
	 */
	protected MessageItem onSuccessMessage;

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

	/**
	 * The cached value of the '{@link #isHasStartedMessage() <em>Has Started Message</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #isHasStartedMessage()
	 * @generated
	 * @ordered
	 */
	protected boolean hasStartedMessage = HAS_STARTED_MESSAGE_EDEFAULT;

	/**
	 * The cached value of the '{@link #getOnStartedMessage() <em>On Started Message</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getOnStartedMessage()
	 * @generated
	 * @ordered
	 */
	protected MessageItem onStartedMessage;

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionLibraryActionGroup getActionGroup() {
		if (actionGroup != null && actionGroup.eIsProxy()) {
			InternalEObject oldActionGroup = (InternalEObject)actionGroup;
			actionGroup = (FunctionLibraryActionGroup)eResolveProxy(oldActionGroup);
			if (actionGroup != oldActionGroup) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ActionDSLPackage.ACTION_FUNCTION__ACTION_GROUP, oldActionGroup, actionGroup));
			}
		}
		return actionGroup;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionLibraryActionGroup basicGetActionGroup() {
		return actionGroup;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setActionGroup(FunctionLibraryActionGroup newActionGroup) {
		FunctionLibraryActionGroup oldActionGroup = actionGroup;
		actionGroup = newActionGroup;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__ACTION_GROUP, oldActionGroup, actionGroup));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionLibraryCanExecute getCanExecute() {
		if (canExecute != null && canExecute.eIsProxy()) {
			InternalEObject oldCanExecute = (InternalEObject)canExecute;
			canExecute = (FunctionLibraryCanExecute)eResolveProxy(oldCanExecute);
			if (canExecute != oldCanExecute) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ActionDSLPackage.ACTION_FUNCTION__CAN_EXECUTE, oldCanExecute, canExecute));
			}
		}
		return canExecute;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionLibraryCanExecute basicGetCanExecute() {
		return canExecute;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setCanExecute(FunctionLibraryCanExecute newCanExecute) {
		FunctionLibraryCanExecute oldCanExecute = canExecute;
		canExecute = newCanExecute;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__CAN_EXECUTE, oldCanExecute, canExecute));
	}

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setHasExecuteImmediate(boolean newHasExecuteImmediate) {
		boolean oldHasExecuteImmediate = hasExecuteImmediate;
		hasExecuteImmediate = newHasExecuteImmediate;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__HAS_EXECUTE_IMMEDIATE, oldHasExecuteImmediate, hasExecuteImmediate));
	}

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setHasExecuteLater(boolean newHasExecuteLater) {
		boolean oldHasExecuteLater = hasExecuteLater;
		hasExecuteLater = newHasExecuteLater;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__HAS_EXECUTE_LATER, oldHasExecuteLater, hasExecuteLater));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionLibraryExecute getExecuteImmediate() {
		if (executeImmediate != null && executeImmediate.eIsProxy()) {
			InternalEObject oldExecuteImmediate = (InternalEObject)executeImmediate;
			executeImmediate = (FunctionLibraryExecute)eResolveProxy(oldExecuteImmediate);
			if (executeImmediate != oldExecuteImmediate) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ActionDSLPackage.ACTION_FUNCTION__EXECUTE_IMMEDIATE, oldExecuteImmediate, executeImmediate));
			}
		}
		return executeImmediate;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionLibraryExecute basicGetExecuteImmediate() {
		return executeImmediate;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setExecuteImmediate(FunctionLibraryExecute newExecuteImmediate) {
		FunctionLibraryExecute oldExecuteImmediate = executeImmediate;
		executeImmediate = newExecuteImmediate;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__EXECUTE_IMMEDIATE, oldExecuteImmediate, executeImmediate));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionLibraryExecute getExecuteLater() {
		if (executeLater != null && executeLater.eIsProxy()) {
			InternalEObject oldExecuteLater = (InternalEObject)executeLater;
			executeLater = (FunctionLibraryExecute)eResolveProxy(oldExecuteLater);
			if (executeLater != oldExecuteLater) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ActionDSLPackage.ACTION_FUNCTION__EXECUTE_LATER, oldExecuteLater, executeLater));
			}
		}
		return executeLater;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FunctionLibraryExecute basicGetExecuteLater() {
		return executeLater;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setExecuteLater(FunctionLibraryExecute newExecuteLater) {
		FunctionLibraryExecute oldExecuteLater = executeLater;
		executeLater = newExecuteLater;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__EXECUTE_LATER, oldExecuteLater, executeLater));
	}

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setHasMessage(boolean newHasMessage) {
		boolean oldHasMessage = hasMessage;
		hasMessage = newHasMessage;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__HAS_MESSAGE, oldHasMessage, hasMessage));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MessageCategory getMessageCategory() {
		if (messageCategory != null && messageCategory.eIsProxy()) {
			InternalEObject oldMessageCategory = (InternalEObject)messageCategory;
			messageCategory = (MessageCategory)eResolveProxy(oldMessageCategory);
			if (messageCategory != oldMessageCategory) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ActionDSLPackage.ACTION_FUNCTION__MESSAGE_CATEGORY, oldMessageCategory, messageCategory));
			}
		}
		return messageCategory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MessageCategory basicGetMessageCategory() {
		return messageCategory;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setMessageCategory(MessageCategory newMessageCategory) {
		MessageCategory oldMessageCategory = messageCategory;
		messageCategory = newMessageCategory;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__MESSAGE_CATEGORY, oldMessageCategory, messageCategory));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MessageItem getOnFailMessage() {
		if (onFailMessage != null && onFailMessage.eIsProxy()) {
			InternalEObject oldOnFailMessage = (InternalEObject)onFailMessage;
			onFailMessage = (MessageItem)eResolveProxy(oldOnFailMessage);
			if (onFailMessage != oldOnFailMessage) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ActionDSLPackage.ACTION_FUNCTION__ON_FAIL_MESSAGE, oldOnFailMessage, onFailMessage));
			}
		}
		return onFailMessage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MessageItem basicGetOnFailMessage() {
		return onFailMessage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setOnFailMessage(MessageItem newOnFailMessage) {
		MessageItem oldOnFailMessage = onFailMessage;
		onFailMessage = newOnFailMessage;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__ON_FAIL_MESSAGE, oldOnFailMessage, onFailMessage));
	}

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setHasSuccessMessage(boolean newHasSuccessMessage) {
		boolean oldHasSuccessMessage = hasSuccessMessage;
		hasSuccessMessage = newHasSuccessMessage;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__HAS_SUCCESS_MESSAGE, oldHasSuccessMessage, hasSuccessMessage));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MessageItem getOnSuccessMessage() {
		if (onSuccessMessage != null && onSuccessMessage.eIsProxy()) {
			InternalEObject oldOnSuccessMessage = (InternalEObject)onSuccessMessage;
			onSuccessMessage = (MessageItem)eResolveProxy(oldOnSuccessMessage);
			if (onSuccessMessage != oldOnSuccessMessage) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ActionDSLPackage.ACTION_FUNCTION__ON_SUCCESS_MESSAGE, oldOnSuccessMessage, onSuccessMessage));
			}
		}
		return onSuccessMessage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MessageItem basicGetOnSuccessMessage() {
		return onSuccessMessage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setOnSuccessMessage(MessageItem newOnSuccessMessage) {
		MessageItem oldOnSuccessMessage = onSuccessMessage;
		onSuccessMessage = newOnSuccessMessage;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__ON_SUCCESS_MESSAGE, oldOnSuccessMessage, onSuccessMessage));
	}

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setHasStartedMessage(boolean newHasStartedMessage) {
		boolean oldHasStartedMessage = hasStartedMessage;
		hasStartedMessage = newHasStartedMessage;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__HAS_STARTED_MESSAGE, oldHasStartedMessage, hasStartedMessage));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MessageItem getOnStartedMessage() {
		if (onStartedMessage != null && onStartedMessage.eIsProxy()) {
			InternalEObject oldOnStartedMessage = (InternalEObject)onStartedMessage;
			onStartedMessage = (MessageItem)eResolveProxy(oldOnStartedMessage);
			if (onStartedMessage != oldOnStartedMessage) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ActionDSLPackage.ACTION_FUNCTION__ON_STARTED_MESSAGE, oldOnStartedMessage, onStartedMessage));
			}
		}
		return onStartedMessage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public MessageItem basicGetOnStartedMessage() {
		return onStartedMessage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setOnStartedMessage(MessageItem newOnStartedMessage) {
		MessageItem oldOnStartedMessage = onStartedMessage;
		onStartedMessage = newOnStartedMessage;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, ActionDSLPackage.ACTION_FUNCTION__ON_STARTED_MESSAGE, oldOnStartedMessage, onStartedMessage));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case ActionDSLPackage.ACTION_FUNCTION__ACTION_GROUP:
				if (resolve) return getActionGroup();
				return basicGetActionGroup();
			case ActionDSLPackage.ACTION_FUNCTION__CAN_EXECUTE:
				if (resolve) return getCanExecute();
				return basicGetCanExecute();
			case ActionDSLPackage.ACTION_FUNCTION__HAS_EXECUTE_IMMEDIATE:
				return isHasExecuteImmediate();
			case ActionDSLPackage.ACTION_FUNCTION__HAS_EXECUTE_LATER:
				return isHasExecuteLater();
			case ActionDSLPackage.ACTION_FUNCTION__EXECUTE_IMMEDIATE:
				if (resolve) return getExecuteImmediate();
				return basicGetExecuteImmediate();
			case ActionDSLPackage.ACTION_FUNCTION__EXECUTE_LATER:
				if (resolve) return getExecuteLater();
				return basicGetExecuteLater();
			case ActionDSLPackage.ACTION_FUNCTION__HAS_MESSAGE:
				return isHasMessage();
			case ActionDSLPackage.ACTION_FUNCTION__MESSAGE_CATEGORY:
				if (resolve) return getMessageCategory();
				return basicGetMessageCategory();
			case ActionDSLPackage.ACTION_FUNCTION__ON_FAIL_MESSAGE:
				if (resolve) return getOnFailMessage();
				return basicGetOnFailMessage();
			case ActionDSLPackage.ACTION_FUNCTION__HAS_SUCCESS_MESSAGE:
				return isHasSuccessMessage();
			case ActionDSLPackage.ACTION_FUNCTION__ON_SUCCESS_MESSAGE:
				if (resolve) return getOnSuccessMessage();
				return basicGetOnSuccessMessage();
			case ActionDSLPackage.ACTION_FUNCTION__HAS_STARTED_MESSAGE:
				return isHasStartedMessage();
			case ActionDSLPackage.ACTION_FUNCTION__ON_STARTED_MESSAGE:
				if (resolve) return getOnStartedMessage();
				return basicGetOnStartedMessage();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case ActionDSLPackage.ACTION_FUNCTION__ACTION_GROUP:
				setActionGroup((FunctionLibraryActionGroup)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__CAN_EXECUTE:
				setCanExecute((FunctionLibraryCanExecute)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_EXECUTE_IMMEDIATE:
				setHasExecuteImmediate((Boolean)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_EXECUTE_LATER:
				setHasExecuteLater((Boolean)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__EXECUTE_IMMEDIATE:
				setExecuteImmediate((FunctionLibraryExecute)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__EXECUTE_LATER:
				setExecuteLater((FunctionLibraryExecute)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_MESSAGE:
				setHasMessage((Boolean)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__MESSAGE_CATEGORY:
				setMessageCategory((MessageCategory)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__ON_FAIL_MESSAGE:
				setOnFailMessage((MessageItem)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_SUCCESS_MESSAGE:
				setHasSuccessMessage((Boolean)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__ON_SUCCESS_MESSAGE:
				setOnSuccessMessage((MessageItem)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_STARTED_MESSAGE:
				setHasStartedMessage((Boolean)newValue);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__ON_STARTED_MESSAGE:
				setOnStartedMessage((MessageItem)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case ActionDSLPackage.ACTION_FUNCTION__ACTION_GROUP:
				setActionGroup((FunctionLibraryActionGroup)null);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__CAN_EXECUTE:
				setCanExecute((FunctionLibraryCanExecute)null);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_EXECUTE_IMMEDIATE:
				setHasExecuteImmediate(HAS_EXECUTE_IMMEDIATE_EDEFAULT);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_EXECUTE_LATER:
				setHasExecuteLater(HAS_EXECUTE_LATER_EDEFAULT);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__EXECUTE_IMMEDIATE:
				setExecuteImmediate((FunctionLibraryExecute)null);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__EXECUTE_LATER:
				setExecuteLater((FunctionLibraryExecute)null);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_MESSAGE:
				setHasMessage(HAS_MESSAGE_EDEFAULT);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__MESSAGE_CATEGORY:
				setMessageCategory((MessageCategory)null);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__ON_FAIL_MESSAGE:
				setOnFailMessage((MessageItem)null);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_SUCCESS_MESSAGE:
				setHasSuccessMessage(HAS_SUCCESS_MESSAGE_EDEFAULT);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__ON_SUCCESS_MESSAGE:
				setOnSuccessMessage((MessageItem)null);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_STARTED_MESSAGE:
				setHasStartedMessage(HAS_STARTED_MESSAGE_EDEFAULT);
				return;
			case ActionDSLPackage.ACTION_FUNCTION__ON_STARTED_MESSAGE:
				setOnStartedMessage((MessageItem)null);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case ActionDSLPackage.ACTION_FUNCTION__ACTION_GROUP:
				return actionGroup != null;
			case ActionDSLPackage.ACTION_FUNCTION__CAN_EXECUTE:
				return canExecute != null;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_EXECUTE_IMMEDIATE:
				return hasExecuteImmediate != HAS_EXECUTE_IMMEDIATE_EDEFAULT;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_EXECUTE_LATER:
				return hasExecuteLater != HAS_EXECUTE_LATER_EDEFAULT;
			case ActionDSLPackage.ACTION_FUNCTION__EXECUTE_IMMEDIATE:
				return executeImmediate != null;
			case ActionDSLPackage.ACTION_FUNCTION__EXECUTE_LATER:
				return executeLater != null;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_MESSAGE:
				return hasMessage != HAS_MESSAGE_EDEFAULT;
			case ActionDSLPackage.ACTION_FUNCTION__MESSAGE_CATEGORY:
				return messageCategory != null;
			case ActionDSLPackage.ACTION_FUNCTION__ON_FAIL_MESSAGE:
				return onFailMessage != null;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_SUCCESS_MESSAGE:
				return hasSuccessMessage != HAS_SUCCESS_MESSAGE_EDEFAULT;
			case ActionDSLPackage.ACTION_FUNCTION__ON_SUCCESS_MESSAGE:
				return onSuccessMessage != null;
			case ActionDSLPackage.ACTION_FUNCTION__HAS_STARTED_MESSAGE:
				return hasStartedMessage != HAS_STARTED_MESSAGE_EDEFAULT;
			case ActionDSLPackage.ACTION_FUNCTION__ON_STARTED_MESSAGE:
				return onStartedMessage != null;
		}
		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(" (hasExecuteImmediate: ");
		result.append(hasExecuteImmediate);
		result.append(", hasExecuteLater: ");
		result.append(hasExecuteLater);
		result.append(", hasMessage: ");
		result.append(hasMessage);
		result.append(", hasSuccessMessage: ");
		result.append(hasSuccessMessage);
		result.append(", hasStartedMessage: ");
		result.append(hasStartedMessage);
		result.append(')');
		return result.toString();
	}

} //ActionFunctionImpl
