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

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 -->
 * A representation of the model object '<em><b>Action Function</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#getActionGroup <em>Action Group</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#getCanExecute <em>Can Execute</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#isHasExecuteImmediate <em>Has Execute Immediate</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#isHasExecuteLater <em>Has Execute Later</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#getExecuteImmediate <em>Execute Immediate</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#getExecuteLater <em>Execute Later</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#isHasMessage <em>Has Message</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#getMessageCategory <em>Message Category</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#getOnFailMessage <em>On Fail Message</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#isHasSuccessMessage <em>Has Success Message</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#getOnSuccessMessage <em>On Success Message</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#isHasStartedMessage <em>Has Started Message</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.action.ActionFunction#getOnStartedMessage <em>On Started Message</em>}</li>
 * </ul>
 *
 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction()
 * @model
 * @generated
 */
public interface ActionFunction extends ActionType {
	/**
	 * Returns the value of the '<em><b>Action Group</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Action Group</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Action Group</em>' reference.
	 * @see #setActionGroup(FunctionLibraryActionGroup)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_ActionGroup()
	 * @model
	 * @generated
	 */
	FunctionLibraryActionGroup getActionGroup();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#getActionGroup <em>Action Group</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Action Group</em>' reference.
	 * @see #getActionGroup()
	 * @generated
	 */
	void setActionGroup(FunctionLibraryActionGroup value);

	/**
	 * Returns the value of the '<em><b>Can Execute</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Can Execute</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Can Execute</em>' reference.
	 * @see #setCanExecute(FunctionLibraryCanExecute)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_CanExecute()
	 * @model
	 * @generated
	 */
	FunctionLibraryCanExecute getCanExecute();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#getCanExecute <em>Can Execute</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Can Execute</em>' reference.
	 * @see #getCanExecute()
	 * @generated
	 */
	void setCanExecute(FunctionLibraryCanExecute value);

	/**
	 * Returns the value of the '<em><b>Has Execute Immediate</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Has Execute Immediate</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Has Execute Immediate</em>' attribute.
	 * @see #setHasExecuteImmediate(boolean)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_HasExecuteImmediate()
	 * @model unique="false"
	 * @generated
	 */
	boolean isHasExecuteImmediate();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#isHasExecuteImmediate <em>Has Execute Immediate</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Has Execute Immediate</em>' attribute.
	 * @see #isHasExecuteImmediate()
	 * @generated
	 */
	void setHasExecuteImmediate(boolean value);

	/**
	 * Returns the value of the '<em><b>Has Execute Later</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Has Execute Later</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Has Execute Later</em>' attribute.
	 * @see #setHasExecuteLater(boolean)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_HasExecuteLater()
	 * @model unique="false"
	 * @generated
	 */
	boolean isHasExecuteLater();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#isHasExecuteLater <em>Has Execute Later</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Has Execute Later</em>' attribute.
	 * @see #isHasExecuteLater()
	 * @generated
	 */
	void setHasExecuteLater(boolean value);

	/**
	 * Returns the value of the '<em><b>Execute Immediate</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Execute Immediate</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Execute Immediate</em>' reference.
	 * @see #setExecuteImmediate(FunctionLibraryExecute)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_ExecuteImmediate()
	 * @model
	 * @generated
	 */
	FunctionLibraryExecute getExecuteImmediate();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#getExecuteImmediate <em>Execute Immediate</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Execute Immediate</em>' reference.
	 * @see #getExecuteImmediate()
	 * @generated
	 */
	void setExecuteImmediate(FunctionLibraryExecute value);

	/**
	 * Returns the value of the '<em><b>Execute Later</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Execute Later</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Execute Later</em>' reference.
	 * @see #setExecuteLater(FunctionLibraryExecute)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_ExecuteLater()
	 * @model
	 * @generated
	 */
	FunctionLibraryExecute getExecuteLater();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#getExecuteLater <em>Execute Later</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Execute Later</em>' reference.
	 * @see #getExecuteLater()
	 * @generated
	 */
	void setExecuteLater(FunctionLibraryExecute value);

	/**
	 * Returns the value of the '<em><b>Has Message</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Has Message</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Has Message</em>' attribute.
	 * @see #setHasMessage(boolean)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_HasMessage()
	 * @model unique="false"
	 * @generated
	 */
	boolean isHasMessage();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#isHasMessage <em>Has Message</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Has Message</em>' attribute.
	 * @see #isHasMessage()
	 * @generated
	 */
	void setHasMessage(boolean value);

	/**
	 * Returns the value of the '<em><b>Message Category</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Message Category</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Message Category</em>' reference.
	 * @see #setMessageCategory(MessageCategory)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_MessageCategory()
	 * @model
	 * @generated
	 */
	MessageCategory getMessageCategory();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#getMessageCategory <em>Message Category</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Message Category</em>' reference.
	 * @see #getMessageCategory()
	 * @generated
	 */
	void setMessageCategory(MessageCategory value);

	/**
	 * Returns the value of the '<em><b>On Fail Message</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>On Fail Message</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>On Fail Message</em>' reference.
	 * @see #setOnFailMessage(MessageItem)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_OnFailMessage()
	 * @model
	 * @generated
	 */
	MessageItem getOnFailMessage();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#getOnFailMessage <em>On Fail Message</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>On Fail Message</em>' reference.
	 * @see #getOnFailMessage()
	 * @generated
	 */
	void setOnFailMessage(MessageItem value);

	/**
	 * Returns the value of the '<em><b>Has Success Message</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Has Success Message</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Has Success Message</em>' attribute.
	 * @see #setHasSuccessMessage(boolean)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_HasSuccessMessage()
	 * @model unique="false"
	 * @generated
	 */
	boolean isHasSuccessMessage();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#isHasSuccessMessage <em>Has Success Message</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Has Success Message</em>' attribute.
	 * @see #isHasSuccessMessage()
	 * @generated
	 */
	void setHasSuccessMessage(boolean value);

	/**
	 * Returns the value of the '<em><b>On Success Message</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>On Success Message</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>On Success Message</em>' reference.
	 * @see #setOnSuccessMessage(MessageItem)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_OnSuccessMessage()
	 * @model
	 * @generated
	 */
	MessageItem getOnSuccessMessage();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#getOnSuccessMessage <em>On Success Message</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>On Success Message</em>' reference.
	 * @see #getOnSuccessMessage()
	 * @generated
	 */
	void setOnSuccessMessage(MessageItem value);

	/**
	 * Returns the value of the '<em><b>Has Started Message</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Has Started Message</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Has Started Message</em>' attribute.
	 * @see #setHasStartedMessage(boolean)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_HasStartedMessage()
	 * @model unique="false"
	 * @generated
	 */
	boolean isHasStartedMessage();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#isHasStartedMessage <em>Has Started Message</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Has Started Message</em>' attribute.
	 * @see #isHasStartedMessage()
	 * @generated
	 */
	void setHasStartedMessage(boolean value);

	/**
	 * Returns the value of the '<em><b>On Started Message</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>On Started Message</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>On Started Message</em>' reference.
	 * @see #setOnStartedMessage(MessageItem)
	 * @see org.eclipse.osbp.xtext.action.ActionDSLPackage#getActionFunction_OnStartedMessage()
	 * @model
	 * @generated
	 */
	MessageItem getOnStartedMessage();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.action.ActionFunction#getOnStartedMessage <em>On Started Message</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>On Started Message</em>' reference.
	 * @see #getOnStartedMessage()
	 * @generated
	 */
	void setOnStartedMessage(MessageItem value);

} // ActionFunction
