/**
 *                                                                            
 *  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                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 *
 */
grammar org.eclipse.osbp.xtext.action.ActionDSL with org.eclipse.osbp.xtext.oxtype.OXtype

import "http://osbp.eclipse.org/xtext/action/ActionDSL"

import "http://osbp.eclipse.org/xtext/functionlibrarydsl/FunctionLibraryDSL" as func
import "http://osbp.eclipse.org/xtext/messagedsl/MessageDSL" as msg
import "http://osbp.eclipse.org/xtext/datainterchange/DataDSL" as data
import "http://osbp.eclipse.org/dsl/common/types/v1" as types
import "http://www.eclipse.org/emf/2002/Ecore" as ecore 

ActionModel:
	importSection=XImportSection?
	packages+=ActionPackage*;

ActionPackage:
	{ActionPackage} 'package' name=QualifiedName
	('{' 
		(commands+=ActionCommand)*
		(toolbars+=ActionToolbar)* 
	'}')?;

ActionCommand:
	{ActionCommand} 'command' name=ID
	(hasDescription?='describedBy' description=TRANSLATABLESTRING)?
	(hasKeyBinding?='keyBinding' keyBinding=STRING)?
	actionType = ActionType;
	
ActionToolbar:
	{ActionToolbar} 'toolbar' name=ID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)?
	('items' '{' (actions+=ActionButton)* '}')?;
	
ActionButton:
	{ActionButton} 'item' name=TRANSLATABLEID (description?='describedBy' descriptionValue=TRANSLATABLESTRING)?
	'command' command=[ActionCommand]
	('icon' iconURI=STRING)?;
	
ActionType:
	ActionTask | ActionSelectWorkload | ActionDialog | ActionReport |ActionChart | ActionWorkflow | ActionFunction | ActionDatainterchange | ActionUI;
	
ActionTask:
	'taskAction' action=TaskActionEnum;

ActionSelectWorkload:
	'selectWorkloadAction' action=SelectWorkloadActionEnum;
	
ActionDialog:
	'dialogAction' action=DialogActionEnum;
	
ActionReport:
	'reportAction' action=ReportActionEnum;
	
ActionChart:
	'chartAction' action=ChartActionEnum;
	
ActionWorkflow:
	'workflowAction' action=WorkflowActionEnum;

ActionDatainterchange:
	'datainterchangeAction' action=DatainterchangeActionEnum dataRef=[data::DataInterchange];

ActionUI:
	'userinterfaceAction' action=UIActionEnum;

ActionFunction:
	'functionalAction' 
	'group' actionGroup=[func::FunctionLibraryActionGroup] 
	'canExecute' canExecute=[func::FunctionLibraryCanExecute]
	((hasExecuteImmediate?='executeImmediate' executeImmediate=[func::FunctionLibraryExecute] 
		(hasMessage?='messageCategory' messageCategory=[msg::MessageCategory] 
		'onFailMessage' onFailMessage=[msg::MessageItem] (hasSuccessMessage?='onSuccessMessage' onSuccessMessage=[msg::MessageItem])?)?
	)|
	(hasExecuteLater?='executeLater' executeLater=[func::FunctionLibraryExecute]
		(hasStartedMessage?='messageCategory' messageCategory=[msg::MessageCategory] 
		'onStartedMessage' onStartedMessage=[msg::MessageItem])?
	));

ActionParameter:
	{ActionParameter} 'parameter' parameter = [func::FunctionLibraryParameter];
	
TRANSLATABLEID:
	ID;
		
TRANSLATABLESTRING:
	STRING;

enum TaskActionEnum:
	TASK_ACTION_CLAIM='Claim' | TASK_ACTION_START='Start' | TASK_ACTION_STOP='Stop' | TASK_ACTION_RELEASE='Release' | TASK_ACTION_SUSPEND='Suspend' | 
	TASK_ACTION_RESUME='Resume' | TASK_ACTION_SKIP='Skip' | TASK_ACTION_COMPLETE='Complete' | TASK_ACTION_DELEGATE='Delegate' |
	TASK_ACTION_FORWARD='Forward' | TASK_ACTION_FAIL='Fail' | TASK_ACTION_REGISTER='Register' | TASK_ACTION_REMOVE='Remove' | 
	TASK_ACTION_ACTIVATE='Activate' | TASK_ACTION_EXIT='Exit';

enum SelectWorkloadActionEnum:
	WORKLOAD_SELECT_ACTION_REMOVE_ALL='RemoveAll' | WORKLOAD_SELECT_ACTION_ADD_ALL='AddAll';

enum DialogActionEnum:
	DIALOG_ACTION_NEW='New' | DIALOG_ACTION_SAVE='Save' | DIALOG_ACTION_DELETE='Delete' | DIALOG_ACTION_CANCEL='Cancel';

enum ReportActionEnum:
	REPORT_ACTION_PRINT_ON_SERVER_PDF='PrintOnServer' | REPORT_ACTION_DOWNLOAD_PDF='Download';

enum ChartActionEnum:
	CHART_ACTION_DOWNLOAD='Download';

enum WorkflowActionEnum:
	WORKFLOW_ACTION_START='Start';

enum DatainterchangeActionEnum:
	DATAINTERCHANGE_ACTION_IMPORT='Import' | DATAINTERCHANGE_ACTION_EXPORT='Export'; 

enum UIActionEnum:
	NEXT_PART = 'NextPart' |
	PREVIOUS_PART = 'PreviousPart';
	