/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), 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 v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *         Florian Pirchner - Initial implementation
 */
grammar org.eclipse.osbp.ecview.dsl.UIGrammar with org.eclipse.osbp.xtext.oxtype.OXtype

import "http://osbp.eclipse.org/ecview/dsl/uimodel/semantics" as cfg
import "http://osbp.eclipse.org/ecview/dsl/uimodel/core"
import "http://www.eclipse.org/xtext/common/JavaVMTypes"
import "http://www.eclipse.org/xtext/xbase/Xbase"
import "http://www.eclipse.org/xtext/xbase/Xtype"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore

UiModel returns UiModel:
	'package' packageName=QualifiedName
	importSection=XImportSection?
	roots+=UiRootElements*;

UiRootElements returns UiRootElements:
	UiView  | UiDisplayView | UiViewSet | UiValidatorAlias | UiMobileView;

UiValidatorAlias returns UiValidatorAlias:
	'validatorAlias' validator=UiValidator 'as' alias=ID (';')?;

UiValidatorAssignment returns UiValidatorAssignment:
	'fieldValidation' field=[UiField] '+=' (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
	(';')?);

UiValidatorDef returns UiValidatorDef:
	validator=UiValidator;

UiViewSet returns UiViewSet:
	'viewset' name=ID '{'
	(beanSlots+=UiBeanSlot)*
	(bindingEndpointAlias+=UiBindingEndpointAlias)*
	'}';

UiBindingEndpointAlias returns UiBindingEndpointAlias:
	'dataAlias' endpoint=UiBindingEndpointAssignment 'as' alias=ID (';')?;

UiBeanSlot returns UiBeanSlot:
	'datasource' name=ID ':' jvmType=JvmTypeReference ('eventTopic' eventTopic=STRING)? (';')?;

UiBinding returns UiBinding:
	'bind' (listBinding?='list')? source=UiBindingEndpointAssignment ((targetToSource?='<')? '--'
	(sourceToTarget?='>')?) target=UiBindingEndpointAssignment (';')?;

UiBindingEndpointAssignment returns UiBindingExpression:
	((UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=(UiPathSegment)?)
	| (UiCommandBindableDef {UiBindingEndpointAssignment.typedBindableDef=current})
	| ({UiBindingEndpointAssignment} typedBindableAlias=[UiTypedBindable] path=(UiPathSegment)?));

UiPathSegment returns UiPathSegment:
	{UiPathSegment}
	'.' getter=[JvmOperation] path=(UiPathSegment)?;

UiNestedProperty:
	{UiNestedProperty}
	getter=[JvmOperation] path=(UiPathSegment)?;

UiTypedBindableDef returns UiBindingExpression:
	{UiTypedBindableDef}
	('[' rawBindable=[UiRawBindable] (rawBindablePath=UiRawBindablePathSegment)? ']' '.' method=[cfg::UxEndpointDef]);

UiTypedBindableRawType returns UiBindingExpression:
	{UiTypedBindableRawType}
	'[' rawBindable=[UiRawBindable] (rawBindablePath=UiRawBindablePathSegment)? ']';

UiTypedBindableRawTypeAlias:
	'ui' type=UiTypedBindableRawType 'as' alias=ID (';')?;

UiRawBindablePathSegment:
	{UiRawBindablePathSegment}
	('.' | toParent?='..') rawBindable=[UiRawBindable] (path=UiRawBindablePathSegment)?;

UiCommandBindableDef returns UiCommandBindableDef:
	{UiCommandBindableDef}
	command=UiCommand;

UiCommand returns UiCommand:
	UiMobileNavigationCommand | UiOpenDialogCommand | UiSearchWithDialogCommand | UiAddToTableCommand |
	UiRemoveFromTableCommand | UiSendEventCommand | UiSetNewInstanceCommand;

UiMobileNavigationCommand:
	{UiMobileNavigationCommand}
	'navigateTo' targetPage=UiMobileNavigationPage;

UiOpenDialogCommand:
	{UiOpenDialogCommand}
	'openDialog' dialog=UiDialog;

UiSearchWithDialogCommand:
	{UiSearchWithDialogCommand}
	'searchWith' dialog=UiSearchDialog;

UiAddToTableCommand:
	{UiAddToTableCommand}
	'addToTable' table=[UiTable];

UiRemoveFromTableCommand:
	{UiRemoveFromTableCommand}
	'removeFromTable' table=[UiTable];

UiSetNewInstanceCommand:
	{UiSetNewInstanceCommand}
	'newInstance' ('for' jvmType=JvmTypeReference)? ('at' target=UiBindingEndpointAssignment);

UiSendEventCommand:
	{UiSendEventCommand}
	'sendEvent' '(' (noAutoTrigger?='noAutoTrigger')? eventTopic=STRING ')';

UiView returns UiView:
	UiIDEView;

UiIDEView returns UiIDEView:
	'ideview' name=ID
	'{'
	(('sharedStateGroup' sharedStateGroup=STRING (';')?)?
	& ('category' viewCategory=[cfg::UxViewCategory|QualifiedName] (';')?)?
	& ('rootType' jvmType=JvmTypeReference (';')?)?
	& ('exposedActions' '{'
	exposedActions+=UiExposedAction*
	'}')?)
	((beanSlots+=UiBeanSlot)
	|
	(bindingEndpointAlias+=UiBindingEndpointAlias)
	| 
	(bindings+=UiBinding))*
	
	content=UiEmbeddable ('align' contentAlignment=UiAlignment)?
	((bindingEndpointAlias+=UiBindingEndpointAlias)
	|
	(bindings+=UiBinding)
	|
	(validatorAssignments+=UiValidatorAssignment)
	|
	(processorAssignments+=UiVisibilityProcessorAssignment))*
	'}';

UiDisplayView returns UiDisplayView:
	'display' name=ID
	'{'
	'rootType' jvmType=JvmTypeReference
	((beanSlots+=UiBeanSlot)
	|
	(bindingEndpointAlias+=UiBindingEndpointAlias)
	| 
	(bindings+=UiBinding))*
	
	content=UiEmbeddable ('align' contentAlignment=UiAlignment)?
	((bindingEndpointAlias+=UiBindingEndpointAlias)
	|
	(bindings+=UiBinding)
	|
	(validatorAssignments+=UiValidatorAssignment)
	|
	(processorAssignments+=UiVisibilityProcessorAssignment))*
	'}';

UiExposedAction:
	name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
	(checkDirty?='checkDirty')? ('externalCommand' externalCommandId=STRING)? (';')?;

UiMobileNavBarAction:
	name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING) (';')?;

UiMobileView returns UiMobileView:
	'mobile' name=ID
	'{'
	(('sharedStateGroup' sharedStateGroup=STRING (';')?)?
	& ('rootType' jvmType=JvmTypeReference (';')?)?)
	((beanSlots+=UiBeanSlot)
	|
	(bindingEndpointAlias+=UiBindingEndpointAlias))*
	content=UiMobileEmbeddable ('align' contentAlignment=UiAlignment)?
	((bindingEndpointAlias+=UiBindingEndpointAlias)
	|
	(bindings+=UiBinding)
	|
	(validatorAssignments+=UiValidatorAssignment)
	|
	(processorAssignments+=UiVisibilityProcessorAssignment))*
	'}';

UiI18nInfo:
	'i18n' (noCaption?='noCaption'|key=STRING);

UiGridLayout returns UiGridLayout:
	{UiGridLayout}
	'gridlayout'
	('('
	(('columns=' columns=INT)?
	& (i18nInfo=UiI18nInfo)?
	& ('styles' styles=STRING)?
	& (readonly?="readonly")?)
	')')?
	name=ID?
	'{'
	(contents+=UiGridLayoutAssigment)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiVisibilityProcessorAssignment:
	{UiVisibilityProcessorAssignment}
	processor=UiVisibilityProcessor;

UiGridLayoutAssigment returns UiGridLayoutAssigment:
	element=UiEmbeddable ('align' alignment=UiAlignment)?;

UiFormLayout:
	{UiFormLayout}
	'form'
	('('
	(i18nInfo=UiI18nInfo)?
	& ('styles' styles=STRING)?
	& (readonly?="readonly")?
	')')?
	name=ID?
	'{'
	(contents+=UiFormLayoutAssigment)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiFormLayoutAssigment:
	element=UiEmbeddable;

UiVerticalLayout:
	{UiVerticalLayout}
	'verticalLayout'
	('('
	(i18nInfo=UiI18nInfo)?
	& ('styles' styles=STRING)?
	& (readonly?="readonly")?
	')')?
	name=ID?
	'{'
	(contents+=UiVerticalLayoutAssigment)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiVerticalLayoutAssigment:
	element=UiEmbeddable ('align' alignment=UiAlignment)?;

UiMobileVerticalLayout returns UiVerticalLayout:
	{UiVerticalLayout}
	'mobileVerticalLayout'
	('('
	(i18nInfo=UiI18nInfo)?
	& ('styles' styles=STRING)?
	& (readonly?="readonly")?
	')')?
	name=ID?
	'{'
	(contents+=UiMobileVerticalLayoutAssigment)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiMobileVerticalLayoutAssigment returns UiVerticalLayoutAssigment:
	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;

UiMobileNavigationRoot returns UiMobileNavigationRoot:
	{UiMobileNavigationRoot}
	'navRoot'
	name=ID?
	'{'
	(contents+=UiMobileNavigationRootAssigment)
	'}';

UiMobileNavigationRootAssigment returns UiMobileNavigationRootAssigment:
	element=UiMobileNavigationPage;

UiHorizontalLayout:
	{UiHorizontalLayout}
	'horizontalLayout'
	('('
	(i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?
	& ('styles' styles=STRING)?
	')')?
	name=ID?
	'{'
//	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
	(contents+=UiHorizontalLayoutAssigment)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiHorizontalLayoutAssigment returns UiHorizontalLayoutAssigment:
	element=UiEmbeddable ('align' alignment=UiAlignment)?;

UiMobileHorizontalLayout returns UiHorizontalLayout:
	{UiHorizontalLayout}
	'mobileHorizontalLayout'
	('('
	(i18nInfo=UiI18nInfo)?
	& ('styles' styles=STRING)?
	& (readonly?="readonly")?
	')')?
	name=ID?
	'{'
//	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
	(contents+=UiMobileHorizontalLayoutAssigment)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiMobileHorizontalLayoutAssigment returns UiHorizontalLayoutAssigment:
	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;

UiMobileHorizontalButtonGroup returns UiHorizontalButtonGroup:
	{UiHorizontalButtonGroup}
	'horizontalButtonGroup'
	('('
	((i18nInfo=UiI18nInfo)?
	& ('styles' styles=STRING)?
	& (readonly?="readonly")?) ')')?
	name=ID?
	'{'
	(contents+=UiMobileHorizontalButtonGroupAssigment)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiMobileHorizontalButtonGroupAssigment returns UiHorizontalButtonGroupAssigment:
	element=UiMobileEmbeddable;

UiMobileVerticalComponentGroup returns UiVerticalComponentGroup:
	{UiVerticalComponentGroup}
	'verticalGroup'
	('('
	((i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?
	& ('styles' styles=STRING)?)
	')')?
	name=ID?
	'{'
	(contents+=UiMobileVerticalComponentGroupAssigment)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiMobileVerticalComponentGroupAssigment returns UiVerticalComponentGroupAssigment:
	element=UiMobileEmbeddable;

UiSearchPanel:
	{UiSearchPanel}
	'searchPanel'
	('('
	((i18nInfo=UiI18nInfo)?
	& ('styles' styles=STRING)?)
	')')?
	name=ID?
	'{'
	'type' jvmType=JvmTypeReference (';')?
	(contents+=UiSearchField)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiMobileSearchPanel:
	{UiMobileSearchPanel}
	'mobileSearchPanel'
	('('
	((i18nInfo=UiI18nInfo)?
	& ('styles' styles=STRING)?)
	')')?
	name=ID?
	'{'
	'type' jvmType=JvmTypeReference (';')?
	(contents+=UiSearchField)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiMobileTabSheet:
	{UiMobileTabSheet}
	'mobileTab'
	('('
	((i18nInfo=UiI18nInfo)?
	& ('styles' styles=STRING)?)
	')')?
	name=ID?
	'{'
	(tabs+=UiMobileTabAssignment)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiMobileTabAssignment:
	'tab' (name=ID)? element=UiMobileEmbeddable;

UiTabSheet:
	{UiTabSheet}
	'tabsheet'
	('(' ((i18nInfo=UiI18nInfo)?
	& ('styles' styles=STRING)?)
	')')?
	name=ID?
	'{'
	(tabs+=UiTabAssignment)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiTabAssignment:
	'tab' (name=ID)? element=UiEmbeddable;

UiSplitpanel:
	'splitter' ('(' (i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)? ')')? name=ID
	'{'
	(('first' firstContent=UiSplitpanelAssigment)
	& ('second' secondContent=UiSplitpanelAssigment)
	& ('splitPos' splitPosition=INT)?
	& (readonly?="readonly")?)
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiSplitpanelAssigment:
	element=UiEmbeddable;

UiPanel:
	'panel' ('('
	((i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?
	& ('styles' styles=STRING)?)
	')')?
	name=ID
	'{'
	'content' content=UiEmbeddable
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiDialog:
	{UiDialog}
	'dialog' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')? name=ID? '{'
	('type' jvmType=JvmTypeReference (';')?)?
	(content=UiDialogAssignment (';')?)?
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiDialogAssignment:
	element=UiEmbeddable;

UiSearchDialog:
	{UiSearchDialog}
	'searchdialog' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')? name=ID? '{'
	('type' jvmType=JvmTypeReference)?
	('search' '{'
	searchFields+=UiDialogSearchFieldAssignment*
	'}')?
	('content' '{'
	content=UiDialogAssignment
	'}')?
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiDialogSearchFieldAssignment:
	element=UiSearchField;

UiMobileNavigationPage:
	{UiMobileNavigationPage}
	'navPage' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')? name=ID? '{'
	('type' jvmType=JvmTypeReference (';')?)?
	('navbarActions' '{'
	barActions+=UiMobileNavBarAction*
	'}')?
	(contents+=UiMobileNavigationPageAssignment)*
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}';

UiMobileNavigationPageAssignment:
	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;

UiPoint returns UiPoint:
	x=INT '/' y=INT;

UiTextField returns UiTextField:
	{UiTextField}
	'textfield'
	('('
	(('maxLength=' maxLength=INT)?
	& ('minLength=' minLength=INT)?
	& ('regex=' regex=STRING)?
	& ('styles' styles=STRING)?
	& (i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?)
	')')?
	name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiPasswordField returns UiPasswordField:
	{UiPasswordField}
	'passwordField'
	('('
	(('styles' styles=STRING)?
	& (i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?)
	')')?
	name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiMaskedTextField returns UiMaskedTextField:
	{UiMaskedTextField}
	'maskedText'
	('('
	(('styles' styles=STRING)?
	& ('mask=' mask=STRING)?
	& (i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?)
	')')?
	name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiMaskedNumericField returns UiMaskedNumericField:
	{UiMaskedNumericField}
	'maskedNumeric'
	('('
	(('styles' styles=STRING)?
	& (i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?)
	')')?
	name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiMaskedDecimalField returns UiMaskedDecimalField:
	{UiMaskedDecimalField}
	'maskedDecimal'
	('('
	(('styles' styles=STRING)?
	& ('mask=' mask=STRING)?
	& (i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?)
	')')?
	name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiPrefixedMaskedTextField returns UiPrefixedMaskedTextField:
	{UiPrefixedMaskedTextField}
	'maskedTextWithPrefix'
	('('
	(('styles' styles=STRING)?
	& ('mask=' mask=STRING)?
	& ('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (',' prefixMasks+=UiPrefixToMaskMapEntry)* ')')?
	& (i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?)
	')')?
	name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiPrefixToMaskMapEntry returns UiPrefixToMaskMapEntry:
	{UiPrefixToMaskMapEntry}
	'prefix' key=STRING 'mask' value=STRING;

UiRichTextArea returns UiRichTextArea:
	{UiRichTextArea}
	'richtextArea'
	('('
	(('styles' styles=STRING)?
	& (i18nInfo=UiI18nInfo)?
	& (asBlob?="asBlob")?
	& (readonly?="readonly")?)
	')')?
	name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiSuggestTextField returns UiSuggestTextField:
	{UiSuggestTextField}
	'suggestText' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')? name=ID?
	('{'
	(('type' jvmType=JvmTypeReference (';')?)?
	& ('captionField' itemCaptionProperty=[JvmOperation] (';')?)?
	& ('filterField' itemFilterProperty=[JvmOperation] (';')?)?
	& ('uuidField' itemUUIDProperty=[JvmOperation] (';')?)?
	& (autoHidePopup?='autoHidePopup')?
	& (readonly?='readonly')?)
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiBeanReferenceField returns UiBeanReferenceField:
	{UiBeanReferenceField}
	'referenceField'
	('('
	((i18nInfo=UiI18nInfo)?
	& ('styles' styles=STRING)?)
	')')?
	name=ID?
	('{'
	(('type' jvmType=JvmTypeReference (';')?)?
	& ('refSource' referenceSourceJvmType=JvmTypeReference ':' referenceSourceField=[JvmField] (';')?)?
	& ('captionField' captionProperty=UiNestedProperty (';')?)?
	& ('descriptionField' descriptionProperty=UiNestedProperty (';')?)?
	& ('imageField' imageProperty=UiNestedProperty (';')?)?
	& ('inMemoryService' inMemoryBeanProvider=JvmTypeReference (';')?)?)
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiSearchField:
	{UiSearchField}
	'searchfield' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')? property=UiNestedProperty;

UiTextArea returns UiTextArea:
	{UiTextArea}
	'textarea'
	('('
	((i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?
	& ('styles' styles=STRING)?)
	')')?
	name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiDateField returns UiDateField:
	{UiDateField}
	'datefield'
	('('
	((dateFormat=UiDateFormat)?
	& (resolution=UiDateTimeResolution)?
	& ('styles' styles=STRING)?
	& (i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?)
	')')?
	name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

enum UiDateFormat:
	DATE="date" | DATE_TIME="datetime" | TIME="time";

enum UiDateTimeResolution:
	UNDEFINED="undefined" | SECOND="second" | MINUTE="minute" | HOUR="hour" | DAY="day" | MONTH="month" | YEAR="year";

UiBrowser returns UiBrowser:
	{UiBrowser}
	'browser'
	('('
	((i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?
	& ('styles' styles=STRING)?)
	')')? name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiProgressBar returns UiProgressBar:
	{UiProgressBar}
	'progressbar' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')? name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiImage returns UiImage:
	{UiImage}
	'image' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')? name=ID?
	('{'
	('iconPath' value=STRING (';')?)?
	(bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiTable returns UiTable:
	{UiTable}
	'table' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')? name=ID?
	('{'
	(('type' jvmType=JvmTypeReference (';')?)?
	& ('selectionType' selectionType=UiSelectionType (';')?)?
	& ('imageField' itemImageProperty=[JvmOperation] (';')?)?
	& (consumeBeanService?='useBeanService' (';')?)?
	& (scrollToBottom?='scrollToBottom' (';')?)?
	& (readonly?="readonly")?)
	columnAssignment=UiColumnsAssignment?
	sortOrderAssignment=UiSortOrderAssignment?
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiComboBox returns UiComboBox:
	{UiComboBox}
	'combo' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')? name=ID?
	('{'
	(('type' jvmType=JvmTypeReference (';')?)?
	& ('captionField' itemCaptionProperty=[JvmOperation] (';')?)?
	& ('descriptionField' descriptionProperty=UiNestedProperty (';')?)?
	& ('imageField' itemImageProperty=[JvmOperation] (';')?)?
	& (consumeBeanService?='useBeanService' (';')?)?
	& (readonly?='readonly')?)
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiButton:
	{UiButton}
	'button'
	('('
	((i18nInfo=UiI18nInfo)?
	& (readonly?='readonly')?
	& ('styles' styles=STRING)?)
	')')? name=ID?;

UiMobileNavigationButton:
	{UiMobileNavigationButton}
	'navButton' ('('
	((i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?
	& ('styles' styles=STRING)?)
	')')?
	name=ID? (targetPage=UiMobileNavigationPage | 'alias'
	targetPageAlias=[UiMobileNavigationPage]);

UiMobileSwitch returns UiSwitch:
	{UiSwitch}
	'switchIt' ('(' ((i18nInfo=UiI18nInfo)? & (readonly?="readonly")? & ('styles' styles=STRING)?) ')')? name=ID? ('{'
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	'}')?;

UiLabel:
	{UiLabel}
	'label' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')? name=ID? ('{'
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	(bindings+=UiBinding)*
	'}')?;

UiDecimalField returns UiDecimalField:
	{UiDecimalField}
	'decimalField'
	('('
	((noGrouping?='noGrouping')?
	& (noMarkNegative?='noMarkNegative')?
	& ('styles' styles=STRING)?
	& ('precision=' precision=INT)?
	& (i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?)
	')')?
	name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiOptionsGroup:
	{UiOptionsGroup}
	'optionsgroup' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')?
	name=ID?
	('{'
	(('type' jvmType=JvmTypeReference)?
	& ('selectionType' selectionType=UiSelectionType)?
	& ('captionField' itemCaptionProperty=[JvmOperation])?
	& ('descriptionField' descriptionProperty=UiNestedProperty (';')?)?
	& ('imageField' itemImageProperty=[JvmOperation])?
	& (consumeBeanService?='useBeanService' (';')?)?
	& (readonly?="readonly")?)
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiList:
	{UiList}
	'listSelect' ('(' ((i18nInfo=UiI18nInfo)? & ('styles' styles=STRING)?) ')')?
	name=ID?
	('{'
	(('type' jvmType=JvmTypeReference)?
	& ('selectionType' selectionType=UiSelectionType)?
	& ('captionField' itemCaptionProperty=[JvmOperation])?
	& ('descriptionField' descriptionProperty=UiNestedProperty (';')?)?
	& ('imageField' itemImageProperty=[JvmOperation])?
	& (consumeBeanService?='useBeanService' (';')?)?
	& (readonly?="readonly")?)
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

enum UiSelectionType returns UiSelectionType:
	SINGLE='single' | MULTI='multi' | NONE='none';

enum UiAlignment:
	UNDEFINED="undefined"
	| BOTTOM_CENTER="bottom-center" | BOTTOM_LEFT="bottom-left" | BOTTOM_RIGHT="bottom-right" | BOTTOM_FILL="bottom-fill"
	| MIDDLE_CENTER="middle-center" | MIDDLE_LEFT="middle-left" | MIDDLE_RIGHT="middle-right" | MIDDLE_FILL="middle-fill"
	| TOP_CENTER="top-center" | TOP_LEFT="top-left" | TOP_RIGHT="top-right" | TOP_FILL="top-fill"
	| FILL_CENTER="fill-center" | FILL_LEFT="fill-left" | FILL_RIGHT="fill-right" | FILL_FILL="fill-fill";

UiColumnsAssignment:
	{UiColumnsAssignment}
	'columns' '{'
	columns+=UiColumn*
	'}';

UiSortOrderAssignment returns UiSortOrderAssignment:
	{UiSortOrderAssignment}
	'sort' '{'
	columns+=UiSortOrder*
	'}';

UiSortOrder:
	'column' property=UiNestedProperty ('desc' | asc?="asc")? (';')?;

UiColumn returns UiColumn:
	{UiColumn}
	'column' property=UiNestedProperty ('icon' iconName=STRING)? (';')?;

UiEmbeddable:
	UiLayout | UiField | UiAction | UiTabSheet;

UiMobileEmbeddable:
	UiMobileLayout | UiMobileField | UiMobileTabSheet | UiMobileAction;

UiMobileLayout:
	UiMobileHorizontalButtonGroup | UiMobileVerticalComponentGroup | UiMobileNavigationPage | UiMobileHorizontalLayout |
	UiMobileVerticalLayout | UiMobileSearchPanel | UiMobileNavigationRoot;

UiMobileField:
	UiMobileSwitch | UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField |
	UiPrefixedMaskedTextField | UiRichTextArea | UiPasswordField | UiSuggestTextField | UiNumericField | UiTable |
	UiComboBox | UiImage
	| UiSearchField | UiLabel |
	UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar | UiOptionsGroup;

UiLayout:
	UiGridLayout | UiFormLayout | UiHorizontalLayout | UiVerticalLayout | UiSplitpanel | UiPanel | UiSearchPanel;

UiField:
	UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField | UiPrefixedMaskedTextField |
	UiRichTextArea | UiPasswordField | UiSuggestTextField | UiList | UiNumericField | UiCheckBox | UiTable | UiComboBox |
	UiImage | UiSearchField | UiLabel |
	UiDecimalField |
	UiTextArea | UiDateField | UiBrowser | UiProgressBar | UiOptionsGroup | UiBeanReferenceField;

UiAction:
	UiButton;

UiMobileAction:
	UiMobileNavigationButton | UiButton;

UiNumericField:
	{UiNumericField}
	'numericField'
	('('
	((noGrouping?='noGrouping')?
	& ('styles' styles=STRING)?
	& (noMarkNegative?='noMarkNegative')?
	& (i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?)
	')')?
	name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiCheckBox:
	{UiCheckBox}
	'checkbox' ('('
	((i18nInfo=UiI18nInfo)?
	& (readonly?="readonly")?
	& ('styles' styles=STRING)?)
	')')? name=ID?
	('{'
	(validators+=UiValidator
	|
	bindings+=UiBinding)*
	(processorAssignments+=UiVisibilityProcessorAssignment)*
	'}')?;

UiValidator:
	UiMaxLengthValidator | UiMinLengthValidator | UiRegexpValidator | UiXbaseValidator | UiBeanValidationValidator;

UiMaxLengthValidator returns UiMaxLengthValidator:
	{UiMaxLengthValidator}
	'MaxLengthValidator' (name=ID)? '(' maxLength=INT ')' (errorCode=UiErrorCode)?;

UiMinLengthValidator returns UiMinLengthValidator:
	{UiMinLengthValidator}
	'MinLengthValidator' (name=ID)? '(' minLength=INT ')' (errorCode=UiErrorCode)?;

UiRegexpValidator returns UiRegexpValidator:
	{UiRegexpValidator}
	'RegexValidator' (name=ID)? '(' regExpression=STRING ')' (errorCode=UiErrorCode)?;

UiXbaseValidator returns UiXbaseValidator:
	{UiXbaseValidator}
	'Expression' name=ID '(' jvmType=JvmTypeReference ')'
	(errorCodes+=UiErrorCode*)
	expression=XBlockExpression?;

UiBeanValidationValidator returns UiBeanValidationValidator:
	{UiBeanValidationValidator}
	'BeanValidationValidator' (name=ID)?;

UiErrorCode:
	'code' name=ID (defaultMessage=STRING)?;

UiVisibilityProcessor:
	{UiVisibilityProcessor}
	'visibility' name=ID '{'
	(dataUsed+=UiBindingEndpointAlias
	|
	changeTriggers+=UiChangeTrigger
	|
	importedElements+=UiTypedBindableRawTypeAlias)*
	(rule=UiXbaseVisibilityRule)?
	'}';

UiXbaseVisibilityRule:
	expression=XBlockExpression;

UiChangeTrigger:
	'fireOn' endpoint=UiBindingEndpointAssignment 'as' alias=ID (';')?;
