/**
 * 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 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:
 *         Florian Pirchner - Initial implementation
 *
 * generated by Xtext 2.11.0
 *
 */

package org.eclipse.osbp.ecview.dsl.services;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.List;
import org.eclipse.osbp.xtext.oxtype.services.OXtypeGrammarAccess;
import org.eclipse.xtext.Action;
import org.eclipse.xtext.Alternatives;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.CrossReference;
import org.eclipse.xtext.EnumLiteralDeclaration;
import org.eclipse.xtext.EnumRule;
import org.eclipse.xtext.Grammar;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.Group;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.TerminalRule;
import org.eclipse.xtext.UnorderedGroup;
import org.eclipse.xtext.service.AbstractElementFinder.AbstractEnumRuleElementFinder;
import org.eclipse.xtext.service.AbstractElementFinder.AbstractGrammarElementFinder;
import org.eclipse.xtext.service.GrammarProvider;
import org.eclipse.xtext.xbase.annotations.services.XbaseWithAnnotationsGrammarAccess;
import org.eclipse.xtext.xbase.services.XbaseGrammarAccess;
import org.eclipse.xtext.xbase.services.XtypeGrammarAccess;

@Singleton
public class UIGrammarGrammarAccess extends AbstractGrammarElementFinder {
	
	public class UiModelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiModel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cPackageKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cPackageNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPackageNameQualifiedNameParserRuleCall_1_0 = (RuleCall)cPackageNameAssignment_1.eContents().get(0);
		private final Assignment cImportSectionAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cImportSectionXImportSectionParserRuleCall_2_0 = (RuleCall)cImportSectionAssignment_2.eContents().get(0);
		private final Assignment cRootsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cRootsUiRootElementsParserRuleCall_3_0 = (RuleCall)cRootsAssignment_3.eContents().get(0);
		
		//UiModel:
		//	'package' packageName=QualifiedName
		//	importSection=XImportSection?
		//	roots+=UiRootElements*;
		@Override public ParserRule getRule() { return rule; }
		
		//'package' packageName=QualifiedName importSection=XImportSection? roots+=UiRootElements*
		public Group getGroup() { return cGroup; }
		
		//'package'
		public Keyword getPackageKeyword_0() { return cPackageKeyword_0; }
		
		//packageName=QualifiedName
		public Assignment getPackageNameAssignment_1() { return cPackageNameAssignment_1; }
		
		//QualifiedName
		public RuleCall getPackageNameQualifiedNameParserRuleCall_1_0() { return cPackageNameQualifiedNameParserRuleCall_1_0; }
		
		//importSection=XImportSection?
		public Assignment getImportSectionAssignment_2() { return cImportSectionAssignment_2; }
		
		//XImportSection
		public RuleCall getImportSectionXImportSectionParserRuleCall_2_0() { return cImportSectionXImportSectionParserRuleCall_2_0; }
		
		//roots+=UiRootElements*
		public Assignment getRootsAssignment_3() { return cRootsAssignment_3; }
		
		//UiRootElements
		public RuleCall getRootsUiRootElementsParserRuleCall_3_0() { return cRootsUiRootElementsParserRuleCall_3_0; }
	}
	public class UiRootElementsElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiRootElements");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiViewParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiDisplayViewParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiViewSetParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiValidatorAliasParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiMobileViewParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		
		//UiRootElements:
		//	UiView | UiDisplayView | UiViewSet | UiValidatorAlias | UiMobileView;
		@Override public ParserRule getRule() { return rule; }
		
		//UiView | UiDisplayView | UiViewSet | UiValidatorAlias | UiMobileView
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UiView
		public RuleCall getUiViewParserRuleCall_0() { return cUiViewParserRuleCall_0; }
		
		//UiDisplayView
		public RuleCall getUiDisplayViewParserRuleCall_1() { return cUiDisplayViewParserRuleCall_1; }
		
		//UiViewSet
		public RuleCall getUiViewSetParserRuleCall_2() { return cUiViewSetParserRuleCall_2; }
		
		//UiValidatorAlias
		public RuleCall getUiValidatorAliasParserRuleCall_3() { return cUiValidatorAliasParserRuleCall_3; }
		
		//UiMobileView
		public RuleCall getUiMobileViewParserRuleCall_4() { return cUiMobileViewParserRuleCall_4; }
	}
	public class UiValidatorAliasElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAlias");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cValidatorAliasKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cValidatorAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cValidatorUiValidatorParserRuleCall_1_0 = (RuleCall)cValidatorAssignment_1.eContents().get(0);
		private final Keyword cAsKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cAliasAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAliasIDTerminalRuleCall_3_0 = (RuleCall)cAliasAssignment_3.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiValidatorAlias:
		//	'validatorAlias' validator=UiValidator 'as' alias=ID ';'?;
		@Override public ParserRule getRule() { return rule; }
		
		//'validatorAlias' validator=UiValidator 'as' alias=ID ';'?
		public Group getGroup() { return cGroup; }
		
		//'validatorAlias'
		public Keyword getValidatorAliasKeyword_0() { return cValidatorAliasKeyword_0; }
		
		//validator=UiValidator
		public Assignment getValidatorAssignment_1() { return cValidatorAssignment_1; }
		
		//UiValidator
		public RuleCall getValidatorUiValidatorParserRuleCall_1_0() { return cValidatorUiValidatorParserRuleCall_1_0; }
		
		//'as'
		public Keyword getAsKeyword_2() { return cAsKeyword_2; }
		
		//alias=ID
		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }
		
		//ID
		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	public class UiValidatorAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cFieldValidationKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cFieldAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cFieldUiFieldCrossReference_1_0 = (CrossReference)cFieldAssignment_1.eContents().get(0);
		private final RuleCall cFieldUiFieldIDTerminalRuleCall_1_0_1 = (RuleCall)cFieldUiFieldCrossReference_1_0.eContents().get(1);
		private final Keyword cPlusSignEqualsSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Assignment cValidatorDefAssignment_3_0 = (Assignment)cAlternatives_3.eContents().get(0);
		private final RuleCall cValidatorDefUiValidatorDefParserRuleCall_3_0_0 = (RuleCall)cValidatorDefAssignment_3_0.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
		private final Assignment cValidatorAliasAssignment_3_1_0 = (Assignment)cGroup_3_1.eContents().get(0);
		private final CrossReference cValidatorAliasUiValidatorAliasCrossReference_3_1_0_0 = (CrossReference)cValidatorAliasAssignment_3_1_0.eContents().get(0);
		private final RuleCall cValidatorAliasUiValidatorAliasQualifiedNameParserRuleCall_3_1_0_0_1 = (RuleCall)cValidatorAliasUiValidatorAliasCrossReference_3_1_0_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
		
		//UiValidatorAssignment:
		//	'fieldValidation' field=[UiField] '+=' (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
		//	';'?);
		@Override public ParserRule getRule() { return rule; }
		
		//'fieldValidation' field=[UiField] '+=' (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
		//';'?)
		public Group getGroup() { return cGroup; }
		
		//'fieldValidation'
		public Keyword getFieldValidationKeyword_0() { return cFieldValidationKeyword_0; }
		
		//field=[UiField]
		public Assignment getFieldAssignment_1() { return cFieldAssignment_1; }
		
		//[UiField]
		public CrossReference getFieldUiFieldCrossReference_1_0() { return cFieldUiFieldCrossReference_1_0; }
		
		//ID
		public RuleCall getFieldUiFieldIDTerminalRuleCall_1_0_1() { return cFieldUiFieldIDTerminalRuleCall_1_0_1; }
		
		//'+='
		public Keyword getPlusSignEqualsSignKeyword_2() { return cPlusSignEqualsSignKeyword_2; }
		
		//validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName] ';'?
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//validatorDef=UiValidatorDef
		public Assignment getValidatorDefAssignment_3_0() { return cValidatorDefAssignment_3_0; }
		
		//UiValidatorDef
		public RuleCall getValidatorDefUiValidatorDefParserRuleCall_3_0_0() { return cValidatorDefUiValidatorDefParserRuleCall_3_0_0; }
		
		//validatorAlias=[UiValidatorAlias|QualifiedName] ';'?
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//validatorAlias=[UiValidatorAlias|QualifiedName]
		public Assignment getValidatorAliasAssignment_3_1_0() { return cValidatorAliasAssignment_3_1_0; }
		
		//[UiValidatorAlias|QualifiedName]
		public CrossReference getValidatorAliasUiValidatorAliasCrossReference_3_1_0_0() { return cValidatorAliasUiValidatorAliasCrossReference_3_1_0_0; }
		
		//QualifiedName
		public RuleCall getValidatorAliasUiValidatorAliasQualifiedNameParserRuleCall_3_1_0_0_1() { return cValidatorAliasUiValidatorAliasQualifiedNameParserRuleCall_3_1_0_0_1; }
		
		//';'?
		public Keyword getSemicolonKeyword_3_1_1() { return cSemicolonKeyword_3_1_1; }
	}
	public class UiValidatorDefElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorDef");
		private final Assignment cValidatorAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cValidatorUiValidatorParserRuleCall_0 = (RuleCall)cValidatorAssignment.eContents().get(0);
		
		//UiValidatorDef:
		//	validator=UiValidator;
		@Override public ParserRule getRule() { return rule; }
		
		//validator=UiValidator
		public Assignment getValidatorAssignment() { return cValidatorAssignment; }
		
		//UiValidator
		public RuleCall getValidatorUiValidatorParserRuleCall_0() { return cValidatorUiValidatorParserRuleCall_0; }
	}
	public class UiViewSetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiViewSet");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cViewsetKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cBeanSlotsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cBeanSlotsUiBeanSlotParserRuleCall_3_0 = (RuleCall)cBeanSlotsAssignment_3.eContents().get(0);
		private final Assignment cBindingEndpointAliasAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0 = (RuleCall)cBindingEndpointAliasAssignment_4.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//UiViewSet:
		//	'viewset' name=ID '{'
		//	beanSlots+=UiBeanSlot*
		//	bindingEndpointAlias+=UiBindingEndpointAlias*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'viewset' name=ID '{' beanSlots+=UiBeanSlot* bindingEndpointAlias+=UiBindingEndpointAlias* '}'
		public Group getGroup() { return cGroup; }
		
		//'viewset'
		public Keyword getViewsetKeyword_0() { return cViewsetKeyword_0; }
		
		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//beanSlots+=UiBeanSlot*
		public Assignment getBeanSlotsAssignment_3() { return cBeanSlotsAssignment_3; }
		
		//UiBeanSlot
		public RuleCall getBeanSlotsUiBeanSlotParserRuleCall_3_0() { return cBeanSlotsUiBeanSlotParserRuleCall_3_0; }
		
		//bindingEndpointAlias+=UiBindingEndpointAlias*
		public Assignment getBindingEndpointAliasAssignment_4() { return cBindingEndpointAliasAssignment_4; }
		
		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}
	public class UiBindingEndpointAliasElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cDataAliasKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cEndpointAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cEndpointUiBindingEndpointAssignmentParserRuleCall_1_0 = (RuleCall)cEndpointAssignment_1.eContents().get(0);
		private final Keyword cAsKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cAliasAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAliasIDTerminalRuleCall_3_0 = (RuleCall)cAliasAssignment_3.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiBindingEndpointAlias:
		//	'dataAlias' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?;
		@Override public ParserRule getRule() { return rule; }
		
		//'dataAlias' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?
		public Group getGroup() { return cGroup; }
		
		//'dataAlias'
		public Keyword getDataAliasKeyword_0() { return cDataAliasKeyword_0; }
		
		//endpoint=UiBindingEndpointAssignment
		public Assignment getEndpointAssignment_1() { return cEndpointAssignment_1; }
		
		//UiBindingEndpointAssignment
		public RuleCall getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0() { return cEndpointUiBindingEndpointAssignmentParserRuleCall_1_0; }
		
		//'as'
		public Keyword getAsKeyword_2() { return cAsKeyword_2; }
		
		//alias=ID
		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }
		
		//ID
		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	public class UiBeanSlotElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cDatasourceKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cColonKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cJvmTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_3_0 = (RuleCall)cJvmTypeAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cEventTopicKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cEventTopicAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cEventTopicSTRINGTerminalRuleCall_4_1_0 = (RuleCall)cEventTopicAssignment_4_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//UiBeanSlot:
		//	'datasource' name=ID ':' jvmType=JvmTypeReference ('eventTopic' eventTopic=STRING)? ';'?;
		@Override public ParserRule getRule() { return rule; }
		
		//'datasource' name=ID ':' jvmType=JvmTypeReference ('eventTopic' eventTopic=STRING)? ';'?
		public Group getGroup() { return cGroup; }
		
		//'datasource'
		public Keyword getDatasourceKeyword_0() { return cDatasourceKeyword_0; }
		
		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
		
		//':'
		public Keyword getColonKeyword_2() { return cColonKeyword_2; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_3() { return cJvmTypeAssignment_3; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_3_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_3_0; }
		
		//('eventTopic' eventTopic=STRING)?
		public Group getGroup_4() { return cGroup_4; }
		
		//'eventTopic'
		public Keyword getEventTopicKeyword_4_0() { return cEventTopicKeyword_4_0; }
		
		//eventTopic=STRING
		public Assignment getEventTopicAssignment_4_1() { return cEventTopicAssignment_4_1; }
		
		//STRING
		public RuleCall getEventTopicSTRINGTerminalRuleCall_4_1_0() { return cEventTopicSTRINGTerminalRuleCall_4_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
	}
	public class UiBindingElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cBindKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cListBindingAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Keyword cListBindingListKeyword_1_0 = (Keyword)cListBindingAssignment_1.eContents().get(0);
		private final Assignment cSourceAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cSourceUiBindingEndpointAssignmentParserRuleCall_2_0 = (RuleCall)cSourceAssignment_2.eContents().get(0);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Assignment cTargetToSourceAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final Keyword cTargetToSourceLessThanSignKeyword_3_0_0 = (Keyword)cTargetToSourceAssignment_3_0.eContents().get(0);
		private final Keyword cHyphenMinusHyphenMinusKeyword_3_1 = (Keyword)cGroup_3.eContents().get(1);
		private final Assignment cSourceToTargetAssignment_3_2 = (Assignment)cGroup_3.eContents().get(2);
		private final Keyword cSourceToTargetGreaterThanSignKeyword_3_2_0 = (Keyword)cSourceToTargetAssignment_3_2.eContents().get(0);
		private final Assignment cTargetAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cTargetUiBindingEndpointAssignmentParserRuleCall_4_0 = (RuleCall)cTargetAssignment_4.eContents().get(0);
		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//UiBinding:
		//	'bind' listBinding?='list'? source=UiBindingEndpointAssignment (targetToSource?='<'? '--'
		//	sourceToTarget?='>'?) target=UiBindingEndpointAssignment ';'?;
		@Override public ParserRule getRule() { return rule; }
		
		//'bind' listBinding?='list'? source=UiBindingEndpointAssignment (targetToSource?='<'? '--' sourceToTarget?='>'?)
		//target=UiBindingEndpointAssignment ';'?
		public Group getGroup() { return cGroup; }
		
		//'bind'
		public Keyword getBindKeyword_0() { return cBindKeyword_0; }
		
		//listBinding?='list'?
		public Assignment getListBindingAssignment_1() { return cListBindingAssignment_1; }
		
		//'list'
		public Keyword getListBindingListKeyword_1_0() { return cListBindingListKeyword_1_0; }
		
		//source=UiBindingEndpointAssignment
		public Assignment getSourceAssignment_2() { return cSourceAssignment_2; }
		
		//UiBindingEndpointAssignment
		public RuleCall getSourceUiBindingEndpointAssignmentParserRuleCall_2_0() { return cSourceUiBindingEndpointAssignmentParserRuleCall_2_0; }
		
		//targetToSource?='<'? '--' sourceToTarget?='>'?
		public Group getGroup_3() { return cGroup_3; }
		
		//targetToSource?='<'?
		public Assignment getTargetToSourceAssignment_3_0() { return cTargetToSourceAssignment_3_0; }
		
		//'<'
		public Keyword getTargetToSourceLessThanSignKeyword_3_0_0() { return cTargetToSourceLessThanSignKeyword_3_0_0; }
		
		//'--'
		public Keyword getHyphenMinusHyphenMinusKeyword_3_1() { return cHyphenMinusHyphenMinusKeyword_3_1; }
		
		//sourceToTarget?='>'?
		public Assignment getSourceToTargetAssignment_3_2() { return cSourceToTargetAssignment_3_2; }
		
		//'>'
		public Keyword getSourceToTargetGreaterThanSignKeyword_3_2_0() { return cSourceToTargetGreaterThanSignKeyword_3_2_0; }
		
		//target=UiBindingEndpointAssignment
		public Assignment getTargetAssignment_4() { return cTargetAssignment_4; }
		
		//UiBindingEndpointAssignment
		public RuleCall getTargetUiBindingEndpointAssignmentParserRuleCall_4_0() { return cTargetUiBindingEndpointAssignmentParserRuleCall_4_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
	}
	public class UiBindingEndpointAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final RuleCall cUiTypedBindableDefParserRuleCall_0_0 = (RuleCall)cGroup_0.eContents().get(0);
		private final Action cUiBindingEndpointAssignmentTypedBindableDefAction_0_1 = (Action)cGroup_0.eContents().get(1);
		private final Assignment cPathAssignment_0_2 = (Assignment)cGroup_0.eContents().get(2);
		private final RuleCall cPathUiPathSegmentParserRuleCall_0_2_0 = (RuleCall)cPathAssignment_0_2.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final RuleCall cUiCommandBindableDefParserRuleCall_1_0 = (RuleCall)cGroup_1.eContents().get(0);
		private final Action cUiBindingEndpointAssignmentTypedBindableDefAction_1_1 = (Action)cGroup_1.eContents().get(1);
		private final Group cGroup_2 = (Group)cAlternatives.eContents().get(2);
		private final Action cUiBindingEndpointAssignmentAction_2_0 = (Action)cGroup_2.eContents().get(0);
		private final Assignment cTypedBindableAliasAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final CrossReference cTypedBindableAliasUiTypedBindableCrossReference_2_1_0 = (CrossReference)cTypedBindableAliasAssignment_2_1.eContents().get(0);
		private final RuleCall cTypedBindableAliasUiTypedBindableIDTerminalRuleCall_2_1_0_1 = (RuleCall)cTypedBindableAliasUiTypedBindableCrossReference_2_1_0.eContents().get(1);
		private final Assignment cPathAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
		private final RuleCall cPathUiPathSegmentParserRuleCall_2_2_0 = (RuleCall)cPathAssignment_2_2.eContents().get(0);
		
		//UiBindingEndpointAssignment UiBindingExpression:
		//	UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment? | UiCommandBindableDef
		//	{UiBindingEndpointAssignment.typedBindableDef=current} | {UiBindingEndpointAssignment}
		//	typedBindableAlias=[UiTypedBindable] path=UiPathSegment?;
		@Override public ParserRule getRule() { return rule; }
		
		//UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment? | UiCommandBindableDef
		//{UiBindingEndpointAssignment.typedBindableDef=current} | {UiBindingEndpointAssignment}
		//typedBindableAlias=[UiTypedBindable] path=UiPathSegment?
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment?
		public Group getGroup_0() { return cGroup_0; }
		
		//UiTypedBindableDef
		public RuleCall getUiTypedBindableDefParserRuleCall_0_0() { return cUiTypedBindableDefParserRuleCall_0_0; }
		
		//{UiBindingEndpointAssignment.typedBindableDef=current}
		public Action getUiBindingEndpointAssignmentTypedBindableDefAction_0_1() { return cUiBindingEndpointAssignmentTypedBindableDefAction_0_1; }
		
		//path=UiPathSegment?
		public Assignment getPathAssignment_0_2() { return cPathAssignment_0_2; }
		
		//UiPathSegment
		public RuleCall getPathUiPathSegmentParserRuleCall_0_2_0() { return cPathUiPathSegmentParserRuleCall_0_2_0; }
		
		//UiCommandBindableDef {UiBindingEndpointAssignment.typedBindableDef=current}
		public Group getGroup_1() { return cGroup_1; }
		
		//UiCommandBindableDef
		public RuleCall getUiCommandBindableDefParserRuleCall_1_0() { return cUiCommandBindableDefParserRuleCall_1_0; }
		
		//{UiBindingEndpointAssignment.typedBindableDef=current}
		public Action getUiBindingEndpointAssignmentTypedBindableDefAction_1_1() { return cUiBindingEndpointAssignmentTypedBindableDefAction_1_1; }
		
		//{UiBindingEndpointAssignment} typedBindableAlias=[UiTypedBindable] path=UiPathSegment?
		public Group getGroup_2() { return cGroup_2; }
		
		//{UiBindingEndpointAssignment}
		public Action getUiBindingEndpointAssignmentAction_2_0() { return cUiBindingEndpointAssignmentAction_2_0; }
		
		//typedBindableAlias=[UiTypedBindable]
		public Assignment getTypedBindableAliasAssignment_2_1() { return cTypedBindableAliasAssignment_2_1; }
		
		//[UiTypedBindable]
		public CrossReference getTypedBindableAliasUiTypedBindableCrossReference_2_1_0() { return cTypedBindableAliasUiTypedBindableCrossReference_2_1_0; }
		
		//ID
		public RuleCall getTypedBindableAliasUiTypedBindableIDTerminalRuleCall_2_1_0_1() { return cTypedBindableAliasUiTypedBindableIDTerminalRuleCall_2_1_0_1; }
		
		//path=UiPathSegment?
		public Assignment getPathAssignment_2_2() { return cPathAssignment_2_2; }
		
		//UiPathSegment
		public RuleCall getPathUiPathSegmentParserRuleCall_2_2_0() { return cPathUiPathSegmentParserRuleCall_2_2_0; }
	}
	public class UiPathSegmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiPathSegmentAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cFullStopKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cGetterAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cGetterJvmOperationCrossReference_2_0 = (CrossReference)cGetterAssignment_2.eContents().get(0);
		private final RuleCall cGetterJvmOperationIDTerminalRuleCall_2_0_1 = (RuleCall)cGetterJvmOperationCrossReference_2_0.eContents().get(1);
		private final Assignment cPathAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cPathUiPathSegmentParserRuleCall_3_0 = (RuleCall)cPathAssignment_3.eContents().get(0);
		
		//UiPathSegment:
		//	{UiPathSegment}
		//	'.' getter=[JvmOperation] path=UiPathSegment?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiPathSegment} '.' getter=[JvmOperation] path=UiPathSegment?
		public Group getGroup() { return cGroup; }
		
		//{UiPathSegment}
		public Action getUiPathSegmentAction_0() { return cUiPathSegmentAction_0; }
		
		//'.'
		public Keyword getFullStopKeyword_1() { return cFullStopKeyword_1; }
		
		//getter=[JvmOperation]
		public Assignment getGetterAssignment_2() { return cGetterAssignment_2; }
		
		//[JvmOperation]
		public CrossReference getGetterJvmOperationCrossReference_2_0() { return cGetterJvmOperationCrossReference_2_0; }
		
		//ID
		public RuleCall getGetterJvmOperationIDTerminalRuleCall_2_0_1() { return cGetterJvmOperationIDTerminalRuleCall_2_0_1; }
		
		//path=UiPathSegment?
		public Assignment getPathAssignment_3() { return cPathAssignment_3; }
		
		//UiPathSegment
		public RuleCall getPathUiPathSegmentParserRuleCall_3_0() { return cPathUiPathSegmentParserRuleCall_3_0; }
	}
	public class UiNestedPropertyElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiNestedPropertyAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cGetterAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cGetterJvmOperationCrossReference_1_0 = (CrossReference)cGetterAssignment_1.eContents().get(0);
		private final RuleCall cGetterJvmOperationIDTerminalRuleCall_1_0_1 = (RuleCall)cGetterJvmOperationCrossReference_1_0.eContents().get(1);
		private final Assignment cPathAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cPathUiPathSegmentParserRuleCall_2_0 = (RuleCall)cPathAssignment_2.eContents().get(0);
		
		//UiNestedProperty:
		//	{UiNestedProperty} getter=[JvmOperation] path=UiPathSegment?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiNestedProperty} getter=[JvmOperation] path=UiPathSegment?
		public Group getGroup() { return cGroup; }
		
		//{UiNestedProperty}
		public Action getUiNestedPropertyAction_0() { return cUiNestedPropertyAction_0; }
		
		//getter=[JvmOperation]
		public Assignment getGetterAssignment_1() { return cGetterAssignment_1; }
		
		//[JvmOperation]
		public CrossReference getGetterJvmOperationCrossReference_1_0() { return cGetterJvmOperationCrossReference_1_0; }
		
		//ID
		public RuleCall getGetterJvmOperationIDTerminalRuleCall_1_0_1() { return cGetterJvmOperationIDTerminalRuleCall_1_0_1; }
		
		//path=UiPathSegment?
		public Assignment getPathAssignment_2() { return cPathAssignment_2; }
		
		//UiPathSegment
		public RuleCall getPathUiPathSegmentParserRuleCall_2_0() { return cPathUiPathSegmentParserRuleCall_2_0; }
	}
	public class UiTypedBindableDefElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableDef");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTypedBindableDefAction_0 = (Action)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cLeftSquareBracketKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cRawBindableAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final CrossReference cRawBindableUiRawBindableCrossReference_1_1_0 = (CrossReference)cRawBindableAssignment_1_1.eContents().get(0);
		private final RuleCall cRawBindableUiRawBindableIDTerminalRuleCall_1_1_0_1 = (RuleCall)cRawBindableUiRawBindableCrossReference_1_1_0.eContents().get(1);
		private final Assignment cRawBindablePathAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0 = (RuleCall)cRawBindablePathAssignment_1_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
		private final Keyword cFullStopKeyword_1_4 = (Keyword)cGroup_1.eContents().get(4);
		private final Assignment cMethodAssignment_1_5 = (Assignment)cGroup_1.eContents().get(5);
		private final CrossReference cMethodUxEndpointDefCrossReference_1_5_0 = (CrossReference)cMethodAssignment_1_5.eContents().get(0);
		private final RuleCall cMethodUxEndpointDefIDTerminalRuleCall_1_5_0_1 = (RuleCall)cMethodUxEndpointDefCrossReference_1_5_0.eContents().get(1);
		
		//UiTypedBindableDef UiBindingExpression:
		//	{UiTypedBindableDef} ('[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']' '.'
		//	method=[cfg::UxEndpointDef]);
		@Override public ParserRule getRule() { return rule; }
		
		//{UiTypedBindableDef} ('[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']' '.'
		//method=[cfg::UxEndpointDef])
		public Group getGroup() { return cGroup; }
		
		//{UiTypedBindableDef}
		public Action getUiTypedBindableDefAction_0() { return cUiTypedBindableDefAction_0; }
		
		//'[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']' '.' method=[cfg::UxEndpointDef]
		public Group getGroup_1() { return cGroup_1; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_1_0() { return cLeftSquareBracketKeyword_1_0; }
		
		//rawBindable=[UiRawBindable]
		public Assignment getRawBindableAssignment_1_1() { return cRawBindableAssignment_1_1; }
		
		//[UiRawBindable]
		public CrossReference getRawBindableUiRawBindableCrossReference_1_1_0() { return cRawBindableUiRawBindableCrossReference_1_1_0; }
		
		//ID
		public RuleCall getRawBindableUiRawBindableIDTerminalRuleCall_1_1_0_1() { return cRawBindableUiRawBindableIDTerminalRuleCall_1_1_0_1; }
		
		//rawBindablePath=UiRawBindablePathSegment?
		public Assignment getRawBindablePathAssignment_1_2() { return cRawBindablePathAssignment_1_2; }
		
		//UiRawBindablePathSegment
		public RuleCall getRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0() { return cRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_1_3() { return cRightSquareBracketKeyword_1_3; }
		
		//'.'
		public Keyword getFullStopKeyword_1_4() { return cFullStopKeyword_1_4; }
		
		//method=[cfg::UxEndpointDef]
		public Assignment getMethodAssignment_1_5() { return cMethodAssignment_1_5; }
		
		//[cfg::UxEndpointDef]
		public CrossReference getMethodUxEndpointDefCrossReference_1_5_0() { return cMethodUxEndpointDefCrossReference_1_5_0; }
		
		//ID
		public RuleCall getMethodUxEndpointDefIDTerminalRuleCall_1_5_0_1() { return cMethodUxEndpointDefIDTerminalRuleCall_1_5_0_1; }
	}
	public class UiTypedBindableRawTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableRawType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTypedBindableRawTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cLeftSquareBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRawBindableAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRawBindableUiRawBindableCrossReference_2_0 = (CrossReference)cRawBindableAssignment_2.eContents().get(0);
		private final RuleCall cRawBindableUiRawBindableIDTerminalRuleCall_2_0_1 = (RuleCall)cRawBindableUiRawBindableCrossReference_2_0.eContents().get(1);
		private final Assignment cRawBindablePathAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0 = (RuleCall)cRawBindablePathAssignment_3.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiTypedBindableRawType UiBindingExpression:
		//	{UiTypedBindableRawType}
		//	'[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiTypedBindableRawType} '[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']'
		public Group getGroup() { return cGroup; }
		
		//{UiTypedBindableRawType}
		public Action getUiTypedBindableRawTypeAction_0() { return cUiTypedBindableRawTypeAction_0; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_1() { return cLeftSquareBracketKeyword_1; }
		
		//rawBindable=[UiRawBindable]
		public Assignment getRawBindableAssignment_2() { return cRawBindableAssignment_2; }
		
		//[UiRawBindable]
		public CrossReference getRawBindableUiRawBindableCrossReference_2_0() { return cRawBindableUiRawBindableCrossReference_2_0; }
		
		//ID
		public RuleCall getRawBindableUiRawBindableIDTerminalRuleCall_2_0_1() { return cRawBindableUiRawBindableIDTerminalRuleCall_2_0_1; }
		
		//rawBindablePath=UiRawBindablePathSegment?
		public Assignment getRawBindablePathAssignment_3() { return cRawBindablePathAssignment_3; }
		
		//UiRawBindablePathSegment
		public RuleCall getRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0() { return cRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_4() { return cRightSquareBracketKeyword_4; }
	}
	public class UiTypedBindableRawTypeAliasElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableRawTypeAlias");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cUiKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cTypeUiTypedBindableRawTypeParserRuleCall_1_0 = (RuleCall)cTypeAssignment_1.eContents().get(0);
		private final Keyword cAsKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cAliasAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAliasIDTerminalRuleCall_3_0 = (RuleCall)cAliasAssignment_3.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiTypedBindableRawTypeAlias:
		//	'ui' type=UiTypedBindableRawType 'as' alias=ID ';'?;
		@Override public ParserRule getRule() { return rule; }
		
		//'ui' type=UiTypedBindableRawType 'as' alias=ID ';'?
		public Group getGroup() { return cGroup; }
		
		//'ui'
		public Keyword getUiKeyword_0() { return cUiKeyword_0; }
		
		//type=UiTypedBindableRawType
		public Assignment getTypeAssignment_1() { return cTypeAssignment_1; }
		
		//UiTypedBindableRawType
		public RuleCall getTypeUiTypedBindableRawTypeParserRuleCall_1_0() { return cTypeUiTypedBindableRawTypeParserRuleCall_1_0; }
		
		//'as'
		public Keyword getAsKeyword_2() { return cAsKeyword_2; }
		
		//alias=ID
		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }
		
		//ID
		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	public class UiRawBindablePathSegmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiRawBindablePathSegment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiRawBindablePathSegmentAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Assignment cToParentAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
		private final Keyword cToParentFullStopFullStopKeyword_1_1_0 = (Keyword)cToParentAssignment_1_1.eContents().get(0);
		private final Assignment cRawBindableAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cRawBindableUiRawBindableCrossReference_2_0 = (CrossReference)cRawBindableAssignment_2.eContents().get(0);
		private final RuleCall cRawBindableUiRawBindableIDTerminalRuleCall_2_0_1 = (RuleCall)cRawBindableUiRawBindableCrossReference_2_0.eContents().get(1);
		private final Assignment cPathAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cPathUiRawBindablePathSegmentParserRuleCall_3_0 = (RuleCall)cPathAssignment_3.eContents().get(0);
		
		//UiRawBindablePathSegment:
		//	{UiRawBindablePathSegment} ('.' | toParent?='..') rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiRawBindablePathSegment} ('.' | toParent?='..') rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?
		public Group getGroup() { return cGroup; }
		
		//{UiRawBindablePathSegment}
		public Action getUiRawBindablePathSegmentAction_0() { return cUiRawBindablePathSegmentAction_0; }
		
		//'.' | toParent?='..'
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'.'
		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
		
		//toParent?='..'
		public Assignment getToParentAssignment_1_1() { return cToParentAssignment_1_1; }
		
		//'..'
		public Keyword getToParentFullStopFullStopKeyword_1_1_0() { return cToParentFullStopFullStopKeyword_1_1_0; }
		
		//rawBindable=[UiRawBindable]
		public Assignment getRawBindableAssignment_2() { return cRawBindableAssignment_2; }
		
		//[UiRawBindable]
		public CrossReference getRawBindableUiRawBindableCrossReference_2_0() { return cRawBindableUiRawBindableCrossReference_2_0; }
		
		//ID
		public RuleCall getRawBindableUiRawBindableIDTerminalRuleCall_2_0_1() { return cRawBindableUiRawBindableIDTerminalRuleCall_2_0_1; }
		
		//path=UiRawBindablePathSegment?
		public Assignment getPathAssignment_3() { return cPathAssignment_3; }
		
		//UiRawBindablePathSegment
		public RuleCall getPathUiRawBindablePathSegmentParserRuleCall_3_0() { return cPathUiRawBindablePathSegmentParserRuleCall_3_0; }
	}
	public class UiCommandBindableDefElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiCommandBindableDef");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiCommandBindableDefAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cCommandAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cCommandUiCommandParserRuleCall_1_0 = (RuleCall)cCommandAssignment_1.eContents().get(0);
		
		//UiCommandBindableDef:
		//	{UiCommandBindableDef} command=UiCommand;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiCommandBindableDef} command=UiCommand
		public Group getGroup() { return cGroup; }
		
		//{UiCommandBindableDef}
		public Action getUiCommandBindableDefAction_0() { return cUiCommandBindableDefAction_0; }
		
		//command=UiCommand
		public Assignment getCommandAssignment_1() { return cCommandAssignment_1; }
		
		//UiCommand
		public RuleCall getCommandUiCommandParserRuleCall_1_0() { return cCommandUiCommandParserRuleCall_1_0; }
	}
	public class UiCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiCommand");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMobileNavigationCommandParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiOpenDialogCommandParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiSearchWithDialogCommandParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiAddToTableCommandParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiRemoveFromTableCommandParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cUiSendEventCommandParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cUiSetNewInstanceCommandParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		
		//UiCommand:
		//	UiMobileNavigationCommand | UiOpenDialogCommand | UiSearchWithDialogCommand | UiAddToTableCommand |
		//	UiRemoveFromTableCommand | UiSendEventCommand | UiSetNewInstanceCommand;
		@Override public ParserRule getRule() { return rule; }
		
		//UiMobileNavigationCommand | UiOpenDialogCommand | UiSearchWithDialogCommand | UiAddToTableCommand |
		//UiRemoveFromTableCommand | UiSendEventCommand | UiSetNewInstanceCommand
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UiMobileNavigationCommand
		public RuleCall getUiMobileNavigationCommandParserRuleCall_0() { return cUiMobileNavigationCommandParserRuleCall_0; }
		
		//UiOpenDialogCommand
		public RuleCall getUiOpenDialogCommandParserRuleCall_1() { return cUiOpenDialogCommandParserRuleCall_1; }
		
		//UiSearchWithDialogCommand
		public RuleCall getUiSearchWithDialogCommandParserRuleCall_2() { return cUiSearchWithDialogCommandParserRuleCall_2; }
		
		//UiAddToTableCommand
		public RuleCall getUiAddToTableCommandParserRuleCall_3() { return cUiAddToTableCommandParserRuleCall_3; }
		
		//UiRemoveFromTableCommand
		public RuleCall getUiRemoveFromTableCommandParserRuleCall_4() { return cUiRemoveFromTableCommandParserRuleCall_4; }
		
		//UiSendEventCommand
		public RuleCall getUiSendEventCommandParserRuleCall_5() { return cUiSendEventCommandParserRuleCall_5; }
		
		//UiSetNewInstanceCommand
		public RuleCall getUiSetNewInstanceCommandParserRuleCall_6() { return cUiSetNewInstanceCommandParserRuleCall_6; }
	}
	public class UiMobileNavigationCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileNavigationCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNavigateToKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cTargetPageAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cTargetPageUiMobileNavigationPageParserRuleCall_2_0 = (RuleCall)cTargetPageAssignment_2.eContents().get(0);
		
		//UiMobileNavigationCommand:
		//	{UiMobileNavigationCommand}
		//	'navigateTo' targetPage=UiMobileNavigationPage;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiMobileNavigationCommand} 'navigateTo' targetPage=UiMobileNavigationPage
		public Group getGroup() { return cGroup; }
		
		//{UiMobileNavigationCommand}
		public Action getUiMobileNavigationCommandAction_0() { return cUiMobileNavigationCommandAction_0; }
		
		//'navigateTo'
		public Keyword getNavigateToKeyword_1() { return cNavigateToKeyword_1; }
		
		//targetPage=UiMobileNavigationPage
		public Assignment getTargetPageAssignment_2() { return cTargetPageAssignment_2; }
		
		//UiMobileNavigationPage
		public RuleCall getTargetPageUiMobileNavigationPageParserRuleCall_2_0() { return cTargetPageUiMobileNavigationPageParserRuleCall_2_0; }
	}
	public class UiOpenDialogCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiOpenDialogCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiOpenDialogCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cOpenDialogKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cDialogAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDialogUiDialogParserRuleCall_2_0 = (RuleCall)cDialogAssignment_2.eContents().get(0);
		
		//UiOpenDialogCommand:
		//	{UiOpenDialogCommand}
		//	'openDialog' dialog=UiDialog;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiOpenDialogCommand} 'openDialog' dialog=UiDialog
		public Group getGroup() { return cGroup; }
		
		//{UiOpenDialogCommand}
		public Action getUiOpenDialogCommandAction_0() { return cUiOpenDialogCommandAction_0; }
		
		//'openDialog'
		public Keyword getOpenDialogKeyword_1() { return cOpenDialogKeyword_1; }
		
		//dialog=UiDialog
		public Assignment getDialogAssignment_2() { return cDialogAssignment_2; }
		
		//UiDialog
		public RuleCall getDialogUiDialogParserRuleCall_2_0() { return cDialogUiDialogParserRuleCall_2_0; }
	}
	public class UiSearchWithDialogCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchWithDialogCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSearchWithDialogCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSearchWithKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cDialogAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDialogUiSearchDialogParserRuleCall_2_0 = (RuleCall)cDialogAssignment_2.eContents().get(0);
		
		//UiSearchWithDialogCommand:
		//	{UiSearchWithDialogCommand}
		//	'searchWith' dialog=UiSearchDialog;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiSearchWithDialogCommand} 'searchWith' dialog=UiSearchDialog
		public Group getGroup() { return cGroup; }
		
		//{UiSearchWithDialogCommand}
		public Action getUiSearchWithDialogCommandAction_0() { return cUiSearchWithDialogCommandAction_0; }
		
		//'searchWith'
		public Keyword getSearchWithKeyword_1() { return cSearchWithKeyword_1; }
		
		//dialog=UiSearchDialog
		public Assignment getDialogAssignment_2() { return cDialogAssignment_2; }
		
		//UiSearchDialog
		public RuleCall getDialogUiSearchDialogParserRuleCall_2_0() { return cDialogUiSearchDialogParserRuleCall_2_0; }
	}
	public class UiAddToTableCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiAddToTableCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiAddToTableCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cAddToTableKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cTableAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cTableUiTableCrossReference_2_0 = (CrossReference)cTableAssignment_2.eContents().get(0);
		private final RuleCall cTableUiTableIDTerminalRuleCall_2_0_1 = (RuleCall)cTableUiTableCrossReference_2_0.eContents().get(1);
		
		//UiAddToTableCommand:
		//	{UiAddToTableCommand}
		//	'addToTable' table=[UiTable];
		@Override public ParserRule getRule() { return rule; }
		
		//{UiAddToTableCommand} 'addToTable' table=[UiTable]
		public Group getGroup() { return cGroup; }
		
		//{UiAddToTableCommand}
		public Action getUiAddToTableCommandAction_0() { return cUiAddToTableCommandAction_0; }
		
		//'addToTable'
		public Keyword getAddToTableKeyword_1() { return cAddToTableKeyword_1; }
		
		//table=[UiTable]
		public Assignment getTableAssignment_2() { return cTableAssignment_2; }
		
		//[UiTable]
		public CrossReference getTableUiTableCrossReference_2_0() { return cTableUiTableCrossReference_2_0; }
		
		//ID
		public RuleCall getTableUiTableIDTerminalRuleCall_2_0_1() { return cTableUiTableIDTerminalRuleCall_2_0_1; }
	}
	public class UiRemoveFromTableCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiRemoveFromTableCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiRemoveFromTableCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cRemoveFromTableKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cTableAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cTableUiTableCrossReference_2_0 = (CrossReference)cTableAssignment_2.eContents().get(0);
		private final RuleCall cTableUiTableIDTerminalRuleCall_2_0_1 = (RuleCall)cTableUiTableCrossReference_2_0.eContents().get(1);
		
		//UiRemoveFromTableCommand:
		//	{UiRemoveFromTableCommand}
		//	'removeFromTable' table=[UiTable];
		@Override public ParserRule getRule() { return rule; }
		
		//{UiRemoveFromTableCommand} 'removeFromTable' table=[UiTable]
		public Group getGroup() { return cGroup; }
		
		//{UiRemoveFromTableCommand}
		public Action getUiRemoveFromTableCommandAction_0() { return cUiRemoveFromTableCommandAction_0; }
		
		//'removeFromTable'
		public Keyword getRemoveFromTableKeyword_1() { return cRemoveFromTableKeyword_1; }
		
		//table=[UiTable]
		public Assignment getTableAssignment_2() { return cTableAssignment_2; }
		
		//[UiTable]
		public CrossReference getTableUiTableCrossReference_2_0() { return cTableUiTableCrossReference_2_0; }
		
		//ID
		public RuleCall getTableUiTableIDTerminalRuleCall_2_0_1() { return cTableUiTableIDTerminalRuleCall_2_0_1; }
	}
	public class UiSetNewInstanceCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSetNewInstanceCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSetNewInstanceCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNewInstanceKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cForKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cJvmTypeAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_2_1_0 = (RuleCall)cJvmTypeAssignment_2_1.eContents().get(0);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Keyword cAtKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Assignment cTargetAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0 = (RuleCall)cTargetAssignment_3_1.eContents().get(0);
		
		//UiSetNewInstanceCommand:
		//	{UiSetNewInstanceCommand}
		//	'newInstance' ('for' jvmType=JvmTypeReference)? ('at' target=UiBindingEndpointAssignment);
		@Override public ParserRule getRule() { return rule; }
		
		//{UiSetNewInstanceCommand} 'newInstance' ('for' jvmType=JvmTypeReference)? ('at' target=UiBindingEndpointAssignment)
		public Group getGroup() { return cGroup; }
		
		//{UiSetNewInstanceCommand}
		public Action getUiSetNewInstanceCommandAction_0() { return cUiSetNewInstanceCommandAction_0; }
		
		//'newInstance'
		public Keyword getNewInstanceKeyword_1() { return cNewInstanceKeyword_1; }
		
		//('for' jvmType=JvmTypeReference)?
		public Group getGroup_2() { return cGroup_2; }
		
		//'for'
		public Keyword getForKeyword_2_0() { return cForKeyword_2_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_2_1() { return cJvmTypeAssignment_2_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_2_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_2_1_0; }
		
		//'at' target=UiBindingEndpointAssignment
		public Group getGroup_3() { return cGroup_3; }
		
		//'at'
		public Keyword getAtKeyword_3_0() { return cAtKeyword_3_0; }
		
		//target=UiBindingEndpointAssignment
		public Assignment getTargetAssignment_3_1() { return cTargetAssignment_3_1; }
		
		//UiBindingEndpointAssignment
		public RuleCall getTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0() { return cTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0; }
	}
	public class UiSendEventCommandElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSendEventCommand");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSendEventCommandAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSendEventKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cNoAutoTriggerAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final Keyword cNoAutoTriggerNoAutoTriggerKeyword_3_0 = (Keyword)cNoAutoTriggerAssignment_3.eContents().get(0);
		private final Assignment cEventTopicAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cEventTopicSTRINGTerminalRuleCall_4_0 = (RuleCall)cEventTopicAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//UiSendEventCommand:
		//	{UiSendEventCommand}
		//	'sendEvent' '(' noAutoTrigger?='noAutoTrigger'? eventTopic=STRING ')';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiSendEventCommand} 'sendEvent' '(' noAutoTrigger?='noAutoTrigger'? eventTopic=STRING ')'
		public Group getGroup() { return cGroup; }
		
		//{UiSendEventCommand}
		public Action getUiSendEventCommandAction_0() { return cUiSendEventCommandAction_0; }
		
		//'sendEvent'
		public Keyword getSendEventKeyword_1() { return cSendEventKeyword_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2() { return cLeftParenthesisKeyword_2; }
		
		//noAutoTrigger?='noAutoTrigger'?
		public Assignment getNoAutoTriggerAssignment_3() { return cNoAutoTriggerAssignment_3; }
		
		//'noAutoTrigger'
		public Keyword getNoAutoTriggerNoAutoTriggerKeyword_3_0() { return cNoAutoTriggerNoAutoTriggerKeyword_3_0; }
		
		//eventTopic=STRING
		public Assignment getEventTopicAssignment_4() { return cEventTopicAssignment_4; }
		
		//STRING
		public RuleCall getEventTopicSTRINGTerminalRuleCall_4_0() { return cEventTopicSTRINGTerminalRuleCall_4_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
	}
	public class UiViewElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiView");
		private final RuleCall cUiIDEViewParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//UiView:
		//	UiIDEView;
		@Override public ParserRule getRule() { return rule; }
		
		//UiIDEView
		public RuleCall getUiIDEViewParserRuleCall() { return cUiIDEViewParserRuleCall; }
	}
	public class UiIDEViewElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiIDEView");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cIdeviewKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cSharedStateGroupKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cSharedStateGroupAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0 = (RuleCall)cSharedStateGroupAssignment_3_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Keyword cCategoryKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cViewCategoryAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final CrossReference cViewCategoryUxViewCategoryCrossReference_3_1_1_0 = (CrossReference)cViewCategoryAssignment_3_1_1.eContents().get(0);
		private final RuleCall cViewCategoryUxViewCategoryQualifiedNameParserRuleCall_3_1_1_0_1 = (RuleCall)cViewCategoryUxViewCategoryCrossReference_3_1_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_3_1_2 = (Keyword)cGroup_3_1.eContents().get(2);
		private final Group cGroup_3_2 = (Group)cUnorderedGroup_3.eContents().get(2);
		private final Keyword cRootTypeKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
		private final Assignment cJvmTypeAssignment_3_2_1 = (Assignment)cGroup_3_2.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0 = (RuleCall)cJvmTypeAssignment_3_2_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_2_2 = (Keyword)cGroup_3_2.eContents().get(2);
		private final Group cGroup_3_3 = (Group)cUnorderedGroup_3.eContents().get(3);
		private final Keyword cExposedActionsKeyword_3_3_0 = (Keyword)cGroup_3_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3_3_1 = (Keyword)cGroup_3_3.eContents().get(1);
		private final Assignment cExposedActionsAssignment_3_3_2 = (Assignment)cGroup_3_3.eContents().get(2);
		private final RuleCall cExposedActionsUiExposedActionParserRuleCall_3_3_2_0 = (RuleCall)cExposedActionsAssignment_3_3_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_3_3_3 = (Keyword)cGroup_3_3.eContents().get(3);
		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Assignment cBeanSlotsAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
		private final RuleCall cBeanSlotsUiBeanSlotParserRuleCall_4_0_0 = (RuleCall)cBeanSlotsAssignment_4_0.eContents().get(0);
		private final Assignment cBindingEndpointAliasAssignment_4_1 = (Assignment)cAlternatives_4.eContents().get(1);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0 = (RuleCall)cBindingEndpointAliasAssignment_4_1.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2 = (Assignment)cAlternatives_4.eContents().get(2);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_0 = (RuleCall)cBindingsAssignment_4_2.eContents().get(0);
		private final Assignment cContentAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentUiEmbeddableParserRuleCall_5_0 = (RuleCall)cContentAssignment_5.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cAlignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Assignment cContentAlignmentAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
		private final RuleCall cContentAlignmentUiAlignmentEnumRuleCall_6_1_0 = (RuleCall)cContentAlignmentAssignment_6_1.eContents().get(0);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Assignment cBindingEndpointAliasAssignment_7_0 = (Assignment)cAlternatives_7.eContents().get(0);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0 = (RuleCall)cBindingEndpointAliasAssignment_7_0.eContents().get(0);
		private final Assignment cBindingsAssignment_7_1 = (Assignment)cAlternatives_7.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_7_1_0 = (RuleCall)cBindingsAssignment_7_1.eContents().get(0);
		private final Assignment cValidatorAssignmentsAssignment_7_2 = (Assignment)cAlternatives_7.eContents().get(2);
		private final RuleCall cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0 = (RuleCall)cValidatorAssignmentsAssignment_7_2.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7_3 = (Assignment)cAlternatives_7.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0 = (RuleCall)cProcessorAssignmentsAssignment_7_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//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)*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'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)* '}'
		public Group getGroup() { return cGroup; }
		
		//'ideview'
		public Keyword getIdeviewKeyword_0() { return cIdeviewKeyword_0; }
		
		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//('sharedStateGroup' sharedStateGroup=STRING ';'?)? & ('category' viewCategory=[cfg::UxViewCategory|QualifiedName] ';'?)?
		//& ('rootType' jvmType=JvmTypeReference ';'?)? & ('exposedActions' '{' exposedActions+=UiExposedAction* '}')?
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
		
		//('sharedStateGroup' sharedStateGroup=STRING ';'?)?
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'sharedStateGroup'
		public Keyword getSharedStateGroupKeyword_3_0_0() { return cSharedStateGroupKeyword_3_0_0; }
		
		//sharedStateGroup=STRING
		public Assignment getSharedStateGroupAssignment_3_0_1() { return cSharedStateGroupAssignment_3_0_1; }
		
		//STRING
		public RuleCall getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0() { return cSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_3_0_2() { return cSemicolonKeyword_3_0_2; }
		
		//('category' viewCategory=[cfg::UxViewCategory|QualifiedName] ';'?)?
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'category'
		public Keyword getCategoryKeyword_3_1_0() { return cCategoryKeyword_3_1_0; }
		
		//viewCategory=[cfg::UxViewCategory|QualifiedName]
		public Assignment getViewCategoryAssignment_3_1_1() { return cViewCategoryAssignment_3_1_1; }
		
		//[cfg::UxViewCategory|QualifiedName]
		public CrossReference getViewCategoryUxViewCategoryCrossReference_3_1_1_0() { return cViewCategoryUxViewCategoryCrossReference_3_1_1_0; }
		
		//QualifiedName
		public RuleCall getViewCategoryUxViewCategoryQualifiedNameParserRuleCall_3_1_1_0_1() { return cViewCategoryUxViewCategoryQualifiedNameParserRuleCall_3_1_1_0_1; }
		
		//';'?
		public Keyword getSemicolonKeyword_3_1_2() { return cSemicolonKeyword_3_1_2; }
		
		//('rootType' jvmType=JvmTypeReference ';'?)?
		public Group getGroup_3_2() { return cGroup_3_2; }
		
		//'rootType'
		public Keyword getRootTypeKeyword_3_2_0() { return cRootTypeKeyword_3_2_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_3_2_1() { return cJvmTypeAssignment_3_2_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_3_2_2() { return cSemicolonKeyword_3_2_2; }
		
		//('exposedActions' '{' exposedActions+=UiExposedAction* '}')?
		public Group getGroup_3_3() { return cGroup_3_3; }
		
		//'exposedActions'
		public Keyword getExposedActionsKeyword_3_3_0() { return cExposedActionsKeyword_3_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3_3_1() { return cLeftCurlyBracketKeyword_3_3_1; }
		
		//exposedActions+=UiExposedAction*
		public Assignment getExposedActionsAssignment_3_3_2() { return cExposedActionsAssignment_3_3_2; }
		
		//UiExposedAction
		public RuleCall getExposedActionsUiExposedActionParserRuleCall_3_3_2_0() { return cExposedActionsUiExposedActionParserRuleCall_3_3_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_3_3_3() { return cRightCurlyBracketKeyword_3_3_3; }
		
		//(beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)*
		public Alternatives getAlternatives_4() { return cAlternatives_4; }
		
		//beanSlots+=UiBeanSlot
		public Assignment getBeanSlotsAssignment_4_0() { return cBeanSlotsAssignment_4_0; }
		
		//UiBeanSlot
		public RuleCall getBeanSlotsUiBeanSlotParserRuleCall_4_0_0() { return cBeanSlotsUiBeanSlotParserRuleCall_4_0_0; }
		
		//bindingEndpointAlias+=UiBindingEndpointAlias
		public Assignment getBindingEndpointAliasAssignment_4_1() { return cBindingEndpointAliasAssignment_4_1; }
		
		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2() { return cBindingsAssignment_4_2; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_0() { return cBindingsUiBindingParserRuleCall_4_2_0; }
		
		//content=UiEmbeddable
		public Assignment getContentAssignment_5() { return cContentAssignment_5; }
		
		//UiEmbeddable
		public RuleCall getContentUiEmbeddableParserRuleCall_5_0() { return cContentUiEmbeddableParserRuleCall_5_0; }
		
		//('align' contentAlignment=UiAlignment)?
		public Group getGroup_6() { return cGroup_6; }
		
		//'align'
		public Keyword getAlignKeyword_6_0() { return cAlignKeyword_6_0; }
		
		//contentAlignment=UiAlignment
		public Assignment getContentAlignmentAssignment_6_1() { return cContentAlignmentAssignment_6_1; }
		
		//UiAlignment
		public RuleCall getContentAlignmentUiAlignmentEnumRuleCall_6_1_0() { return cContentAlignmentUiAlignmentEnumRuleCall_6_1_0; }
		
		//(bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
		//processorAssignments+=UiVisibilityProcessorAssignment)*
		public Alternatives getAlternatives_7() { return cAlternatives_7; }
		
		//bindingEndpointAlias+=UiBindingEndpointAlias
		public Assignment getBindingEndpointAliasAssignment_7_0() { return cBindingEndpointAliasAssignment_7_0; }
		
		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_7_1() { return cBindingsAssignment_7_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_7_1_0() { return cBindingsUiBindingParserRuleCall_7_1_0; }
		
		//validatorAssignments+=UiValidatorAssignment
		public Assignment getValidatorAssignmentsAssignment_7_2() { return cValidatorAssignmentsAssignment_7_2; }
		
		//UiValidatorAssignment
		public RuleCall getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0() { return cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment
		public Assignment getProcessorAssignmentsAssignment_7_3() { return cProcessorAssignmentsAssignment_7_3; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiDisplayViewElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDisplayView");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cDisplayKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Keyword cRootTypeKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cJvmTypeAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_0 = (RuleCall)cJvmTypeAssignment_4.eContents().get(0);
		private final Alternatives cAlternatives_5 = (Alternatives)cGroup.eContents().get(5);
		private final Assignment cBeanSlotsAssignment_5_0 = (Assignment)cAlternatives_5.eContents().get(0);
		private final RuleCall cBeanSlotsUiBeanSlotParserRuleCall_5_0_0 = (RuleCall)cBeanSlotsAssignment_5_0.eContents().get(0);
		private final Assignment cBindingEndpointAliasAssignment_5_1 = (Assignment)cAlternatives_5.eContents().get(1);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_5_1_0 = (RuleCall)cBindingEndpointAliasAssignment_5_1.eContents().get(0);
		private final Assignment cBindingsAssignment_5_2 = (Assignment)cAlternatives_5.eContents().get(2);
		private final RuleCall cBindingsUiBindingParserRuleCall_5_2_0 = (RuleCall)cBindingsAssignment_5_2.eContents().get(0);
		private final Assignment cContentAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cContentUiEmbeddableParserRuleCall_6_0 = (RuleCall)cContentAssignment_6.eContents().get(0);
		private final Group cGroup_7 = (Group)cGroup.eContents().get(7);
		private final Keyword cAlignKeyword_7_0 = (Keyword)cGroup_7.eContents().get(0);
		private final Assignment cContentAlignmentAssignment_7_1 = (Assignment)cGroup_7.eContents().get(1);
		private final RuleCall cContentAlignmentUiAlignmentEnumRuleCall_7_1_0 = (RuleCall)cContentAlignmentAssignment_7_1.eContents().get(0);
		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
		private final Assignment cBindingEndpointAliasAssignment_8_0 = (Assignment)cAlternatives_8.eContents().get(0);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_8_0_0 = (RuleCall)cBindingEndpointAliasAssignment_8_0.eContents().get(0);
		private final Assignment cBindingsAssignment_8_1 = (Assignment)cAlternatives_8.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_8_1_0 = (RuleCall)cBindingsAssignment_8_1.eContents().get(0);
		private final Assignment cValidatorAssignmentsAssignment_8_2 = (Assignment)cAlternatives_8.eContents().get(2);
		private final RuleCall cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_8_2_0 = (RuleCall)cValidatorAssignmentsAssignment_8_2.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_8_3 = (Assignment)cAlternatives_8.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_3_0 = (RuleCall)cProcessorAssignmentsAssignment_8_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_9 = (Keyword)cGroup.eContents().get(9);
		
		//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)*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'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)* '}'
		public Group getGroup() { return cGroup; }
		
		//'display'
		public Keyword getDisplayKeyword_0() { return cDisplayKeyword_0; }
		
		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//'rootType'
		public Keyword getRootTypeKeyword_3() { return cRootTypeKeyword_3; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4() { return cJvmTypeAssignment_4; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_0; }
		
		//(beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding)*
		public Alternatives getAlternatives_5() { return cAlternatives_5; }
		
		//beanSlots+=UiBeanSlot
		public Assignment getBeanSlotsAssignment_5_0() { return cBeanSlotsAssignment_5_0; }
		
		//UiBeanSlot
		public RuleCall getBeanSlotsUiBeanSlotParserRuleCall_5_0_0() { return cBeanSlotsUiBeanSlotParserRuleCall_5_0_0; }
		
		//bindingEndpointAlias+=UiBindingEndpointAlias
		public Assignment getBindingEndpointAliasAssignment_5_1() { return cBindingEndpointAliasAssignment_5_1; }
		
		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_5_1_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_5_1_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_5_2() { return cBindingsAssignment_5_2; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_5_2_0() { return cBindingsUiBindingParserRuleCall_5_2_0; }
		
		//content=UiEmbeddable
		public Assignment getContentAssignment_6() { return cContentAssignment_6; }
		
		//UiEmbeddable
		public RuleCall getContentUiEmbeddableParserRuleCall_6_0() { return cContentUiEmbeddableParserRuleCall_6_0; }
		
		//('align' contentAlignment=UiAlignment)?
		public Group getGroup_7() { return cGroup_7; }
		
		//'align'
		public Keyword getAlignKeyword_7_0() { return cAlignKeyword_7_0; }
		
		//contentAlignment=UiAlignment
		public Assignment getContentAlignmentAssignment_7_1() { return cContentAlignmentAssignment_7_1; }
		
		//UiAlignment
		public RuleCall getContentAlignmentUiAlignmentEnumRuleCall_7_1_0() { return cContentAlignmentUiAlignmentEnumRuleCall_7_1_0; }
		
		//(bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
		//processorAssignments+=UiVisibilityProcessorAssignment)*
		public Alternatives getAlternatives_8() { return cAlternatives_8; }
		
		//bindingEndpointAlias+=UiBindingEndpointAlias
		public Assignment getBindingEndpointAliasAssignment_8_0() { return cBindingEndpointAliasAssignment_8_0; }
		
		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_8_0_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_8_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_8_1() { return cBindingsAssignment_8_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_8_1_0() { return cBindingsUiBindingParserRuleCall_8_1_0; }
		
		//validatorAssignments+=UiValidatorAssignment
		public Assignment getValidatorAssignmentsAssignment_8_2() { return cValidatorAssignmentsAssignment_8_2; }
		
		//UiValidatorAssignment
		public RuleCall getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_8_2_0() { return cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_8_2_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment
		public Assignment getProcessorAssignmentsAssignment_8_3() { return cProcessorAssignmentsAssignment_8_3; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_9() { return cRightCurlyBracketKeyword_9; }
	}
	public class UiExposedActionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiExposedAction");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cNameIDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cIconKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cIconNameAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cIconNameSTRINGTerminalRuleCall_1_1_0 = (RuleCall)cIconNameAssignment_1_1.eContents().get(0);
		private final Keyword cIdKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Assignment cActionReferenceAssignment_3_0 = (Assignment)cAlternatives_3.eContents().get(0);
		private final CrossReference cActionReferenceUxActionCrossReference_3_0_0 = (CrossReference)cActionReferenceAssignment_3_0.eContents().get(0);
		private final RuleCall cActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1 = (RuleCall)cActionReferenceUxActionCrossReference_3_0_0.eContents().get(1);
		private final Assignment cActionIDAssignment_3_1 = (Assignment)cAlternatives_3.eContents().get(1);
		private final RuleCall cActionIDSTRINGTerminalRuleCall_3_1_0 = (RuleCall)cActionIDAssignment_3_1.eContents().get(0);
		private final Assignment cCheckDirtyAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final Keyword cCheckDirtyCheckDirtyKeyword_4_0 = (Keyword)cCheckDirtyAssignment_4.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cExternalCommandKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cExternalCommandIdAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cExternalCommandIdSTRINGTerminalRuleCall_5_1_0 = (RuleCall)cExternalCommandIdAssignment_5_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//UiExposedAction:
		//	name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
		//	checkDirty?='checkDirty'? ('externalCommand' externalCommandId=STRING)? ';'?;
		@Override public ParserRule getRule() { return rule; }
		
		//name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
		//checkDirty?='checkDirty'? ('externalCommand' externalCommandId=STRING)? ';'?
		public Group getGroup() { return cGroup; }
		
		//name=ID
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_0_0() { return cNameIDTerminalRuleCall_0_0; }
		
		//('icon' iconName=STRING)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'icon'
		public Keyword getIconKeyword_1_0() { return cIconKeyword_1_0; }
		
		//iconName=STRING
		public Assignment getIconNameAssignment_1_1() { return cIconNameAssignment_1_1; }
		
		//STRING
		public RuleCall getIconNameSTRINGTerminalRuleCall_1_1_0() { return cIconNameSTRINGTerminalRuleCall_1_1_0; }
		
		//'id'
		public Keyword getIdKeyword_2() { return cIdKeyword_2; }
		
		//=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//=> actionReference=[cfg::UxAction|QualifiedName]
		public Assignment getActionReferenceAssignment_3_0() { return cActionReferenceAssignment_3_0; }
		
		//[cfg::UxAction|QualifiedName]
		public CrossReference getActionReferenceUxActionCrossReference_3_0_0() { return cActionReferenceUxActionCrossReference_3_0_0; }
		
		//QualifiedName
		public RuleCall getActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1() { return cActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1; }
		
		//actionID=STRING
		public Assignment getActionIDAssignment_3_1() { return cActionIDAssignment_3_1; }
		
		//STRING
		public RuleCall getActionIDSTRINGTerminalRuleCall_3_1_0() { return cActionIDSTRINGTerminalRuleCall_3_1_0; }
		
		//checkDirty?='checkDirty'?
		public Assignment getCheckDirtyAssignment_4() { return cCheckDirtyAssignment_4; }
		
		//'checkDirty'
		public Keyword getCheckDirtyCheckDirtyKeyword_4_0() { return cCheckDirtyCheckDirtyKeyword_4_0; }
		
		//('externalCommand' externalCommandId=STRING)?
		public Group getGroup_5() { return cGroup_5; }
		
		//'externalCommand'
		public Keyword getExternalCommandKeyword_5_0() { return cExternalCommandKeyword_5_0; }
		
		//externalCommandId=STRING
		public Assignment getExternalCommandIdAssignment_5_1() { return cExternalCommandIdAssignment_5_1; }
		
		//STRING
		public RuleCall getExternalCommandIdSTRINGTerminalRuleCall_5_1_0() { return cExternalCommandIdSTRINGTerminalRuleCall_5_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
	}
	public class UiMobileNavBarActionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavBarAction");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cNameIDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cIconKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cIconNameAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cIconNameSTRINGTerminalRuleCall_1_1_0 = (RuleCall)cIconNameAssignment_1_1.eContents().get(0);
		private final Keyword cIdKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Assignment cActionReferenceAssignment_3_0 = (Assignment)cAlternatives_3.eContents().get(0);
		private final CrossReference cActionReferenceUxActionCrossReference_3_0_0 = (CrossReference)cActionReferenceAssignment_3_0.eContents().get(0);
		private final RuleCall cActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1 = (RuleCall)cActionReferenceUxActionCrossReference_3_0_0.eContents().get(1);
		private final Assignment cActionIDAssignment_3_1 = (Assignment)cAlternatives_3.eContents().get(1);
		private final RuleCall cActionIDSTRINGTerminalRuleCall_3_1_0 = (RuleCall)cActionIDAssignment_3_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiMobileNavBarAction:
		//	name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING) ';'?;
		@Override public ParserRule getRule() { return rule; }
		
		//name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING) ';'?
		public Group getGroup() { return cGroup; }
		
		//name=ID
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_0_0() { return cNameIDTerminalRuleCall_0_0; }
		
		//('icon' iconName=STRING)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'icon'
		public Keyword getIconKeyword_1_0() { return cIconKeyword_1_0; }
		
		//iconName=STRING
		public Assignment getIconNameAssignment_1_1() { return cIconNameAssignment_1_1; }
		
		//STRING
		public RuleCall getIconNameSTRINGTerminalRuleCall_1_1_0() { return cIconNameSTRINGTerminalRuleCall_1_1_0; }
		
		//'id'
		public Keyword getIdKeyword_2() { return cIdKeyword_2; }
		
		//=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//=> actionReference=[cfg::UxAction|QualifiedName]
		public Assignment getActionReferenceAssignment_3_0() { return cActionReferenceAssignment_3_0; }
		
		//[cfg::UxAction|QualifiedName]
		public CrossReference getActionReferenceUxActionCrossReference_3_0_0() { return cActionReferenceUxActionCrossReference_3_0_0; }
		
		//QualifiedName
		public RuleCall getActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1() { return cActionReferenceUxActionQualifiedNameParserRuleCall_3_0_0_1; }
		
		//actionID=STRING
		public Assignment getActionIDAssignment_3_1() { return cActionIDAssignment_3_1; }
		
		//STRING
		public RuleCall getActionIDSTRINGTerminalRuleCall_3_1_0() { return cActionIDSTRINGTerminalRuleCall_3_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	public class UiMobileViewElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileView");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cMobileKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cSharedStateGroupKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cSharedStateGroupAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0 = (RuleCall)cSharedStateGroupAssignment_3_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Keyword cRootTypeKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cJvmTypeAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0 = (RuleCall)cJvmTypeAssignment_3_1_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_1_2 = (Keyword)cGroup_3_1.eContents().get(2);
		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Assignment cBeanSlotsAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
		private final RuleCall cBeanSlotsUiBeanSlotParserRuleCall_4_0_0 = (RuleCall)cBeanSlotsAssignment_4_0.eContents().get(0);
		private final Assignment cBindingEndpointAliasAssignment_4_1 = (Assignment)cAlternatives_4.eContents().get(1);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0 = (RuleCall)cBindingEndpointAliasAssignment_4_1.eContents().get(0);
		private final Assignment cContentAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentUiMobileEmbeddableParserRuleCall_5_0 = (RuleCall)cContentAssignment_5.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cAlignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Assignment cContentAlignmentAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
		private final RuleCall cContentAlignmentUiAlignmentEnumRuleCall_6_1_0 = (RuleCall)cContentAlignmentAssignment_6_1.eContents().get(0);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Assignment cBindingEndpointAliasAssignment_7_0 = (Assignment)cAlternatives_7.eContents().get(0);
		private final RuleCall cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0 = (RuleCall)cBindingEndpointAliasAssignment_7_0.eContents().get(0);
		private final Assignment cBindingsAssignment_7_1 = (Assignment)cAlternatives_7.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_7_1_0 = (RuleCall)cBindingsAssignment_7_1.eContents().get(0);
		private final Assignment cValidatorAssignmentsAssignment_7_2 = (Assignment)cAlternatives_7.eContents().get(2);
		private final RuleCall cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0 = (RuleCall)cValidatorAssignmentsAssignment_7_2.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7_3 = (Assignment)cAlternatives_7.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0 = (RuleCall)cProcessorAssignmentsAssignment_7_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//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)*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'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)* '}'
		public Group getGroup() { return cGroup; }
		
		//'mobile'
		public Keyword getMobileKeyword_0() { return cMobileKeyword_0; }
		
		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//('sharedStateGroup' sharedStateGroup=STRING ';'?)? & ('rootType' jvmType=JvmTypeReference ';'?)?
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
		
		//('sharedStateGroup' sharedStateGroup=STRING ';'?)?
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'sharedStateGroup'
		public Keyword getSharedStateGroupKeyword_3_0_0() { return cSharedStateGroupKeyword_3_0_0; }
		
		//sharedStateGroup=STRING
		public Assignment getSharedStateGroupAssignment_3_0_1() { return cSharedStateGroupAssignment_3_0_1; }
		
		//STRING
		public RuleCall getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0() { return cSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_3_0_2() { return cSemicolonKeyword_3_0_2; }
		
		//('rootType' jvmType=JvmTypeReference ';'?)?
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'rootType'
		public Keyword getRootTypeKeyword_3_1_0() { return cRootTypeKeyword_3_1_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_3_1_1() { return cJvmTypeAssignment_3_1_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_3_1_2() { return cSemicolonKeyword_3_1_2; }
		
		//(beanSlots+=UiBeanSlot | bindingEndpointAlias+=UiBindingEndpointAlias)*
		public Alternatives getAlternatives_4() { return cAlternatives_4; }
		
		//beanSlots+=UiBeanSlot
		public Assignment getBeanSlotsAssignment_4_0() { return cBeanSlotsAssignment_4_0; }
		
		//UiBeanSlot
		public RuleCall getBeanSlotsUiBeanSlotParserRuleCall_4_0_0() { return cBeanSlotsUiBeanSlotParserRuleCall_4_0_0; }
		
		//bindingEndpointAlias+=UiBindingEndpointAlias
		public Assignment getBindingEndpointAliasAssignment_4_1() { return cBindingEndpointAliasAssignment_4_1; }
		
		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0; }
		
		//content=UiMobileEmbeddable
		public Assignment getContentAssignment_5() { return cContentAssignment_5; }
		
		//UiMobileEmbeddable
		public RuleCall getContentUiMobileEmbeddableParserRuleCall_5_0() { return cContentUiMobileEmbeddableParserRuleCall_5_0; }
		
		//('align' contentAlignment=UiAlignment)?
		public Group getGroup_6() { return cGroup_6; }
		
		//'align'
		public Keyword getAlignKeyword_6_0() { return cAlignKeyword_6_0; }
		
		//contentAlignment=UiAlignment
		public Assignment getContentAlignmentAssignment_6_1() { return cContentAlignmentAssignment_6_1; }
		
		//UiAlignment
		public RuleCall getContentAlignmentUiAlignmentEnumRuleCall_6_1_0() { return cContentAlignmentUiAlignmentEnumRuleCall_6_1_0; }
		
		//(bindingEndpointAlias+=UiBindingEndpointAlias | bindings+=UiBinding | validatorAssignments+=UiValidatorAssignment |
		//processorAssignments+=UiVisibilityProcessorAssignment)*
		public Alternatives getAlternatives_7() { return cAlternatives_7; }
		
		//bindingEndpointAlias+=UiBindingEndpointAlias
		public Assignment getBindingEndpointAliasAssignment_7_0() { return cBindingEndpointAliasAssignment_7_0; }
		
		//UiBindingEndpointAlias
		public RuleCall getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0() { return cBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_7_1() { return cBindingsAssignment_7_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_7_1_0() { return cBindingsUiBindingParserRuleCall_7_1_0; }
		
		//validatorAssignments+=UiValidatorAssignment
		public Assignment getValidatorAssignmentsAssignment_7_2() { return cValidatorAssignmentsAssignment_7_2; }
		
		//UiValidatorAssignment
		public RuleCall getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0() { return cValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment
		public Assignment getProcessorAssignmentsAssignment_7_3() { return cProcessorAssignmentsAssignment_7_3; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiI18nInfoElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cI18nKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Assignment cNoCaptionAssignment_1_0 = (Assignment)cAlternatives_1.eContents().get(0);
		private final Keyword cNoCaptionNoCaptionKeyword_1_0_0 = (Keyword)cNoCaptionAssignment_1_0.eContents().get(0);
		private final Assignment cKeyAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
		private final RuleCall cKeySTRINGTerminalRuleCall_1_1_0 = (RuleCall)cKeyAssignment_1_1.eContents().get(0);
		
		//UiI18nInfo:
		//	'i18n' (noCaption?='noCaption' | key=STRING);
		@Override public ParserRule getRule() { return rule; }
		
		//'i18n' (noCaption?='noCaption' | key=STRING)
		public Group getGroup() { return cGroup; }
		
		//'i18n'
		public Keyword getI18nKeyword_0() { return cI18nKeyword_0; }
		
		//noCaption?='noCaption' | key=STRING
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//noCaption?='noCaption'
		public Assignment getNoCaptionAssignment_1_0() { return cNoCaptionAssignment_1_0; }
		
		//'noCaption'
		public Keyword getNoCaptionNoCaptionKeyword_1_0_0() { return cNoCaptionNoCaptionKeyword_1_0_0; }
		
		//key=STRING
		public Assignment getKeyAssignment_1_1() { return cKeyAssignment_1_1; }
		
		//STRING
		public RuleCall getKeySTRINGTerminalRuleCall_1_1_0() { return cKeySTRINGTerminalRuleCall_1_1_0; }
	}
	public class UiGridLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiGridLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiGridLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cGridlayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cColumnsKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cColumnsAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cColumnsINTTerminalRuleCall_2_1_0_1_0 = (RuleCall)cColumnsAssignment_2_1_0_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0 = (RuleCall)cI18nInfoAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cReadonlyReadonlyKeyword_2_1_3_0 = (Keyword)cReadonlyAssignment_2_1_3.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiGridLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiGridLayout:
		//	{UiGridLayout}
		//	'gridlayout' ('(' (('columns=' columns=INT)?
		//	& i18nInfo=UiI18nInfo?
		//	& ('styles' styles=STRING)?
		//	& readonly?="readonly"?)
		//	')')?
		//	name=ID?
		//	'{'
		//	contents+=UiGridLayoutAssigment*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiGridLayout} 'gridlayout' ('(' (('columns=' columns=INT)? & i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? &
		//readonly?="readonly"?) ')')? name=ID? '{' contents+=UiGridLayoutAssigment* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiGridLayout}
		public Action getUiGridLayoutAction_0() { return cUiGridLayoutAction_0; }
		
		//'gridlayout'
		public Keyword getGridlayoutKeyword_1() { return cGridlayoutKeyword_1; }
		
		//('(' (('columns=' columns=INT)? & i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//('columns=' columns=INT)? & i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('columns=' columns=INT)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'columns='
		public Keyword getColumnsKeyword_2_1_0_0() { return cColumnsKeyword_2_1_0_0; }
		
		//columns=INT
		public Assignment getColumnsAssignment_2_1_0_1() { return cColumnsAssignment_2_1_0_1; }
		
		//INT
		public RuleCall getColumnsINTTerminalRuleCall_2_1_0_1_0() { return cColumnsINTTerminalRuleCall_2_1_0_1_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//contents+=UiGridLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
		
		//UiGridLayoutAssigment
		public RuleCall getContentsUiGridLayoutAssigmentParserRuleCall_5_0() { return cContentsUiGridLayoutAssigmentParserRuleCall_5_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiVisibilityProcessorAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiVisibilityProcessorAssignmentAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cProcessorAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cProcessorUiVisibilityProcessorParserRuleCall_1_0 = (RuleCall)cProcessorAssignment_1.eContents().get(0);
		
		//UiVisibilityProcessorAssignment:
		//	{UiVisibilityProcessorAssignment} processor=UiVisibilityProcessor;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiVisibilityProcessorAssignment} processor=UiVisibilityProcessor
		public Group getGroup() { return cGroup; }
		
		//{UiVisibilityProcessorAssignment}
		public Action getUiVisibilityProcessorAssignmentAction_0() { return cUiVisibilityProcessorAssignmentAction_0; }
		
		//processor=UiVisibilityProcessor
		public Assignment getProcessorAssignment_1() { return cProcessorAssignment_1; }
		
		//UiVisibilityProcessor
		public RuleCall getProcessorUiVisibilityProcessorParserRuleCall_1_0() { return cProcessorUiVisibilityProcessorParserRuleCall_1_0; }
	}
	public class UiGridLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiGridLayoutAssigment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiGridLayoutAssigment:
		//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiEmbeddable ('align' alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }
		
		//element=UiEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
		
		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0_0() { return cElementUiEmbeddableParserRuleCall_0_0; }
		
		//('align' alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'align'
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
		
		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
		
		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}
	public class UiFormLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiFormLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiFormLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cFormKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0 = (RuleCall)cI18nInfoAssignment_2_0_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cUnorderedGroup_2.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_0 = (RuleCall)cStylesAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cUnorderedGroup_2.eContents().get(2);
		private final Assignment cReadonlyAssignment_2_2_0 = (Assignment)cGroup_2_2.eContents().get(0);
		private final Keyword cReadonlyReadonlyKeyword_2_2_0_0 = (Keyword)cReadonlyAssignment_2_2_0.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiFormLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiFormLayout:
		//	{UiFormLayout}
		//	'form' ('('
		//	i18nInfo=UiI18nInfo?
		//	& ('styles' styles=STRING)?
		//	& readonly?="readonly"?
		//	')')?
		//	name=ID?
		//	'{'
		//	contents+=UiFormLayoutAssigment*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiFormLayout} 'form' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')? name=ID? '{'
		//contents+=UiFormLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiFormLayout}
		public Action getUiFormLayoutAction_0() { return cUiFormLayoutAction_0; }
		
		//'form'
		public Keyword getFormKeyword_1() { return cFormKeyword_1; }
		
		//('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')?
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
		
		//'(' i18nInfo=UiI18nInfo?
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }
		
		//readonly?="readonly"? ')'
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }
		
		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//contents+=UiFormLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
		
		//UiFormLayoutAssigment
		public RuleCall getContentsUiFormLayoutAssigmentParserRuleCall_5_0() { return cContentsUiFormLayoutAssigmentParserRuleCall_5_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiFormLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiFormLayoutAssigment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiFormLayoutAssigment:
		//	element=UiEmbeddable;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiEmbeddable
		public Assignment getElementAssignment() { return cElementAssignment; }
		
		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0() { return cElementUiEmbeddableParserRuleCall_0; }
	}
	public class UiVerticalLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiVerticalLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiVerticalLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cVerticalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0 = (RuleCall)cI18nInfoAssignment_2_0_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cUnorderedGroup_2.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_0 = (RuleCall)cStylesAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cUnorderedGroup_2.eContents().get(2);
		private final Assignment cReadonlyAssignment_2_2_0 = (Assignment)cGroup_2_2.eContents().get(0);
		private final Keyword cReadonlyReadonlyKeyword_2_2_0_0 = (Keyword)cReadonlyAssignment_2_2_0.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiVerticalLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiVerticalLayout:
		//	{UiVerticalLayout}
		//	'verticalLayout' ('('
		//	i18nInfo=UiI18nInfo?
		//	& ('styles' styles=STRING)?
		//	& readonly?="readonly"?
		//	')')?
		//	name=ID?
		//	'{'
		//	contents+=UiVerticalLayoutAssigment*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiVerticalLayout} 'verticalLayout' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')?
		//name=ID? '{' contents+=UiVerticalLayoutAssigment* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiVerticalLayout}
		public Action getUiVerticalLayoutAction_0() { return cUiVerticalLayoutAction_0; }
		
		//'verticalLayout'
		public Keyword getVerticalLayoutKeyword_1() { return cVerticalLayoutKeyword_1; }
		
		//('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')?
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
		
		//'(' i18nInfo=UiI18nInfo?
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }
		
		//readonly?="readonly"? ')'
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }
		
		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//contents+=UiVerticalLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
		
		//UiVerticalLayoutAssigment
		public RuleCall getContentsUiVerticalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiVerticalLayoutAssigmentParserRuleCall_5_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiVerticalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiVerticalLayoutAssigment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiVerticalLayoutAssigment:
		//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiEmbeddable ('align' alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }
		
		//element=UiEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
		
		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0_0() { return cElementUiEmbeddableParserRuleCall_0_0; }
		
		//('align' alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'align'
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
		
		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
		
		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}
	public class UiMobileVerticalLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiVerticalLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMobileVerticalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0 = (RuleCall)cI18nInfoAssignment_2_0_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cUnorderedGroup_2.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_0 = (RuleCall)cStylesAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cUnorderedGroup_2.eContents().get(2);
		private final Assignment cReadonlyAssignment_2_2_0 = (Assignment)cGroup_2_2.eContents().get(0);
		private final Keyword cReadonlyReadonlyKeyword_2_2_0_0 = (Keyword)cReadonlyAssignment_2_2_0.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiMobileVerticalLayout UiVerticalLayout:
		//	{UiVerticalLayout}
		//	'mobileVerticalLayout' ('('
		//	i18nInfo=UiI18nInfo?
		//	& ('styles' styles=STRING)?
		//	& readonly?="readonly"?
		//	')')?
		//	name=ID?
		//	'{'
		//	contents+=UiMobileVerticalLayoutAssigment*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiVerticalLayout} 'mobileVerticalLayout' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"?
		//')')? name=ID? '{' contents+=UiMobileVerticalLayoutAssigment* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiVerticalLayout}
		public Action getUiVerticalLayoutAction_0() { return cUiVerticalLayoutAction_0; }
		
		//'mobileVerticalLayout'
		public Keyword getMobileVerticalLayoutKeyword_1() { return cMobileVerticalLayoutKeyword_1; }
		
		//('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')?
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
		
		//'(' i18nInfo=UiI18nInfo?
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }
		
		//readonly?="readonly"? ')'
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }
		
		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//contents+=UiMobileVerticalLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
		
		//UiMobileVerticalLayoutAssigment
		public RuleCall getContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiMobileVerticalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalLayoutAssigment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiMobileVerticalLayoutAssigment UiVerticalLayoutAssigment:
		//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiMobileEmbeddable ('align' alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }
		
		//element=UiMobileEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
		
		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0_0() { return cElementUiMobileEmbeddableParserRuleCall_0_0; }
		
		//('align' alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'align'
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
		
		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
		
		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}
	public class UiMobileNavigationRootElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationRoot");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileNavigationRootAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNavRootKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cContentsAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0 = (RuleCall)cContentsAssignment_4.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//UiMobileNavigationRoot:
		//	{UiMobileNavigationRoot}
		//	'navRoot'
		//	name=ID?
		//	'{'
		//	contents+=UiMobileNavigationRootAssigment '}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiMobileNavigationRoot} 'navRoot' name=ID? '{' contents+=UiMobileNavigationRootAssigment '}'
		public Group getGroup() { return cGroup; }
		
		//{UiMobileNavigationRoot}
		public Action getUiMobileNavigationRootAction_0() { return cUiMobileNavigationRootAction_0; }
		
		//'navRoot'
		public Keyword getNavRootKeyword_1() { return cNavRootKeyword_1; }
		
		//name=ID?
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
		
		//contents+=UiMobileNavigationRootAssigment
		public Assignment getContentsAssignment_4() { return cContentsAssignment_4; }
		
		//UiMobileNavigationRootAssigment
		public RuleCall getContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0() { return cContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}
	public class UiMobileNavigationRootAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationRootAssigment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiMobileNavigationPageParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiMobileNavigationRootAssigment:
		//	element=UiMobileNavigationPage;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiMobileNavigationPage
		public Assignment getElementAssignment() { return cElementAssignment; }
		
		//UiMobileNavigationPage
		public RuleCall getElementUiMobileNavigationPageParserRuleCall_0() { return cElementUiMobileNavigationPageParserRuleCall_0; }
	}
	public class UiHorizontalLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiHorizontalLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiHorizontalLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cHorizontalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0 = (RuleCall)cI18nInfoAssignment_2_0_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1 = (Assignment)cUnorderedGroup_2.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_0 = (Keyword)cReadonlyAssignment_2_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cUnorderedGroup_2.eContents().get(2);
		private final Group cGroup_2_2_0 = (Group)cGroup_2_2.eContents().get(0);
		private final Keyword cStylesKeyword_2_2_0_0 = (Keyword)cGroup_2_2_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_2_0_1 = (Assignment)cGroup_2_2_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_2_0_1_0 = (RuleCall)cStylesAssignment_2_2_0_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiHorizontalLayout:
		//	{UiHorizontalLayout}
		//	'horizontalLayout' ('('
		//	i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?
		//	& ('styles' styles=STRING)?
		//	')')?
		//	name=ID?
		//	'{'
		//	//	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
		//	contents+=UiHorizontalLayoutAssigment*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiHorizontalLayout} 'horizontalLayout' ('(' i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
		//')')? name=ID? '{' //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
		//contents+=UiHorizontalLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiHorizontalLayout}
		public Action getUiHorizontalLayoutAction_0() { return cUiHorizontalLayoutAction_0; }
		
		//'horizontalLayout'
		public Keyword getHorizontalLayoutKeyword_1() { return cHorizontalLayoutKeyword_1; }
		
		//('(' i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)? ')')?
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
		
		//'(' i18nInfo=UiI18nInfo?
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1() { return cReadonlyAssignment_2_1; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_0() { return cReadonlyReadonlyKeyword_2_1_0; }
		
		//('styles' styles=STRING)? ')'
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_2_0() { return cGroup_2_2_0; }
		
		//'styles'
		public Keyword getStylesKeyword_2_2_0_0() { return cStylesKeyword_2_2_0_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_2_0_1() { return cStylesAssignment_2_2_0_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_2_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_2_0_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }
		
		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		////	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
		//contents+=UiHorizontalLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
		
		//UiHorizontalLayoutAssigment
		public RuleCall getContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiHorizontalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiHorizontalLayoutAssigment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiHorizontalLayoutAssigment:
		//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiEmbeddable ('align' alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }
		
		//element=UiEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
		
		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0_0() { return cElementUiEmbeddableParserRuleCall_0_0; }
		
		//('align' alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'align'
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
		
		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
		
		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}
	public class UiMobileHorizontalLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalLayout");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiHorizontalLayoutAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMobileHorizontalLayoutKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0 = (RuleCall)cI18nInfoAssignment_2_0_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cUnorderedGroup_2.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_0 = (RuleCall)cStylesAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cUnorderedGroup_2.eContents().get(2);
		private final Assignment cReadonlyAssignment_2_2_0 = (Assignment)cGroup_2_2.eContents().get(0);
		private final Keyword cReadonlyReadonlyKeyword_2_2_0_0 = (Keyword)cReadonlyAssignment_2_2_0.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiMobileHorizontalLayout UiHorizontalLayout:
		//	{UiHorizontalLayout}
		//	'mobileHorizontalLayout' ('('
		//	i18nInfo=UiI18nInfo?
		//	& ('styles' styles=STRING)?
		//	& readonly?="readonly"?
		//	')')?
		//	name=ID?
		//	'{'
		//	//	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
		//	contents+=UiMobileHorizontalLayoutAssigment*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiHorizontalLayout} 'mobileHorizontalLayout' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? &
		//readonly?="readonly"? ')')? name=ID? '{' //	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
		//contents+=UiMobileHorizontalLayoutAssigment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment*
		//'}'
		public Group getGroup() { return cGroup; }
		
		//{UiHorizontalLayout}
		public Action getUiHorizontalLayoutAction_0() { return cUiHorizontalLayoutAction_0; }
		
		//'mobileHorizontalLayout'
		public Keyword getMobileHorizontalLayoutKeyword_1() { return cMobileHorizontalLayoutKeyword_1; }
		
		//('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"? ')')?
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
		
		//'(' i18nInfo=UiI18nInfo?
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0_0() { return cLeftParenthesisKeyword_2_0_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_0_1() { return cI18nInfoAssignment_2_0_1; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_0_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_0() { return cStylesKeyword_2_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1() { return cStylesAssignment_2_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_0; }
		
		//readonly?="readonly"? ')'
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_2_0() { return cReadonlyAssignment_2_2_0; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_2_0_0() { return cReadonlyReadonlyKeyword_2_2_0_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2_1() { return cRightParenthesisKeyword_2_2_1; }
		
		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		////	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
		//contents+=UiMobileHorizontalLayoutAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
		
		//UiMobileHorizontalLayoutAssigment
		public RuleCall getContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0() { return cContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiMobileHorizontalLayoutAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalLayoutAssigment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiMobileHorizontalLayoutAssigment UiHorizontalLayoutAssigment:
		//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiMobileEmbeddable ('align' alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }
		
		//element=UiMobileEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
		
		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0_0() { return cElementUiMobileEmbeddableParserRuleCall_0_0; }
		
		//('align' alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'align'
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
		
		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
		
		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}
	public class UiMobileHorizontalButtonGroupElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalButtonGroup");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiHorizontalButtonGroupAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cHorizontalButtonGroupKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cReadonlyReadonlyKeyword_2_1_2_0 = (Keyword)cReadonlyAssignment_2_1_2.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiMobileHorizontalButtonGroup UiHorizontalButtonGroup:
		//	{UiHorizontalButtonGroup}
		//	'horizontalButtonGroup' ('(' (i18nInfo=UiI18nInfo?
		//	& ('styles' styles=STRING)?
		//	& readonly?="readonly"?) ')')?
		//	name=TRANSLATABLEID?
		//	'{'
		//	contents+=UiMobileHorizontalButtonGroupAssigment*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiHorizontalButtonGroup} 'horizontalButtonGroup' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? &
		//readonly?="readonly"?) ')')? name=TRANSLATABLEID? '{' contents+=UiMobileHorizontalButtonGroupAssigment*
		//bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiHorizontalButtonGroup}
		public Action getUiHorizontalButtonGroupAction_0() { return cUiHorizontalButtonGroupAction_0; }
		
		//'horizontalButtonGroup'
		public Keyword getHorizontalButtonGroupKeyword_1() { return cHorizontalButtonGroupKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_2() { return cReadonlyAssignment_2_1_2; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_2_0() { return cReadonlyReadonlyKeyword_2_1_2_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//contents+=UiMobileHorizontalButtonGroupAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
		
		//UiMobileHorizontalButtonGroupAssigment
		public RuleCall getContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0() { return cContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiMobileHorizontalButtonGroupAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalButtonGroupAssigment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiMobileHorizontalButtonGroupAssigment UiHorizontalButtonGroupAssigment:
		//	element=UiMobileEmbeddable;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiMobileEmbeddable
		public Assignment getElementAssignment() { return cElementAssignment; }
		
		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0() { return cElementUiMobileEmbeddableParserRuleCall_0; }
	}
	public class UiMobileVerticalComponentGroupElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalComponentGroup");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiVerticalComponentGroupAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cVerticalGroupKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0 = (RuleCall)cContentsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiMobileVerticalComponentGroup UiVerticalComponentGroup:
		//	{UiVerticalComponentGroup}
		//	'verticalGroup' ('(' (i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?
		//	& ('styles' styles=STRING)?)
		//	')')?
		//	name=ID?
		//	'{'
		//	contents+=UiMobileVerticalComponentGroupAssigment*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiVerticalComponentGroup} 'verticalGroup' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles'
		//styles=STRING)?) ')')? name=ID? '{' contents+=UiMobileVerticalComponentGroupAssigment* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiVerticalComponentGroup}
		public Action getUiVerticalComponentGroupAction_0() { return cUiVerticalComponentGroupAction_0; }
		
		//'verticalGroup'
		public Keyword getVerticalGroupKeyword_1() { return cVerticalGroupKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//contents+=UiMobileVerticalComponentGroupAssigment*
		public Assignment getContentsAssignment_5() { return cContentsAssignment_5; }
		
		//UiMobileVerticalComponentGroupAssigment
		public RuleCall getContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0() { return cContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiMobileVerticalComponentGroupAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalComponentGroupAssigment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiMobileVerticalComponentGroupAssigment UiVerticalComponentGroupAssigment:
		//	element=UiMobileEmbeddable;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiMobileEmbeddable
		public Assignment getElementAssignment() { return cElementAssignment; }
		
		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0() { return cElementUiMobileEmbeddableParserRuleCall_0; }
	}
	public class UiSearchPanelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchPanel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSearchPanelAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSearchPanelKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Keyword cTypeKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cJvmTypeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_6_0 = (RuleCall)cJvmTypeAssignment_6.eContents().get(0);
		private final Keyword cSemicolonKeyword_7 = (Keyword)cGroup.eContents().get(7);
		private final Assignment cContentsAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cContentsUiSearchFieldParserRuleCall_8_0 = (RuleCall)cContentsAssignment_8.eContents().get(0);
		private final Assignment cBindingsAssignment_9 = (Assignment)cGroup.eContents().get(9);
		private final RuleCall cBindingsUiBindingParserRuleCall_9_0 = (RuleCall)cBindingsAssignment_9.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_10 = (Assignment)cGroup.eContents().get(10);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0 = (RuleCall)cProcessorAssignmentsAssignment_10.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_11 = (Keyword)cGroup.eContents().get(11);
		
		//UiSearchPanel:
		//	{UiSearchPanel}
		//	'searchPanel' ('(' (i18nInfo=UiI18nInfo?
		//	& ('styles' styles=STRING)?)
		//	')')?
		//	name=TRANSLATABLEID?
		//	'{'
		//	'type' jvmType=JvmTypeReference ';'?
		//	contents+=UiSearchField*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiSearchPanel} 'searchPanel' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? '{'
		//'type' jvmType=JvmTypeReference ';'? contents+=UiSearchField* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiSearchPanel}
		public Action getUiSearchPanelAction_0() { return cUiSearchPanelAction_0; }
		
		//'searchPanel'
		public Keyword getSearchPanelKeyword_1() { return cSearchPanelKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//'type'
		public Keyword getTypeKeyword_5() { return cTypeKeyword_5; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_6() { return cJvmTypeAssignment_6; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_6_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_6_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_7() { return cSemicolonKeyword_7; }
		
		//contents+=UiSearchField*
		public Assignment getContentsAssignment_8() { return cContentsAssignment_8; }
		
		//UiSearchField
		public RuleCall getContentsUiSearchFieldParserRuleCall_8_0() { return cContentsUiSearchFieldParserRuleCall_8_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_9() { return cBindingsAssignment_9; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_9_0() { return cBindingsUiBindingParserRuleCall_9_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_10() { return cProcessorAssignmentsAssignment_10; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_11() { return cRightCurlyBracketKeyword_11; }
	}
	public class UiMobileSearchPanelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileSearchPanel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileSearchPanelAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMobileSearchPanelKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Keyword cTypeKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cJvmTypeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_6_0 = (RuleCall)cJvmTypeAssignment_6.eContents().get(0);
		private final Keyword cSemicolonKeyword_7 = (Keyword)cGroup.eContents().get(7);
		private final Assignment cContentsAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cContentsUiSearchFieldParserRuleCall_8_0 = (RuleCall)cContentsAssignment_8.eContents().get(0);
		private final Assignment cBindingsAssignment_9 = (Assignment)cGroup.eContents().get(9);
		private final RuleCall cBindingsUiBindingParserRuleCall_9_0 = (RuleCall)cBindingsAssignment_9.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_10 = (Assignment)cGroup.eContents().get(10);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0 = (RuleCall)cProcessorAssignmentsAssignment_10.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_11 = (Keyword)cGroup.eContents().get(11);
		
		//UiMobileSearchPanel:
		//	{UiMobileSearchPanel}
		//	'mobileSearchPanel' ('(' (i18nInfo=UiI18nInfo?
		//	& ('styles' styles=STRING)?)
		//	')')?
		//	name=TRANSLATABLEID?
		//	'{'
		//	'type' jvmType=JvmTypeReference ';'?
		//	contents+=UiSearchField*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiMobileSearchPanel} 'mobileSearchPanel' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		//name=TRANSLATABLEID? '{' 'type' jvmType=JvmTypeReference ';'? contents+=UiSearchField* bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiMobileSearchPanel}
		public Action getUiMobileSearchPanelAction_0() { return cUiMobileSearchPanelAction_0; }
		
		//'mobileSearchPanel'
		public Keyword getMobileSearchPanelKeyword_1() { return cMobileSearchPanelKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//'type'
		public Keyword getTypeKeyword_5() { return cTypeKeyword_5; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_6() { return cJvmTypeAssignment_6; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_6_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_6_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_7() { return cSemicolonKeyword_7; }
		
		//contents+=UiSearchField*
		public Assignment getContentsAssignment_8() { return cContentsAssignment_8; }
		
		//UiSearchField
		public RuleCall getContentsUiSearchFieldParserRuleCall_8_0() { return cContentsUiSearchFieldParserRuleCall_8_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_9() { return cBindingsAssignment_9; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_9_0() { return cBindingsUiBindingParserRuleCall_9_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_10() { return cProcessorAssignmentsAssignment_10; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_11() { return cRightCurlyBracketKeyword_11; }
	}
	public class UiMobileTabSheetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileTabSheet");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileTabSheetAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMobileTabKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cTabsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cTabsUiMobileTabAssignmentParserRuleCall_5_0 = (RuleCall)cTabsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiMobileTabSheet:
		//	{UiMobileTabSheet}
		//	'mobileTab' ('(' (i18nInfo=UiI18nInfo?
		//	& ('styles' styles=STRING)?)
		//	')')?
		//	name=ID?
		//	'{'
		//	tabs+=UiMobileTabAssignment*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiMobileTabSheet} 'mobileTab' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{'
		//tabs+=UiMobileTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiMobileTabSheet}
		public Action getUiMobileTabSheetAction_0() { return cUiMobileTabSheetAction_0; }
		
		//'mobileTab'
		public Keyword getMobileTabKeyword_1() { return cMobileTabKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//tabs+=UiMobileTabAssignment*
		public Assignment getTabsAssignment_5() { return cTabsAssignment_5; }
		
		//UiMobileTabAssignment
		public RuleCall getTabsUiMobileTabAssignmentParserRuleCall_5_0() { return cTabsUiMobileTabAssignmentParserRuleCall_5_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiMobileTabAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileTabAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cTabKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cElementAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_2_0 = (RuleCall)cElementAssignment_2.eContents().get(0);
		
		//UiMobileTabAssignment:
		//	'tab' name=TRANSLATABLEID? element=UiMobileEmbeddable;
		@Override public ParserRule getRule() { return rule; }
		
		//'tab' name=TRANSLATABLEID? element=UiMobileEmbeddable
		public Group getGroup() { return cGroup; }
		
		//'tab'
		public Keyword getTabKeyword_0() { return cTabKeyword_0; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_1_0() { return cNameTRANSLATABLEIDParserRuleCall_1_0; }
		
		//element=UiMobileEmbeddable
		public Assignment getElementAssignment_2() { return cElementAssignment_2; }
		
		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_2_0() { return cElementUiMobileEmbeddableParserRuleCall_2_0; }
	}
	public class UiTabSheetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTabSheet");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTabSheetAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTabsheetKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cTabsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cTabsUiTabAssignmentParserRuleCall_5_0 = (RuleCall)cTabsAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiTabSheet:
		//	{UiTabSheet}
		//	'tabsheet' ('(' (i18nInfo=UiI18nInfo?
		//	& ('styles' styles=STRING)?)
		//	')')?
		//	name=ID?
		//	'{'
		//	tabs+=UiTabAssignment*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiTabSheet} 'tabsheet' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{'
		//tabs+=UiTabAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiTabSheet}
		public Action getUiTabSheetAction_0() { return cUiTabSheetAction_0; }
		
		//'tabsheet'
		public Keyword getTabsheetKeyword_1() { return cTabsheetKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//tabs+=UiTabAssignment*
		public Assignment getTabsAssignment_5() { return cTabsAssignment_5; }
		
		//UiTabAssignment
		public RuleCall getTabsUiTabAssignmentParserRuleCall_5_0() { return cTabsUiTabAssignmentParserRuleCall_5_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiTabAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTabAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cTabKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cElementAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementUiEmbeddableParserRuleCall_2_0 = (RuleCall)cElementAssignment_2.eContents().get(0);
		
		//UiTabAssignment:
		//	'tab' name=TRANSLATABLEID? element=UiEmbeddable;
		@Override public ParserRule getRule() { return rule; }
		
		//'tab' name=TRANSLATABLEID? element=UiEmbeddable
		public Group getGroup() { return cGroup; }
		
		//'tab'
		public Keyword getTabKeyword_0() { return cTabKeyword_0; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_1_0() { return cNameTRANSLATABLEIDParserRuleCall_1_0; }
		
		//element=UiEmbeddable
		public Assignment getElementAssignment_2() { return cElementAssignment_2; }
		
		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_2_0() { return cElementUiEmbeddableParserRuleCall_2_0; }
	}
	public class UiSplitpanelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSplitpanel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cSplitterKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cUnorderedGroup_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Assignment cI18nInfoAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_1_0_1_0 = (RuleCall)cI18nInfoAssignment_1_0_1.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cUnorderedGroup_1.eContents().get(1);
		private final Group cGroup_1_1_0 = (Group)cGroup_1_1.eContents().get(0);
		private final Keyword cStylesKeyword_1_1_0_0 = (Keyword)cGroup_1_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_1_1_0_1 = (Assignment)cGroup_1_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_1_1_0_1_0 = (RuleCall)cStylesAssignment_1_1_0_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_1_1 = (Keyword)cGroup_1_1.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final UnorderedGroup cUnorderedGroup_4 = (UnorderedGroup)cGroup.eContents().get(4);
		private final Group cGroup_4_0 = (Group)cUnorderedGroup_4.eContents().get(0);
		private final Keyword cFirstKeyword_4_0_0 = (Keyword)cGroup_4_0.eContents().get(0);
		private final Assignment cFirstContentAssignment_4_0_1 = (Assignment)cGroup_4_0.eContents().get(1);
		private final RuleCall cFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0 = (RuleCall)cFirstContentAssignment_4_0_1.eContents().get(0);
		private final Group cGroup_4_1 = (Group)cUnorderedGroup_4.eContents().get(1);
		private final Keyword cSecondKeyword_4_1_0 = (Keyword)cGroup_4_1.eContents().get(0);
		private final Assignment cSecondContentAssignment_4_1_1 = (Assignment)cGroup_4_1.eContents().get(1);
		private final RuleCall cSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0 = (RuleCall)cSecondContentAssignment_4_1_1.eContents().get(0);
		private final Group cGroup_4_2 = (Group)cUnorderedGroup_4.eContents().get(2);
		private final Keyword cSplitPosKeyword_4_2_0 = (Keyword)cGroup_4_2.eContents().get(0);
		private final Assignment cSplitPositionAssignment_4_2_1 = (Assignment)cGroup_4_2.eContents().get(1);
		private final RuleCall cSplitPositionINTTerminalRuleCall_4_2_1_0 = (RuleCall)cSplitPositionAssignment_4_2_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_4_3 = (Assignment)cUnorderedGroup_4.eContents().get(3);
		private final Keyword cReadonlyReadonlyKeyword_4_3_0 = (Keyword)cReadonlyAssignment_4_3.eContents().get(0);
		private final Assignment cBindingsAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cBindingsUiBindingParserRuleCall_5_0 = (RuleCall)cBindingsAssignment_5.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0 = (RuleCall)cProcessorAssignmentsAssignment_6.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//UiSplitpanel:
		//	'splitter' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? ')')? name=ID
		//	'{' ('first' firstContent=UiSplitpanelAssigment & 'second' secondContent=UiSplitpanelAssigment & ('splitPos'
		//	splitPosition=INT)?
		//	& readonly?="readonly"?) bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'splitter' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? ')')? name=ID '{' ('first'
		//firstContent=UiSplitpanelAssigment & 'second' secondContent=UiSplitpanelAssigment & ('splitPos' splitPosition=INT)? &
		//readonly?="readonly"?) bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//'splitter'
		public Keyword getSplitterKeyword_0() { return cSplitterKeyword_0; }
		
		//('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? ')')?
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//'(' i18nInfo=UiI18nInfo?
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_1_0_0() { return cLeftParenthesisKeyword_1_0_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_1_0_1() { return cI18nInfoAssignment_1_0_1; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_1_0_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_1_0_1_0; }
		
		//('styles' styles=STRING)? ')'
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//('styles' styles=STRING)?
		public Group getGroup_1_1_0() { return cGroup_1_1_0; }
		
		//'styles'
		public Keyword getStylesKeyword_1_1_0_0() { return cStylesKeyword_1_1_0_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_1_1_0_1() { return cStylesAssignment_1_1_0_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_1_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_1_1_0_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_1_1() { return cRightParenthesisKeyword_1_1_1; }
		
		//name=ID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
		
		//'first' firstContent=UiSplitpanelAssigment & 'second' secondContent=UiSplitpanelAssigment & ('splitPos'
		//splitPosition=INT)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_4() { return cUnorderedGroup_4; }
		
		//'first' firstContent=UiSplitpanelAssigment
		public Group getGroup_4_0() { return cGroup_4_0; }
		
		//'first'
		public Keyword getFirstKeyword_4_0_0() { return cFirstKeyword_4_0_0; }
		
		//firstContent=UiSplitpanelAssigment
		public Assignment getFirstContentAssignment_4_0_1() { return cFirstContentAssignment_4_0_1; }
		
		//UiSplitpanelAssigment
		public RuleCall getFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0() { return cFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0; }
		
		//'second' secondContent=UiSplitpanelAssigment
		public Group getGroup_4_1() { return cGroup_4_1; }
		
		//'second'
		public Keyword getSecondKeyword_4_1_0() { return cSecondKeyword_4_1_0; }
		
		//secondContent=UiSplitpanelAssigment
		public Assignment getSecondContentAssignment_4_1_1() { return cSecondContentAssignment_4_1_1; }
		
		//UiSplitpanelAssigment
		public RuleCall getSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0() { return cSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0; }
		
		//('splitPos' splitPosition=INT)?
		public Group getGroup_4_2() { return cGroup_4_2; }
		
		//'splitPos'
		public Keyword getSplitPosKeyword_4_2_0() { return cSplitPosKeyword_4_2_0; }
		
		//splitPosition=INT
		public Assignment getSplitPositionAssignment_4_2_1() { return cSplitPositionAssignment_4_2_1; }
		
		//INT
		public RuleCall getSplitPositionINTTerminalRuleCall_4_2_1_0() { return cSplitPositionINTTerminalRuleCall_4_2_1_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_4_3() { return cReadonlyAssignment_4_3; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_4_3_0() { return cReadonlyReadonlyKeyword_4_3_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_5() { return cBindingsAssignment_5; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_5_0() { return cBindingsUiBindingParserRuleCall_5_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_6() { return cProcessorAssignmentsAssignment_6; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
	}
	public class UiSplitpanelAssigmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSplitpanelAssigment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiSplitpanelAssigment:
		//	element=UiEmbeddable;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiEmbeddable
		public Assignment getElementAssignment() { return cElementAssignment; }
		
		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0() { return cElementUiEmbeddableParserRuleCall_0; }
	}
	public class UiPanelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPanel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cPanelKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1_1 = (UnorderedGroup)cGroup_1.eContents().get(1);
		private final Assignment cI18nInfoAssignment_1_1_0 = (Assignment)cUnorderedGroup_1_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_1_1_0_0 = (RuleCall)cI18nInfoAssignment_1_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_1_1_1 = (Assignment)cUnorderedGroup_1_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_1_1_1_0 = (Keyword)cReadonlyAssignment_1_1_1.eContents().get(0);
		private final Group cGroup_1_1_2 = (Group)cUnorderedGroup_1_1.eContents().get(2);
		private final Keyword cStylesKeyword_1_1_2_0 = (Keyword)cGroup_1_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_1_1_2_1 = (Assignment)cGroup_1_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_1_1_2_1_0 = (RuleCall)cStylesAssignment_1_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Keyword cContentKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cContentAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContentUiEmbeddableParserRuleCall_5_0 = (RuleCall)cContentAssignment_5.eContents().get(0);
		private final Assignment cBindingsAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cBindingsUiBindingParserRuleCall_6_0 = (RuleCall)cBindingsAssignment_6.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0 = (RuleCall)cProcessorAssignmentsAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//UiPanel:
		//	'panel' ('(' (i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?
		//	& ('styles' styles=STRING)?)
		//	')')?
		//	name=TRANSLATABLEID
		//	'{'
		//	'content' content=UiEmbeddable
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//'panel' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID '{'
		//'content' content=UiEmbeddable bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//'panel'
		public Keyword getPanelKeyword_0() { return cPanelKeyword_0; }
		
		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_1() { return cGroup_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_1_0() { return cLeftParenthesisKeyword_1_0; }
		
		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_1_1() { return cUnorderedGroup_1_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_1_1_0() { return cI18nInfoAssignment_1_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_1_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_1_1_0_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_1_1_1() { return cReadonlyAssignment_1_1_1; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_1_1_1_0() { return cReadonlyReadonlyKeyword_1_1_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_1_1_2() { return cGroup_1_1_2; }
		
		//'styles'
		public Keyword getStylesKeyword_1_1_2_0() { return cStylesKeyword_1_1_2_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_1_1_2_1() { return cStylesAssignment_1_1_2_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_1_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_1_1_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_2() { return cRightParenthesisKeyword_1_2; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_2_0() { return cNameTRANSLATABLEIDParserRuleCall_2_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
		
		//'content'
		public Keyword getContentKeyword_4() { return cContentKeyword_4; }
		
		//content=UiEmbeddable
		public Assignment getContentAssignment_5() { return cContentAssignment_5; }
		
		//UiEmbeddable
		public RuleCall getContentUiEmbeddableParserRuleCall_5_0() { return cContentUiEmbeddableParserRuleCall_5_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_6() { return cBindingsAssignment_6; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_6_0() { return cBindingsUiBindingParserRuleCall_6_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_7() { return cProcessorAssignmentsAssignment_7; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class UiDialogElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialog");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiDialogAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDialogKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cTypeKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cJvmTypeAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0 = (RuleCall)cJvmTypeAssignment_5_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_5_2 = (Keyword)cGroup_5.eContents().get(2);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Assignment cContentAssignment_6_0 = (Assignment)cGroup_6.eContents().get(0);
		private final RuleCall cContentUiDialogAssignmentParserRuleCall_6_0_0 = (RuleCall)cContentAssignment_6_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
		private final Assignment cBindingsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cBindingsUiBindingParserRuleCall_7_0 = (RuleCall)cBindingsAssignment_7.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0 = (RuleCall)cProcessorAssignmentsAssignment_8.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_9 = (Keyword)cGroup.eContents().get(9);
		
		//UiDialog:
		//	{UiDialog}
		//	'dialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? '{' ('type'
		//	jvmType=JvmTypeReference ';'?)? (content=UiDialogAssignment ';'?)?
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiDialog} 'dialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? '{' ('type'
		//jvmType=JvmTypeReference ';'?)? (content=UiDialogAssignment ';'?)? bindings+=UiBinding*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiDialog}
		public Action getUiDialogAction_0() { return cUiDialogAction_0; }
		
		//'dialog'
		public Keyword getDialogKeyword_1() { return cDialogKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//('type' jvmType=JvmTypeReference ';'?)?
		public Group getGroup_5() { return cGroup_5; }
		
		//'type'
		public Keyword getTypeKeyword_5_0() { return cTypeKeyword_5_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_5_1() { return cJvmTypeAssignment_5_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_5_2() { return cSemicolonKeyword_5_2; }
		
		//(content=UiDialogAssignment ';'?)?
		public Group getGroup_6() { return cGroup_6; }
		
		//content=UiDialogAssignment
		public Assignment getContentAssignment_6_0() { return cContentAssignment_6_0; }
		
		//UiDialogAssignment
		public RuleCall getContentUiDialogAssignmentParserRuleCall_6_0_0() { return cContentUiDialogAssignmentParserRuleCall_6_0_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_6_1() { return cSemicolonKeyword_6_1; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_7() { return cBindingsAssignment_7; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_7_0() { return cBindingsUiBindingParserRuleCall_7_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_8() { return cProcessorAssignmentsAssignment_8; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_9() { return cRightCurlyBracketKeyword_9; }
	}
	public class UiDialogAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogAssignment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiEmbeddableParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiDialogAssignment:
		//	element=UiEmbeddable;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiEmbeddable
		public Assignment getElementAssignment() { return cElementAssignment; }
		
		//UiEmbeddable
		public RuleCall getElementUiEmbeddableParserRuleCall_0() { return cElementUiEmbeddableParserRuleCall_0; }
	}
	public class UiSearchDialogElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchDialog");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSearchDialogAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSearchdialogKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cTypeKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cJvmTypeAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0 = (RuleCall)cJvmTypeAssignment_5_1.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cSearchKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
		private final Assignment cSearchFieldsAssignment_6_2 = (Assignment)cGroup_6.eContents().get(2);
		private final RuleCall cSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0 = (RuleCall)cSearchFieldsAssignment_6_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6_3 = (Keyword)cGroup_6.eContents().get(3);
		private final Group cGroup_7 = (Group)cGroup.eContents().get(7);
		private final Keyword cContentKeyword_7_0 = (Keyword)cGroup_7.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_7_1 = (Keyword)cGroup_7.eContents().get(1);
		private final Assignment cContentAssignment_7_2 = (Assignment)cGroup_7.eContents().get(2);
		private final RuleCall cContentUiDialogAssignmentParserRuleCall_7_2_0 = (RuleCall)cContentAssignment_7_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_3 = (Keyword)cGroup_7.eContents().get(3);
		private final Assignment cBindingsAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cBindingsUiBindingParserRuleCall_8_0 = (RuleCall)cBindingsAssignment_8.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_9 = (Assignment)cGroup.eContents().get(9);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0 = (RuleCall)cProcessorAssignmentsAssignment_9.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_10 = (Keyword)cGroup.eContents().get(10);
		
		//UiSearchDialog:
		//	{UiSearchDialog}
		//	'searchdialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? '{' ('type'
		//	jvmType=JvmTypeReference)? ('search' '{'
		//	searchFields+=UiDialogSearchFieldAssignment*
		//	'}')? ('content' '{'
		//	content=UiDialogAssignment
		//	'}')?
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiSearchDialog} 'searchdialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? '{'
		//('type' jvmType=JvmTypeReference)? ('search' '{' searchFields+=UiDialogSearchFieldAssignment* '}')? ('content' '{'
		//content=UiDialogAssignment '}')? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiSearchDialog}
		public Action getUiSearchDialogAction_0() { return cUiSearchDialogAction_0; }
		
		//'searchdialog'
		public Keyword getSearchdialogKeyword_1() { return cSearchdialogKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//('type' jvmType=JvmTypeReference)?
		public Group getGroup_5() { return cGroup_5; }
		
		//'type'
		public Keyword getTypeKeyword_5_0() { return cTypeKeyword_5_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_5_1() { return cJvmTypeAssignment_5_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0; }
		
		//('search' '{' searchFields+=UiDialogSearchFieldAssignment* '}')?
		public Group getGroup_6() { return cGroup_6; }
		
		//'search'
		public Keyword getSearchKeyword_6_0() { return cSearchKeyword_6_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_6_1() { return cLeftCurlyBracketKeyword_6_1; }
		
		//searchFields+=UiDialogSearchFieldAssignment*
		public Assignment getSearchFieldsAssignment_6_2() { return cSearchFieldsAssignment_6_2; }
		
		//UiDialogSearchFieldAssignment
		public RuleCall getSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0() { return cSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_6_3() { return cRightCurlyBracketKeyword_6_3; }
		
		//('content' '{' content=UiDialogAssignment '}')?
		public Group getGroup_7() { return cGroup_7; }
		
		//'content'
		public Keyword getContentKeyword_7_0() { return cContentKeyword_7_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7_1() { return cLeftCurlyBracketKeyword_7_1; }
		
		//content=UiDialogAssignment
		public Assignment getContentAssignment_7_2() { return cContentAssignment_7_2; }
		
		//UiDialogAssignment
		public RuleCall getContentUiDialogAssignmentParserRuleCall_7_2_0() { return cContentUiDialogAssignmentParserRuleCall_7_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7_3() { return cRightCurlyBracketKeyword_7_3; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_8() { return cBindingsAssignment_8; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_8_0() { return cBindingsUiBindingParserRuleCall_8_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_9() { return cProcessorAssignmentsAssignment_9; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_10() { return cRightCurlyBracketKeyword_10; }
	}
	public class UiDialogSearchFieldAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogSearchFieldAssignment");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cElementUiSearchFieldParserRuleCall_0 = (RuleCall)cElementAssignment.eContents().get(0);
		
		//UiDialogSearchFieldAssignment:
		//	element=UiSearchField;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiSearchField
		public Assignment getElementAssignment() { return cElementAssignment; }
		
		//UiSearchField
		public RuleCall getElementUiSearchFieldParserRuleCall_0() { return cElementUiSearchFieldParserRuleCall_0; }
	}
	public class UiMobileNavigationPageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPage");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileNavigationPageAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNavPageKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameIDTerminalRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cTypeKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cJvmTypeAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0 = (RuleCall)cJvmTypeAssignment_5_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_5_2 = (Keyword)cGroup_5.eContents().get(2);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cNavbarActionsKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
		private final Assignment cBarActionsAssignment_6_2 = (Assignment)cGroup_6.eContents().get(2);
		private final RuleCall cBarActionsUiMobileNavBarActionParserRuleCall_6_2_0 = (RuleCall)cBarActionsAssignment_6_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6_3 = (Keyword)cGroup_6.eContents().get(3);
		private final Assignment cContentsAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0 = (RuleCall)cContentsAssignment_7.eContents().get(0);
		private final Assignment cBindingsAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cBindingsUiBindingParserRuleCall_8_0 = (RuleCall)cBindingsAssignment_8.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_9 = (Assignment)cGroup.eContents().get(9);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0 = (RuleCall)cProcessorAssignmentsAssignment_9.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_10 = (Keyword)cGroup.eContents().get(10);
		
		//UiMobileNavigationPage:
		//	{UiMobileNavigationPage}
		//	'navPage' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type' jvmType=JvmTypeReference
		//	';'?)? ('navbarActions' '{'
		//	barActions+=UiMobileNavBarAction*
		//	'}')?
		//	contents+=UiMobileNavigationPageAssignment*
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiMobileNavigationPage} 'navPage' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type'
		//jvmType=JvmTypeReference ';'?)? ('navbarActions' '{' barActions+=UiMobileNavBarAction* '}')?
		//contents+=UiMobileNavigationPageAssignment* bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment*
		//'}'
		public Group getGroup() { return cGroup; }
		
		//{UiMobileNavigationPage}
		public Action getUiMobileNavigationPageAction_0() { return cUiMobileNavigationPageAction_0; }
		
		//'navPage'
		public Keyword getNavPageKeyword_1() { return cNavPageKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=ID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_3_0() { return cNameIDTerminalRuleCall_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//('type' jvmType=JvmTypeReference ';'?)?
		public Group getGroup_5() { return cGroup_5; }
		
		//'type'
		public Keyword getTypeKeyword_5_0() { return cTypeKeyword_5_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_5_1() { return cJvmTypeAssignment_5_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_5_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_5_2() { return cSemicolonKeyword_5_2; }
		
		//('navbarActions' '{' barActions+=UiMobileNavBarAction* '}')?
		public Group getGroup_6() { return cGroup_6; }
		
		//'navbarActions'
		public Keyword getNavbarActionsKeyword_6_0() { return cNavbarActionsKeyword_6_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_6_1() { return cLeftCurlyBracketKeyword_6_1; }
		
		//barActions+=UiMobileNavBarAction*
		public Assignment getBarActionsAssignment_6_2() { return cBarActionsAssignment_6_2; }
		
		//UiMobileNavBarAction
		public RuleCall getBarActionsUiMobileNavBarActionParserRuleCall_6_2_0() { return cBarActionsUiMobileNavBarActionParserRuleCall_6_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_6_3() { return cRightCurlyBracketKeyword_6_3; }
		
		//contents+=UiMobileNavigationPageAssignment*
		public Assignment getContentsAssignment_7() { return cContentsAssignment_7; }
		
		//UiMobileNavigationPageAssignment
		public RuleCall getContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0() { return cContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_8() { return cBindingsAssignment_8; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_8_0() { return cBindingsUiBindingParserRuleCall_8_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_9() { return cProcessorAssignmentsAssignment_9; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_10() { return cRightCurlyBracketKeyword_10; }
	}
	public class UiMobileNavigationPageAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPageAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cElementAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cElementUiMobileEmbeddableParserRuleCall_0_0 = (RuleCall)cElementAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cAlignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cAlignmentAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cAlignmentUiAlignmentEnumRuleCall_1_1_0 = (RuleCall)cAlignmentAssignment_1_1.eContents().get(0);
		
		//UiMobileNavigationPageAssignment:
		//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
		@Override public ParserRule getRule() { return rule; }
		
		//element=UiMobileEmbeddable ('align' alignment=UiAlignment)?
		public Group getGroup() { return cGroup; }
		
		//element=UiMobileEmbeddable
		public Assignment getElementAssignment_0() { return cElementAssignment_0; }
		
		//UiMobileEmbeddable
		public RuleCall getElementUiMobileEmbeddableParserRuleCall_0_0() { return cElementUiMobileEmbeddableParserRuleCall_0_0; }
		
		//('align' alignment=UiAlignment)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'align'
		public Keyword getAlignKeyword_1_0() { return cAlignKeyword_1_0; }
		
		//alignment=UiAlignment
		public Assignment getAlignmentAssignment_1_1() { return cAlignmentAssignment_1_1; }
		
		//UiAlignment
		public RuleCall getAlignmentUiAlignmentEnumRuleCall_1_1_0() { return cAlignmentUiAlignmentEnumRuleCall_1_1_0; }
	}
	public class UiPointElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPoint");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cXAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cXINTTerminalRuleCall_0_0 = (RuleCall)cXAssignment_0.eContents().get(0);
		private final Keyword cSolidusKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cYAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cYINTTerminalRuleCall_2_0 = (RuleCall)cYAssignment_2.eContents().get(0);
		
		//UiPoint:
		//	x=INT '/' y=INT;
		@Override public ParserRule getRule() { return rule; }
		
		//x=INT '/' y=INT
		public Group getGroup() { return cGroup; }
		
		//x=INT
		public Assignment getXAssignment_0() { return cXAssignment_0; }
		
		//INT
		public RuleCall getXINTTerminalRuleCall_0_0() { return cXINTTerminalRuleCall_0_0; }
		
		//'/'
		public Keyword getSolidusKeyword_1() { return cSolidusKeyword_1; }
		
		//y=INT
		public Assignment getYAssignment_2() { return cYAssignment_2; }
		
		//INT
		public RuleCall getYINTTerminalRuleCall_2_0() { return cYINTTerminalRuleCall_2_0; }
	}
	public class UiTextFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTextField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTextFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTextfieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cMaxLengthKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cMaxLengthAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cMaxLengthINTTerminalRuleCall_2_1_0_1_0 = (RuleCall)cMaxLengthAssignment_2_1_0_1.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMinLengthKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cMinLengthAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cMinLengthINTTerminalRuleCall_2_1_1_1_0 = (RuleCall)cMinLengthAssignment_2_1_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cRegexKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cRegexAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cRegexSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cRegexAssignment_2_1_2_1.eContents().get(0);
		private final Group cGroup_2_1_3 = (Group)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cStylesKeyword_2_1_3_0 = (Keyword)cGroup_2_1_3.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_3_1 = (Assignment)cGroup_2_1_3.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_3_1_0 = (RuleCall)cStylesAssignment_2_1_3_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_4 = (Assignment)cUnorderedGroup_2_1.eContents().get(4);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_4_0 = (RuleCall)cI18nInfoAssignment_2_1_4.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_5 = (Assignment)cUnorderedGroup_2_1.eContents().get(5);
		private final Keyword cReadonlyReadonlyKeyword_2_1_5_0 = (Keyword)cReadonlyAssignment_2_1_5.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiTextField:
		//	{UiTextField}
		//	'textfield' ('(' (('maxLength=' maxLength=INT)?
		//	& ('minLength=' minLength=INT)?
		//	& ('regex=' regex=STRING)?
		//	& ('styles' styles=STRING)?
		//	& i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiTextField} 'textfield' ('(' (('maxLength=' maxLength=INT)? & ('minLength=' minLength=INT)? & ('regex=' regex=STRING)?
		//& ('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')? name=TRANSLATABLEID? ('{'
		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiTextField}
		public Action getUiTextFieldAction_0() { return cUiTextFieldAction_0; }
		
		//'textfield'
		public Keyword getTextfieldKeyword_1() { return cTextfieldKeyword_1; }
		
		//('(' (('maxLength=' maxLength=INT)? & ('minLength=' minLength=INT)? & ('regex=' regex=STRING)? & ('styles'
		//styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//('maxLength=' maxLength=INT)? & ('minLength=' minLength=INT)? & ('regex=' regex=STRING)? & ('styles' styles=STRING)? &
		//i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('maxLength=' maxLength=INT)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'maxLength='
		public Keyword getMaxLengthKeyword_2_1_0_0() { return cMaxLengthKeyword_2_1_0_0; }
		
		//maxLength=INT
		public Assignment getMaxLengthAssignment_2_1_0_1() { return cMaxLengthAssignment_2_1_0_1; }
		
		//INT
		public RuleCall getMaxLengthINTTerminalRuleCall_2_1_0_1_0() { return cMaxLengthINTTerminalRuleCall_2_1_0_1_0; }
		
		//('minLength=' minLength=INT)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'minLength='
		public Keyword getMinLengthKeyword_2_1_1_0() { return cMinLengthKeyword_2_1_1_0; }
		
		//minLength=INT
		public Assignment getMinLengthAssignment_2_1_1_1() { return cMinLengthAssignment_2_1_1_1; }
		
		//INT
		public RuleCall getMinLengthINTTerminalRuleCall_2_1_1_1_0() { return cMinLengthINTTerminalRuleCall_2_1_1_1_0; }
		
		//('regex=' regex=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'regex='
		public Keyword getRegexKeyword_2_1_2_0() { return cRegexKeyword_2_1_2_0; }
		
		//regex=STRING
		public Assignment getRegexAssignment_2_1_2_1() { return cRegexAssignment_2_1_2_1; }
		
		//STRING
		public RuleCall getRegexSTRINGTerminalRuleCall_2_1_2_1_0() { return cRegexSTRINGTerminalRuleCall_2_1_2_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_3() { return cGroup_2_1_3; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_3_0() { return cStylesKeyword_2_1_3_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_3_1() { return cStylesAssignment_2_1_3_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_3_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_3_1_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_4() { return cI18nInfoAssignment_2_1_4; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_4_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_5() { return cReadonlyAssignment_2_1_5; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_5_0() { return cReadonlyReadonlyKeyword_2_1_5_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiPasswordFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPasswordField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiPasswordFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cPasswordFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0 = (RuleCall)cI18nInfoAssignment_2_1_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cReadonlyReadonlyKeyword_2_1_2_0 = (Keyword)cReadonlyAssignment_2_1_2.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiPasswordField:
		//	{UiPasswordField}
		//	'passwordField' ('(' (('styles' styles=STRING)?
		//	& i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiPasswordField} 'passwordField' ('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
		//name=TRANSLATABLEID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiPasswordField}
		public Action getUiPasswordFieldAction_0() { return cUiPasswordFieldAction_0; }
		
		//'passwordField'
		public Keyword getPasswordFieldKeyword_1() { return cPasswordFieldKeyword_1; }
		
		//('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_2() { return cReadonlyAssignment_2_1_2; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_2_0() { return cReadonlyReadonlyKeyword_2_1_2_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiMaskedTextFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMaskedTextField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMaskedTextFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaskedTextKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMaskKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cMaskAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cMaskSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cMaskAssignment_2_1_1_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_2_0 = (RuleCall)cI18nInfoAssignment_2_1_2.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cReadonlyReadonlyKeyword_2_1_3_0 = (Keyword)cReadonlyAssignment_2_1_3.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiMaskedTextField:
		//	{UiMaskedTextField}
		//	'maskedText' ('(' (('styles' styles=STRING)?
		//	& ('mask=' mask=STRING)?
		//	& i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiMaskedTextField} 'maskedText' ('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?) ')')? name=TRANSLATABLEID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiMaskedTextField}
		public Action getUiMaskedTextFieldAction_0() { return cUiMaskedTextFieldAction_0; }
		
		//'maskedText'
		public Keyword getMaskedTextKeyword_1() { return cMaskedTextKeyword_1; }
		
		//('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
		
		//('mask=' mask=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'mask='
		public Keyword getMaskKeyword_2_1_1_0() { return cMaskKeyword_2_1_1_0; }
		
		//mask=STRING
		public Assignment getMaskAssignment_2_1_1_1() { return cMaskAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getMaskSTRINGTerminalRuleCall_2_1_1_1_0() { return cMaskSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_2() { return cI18nInfoAssignment_2_1_2; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_2_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiMaskedNumericFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMaskedNumericField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMaskedNumericFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaskedNumericKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0 = (RuleCall)cI18nInfoAssignment_2_1_1.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cReadonlyReadonlyKeyword_2_1_2_0 = (Keyword)cReadonlyAssignment_2_1_2.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiMaskedNumericField:
		//	{UiMaskedNumericField}
		//	'maskedNumeric' ('(' (('styles' styles=STRING)?
		//	& i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiMaskedNumericField} 'maskedNumeric' ('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?)
		//')')? name=TRANSLATABLEID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiMaskedNumericField}
		public Action getUiMaskedNumericFieldAction_0() { return cUiMaskedNumericFieldAction_0; }
		
		//'maskedNumeric'
		public Keyword getMaskedNumericKeyword_1() { return cMaskedNumericKeyword_1; }
		
		//('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_2() { return cReadonlyAssignment_2_1_2; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_2_0() { return cReadonlyReadonlyKeyword_2_1_2_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiMaskedDecimalFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMaskedDecimalField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMaskedDecimalFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaskedDecimalKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMaskKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cMaskAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cMaskSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cMaskAssignment_2_1_1_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_2_0 = (RuleCall)cI18nInfoAssignment_2_1_2.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cReadonlyReadonlyKeyword_2_1_3_0 = (Keyword)cReadonlyAssignment_2_1_3.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiMaskedDecimalField:
		//	{UiMaskedDecimalField}
		//	'maskedDecimal' ('(' (('styles' styles=STRING)?
		//	& ('mask=' mask=STRING)?
		//	& i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiMaskedDecimalField} 'maskedDecimal' ('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?) ')')? name=TRANSLATABLEID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiMaskedDecimalField}
		public Action getUiMaskedDecimalFieldAction_0() { return cUiMaskedDecimalFieldAction_0; }
		
		//'maskedDecimal'
		public Keyword getMaskedDecimalKeyword_1() { return cMaskedDecimalKeyword_1; }
		
		//('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//('styles' styles=STRING)? & ('mask=' mask=STRING)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
		
		//('mask=' mask=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'mask='
		public Keyword getMaskKeyword_2_1_1_0() { return cMaskKeyword_2_1_1_0; }
		
		//mask=STRING
		public Assignment getMaskAssignment_2_1_1_1() { return cMaskAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getMaskSTRINGTerminalRuleCall_2_1_1_1_0() { return cMaskSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_2() { return cI18nInfoAssignment_2_1_2; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_2_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiPrefixedMaskedTextFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPrefixedMaskedTextField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiPrefixedMaskedTextFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaskedTextWithPrefixKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cMaskKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cMaskAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cMaskSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cMaskAssignment_2_1_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cPrefixesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_2_1_2_1 = (Keyword)cGroup_2_1_2.eContents().get(1);
		private final Assignment cPrefixMasksAssignment_2_1_2_2 = (Assignment)cGroup_2_1_2.eContents().get(2);
		private final RuleCall cPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0 = (RuleCall)cPrefixMasksAssignment_2_1_2_2.eContents().get(0);
		private final Group cGroup_2_1_2_3 = (Group)cGroup_2_1_2.eContents().get(3);
		private final Keyword cCommaKeyword_2_1_2_3_0 = (Keyword)cGroup_2_1_2_3.eContents().get(0);
		private final Assignment cPrefixMasksAssignment_2_1_2_3_1 = (Assignment)cGroup_2_1_2_3.eContents().get(1);
		private final RuleCall cPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0 = (RuleCall)cPrefixMasksAssignment_2_1_2_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_1_2_4 = (Keyword)cGroup_2_1_2.eContents().get(4);
		private final Assignment cI18nInfoAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0 = (RuleCall)cI18nInfoAssignment_2_1_3.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_4 = (Assignment)cUnorderedGroup_2_1.eContents().get(4);
		private final Keyword cReadonlyReadonlyKeyword_2_1_4_0 = (Keyword)cReadonlyAssignment_2_1_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiPrefixedMaskedTextField:
		//	{UiPrefixedMaskedTextField}
		//	'maskedTextWithPrefix' ('(' (('styles' styles=STRING)?
		//	& ('mask=' mask=STRING)?
		//	& ('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (',' prefixMasks+=UiPrefixToMaskMapEntry)* ')')?
		//	& i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiPrefixedMaskedTextField} 'maskedTextWithPrefix' ('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? &
		//('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (',' prefixMasks+=UiPrefixToMaskMapEntry)* ')')? &
		//i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')? name=TRANSLATABLEID? ('{' (validators+=UiValidator |
		//bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiPrefixedMaskedTextField}
		public Action getUiPrefixedMaskedTextFieldAction_0() { return cUiPrefixedMaskedTextFieldAction_0; }
		
		//'maskedTextWithPrefix'
		public Keyword getMaskedTextWithPrefixKeyword_1() { return cMaskedTextWithPrefixKeyword_1; }
		
		//('(' (('styles' styles=STRING)? & ('mask=' mask=STRING)? & ('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (','
		//prefixMasks+=UiPrefixToMaskMapEntry)* ')')? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//('styles' styles=STRING)? & ('mask=' mask=STRING)? & ('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (','
		//prefixMasks+=UiPrefixToMaskMapEntry)* ')')? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
		
		//('mask=' mask=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'mask='
		public Keyword getMaskKeyword_2_1_1_0() { return cMaskKeyword_2_1_1_0; }
		
		//mask=STRING
		public Assignment getMaskAssignment_2_1_1_1() { return cMaskAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getMaskSTRINGTerminalRuleCall_2_1_1_1_0() { return cMaskSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (',' prefixMasks+=UiPrefixToMaskMapEntry)* ')')?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'prefixes='
		public Keyword getPrefixesKeyword_2_1_2_0() { return cPrefixesKeyword_2_1_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_1_2_1() { return cLeftParenthesisKeyword_2_1_2_1; }
		
		//prefixMasks+=UiPrefixToMaskMapEntry
		public Assignment getPrefixMasksAssignment_2_1_2_2() { return cPrefixMasksAssignment_2_1_2_2; }
		
		//UiPrefixToMaskMapEntry
		public RuleCall getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0() { return cPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0; }
		
		//(',' prefixMasks+=UiPrefixToMaskMapEntry)*
		public Group getGroup_2_1_2_3() { return cGroup_2_1_2_3; }
		
		//','
		public Keyword getCommaKeyword_2_1_2_3_0() { return cCommaKeyword_2_1_2_3_0; }
		
		//prefixMasks+=UiPrefixToMaskMapEntry
		public Assignment getPrefixMasksAssignment_2_1_2_3_1() { return cPrefixMasksAssignment_2_1_2_3_1; }
		
		//UiPrefixToMaskMapEntry
		public RuleCall getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0() { return cPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_1_2_4() { return cRightParenthesisKeyword_2_1_2_4; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_3() { return cI18nInfoAssignment_2_1_3; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_4() { return cReadonlyAssignment_2_1_4; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_4_0() { return cReadonlyReadonlyKeyword_2_1_4_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiPrefixToMaskMapEntryElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiPrefixToMaskMapEntry");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiPrefixToMaskMapEntryAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cPrefixKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cKeyAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cKeySTRINGTerminalRuleCall_2_0 = (RuleCall)cKeyAssignment_2.eContents().get(0);
		private final Keyword cMaskKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cValueAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cValueSTRINGTerminalRuleCall_4_0 = (RuleCall)cValueAssignment_4.eContents().get(0);
		
		//UiPrefixToMaskMapEntry:
		//	{UiPrefixToMaskMapEntry}
		//	'prefix' key=STRING 'mask' value=STRING;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiPrefixToMaskMapEntry} 'prefix' key=STRING 'mask' value=STRING
		public Group getGroup() { return cGroup; }
		
		//{UiPrefixToMaskMapEntry}
		public Action getUiPrefixToMaskMapEntryAction_0() { return cUiPrefixToMaskMapEntryAction_0; }
		
		//'prefix'
		public Keyword getPrefixKeyword_1() { return cPrefixKeyword_1; }
		
		//key=STRING
		public Assignment getKeyAssignment_2() { return cKeyAssignment_2; }
		
		//STRING
		public RuleCall getKeySTRINGTerminalRuleCall_2_0() { return cKeySTRINGTerminalRuleCall_2_0; }
		
		//'mask'
		public Keyword getMaskKeyword_3() { return cMaskKeyword_3; }
		
		//value=STRING
		public Assignment getValueAssignment_4() { return cValueAssignment_4; }
		
		//STRING
		public RuleCall getValueSTRINGTerminalRuleCall_4_0() { return cValueSTRINGTerminalRuleCall_4_0; }
	}
	public class UiRichTextAreaElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiRichTextArea");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiRichTextAreaAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cRichtextAreaKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cStylesKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_0_1 = (Assignment)cGroup_2_1_0.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_0_1_0 = (RuleCall)cStylesAssignment_2_1_0_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0 = (RuleCall)cI18nInfoAssignment_2_1_1.eContents().get(0);
		private final Assignment cAsBlobAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cAsBlobAsBlobKeyword_2_1_2_0 = (Keyword)cAsBlobAssignment_2_1_2.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cReadonlyReadonlyKeyword_2_1_3_0 = (Keyword)cReadonlyAssignment_2_1_3.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiRichTextArea:
		//	{UiRichTextArea}
		//	'richtextArea' ('(' (('styles' styles=STRING)?
		//	& i18nInfo=UiI18nInfo?
		//	& asBlob?="asBlob"?
		//	& readonly?="readonly"?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiRichTextArea} 'richtextArea' ('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? &
		//readonly?="readonly"?) ')')? name=TRANSLATABLEID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiRichTextArea}
		public Action getUiRichTextAreaAction_0() { return cUiRichTextAreaAction_0; }
		
		//'richtextArea'
		public Keyword getRichtextAreaKeyword_1() { return cRichtextAreaKeyword_1; }
		
		//('(' (('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? & readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//('styles' styles=STRING)? & i18nInfo=UiI18nInfo? & asBlob?="asBlob"? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_0_0() { return cStylesKeyword_2_1_0_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_0_1() { return cStylesAssignment_2_1_0_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_0_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_0_1_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_1() { return cI18nInfoAssignment_2_1_1; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_1_0; }
		
		//asBlob?="asBlob"?
		public Assignment getAsBlobAssignment_2_1_2() { return cAsBlobAssignment_2_1_2; }
		
		//"asBlob"
		public Keyword getAsBlobAsBlobKeyword_2_1_2_0() { return cAsBlobAsBlobKeyword_2_1_2_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_3() { return cReadonlyAssignment_2_1_3; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_3_0() { return cReadonlyReadonlyKeyword_2_1_3_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiSuggestTextFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSuggestTextField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSuggestTextFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSuggestTextKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_0_2 = (Keyword)cGroup_4_1_0.eContents().get(2);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cCaptionFieldKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cItemCaptionPropertyAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final CrossReference cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0 = (CrossReference)cItemCaptionPropertyAssignment_4_1_1_1.eContents().get(0);
		private final RuleCall cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1 = (RuleCall)cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_1_2 = (Keyword)cGroup_4_1_1.eContents().get(2);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cFilterFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cItemFilterPropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final CrossReference cItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0 = (CrossReference)cItemFilterPropertyAssignment_4_1_2_1.eContents().get(0);
		private final RuleCall cItemFilterPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1 = (RuleCall)cItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_2_2 = (Keyword)cGroup_4_1_2.eContents().get(2);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Keyword cUuidFieldKeyword_4_1_3_0 = (Keyword)cGroup_4_1_3.eContents().get(0);
		private final Assignment cItemUUIDPropertyAssignment_4_1_3_1 = (Assignment)cGroup_4_1_3.eContents().get(1);
		private final CrossReference cItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0 = (CrossReference)cItemUUIDPropertyAssignment_4_1_3_1.eContents().get(0);
		private final RuleCall cItemUUIDPropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1 = (RuleCall)cItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_3_2 = (Keyword)cGroup_4_1_3.eContents().get(2);
		private final Assignment cAutoHidePopupAssignment_4_1_4 = (Assignment)cUnorderedGroup_4_1.eContents().get(4);
		private final Keyword cAutoHidePopupAutoHidePopupKeyword_4_1_4_0 = (Keyword)cAutoHidePopupAssignment_4_1_4.eContents().get(0);
		private final Assignment cReadonlyAssignment_4_1_5 = (Assignment)cUnorderedGroup_4_1.eContents().get(5);
		private final Keyword cReadonlyReadonlyKeyword_4_1_5_0 = (Keyword)cReadonlyAssignment_4_1_5.eContents().get(0);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiSuggestTextField:
		//	{UiSuggestTextField}
		//	'suggestText' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' (('type'
		//	jvmType=JvmTypeReference ';'?)?
		//	& ('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
		//	& ('filterField' itemFilterProperty=[JvmOperation] ';'?)?
		//	& ('uuidField' itemUUIDProperty=[JvmOperation] ';'?)?
		//	& autoHidePopup?='autoHidePopup'?
		//	& readonly?='readonly'?) (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiSuggestTextField} 'suggestText' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID?
		//('{' (('type' jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? &
		//('filterField' itemFilterProperty=[JvmOperation] ';'?)? & ('uuidField' itemUUIDProperty=[JvmOperation] ';'?)? &
		//autoHidePopup?='autoHidePopup'? & readonly?='readonly'?) (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiSuggestTextField}
		public Action getUiSuggestTextFieldAction_0() { return cUiSuggestTextFieldAction_0; }
		
		//'suggestText'
		public Keyword getSuggestTextKeyword_1() { return cSuggestTextKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (('type' jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? &
		//('filterField' itemFilterProperty=[JvmOperation] ';'?)? & ('uuidField' itemUUIDProperty=[JvmOperation] ';'?)? &
		//autoHidePopup?='autoHidePopup'? & readonly?='readonly'?) (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//('type' jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? & ('filterField'
		//itemFilterProperty=[JvmOperation] ';'?)? & ('uuidField' itemUUIDProperty=[JvmOperation] ';'?)? &
		//autoHidePopup?='autoHidePopup'? & readonly?='readonly'?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
		
		//('type' jvmType=JvmTypeReference ';'?)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
		
		//'type'
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }
		
		//('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
		
		//'captionField'
		public Keyword getCaptionFieldKeyword_4_1_1_0() { return cCaptionFieldKeyword_4_1_1_0; }
		
		//itemCaptionProperty=[JvmOperation]
		public Assignment getItemCaptionPropertyAssignment_4_1_1_1() { return cItemCaptionPropertyAssignment_4_1_1_1; }
		
		//[JvmOperation]
		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0; }
		
		//ID
		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_1_2() { return cSemicolonKeyword_4_1_1_2; }
		
		//('filterField' itemFilterProperty=[JvmOperation] ';'?)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
		
		//'filterField'
		public Keyword getFilterFieldKeyword_4_1_2_0() { return cFilterFieldKeyword_4_1_2_0; }
		
		//itemFilterProperty=[JvmOperation]
		public Assignment getItemFilterPropertyAssignment_4_1_2_1() { return cItemFilterPropertyAssignment_4_1_2_1; }
		
		//[JvmOperation]
		public CrossReference getItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0; }
		
		//ID
		public RuleCall getItemFilterPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemFilterPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }
		
		//('uuidField' itemUUIDProperty=[JvmOperation] ';'?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
		
		//'uuidField'
		public Keyword getUuidFieldKeyword_4_1_3_0() { return cUuidFieldKeyword_4_1_3_0; }
		
		//itemUUIDProperty=[JvmOperation]
		public Assignment getItemUUIDPropertyAssignment_4_1_3_1() { return cItemUUIDPropertyAssignment_4_1_3_1; }
		
		//[JvmOperation]
		public CrossReference getItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0() { return cItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0; }
		
		//ID
		public RuleCall getItemUUIDPropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1() { return cItemUUIDPropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }
		
		//autoHidePopup?='autoHidePopup'?
		public Assignment getAutoHidePopupAssignment_4_1_4() { return cAutoHidePopupAssignment_4_1_4; }
		
		//'autoHidePopup'
		public Keyword getAutoHidePopupAutoHidePopupKeyword_4_1_4_0() { return cAutoHidePopupAutoHidePopupKeyword_4_1_4_0; }
		
		//readonly?='readonly'?
		public Assignment getReadonlyAssignment_4_1_5() { return cReadonlyAssignment_4_1_5; }
		
		//'readonly'
		public Keyword getReadonlyReadonlyKeyword_4_1_5_0() { return cReadonlyReadonlyKeyword_4_1_5_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}
	public class UiBeanReferenceFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanReferenceField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiBeanReferenceFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cReferenceFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_0_2 = (Keyword)cGroup_4_1_0.eContents().get(2);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cRefSourceKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cReferenceSourceJvmTypeAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final RuleCall cReferenceSourceJvmTypeJvmTypeReferenceParserRuleCall_4_1_1_1_0 = (RuleCall)cReferenceSourceJvmTypeAssignment_4_1_1_1.eContents().get(0);
		private final Keyword cColonKeyword_4_1_1_2 = (Keyword)cGroup_4_1_1.eContents().get(2);
		private final Assignment cReferenceSourceFieldAssignment_4_1_1_3 = (Assignment)cGroup_4_1_1.eContents().get(3);
		private final CrossReference cReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0 = (CrossReference)cReferenceSourceFieldAssignment_4_1_1_3.eContents().get(0);
		private final RuleCall cReferenceSourceFieldJvmFieldIDTerminalRuleCall_4_1_1_3_0_1 = (RuleCall)cReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_1_4 = (Keyword)cGroup_4_1_1.eContents().get(4);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cCaptionFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cCaptionPropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final RuleCall cCaptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0 = (RuleCall)cCaptionPropertyAssignment_4_1_2_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_2_2 = (Keyword)cGroup_4_1_2.eContents().get(2);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Keyword cDescriptionFieldKeyword_4_1_3_0 = (Keyword)cGroup_4_1_3.eContents().get(0);
		private final Assignment cDescriptionPropertyAssignment_4_1_3_1 = (Assignment)cGroup_4_1_3.eContents().get(1);
		private final RuleCall cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0 = (RuleCall)cDescriptionPropertyAssignment_4_1_3_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_3_2 = (Keyword)cGroup_4_1_3.eContents().get(2);
		private final Group cGroup_4_1_4 = (Group)cUnorderedGroup_4_1.eContents().get(4);
		private final Keyword cImageFieldKeyword_4_1_4_0 = (Keyword)cGroup_4_1_4.eContents().get(0);
		private final Assignment cImagePropertyAssignment_4_1_4_1 = (Assignment)cGroup_4_1_4.eContents().get(1);
		private final RuleCall cImagePropertyUiNestedPropertyParserRuleCall_4_1_4_1_0 = (RuleCall)cImagePropertyAssignment_4_1_4_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_4_2 = (Keyword)cGroup_4_1_4.eContents().get(2);
		private final Group cGroup_4_1_5 = (Group)cUnorderedGroup_4_1.eContents().get(5);
		private final Keyword cInMemoryServiceKeyword_4_1_5_0 = (Keyword)cGroup_4_1_5.eContents().get(0);
		private final Assignment cInMemoryBeanProviderAssignment_4_1_5_1 = (Assignment)cGroup_4_1_5.eContents().get(1);
		private final RuleCall cInMemoryBeanProviderJvmTypeReferenceParserRuleCall_4_1_5_1_0 = (RuleCall)cInMemoryBeanProviderAssignment_4_1_5_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_5_2 = (Keyword)cGroup_4_1_5.eContents().get(2);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiBeanReferenceField:
		//	{UiBeanReferenceField}
		//	'referenceField' ('(' (i18nInfo=UiI18nInfo?
		//	& ('styles' styles=STRING)?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (('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*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiBeanReferenceField} 'referenceField' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		//name=TRANSLATABLEID? ('{' (('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* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiBeanReferenceField}
		public Action getUiBeanReferenceFieldAction_0() { return cUiBeanReferenceFieldAction_0; }
		
		//'referenceField'
		public Keyword getReferenceFieldKeyword_1() { return cReferenceFieldKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (('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* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//('type' jvmType=JvmTypeReference ';'?)? & ('refSource' referenceSourceJvmType=JvmTypeReference ':'
		//referenceSourceField=[JvmField] ';'?)? & ('captionField' captionProperty=UiNestedProperty ';'?)? & ('descriptionField'
		//descriptionProperty=UiNestedProperty ';'?)? & ('imageField' imageProperty=UiNestedProperty ';'?)? & ('inMemoryService'
		//inMemoryBeanProvider=JvmTypeReference ';'?)?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
		
		//('type' jvmType=JvmTypeReference ';'?)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
		
		//'type'
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }
		
		//('refSource' referenceSourceJvmType=JvmTypeReference ':' referenceSourceField=[JvmField] ';'?)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
		
		//'refSource'
		public Keyword getRefSourceKeyword_4_1_1_0() { return cRefSourceKeyword_4_1_1_0; }
		
		//referenceSourceJvmType=JvmTypeReference
		public Assignment getReferenceSourceJvmTypeAssignment_4_1_1_1() { return cReferenceSourceJvmTypeAssignment_4_1_1_1; }
		
		//JvmTypeReference
		public RuleCall getReferenceSourceJvmTypeJvmTypeReferenceParserRuleCall_4_1_1_1_0() { return cReferenceSourceJvmTypeJvmTypeReferenceParserRuleCall_4_1_1_1_0; }
		
		//':'
		public Keyword getColonKeyword_4_1_1_2() { return cColonKeyword_4_1_1_2; }
		
		//referenceSourceField=[JvmField]
		public Assignment getReferenceSourceFieldAssignment_4_1_1_3() { return cReferenceSourceFieldAssignment_4_1_1_3; }
		
		//[JvmField]
		public CrossReference getReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0() { return cReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0; }
		
		//ID
		public RuleCall getReferenceSourceFieldJvmFieldIDTerminalRuleCall_4_1_1_3_0_1() { return cReferenceSourceFieldJvmFieldIDTerminalRuleCall_4_1_1_3_0_1; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_1_4() { return cSemicolonKeyword_4_1_1_4; }
		
		//('captionField' captionProperty=UiNestedProperty ';'?)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
		
		//'captionField'
		public Keyword getCaptionFieldKeyword_4_1_2_0() { return cCaptionFieldKeyword_4_1_2_0; }
		
		//captionProperty=UiNestedProperty
		public Assignment getCaptionPropertyAssignment_4_1_2_1() { return cCaptionPropertyAssignment_4_1_2_1; }
		
		//UiNestedProperty
		public RuleCall getCaptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0() { return cCaptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }
		
		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
		
		//'descriptionField'
		public Keyword getDescriptionFieldKeyword_4_1_3_0() { return cDescriptionFieldKeyword_4_1_3_0; }
		
		//descriptionProperty=UiNestedProperty
		public Assignment getDescriptionPropertyAssignment_4_1_3_1() { return cDescriptionPropertyAssignment_4_1_3_1; }
		
		//UiNestedProperty
		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }
		
		//('imageField' imageProperty=UiNestedProperty ';'?)?
		public Group getGroup_4_1_4() { return cGroup_4_1_4; }
		
		//'imageField'
		public Keyword getImageFieldKeyword_4_1_4_0() { return cImageFieldKeyword_4_1_4_0; }
		
		//imageProperty=UiNestedProperty
		public Assignment getImagePropertyAssignment_4_1_4_1() { return cImagePropertyAssignment_4_1_4_1; }
		
		//UiNestedProperty
		public RuleCall getImagePropertyUiNestedPropertyParserRuleCall_4_1_4_1_0() { return cImagePropertyUiNestedPropertyParserRuleCall_4_1_4_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_4_2() { return cSemicolonKeyword_4_1_4_2; }
		
		//('inMemoryService' inMemoryBeanProvider=JvmTypeReference ';'?)?
		public Group getGroup_4_1_5() { return cGroup_4_1_5; }
		
		//'inMemoryService'
		public Keyword getInMemoryServiceKeyword_4_1_5_0() { return cInMemoryServiceKeyword_4_1_5_0; }
		
		//inMemoryBeanProvider=JvmTypeReference
		public Assignment getInMemoryBeanProviderAssignment_4_1_5_1() { return cInMemoryBeanProviderAssignment_4_1_5_1; }
		
		//JvmTypeReference
		public RuleCall getInMemoryBeanProviderJvmTypeReferenceParserRuleCall_4_1_5_1_0() { return cInMemoryBeanProviderJvmTypeReferenceParserRuleCall_4_1_5_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_5_2() { return cSemicolonKeyword_4_1_5_2; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}
	public class UiSearchFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSearchFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSearchfieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cPropertyAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cPropertyUiNestedPropertyParserRuleCall_3_0 = (RuleCall)cPropertyAssignment_3.eContents().get(0);
		
		//UiSearchField:
		//	{UiSearchField}
		//	'searchfield' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? property=UiNestedProperty;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiSearchField} 'searchfield' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? property=UiNestedProperty
		public Group getGroup() { return cGroup; }
		
		//{UiSearchField}
		public Action getUiSearchFieldAction_0() { return cUiSearchFieldAction_0; }
		
		//'searchfield'
		public Keyword getSearchfieldKeyword_1() { return cSearchfieldKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//property=UiNestedProperty
		public Assignment getPropertyAssignment_3() { return cPropertyAssignment_3; }
		
		//UiNestedProperty
		public RuleCall getPropertyUiNestedPropertyParserRuleCall_3_0() { return cPropertyUiNestedPropertyParserRuleCall_3_0; }
	}
	public class UiTextAreaElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTextArea");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTextAreaAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTextareaKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiTextArea:
		//	{UiTextArea}
		//	'textarea' ('(' (i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?
		//	& ('styles' styles=STRING)?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiTextArea} 'textarea' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
		//name=TRANSLATABLEID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiTextArea}
		public Action getUiTextAreaAction_0() { return cUiTextAreaAction_0; }
		
		//'textarea'
		public Keyword getTextareaKeyword_1() { return cTextareaKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiDateFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiDateFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDatefieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cDateFormatAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cDateFormatUiDateFormatEnumRuleCall_2_1_0_0 = (RuleCall)cDateFormatAssignment_2_1_0.eContents().get(0);
		private final Assignment cResolutionAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final RuleCall cResolutionUiDateTimeResolutionEnumRuleCall_2_1_1_0 = (RuleCall)cResolutionAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0 = (RuleCall)cI18nInfoAssignment_2_1_3.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_4 = (Assignment)cUnorderedGroup_2_1.eContents().get(4);
		private final Keyword cReadonlyReadonlyKeyword_2_1_4_0 = (Keyword)cReadonlyAssignment_2_1_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiDateField:
		//	{UiDateField}
		//	'datefield' ('(' (dateFormat=UiDateFormat?
		//	& resolution=UiDateTimeResolution?
		//	& ('styles' styles=STRING)?
		//	& i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiDateField} 'datefield' ('(' (dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ('styles' styles=STRING)?
		//& i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')? name=TRANSLATABLEID? ('{' (validators+=UiValidator |
		//bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiDateField}
		public Action getUiDateFieldAction_0() { return cUiDateFieldAction_0; }
		
		//'datefield'
		public Keyword getDatefieldKeyword_1() { return cDatefieldKeyword_1; }
		
		//('(' (dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ('styles' styles=STRING)? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//dateFormat=UiDateFormat? & resolution=UiDateTimeResolution? & ('styles' styles=STRING)? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//dateFormat=UiDateFormat?
		public Assignment getDateFormatAssignment_2_1_0() { return cDateFormatAssignment_2_1_0; }
		
		//UiDateFormat
		public RuleCall getDateFormatUiDateFormatEnumRuleCall_2_1_0_0() { return cDateFormatUiDateFormatEnumRuleCall_2_1_0_0; }
		
		//resolution=UiDateTimeResolution?
		public Assignment getResolutionAssignment_2_1_1() { return cResolutionAssignment_2_1_1; }
		
		//UiDateTimeResolution
		public RuleCall getResolutionUiDateTimeResolutionEnumRuleCall_2_1_1_0() { return cResolutionUiDateTimeResolutionEnumRuleCall_2_1_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_3() { return cI18nInfoAssignment_2_1_3; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_4() { return cReadonlyAssignment_2_1_4; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_4_0() { return cReadonlyReadonlyKeyword_2_1_4_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiBrowserElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBrowser");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiBrowserAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cBrowserKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiBrowser:
		//	{UiBrowser}
		//	'browser' ('(' (i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?
		//	& ('styles' styles=STRING)?)
		//	')')? name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiBrowser} 'browser' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
		//name=TRANSLATABLEID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiBrowser}
		public Action getUiBrowserAction_0() { return cUiBrowserAction_0; }
		
		//'browser'
		public Keyword getBrowserKeyword_1() { return cBrowserKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiProgressBarElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiProgressBar");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiProgressBarAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cProgressbarKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiProgressBar:
		//	{UiProgressBar}
		//	'progressbar' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{'
		//	(validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiProgressBar} 'progressbar' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{'
		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiProgressBar}
		public Action getUiProgressBarAction_0() { return cUiProgressBarAction_0; }
		
		//'progressbar'
		public Keyword getProgressbarKeyword_1() { return cProgressbarKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiImageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiImage");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiImageAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cImageKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Group cGroup_4_1 = (Group)cGroup_4.eContents().get(1);
		private final Keyword cIconPathKeyword_4_1_0 = (Keyword)cGroup_4_1.eContents().get(0);
		private final Assignment cValueAssignment_4_1_1 = (Assignment)cGroup_4_1.eContents().get(1);
		private final RuleCall cValueSTRINGTerminalRuleCall_4_1_1_0 = (RuleCall)cValueAssignment_4_1_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_2 = (Keyword)cGroup_4_1.eContents().get(2);
		private final Assignment cBindingsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_0 = (RuleCall)cBindingsAssignment_4_2.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiImage:
		//	{UiImage}
		//	'image' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' ('iconPath'
		//	value=STRING ';'?)?
		//	bindings+=UiBinding*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiImage} 'image' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' ('iconPath'
		//value=STRING ';'?)? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiImage}
		public Action getUiImageAction_0() { return cUiImageAction_0; }
		
		//'image'
		public Keyword getImageKeyword_1() { return cImageKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' ('iconPath' value=STRING ';'?)? bindings+=UiBinding* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//('iconPath' value=STRING ';'?)?
		public Group getGroup_4_1() { return cGroup_4_1; }
		
		//'iconPath'
		public Keyword getIconPathKeyword_4_1_0() { return cIconPathKeyword_4_1_0; }
		
		//value=STRING
		public Assignment getValueAssignment_4_1_1() { return cValueAssignment_4_1_1; }
		
		//STRING
		public RuleCall getValueSTRINGTerminalRuleCall_4_1_1_0() { return cValueSTRINGTerminalRuleCall_4_1_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_2() { return cSemicolonKeyword_4_1_2; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_4_2() { return cBindingsAssignment_4_2; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_0() { return cBindingsUiBindingParserRuleCall_4_2_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}
	public class UiTableElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiTable");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiTableAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTableKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_0_2 = (Keyword)cGroup_4_1_0.eContents().get(2);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cSelectionTypeKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cSelectionTypeAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final RuleCall cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0 = (RuleCall)cSelectionTypeAssignment_4_1_1_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_1_2 = (Keyword)cGroup_4_1_1.eContents().get(2);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cImageFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cItemImagePropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final CrossReference cItemImagePropertyJvmOperationCrossReference_4_1_2_1_0 = (CrossReference)cItemImagePropertyAssignment_4_1_2_1.eContents().get(0);
		private final RuleCall cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1 = (RuleCall)cItemImagePropertyJvmOperationCrossReference_4_1_2_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_2_2 = (Keyword)cGroup_4_1_2.eContents().get(2);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Assignment cConsumeBeanServiceAssignment_4_1_3_0 = (Assignment)cGroup_4_1_3.eContents().get(0);
		private final Keyword cConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0 = (Keyword)cConsumeBeanServiceAssignment_4_1_3_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_3_1 = (Keyword)cGroup_4_1_3.eContents().get(1);
		private final Group cGroup_4_1_4 = (Group)cUnorderedGroup_4_1.eContents().get(4);
		private final Assignment cScrollToBottomAssignment_4_1_4_0 = (Assignment)cGroup_4_1_4.eContents().get(0);
		private final Keyword cScrollToBottomScrollToBottomKeyword_4_1_4_0_0 = (Keyword)cScrollToBottomAssignment_4_1_4_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_4_1 = (Keyword)cGroup_4_1_4.eContents().get(1);
		private final Assignment cReadonlyAssignment_4_1_5 = (Assignment)cUnorderedGroup_4_1.eContents().get(5);
		private final Keyword cReadonlyReadonlyKeyword_4_1_5_0 = (Keyword)cReadonlyAssignment_4_1_5.eContents().get(0);
		private final Assignment cColumnAssignmentAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0 = (RuleCall)cColumnAssignmentAssignment_4_2.eContents().get(0);
		private final Assignment cSortOrderAssignmentAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cSortOrderAssignmentUiSortOrderAssignmentParserRuleCall_4_3_0 = (RuleCall)cSortOrderAssignmentAssignment_4_3.eContents().get(0);
		private final Alternatives cAlternatives_4_4 = (Alternatives)cGroup_4.eContents().get(4);
		private final Assignment cValidatorsAssignment_4_4_0 = (Assignment)cAlternatives_4_4.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_4_0_0 = (RuleCall)cValidatorsAssignment_4_4_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_4_1 = (Assignment)cAlternatives_4_4.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_4_1_0 = (RuleCall)cBindingsAssignment_4_4_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_5 = (Assignment)cGroup_4.eContents().get(5);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_5_0 = (RuleCall)cProcessorAssignmentsAssignment_4_5.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_6 = (Keyword)cGroup_4.eContents().get(6);
		
		//UiTable:
		//	{UiTable}
		//	'table' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' (('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*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiTable} 'table' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' (('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* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiTable}
		public Action getUiTableAction_0() { return cUiTableAction_0; }
		
		//'table'
		public Keyword getTableKeyword_1() { return cTableKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (('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* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//('type' jvmType=JvmTypeReference ';'?)? & ('selectionType' selectionType=UiSelectionType ';'?)? & ('imageField'
		//itemImageProperty=[JvmOperation] ';'?)? & (consumeBeanService?='useBeanService' ';'?)? &
		//(scrollToBottom?='scrollToBottom' ';'?)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
		
		//('type' jvmType=JvmTypeReference ';'?)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
		
		//'type'
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }
		
		//('selectionType' selectionType=UiSelectionType ';'?)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
		
		//'selectionType'
		public Keyword getSelectionTypeKeyword_4_1_1_0() { return cSelectionTypeKeyword_4_1_1_0; }
		
		//selectionType=UiSelectionType
		public Assignment getSelectionTypeAssignment_4_1_1_1() { return cSelectionTypeAssignment_4_1_1_1; }
		
		//UiSelectionType
		public RuleCall getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0() { return cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_1_2() { return cSemicolonKeyword_4_1_1_2; }
		
		//('imageField' itemImageProperty=[JvmOperation] ';'?)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
		
		//'imageField'
		public Keyword getImageFieldKeyword_4_1_2_0() { return cImageFieldKeyword_4_1_2_0; }
		
		//itemImageProperty=[JvmOperation]
		public Assignment getItemImagePropertyAssignment_4_1_2_1() { return cItemImagePropertyAssignment_4_1_2_1; }
		
		//[JvmOperation]
		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_2_1_0; }
		
		//ID
		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }
		
		//(consumeBeanService?='useBeanService' ';'?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
		
		//consumeBeanService?='useBeanService'
		public Assignment getConsumeBeanServiceAssignment_4_1_3_0() { return cConsumeBeanServiceAssignment_4_1_3_0; }
		
		//'useBeanService'
		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_3_1() { return cSemicolonKeyword_4_1_3_1; }
		
		//(scrollToBottom?='scrollToBottom' ';'?)?
		public Group getGroup_4_1_4() { return cGroup_4_1_4; }
		
		//scrollToBottom?='scrollToBottom'
		public Assignment getScrollToBottomAssignment_4_1_4_0() { return cScrollToBottomAssignment_4_1_4_0; }
		
		//'scrollToBottom'
		public Keyword getScrollToBottomScrollToBottomKeyword_4_1_4_0_0() { return cScrollToBottomScrollToBottomKeyword_4_1_4_0_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_4_1() { return cSemicolonKeyword_4_1_4_1; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_4_1_5() { return cReadonlyAssignment_4_1_5; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_4_1_5_0() { return cReadonlyReadonlyKeyword_4_1_5_0; }
		
		//columnAssignment=UiColumnsAssignment?
		public Assignment getColumnAssignmentAssignment_4_2() { return cColumnAssignmentAssignment_4_2; }
		
		//UiColumnsAssignment
		public RuleCall getColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0() { return cColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0; }
		
		//sortOrderAssignment=UiSortOrderAssignment?
		public Assignment getSortOrderAssignmentAssignment_4_3() { return cSortOrderAssignmentAssignment_4_3; }
		
		//UiSortOrderAssignment
		public RuleCall getSortOrderAssignmentUiSortOrderAssignmentParserRuleCall_4_3_0() { return cSortOrderAssignmentUiSortOrderAssignmentParserRuleCall_4_3_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_4() { return cAlternatives_4_4; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_4_0() { return cValidatorsAssignment_4_4_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_4_0_0() { return cValidatorsUiValidatorParserRuleCall_4_4_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_4_1() { return cBindingsAssignment_4_4_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_4_1_0() { return cBindingsUiBindingParserRuleCall_4_4_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_5() { return cProcessorAssignmentsAssignment_4_5; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_5_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_5_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_6() { return cRightCurlyBracketKeyword_4_6; }
	}
	public class UiComboBoxElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiComboBox");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiComboBoxAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cComboKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_0_2 = (Keyword)cGroup_4_1_0.eContents().get(2);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cCaptionFieldKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cItemCaptionPropertyAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final CrossReference cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0 = (CrossReference)cItemCaptionPropertyAssignment_4_1_1_1.eContents().get(0);
		private final RuleCall cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1 = (RuleCall)cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_1_2 = (Keyword)cGroup_4_1_1.eContents().get(2);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cDescriptionFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cDescriptionPropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final RuleCall cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0 = (RuleCall)cDescriptionPropertyAssignment_4_1_2_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_2_2 = (Keyword)cGroup_4_1_2.eContents().get(2);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Keyword cImageFieldKeyword_4_1_3_0 = (Keyword)cGroup_4_1_3.eContents().get(0);
		private final Assignment cItemImagePropertyAssignment_4_1_3_1 = (Assignment)cGroup_4_1_3.eContents().get(1);
		private final CrossReference cItemImagePropertyJvmOperationCrossReference_4_1_3_1_0 = (CrossReference)cItemImagePropertyAssignment_4_1_3_1.eContents().get(0);
		private final RuleCall cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1 = (RuleCall)cItemImagePropertyJvmOperationCrossReference_4_1_3_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4_1_3_2 = (Keyword)cGroup_4_1_3.eContents().get(2);
		private final Group cGroup_4_1_4 = (Group)cUnorderedGroup_4_1.eContents().get(4);
		private final Assignment cConsumeBeanServiceAssignment_4_1_4_0 = (Assignment)cGroup_4_1_4.eContents().get(0);
		private final Keyword cConsumeBeanServiceUseBeanServiceKeyword_4_1_4_0_0 = (Keyword)cConsumeBeanServiceAssignment_4_1_4_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_4_1 = (Keyword)cGroup_4_1_4.eContents().get(1);
		private final Assignment cReadonlyAssignment_4_1_5 = (Assignment)cUnorderedGroup_4_1.eContents().get(5);
		private final Keyword cReadonlyReadonlyKeyword_4_1_5_0 = (Keyword)cReadonlyAssignment_4_1_5.eContents().get(0);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiComboBox:
		//	{UiComboBox}
		//	'combo' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' (('type'
		//	jvmType=JvmTypeReference ';'?)?
		//	& ('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
		//	& ('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
		//	& ('imageField' itemImageProperty=[JvmOperation] ';'?)?
		//	& (consumeBeanService?='useBeanService' ';'?)?
		//	& readonly?='readonly'?) (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiComboBox} 'combo' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' (('type'
		//jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? & ('descriptionField'
		//descriptionProperty=UiNestedProperty ';'?)? & ('imageField' itemImageProperty=[JvmOperation] ';'?)? &
		//(consumeBeanService?='useBeanService' ';'?)? & readonly?='readonly'?) (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiComboBox}
		public Action getUiComboBoxAction_0() { return cUiComboBoxAction_0; }
		
		//'combo'
		public Keyword getComboKeyword_1() { return cComboKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (('type' jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? &
		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField' itemImageProperty=[JvmOperation] ';'?)?
		//& (consumeBeanService?='useBeanService' ';'?)? & readonly?='readonly'?) (validators+=UiValidator |
		//bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//('type' jvmType=JvmTypeReference ';'?)? & ('captionField' itemCaptionProperty=[JvmOperation] ';'?)? &
		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField' itemImageProperty=[JvmOperation] ';'?)?
		//& (consumeBeanService?='useBeanService' ';'?)? & readonly?='readonly'?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
		
		//('type' jvmType=JvmTypeReference ';'?)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
		
		//'type'
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_0_2() { return cSemicolonKeyword_4_1_0_2; }
		
		//('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
		
		//'captionField'
		public Keyword getCaptionFieldKeyword_4_1_1_0() { return cCaptionFieldKeyword_4_1_1_0; }
		
		//itemCaptionProperty=[JvmOperation]
		public Assignment getItemCaptionPropertyAssignment_4_1_1_1() { return cItemCaptionPropertyAssignment_4_1_1_1; }
		
		//[JvmOperation]
		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0; }
		
		//ID
		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_1_1_0_1; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_1_2() { return cSemicolonKeyword_4_1_1_2; }
		
		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
		
		//'descriptionField'
		public Keyword getDescriptionFieldKeyword_4_1_2_0() { return cDescriptionFieldKeyword_4_1_2_0; }
		
		//descriptionProperty=UiNestedProperty
		public Assignment getDescriptionPropertyAssignment_4_1_2_1() { return cDescriptionPropertyAssignment_4_1_2_1; }
		
		//UiNestedProperty
		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_2_2() { return cSemicolonKeyword_4_1_2_2; }
		
		//('imageField' itemImageProperty=[JvmOperation] ';'?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
		
		//'imageField'
		public Keyword getImageFieldKeyword_4_1_3_0() { return cImageFieldKeyword_4_1_3_0; }
		
		//itemImageProperty=[JvmOperation]
		public Assignment getItemImagePropertyAssignment_4_1_3_1() { return cItemImagePropertyAssignment_4_1_3_1; }
		
		//[JvmOperation]
		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_3_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_3_1_0; }
		
		//ID
		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_3_1_0_1; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }
		
		//(consumeBeanService?='useBeanService' ';'?)?
		public Group getGroup_4_1_4() { return cGroup_4_1_4; }
		
		//consumeBeanService?='useBeanService'
		public Assignment getConsumeBeanServiceAssignment_4_1_4_0() { return cConsumeBeanServiceAssignment_4_1_4_0; }
		
		//'useBeanService'
		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_4_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_4_0_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_4_1() { return cSemicolonKeyword_4_1_4_1; }
		
		//readonly?='readonly'?
		public Assignment getReadonlyAssignment_4_1_5() { return cReadonlyAssignment_4_1_5; }
		
		//'readonly'
		public Keyword getReadonlyReadonlyKeyword_4_1_5_0() { return cReadonlyReadonlyKeyword_4_1_5_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}
	public class UiButtonElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiButton");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiButtonAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cButtonKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		
		//UiButton:
		//	{UiButton}
		//	'button' ('(' (i18nInfo=UiI18nInfo?
		//	& readonly?='readonly'?
		//	& ('styles' styles=STRING)?)
		//	')')? name=TRANSLATABLEID?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiButton} 'button' ('(' (i18nInfo=UiI18nInfo? & readonly?='readonly'? & ('styles' styles=STRING)?) ')')?
		//name=TRANSLATABLEID?
		public Group getGroup() { return cGroup; }
		
		//{UiButton}
		public Action getUiButtonAction_0() { return cUiButtonAction_0; }
		
		//'button'
		public Keyword getButtonKeyword_1() { return cButtonKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & readonly?='readonly'? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & readonly?='readonly'? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//readonly?='readonly'?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
		
		//'readonly'
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
	}
	public class UiMobileNavigationButtonElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationButton");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMobileNavigationButtonAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNavButtonKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Assignment cTargetPageAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
		private final RuleCall cTargetPageUiMobileNavigationPageParserRuleCall_4_0_0 = (RuleCall)cTargetPageAssignment_4_0.eContents().get(0);
		private final Group cGroup_4_1 = (Group)cAlternatives_4.eContents().get(1);
		private final Keyword cAliasKeyword_4_1_0 = (Keyword)cGroup_4_1.eContents().get(0);
		private final Assignment cTargetPageAliasAssignment_4_1_1 = (Assignment)cGroup_4_1.eContents().get(1);
		private final CrossReference cTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0 = (CrossReference)cTargetPageAliasAssignment_4_1_1.eContents().get(0);
		private final RuleCall cTargetPageAliasUiMobileNavigationPageIDTerminalRuleCall_4_1_1_0_1 = (RuleCall)cTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0.eContents().get(1);
		
		//UiMobileNavigationButton:
		//	{UiMobileNavigationButton}
		//	'navButton' ('(' (i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?
		//	& ('styles' styles=STRING)?)
		//	')')?
		//	name=TRANSLATABLEID? (targetPage=UiMobileNavigationPage | 'alias'
		//	targetPageAlias=[UiMobileNavigationPage]);
		@Override public ParserRule getRule() { return rule; }
		
		//{UiMobileNavigationButton} 'navButton' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?)
		//')')? name=TRANSLATABLEID? (targetPage=UiMobileNavigationPage | 'alias' targetPageAlias=[UiMobileNavigationPage])
		public Group getGroup() { return cGroup; }
		
		//{UiMobileNavigationButton}
		public Action getUiMobileNavigationButtonAction_0() { return cUiMobileNavigationButtonAction_0; }
		
		//'navButton'
		public Keyword getNavButtonKeyword_1() { return cNavButtonKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//targetPage=UiMobileNavigationPage | 'alias' targetPageAlias=[UiMobileNavigationPage]
		public Alternatives getAlternatives_4() { return cAlternatives_4; }
		
		//targetPage=UiMobileNavigationPage
		public Assignment getTargetPageAssignment_4_0() { return cTargetPageAssignment_4_0; }
		
		//UiMobileNavigationPage
		public RuleCall getTargetPageUiMobileNavigationPageParserRuleCall_4_0_0() { return cTargetPageUiMobileNavigationPageParserRuleCall_4_0_0; }
		
		//'alias' targetPageAlias=[UiMobileNavigationPage]
		public Group getGroup_4_1() { return cGroup_4_1; }
		
		//'alias'
		public Keyword getAliasKeyword_4_1_0() { return cAliasKeyword_4_1_0; }
		
		//targetPageAlias=[UiMobileNavigationPage]
		public Assignment getTargetPageAliasAssignment_4_1_1() { return cTargetPageAliasAssignment_4_1_1; }
		
		//[UiMobileNavigationPage]
		public CrossReference getTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0() { return cTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0; }
		
		//ID
		public RuleCall getTargetPageAliasUiMobileNavigationPageIDTerminalRuleCall_4_1_1_0_1() { return cTargetPageAliasUiMobileNavigationPageIDTerminalRuleCall_4_1_1_0_1; }
	}
	public class UiMobileSwitchElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileSwitch");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSwitchAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSwitchItKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0 = (RuleCall)cProcessorAssignmentsAssignment_4_1.eContents().get(0);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiMobileSwitch UiSwitch:
		//	{UiSwitch}
		//	'switchIt' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID?
		//	('{'
		//	processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiSwitch} 'switchIt' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
		//name=TRANSLATABLEID? ('{' processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator |
		//bindings+=UiBinding)* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiSwitch}
		public Action getUiSwitchAction_0() { return cUiSwitchAction_0; }
		
		//'switchIt'
		public Keyword getSwitchItKeyword_1() { return cSwitchItKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator | bindings+=UiBinding)* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_1() { return cProcessorAssignmentsAssignment_4_1; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiLabelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiLabel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiLabelAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cLabelKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0 = (RuleCall)cProcessorAssignmentsAssignment_4_1.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_0 = (RuleCall)cBindingsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiLabel:
		//	{UiLabel}
		//	'label' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{'
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	bindings+=UiBinding*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiLabel} 'label' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{'
		//processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiLabel}
		public Action getUiLabelAction_0() { return cUiLabelAction_0; }
		
		//'label'
		public Keyword getLabelKeyword_1() { return cLabelKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' processorAssignments+=UiVisibilityProcessorAssignment* bindings+=UiBinding* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_1() { return cProcessorAssignmentsAssignment_4_1; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0; }
		
		//bindings+=UiBinding*
		public Assignment getBindingsAssignment_4_2() { return cBindingsAssignment_4_2; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_0() { return cBindingsUiBindingParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiDecimalFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDecimalField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiDecimalFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDecimalFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cNoGroupingAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cNoGroupingNoGroupingKeyword_2_1_0_0 = (Keyword)cNoGroupingAssignment_2_1_0.eContents().get(0);
		private final Assignment cNoMarkNegativeAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cNoMarkNegativeNoMarkNegativeKeyword_2_1_1_0 = (Keyword)cNoMarkNegativeAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Group cGroup_2_1_3 = (Group)cUnorderedGroup_2_1.eContents().get(3);
		private final Keyword cPrecisionKeyword_2_1_3_0 = (Keyword)cGroup_2_1_3.eContents().get(0);
		private final Assignment cPrecisionAssignment_2_1_3_1 = (Assignment)cGroup_2_1_3.eContents().get(1);
		private final RuleCall cPrecisionINTTerminalRuleCall_2_1_3_1_0 = (RuleCall)cPrecisionAssignment_2_1_3_1.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_4 = (Assignment)cUnorderedGroup_2_1.eContents().get(4);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_4_0 = (RuleCall)cI18nInfoAssignment_2_1_4.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_5 = (Assignment)cUnorderedGroup_2_1.eContents().get(5);
		private final Keyword cReadonlyReadonlyKeyword_2_1_5_0 = (Keyword)cReadonlyAssignment_2_1_5.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiDecimalField:
		//	{UiDecimalField}
		//	'decimalField' ('(' (noGrouping?='noGrouping'?
		//	& noMarkNegative?='noMarkNegative'?
		//	& ('styles' styles=STRING)?
		//	& ('precision=' precision=INT)?
		//	& i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiDecimalField} 'decimalField' ('(' (noGrouping?='noGrouping'? & noMarkNegative?='noMarkNegative'? & ('styles'
		//styles=STRING)? & ('precision=' precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
		//name=TRANSLATABLEID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiDecimalField}
		public Action getUiDecimalFieldAction_0() { return cUiDecimalFieldAction_0; }
		
		//'decimalField'
		public Keyword getDecimalFieldKeyword_1() { return cDecimalFieldKeyword_1; }
		
		//('(' (noGrouping?='noGrouping'? & noMarkNegative?='noMarkNegative'? & ('styles' styles=STRING)? & ('precision='
		//precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//noGrouping?='noGrouping'? & noMarkNegative?='noMarkNegative'? & ('styles' styles=STRING)? & ('precision='
		//precision=INT)? & i18nInfo=UiI18nInfo? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//noGrouping?='noGrouping'?
		public Assignment getNoGroupingAssignment_2_1_0() { return cNoGroupingAssignment_2_1_0; }
		
		//'noGrouping'
		public Keyword getNoGroupingNoGroupingKeyword_2_1_0_0() { return cNoGroupingNoGroupingKeyword_2_1_0_0; }
		
		//noMarkNegative?='noMarkNegative'?
		public Assignment getNoMarkNegativeAssignment_2_1_1() { return cNoMarkNegativeAssignment_2_1_1; }
		
		//'noMarkNegative'
		public Keyword getNoMarkNegativeNoMarkNegativeKeyword_2_1_1_0() { return cNoMarkNegativeNoMarkNegativeKeyword_2_1_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
		
		//('precision=' precision=INT)?
		public Group getGroup_2_1_3() { return cGroup_2_1_3; }
		
		//'precision='
		public Keyword getPrecisionKeyword_2_1_3_0() { return cPrecisionKeyword_2_1_3_0; }
		
		//precision=INT
		public Assignment getPrecisionAssignment_2_1_3_1() { return cPrecisionAssignment_2_1_3_1; }
		
		//INT
		public RuleCall getPrecisionINTTerminalRuleCall_2_1_3_1_0() { return cPrecisionINTTerminalRuleCall_2_1_3_1_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_4() { return cI18nInfoAssignment_2_1_4; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_4_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_5() { return cReadonlyAssignment_2_1_5; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_5_0() { return cReadonlyReadonlyKeyword_2_1_5_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiOptionsGroupElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiOptionsGroup");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiOptionsGroupAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cOptionsgroupKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cSelectionTypeKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cSelectionTypeAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final RuleCall cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0 = (RuleCall)cSelectionTypeAssignment_4_1_1_1.eContents().get(0);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cCaptionFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cItemCaptionPropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final CrossReference cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0 = (CrossReference)cItemCaptionPropertyAssignment_4_1_2_1.eContents().get(0);
		private final RuleCall cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1 = (RuleCall)cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0.eContents().get(1);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Keyword cDescriptionFieldKeyword_4_1_3_0 = (Keyword)cGroup_4_1_3.eContents().get(0);
		private final Assignment cDescriptionPropertyAssignment_4_1_3_1 = (Assignment)cGroup_4_1_3.eContents().get(1);
		private final RuleCall cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0 = (RuleCall)cDescriptionPropertyAssignment_4_1_3_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_3_2 = (Keyword)cGroup_4_1_3.eContents().get(2);
		private final Group cGroup_4_1_4 = (Group)cUnorderedGroup_4_1.eContents().get(4);
		private final Keyword cImageFieldKeyword_4_1_4_0 = (Keyword)cGroup_4_1_4.eContents().get(0);
		private final Assignment cItemImagePropertyAssignment_4_1_4_1 = (Assignment)cGroup_4_1_4.eContents().get(1);
		private final CrossReference cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0 = (CrossReference)cItemImagePropertyAssignment_4_1_4_1.eContents().get(0);
		private final RuleCall cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1 = (RuleCall)cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0.eContents().get(1);
		private final Group cGroup_4_1_5 = (Group)cUnorderedGroup_4_1.eContents().get(5);
		private final Assignment cConsumeBeanServiceAssignment_4_1_5_0 = (Assignment)cGroup_4_1_5.eContents().get(0);
		private final Keyword cConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0 = (Keyword)cConsumeBeanServiceAssignment_4_1_5_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_5_1 = (Keyword)cGroup_4_1_5.eContents().get(1);
		private final Assignment cReadonlyAssignment_4_1_6 = (Assignment)cUnorderedGroup_4_1.eContents().get(6);
		private final Keyword cReadonlyReadonlyKeyword_4_1_6_0 = (Keyword)cReadonlyAssignment_4_1_6.eContents().get(0);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiOptionsGroup:
		//	{UiOptionsGroup}
		//	'optionsgroup' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		//	name=TRANSLATABLEID? ('{' (('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*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiOptionsGroup} 'optionsgroup' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{'
		//(('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* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiOptionsGroup}
		public Action getUiOptionsGroupAction_0() { return cUiOptionsGroupAction_0; }
		
		//'optionsgroup'
		public Keyword getOptionsgroupKeyword_1() { return cOptionsgroupKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (('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* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//('type' jvmType=JvmTypeReference)? & ('selectionType' selectionType=UiSelectionType)? & ('captionField'
		//itemCaptionProperty=[JvmOperation])? & ('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField'
		//itemImageProperty=[JvmOperation])? & (consumeBeanService?='useBeanService' ';'?)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
		
		//('type' jvmType=JvmTypeReference)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
		
		//'type'
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
		
		//('selectionType' selectionType=UiSelectionType)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
		
		//'selectionType'
		public Keyword getSelectionTypeKeyword_4_1_1_0() { return cSelectionTypeKeyword_4_1_1_0; }
		
		//selectionType=UiSelectionType
		public Assignment getSelectionTypeAssignment_4_1_1_1() { return cSelectionTypeAssignment_4_1_1_1; }
		
		//UiSelectionType
		public RuleCall getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0() { return cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0; }
		
		//('captionField' itemCaptionProperty=[JvmOperation])?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
		
		//'captionField'
		public Keyword getCaptionFieldKeyword_4_1_2_0() { return cCaptionFieldKeyword_4_1_2_0; }
		
		//itemCaptionProperty=[JvmOperation]
		public Assignment getItemCaptionPropertyAssignment_4_1_2_1() { return cItemCaptionPropertyAssignment_4_1_2_1; }
		
		//[JvmOperation]
		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0; }
		
		//ID
		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }
		
		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
		
		//'descriptionField'
		public Keyword getDescriptionFieldKeyword_4_1_3_0() { return cDescriptionFieldKeyword_4_1_3_0; }
		
		//descriptionProperty=UiNestedProperty
		public Assignment getDescriptionPropertyAssignment_4_1_3_1() { return cDescriptionPropertyAssignment_4_1_3_1; }
		
		//UiNestedProperty
		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }
		
		//('imageField' itemImageProperty=[JvmOperation])?
		public Group getGroup_4_1_4() { return cGroup_4_1_4; }
		
		//'imageField'
		public Keyword getImageFieldKeyword_4_1_4_0() { return cImageFieldKeyword_4_1_4_0; }
		
		//itemImageProperty=[JvmOperation]
		public Assignment getItemImagePropertyAssignment_4_1_4_1() { return cItemImagePropertyAssignment_4_1_4_1; }
		
		//[JvmOperation]
		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0; }
		
		//ID
		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1; }
		
		//(consumeBeanService?='useBeanService' ';'?)?
		public Group getGroup_4_1_5() { return cGroup_4_1_5; }
		
		//consumeBeanService?='useBeanService'
		public Assignment getConsumeBeanServiceAssignment_4_1_5_0() { return cConsumeBeanServiceAssignment_4_1_5_0; }
		
		//'useBeanService'
		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_5_1() { return cSemicolonKeyword_4_1_5_1; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_4_1_6() { return cReadonlyAssignment_4_1_6; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_4_1_6_0() { return cReadonlyReadonlyKeyword_4_1_6_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}
	public class UiListElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiList");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiListAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cListSelectKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_4_1 = (UnorderedGroup)cGroup_4.eContents().get(1);
		private final Group cGroup_4_1_0 = (Group)cUnorderedGroup_4_1.eContents().get(0);
		private final Keyword cTypeKeyword_4_1_0_0 = (Keyword)cGroup_4_1_0.eContents().get(0);
		private final Assignment cJvmTypeAssignment_4_1_0_1 = (Assignment)cGroup_4_1_0.eContents().get(1);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0 = (RuleCall)cJvmTypeAssignment_4_1_0_1.eContents().get(0);
		private final Group cGroup_4_1_1 = (Group)cUnorderedGroup_4_1.eContents().get(1);
		private final Keyword cSelectionTypeKeyword_4_1_1_0 = (Keyword)cGroup_4_1_1.eContents().get(0);
		private final Assignment cSelectionTypeAssignment_4_1_1_1 = (Assignment)cGroup_4_1_1.eContents().get(1);
		private final RuleCall cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0 = (RuleCall)cSelectionTypeAssignment_4_1_1_1.eContents().get(0);
		private final Group cGroup_4_1_2 = (Group)cUnorderedGroup_4_1.eContents().get(2);
		private final Keyword cCaptionFieldKeyword_4_1_2_0 = (Keyword)cGroup_4_1_2.eContents().get(0);
		private final Assignment cItemCaptionPropertyAssignment_4_1_2_1 = (Assignment)cGroup_4_1_2.eContents().get(1);
		private final CrossReference cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0 = (CrossReference)cItemCaptionPropertyAssignment_4_1_2_1.eContents().get(0);
		private final RuleCall cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1 = (RuleCall)cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0.eContents().get(1);
		private final Group cGroup_4_1_3 = (Group)cUnorderedGroup_4_1.eContents().get(3);
		private final Keyword cDescriptionFieldKeyword_4_1_3_0 = (Keyword)cGroup_4_1_3.eContents().get(0);
		private final Assignment cDescriptionPropertyAssignment_4_1_3_1 = (Assignment)cGroup_4_1_3.eContents().get(1);
		private final RuleCall cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0 = (RuleCall)cDescriptionPropertyAssignment_4_1_3_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_3_2 = (Keyword)cGroup_4_1_3.eContents().get(2);
		private final Group cGroup_4_1_4 = (Group)cUnorderedGroup_4_1.eContents().get(4);
		private final Keyword cImageFieldKeyword_4_1_4_0 = (Keyword)cGroup_4_1_4.eContents().get(0);
		private final Assignment cItemImagePropertyAssignment_4_1_4_1 = (Assignment)cGroup_4_1_4.eContents().get(1);
		private final CrossReference cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0 = (CrossReference)cItemImagePropertyAssignment_4_1_4_1.eContents().get(0);
		private final RuleCall cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1 = (RuleCall)cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0.eContents().get(1);
		private final Group cGroup_4_1_5 = (Group)cUnorderedGroup_4_1.eContents().get(5);
		private final Assignment cConsumeBeanServiceAssignment_4_1_5_0 = (Assignment)cGroup_4_1_5.eContents().get(0);
		private final Keyword cConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0 = (Keyword)cConsumeBeanServiceAssignment_4_1_5_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_5_1 = (Keyword)cGroup_4_1_5.eContents().get(1);
		private final Assignment cReadonlyAssignment_4_1_6 = (Assignment)cUnorderedGroup_4_1.eContents().get(6);
		private final Keyword cReadonlyReadonlyKeyword_4_1_6_0 = (Keyword)cReadonlyAssignment_4_1_6.eContents().get(0);
		private final Alternatives cAlternatives_4_2 = (Alternatives)cGroup_4.eContents().get(2);
		private final Assignment cValidatorsAssignment_4_2_0 = (Assignment)cAlternatives_4_2.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_2_0_0 = (RuleCall)cValidatorsAssignment_4_2_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_2_1 = (Assignment)cAlternatives_4_2.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_2_1_0 = (RuleCall)cBindingsAssignment_4_2_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_3 = (Assignment)cGroup_4.eContents().get(3);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0 = (RuleCall)cProcessorAssignmentsAssignment_4_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_4 = (Keyword)cGroup_4.eContents().get(4);
		
		//UiList:
		//	{UiList}
		//	'listSelect' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		//	name=TRANSLATABLEID? ('{' (('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*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiList} 'listSelect' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' (('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* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiList}
		public Action getUiListAction_0() { return cUiListAction_0; }
		
		//'listSelect'
		public Keyword getListSelectKeyword_1() { return cListSelectKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (('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* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//('type' jvmType=JvmTypeReference)? & ('selectionType' selectionType=UiSelectionType)? & ('captionField'
		//itemCaptionProperty=[JvmOperation])? & ('descriptionField' descriptionProperty=UiNestedProperty ';'?)? & ('imageField'
		//itemImageProperty=[JvmOperation])? & (consumeBeanService?='useBeanService' ';'?)? & readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_4_1() { return cUnorderedGroup_4_1; }
		
		//('type' jvmType=JvmTypeReference)?
		public Group getGroup_4_1_0() { return cGroup_4_1_0; }
		
		//'type'
		public Keyword getTypeKeyword_4_1_0_0() { return cTypeKeyword_4_1_0_0; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4_1_0_1() { return cJvmTypeAssignment_4_1_0_1; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0; }
		
		//('selectionType' selectionType=UiSelectionType)?
		public Group getGroup_4_1_1() { return cGroup_4_1_1; }
		
		//'selectionType'
		public Keyword getSelectionTypeKeyword_4_1_1_0() { return cSelectionTypeKeyword_4_1_1_0; }
		
		//selectionType=UiSelectionType
		public Assignment getSelectionTypeAssignment_4_1_1_1() { return cSelectionTypeAssignment_4_1_1_1; }
		
		//UiSelectionType
		public RuleCall getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0() { return cSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0; }
		
		//('captionField' itemCaptionProperty=[JvmOperation])?
		public Group getGroup_4_1_2() { return cGroup_4_1_2; }
		
		//'captionField'
		public Keyword getCaptionFieldKeyword_4_1_2_0() { return cCaptionFieldKeyword_4_1_2_0; }
		
		//itemCaptionProperty=[JvmOperation]
		public Assignment getItemCaptionPropertyAssignment_4_1_2_1() { return cItemCaptionPropertyAssignment_4_1_2_1; }
		
		//[JvmOperation]
		public CrossReference getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0() { return cItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0; }
		
		//ID
		public RuleCall getItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1() { return cItemCaptionPropertyJvmOperationIDTerminalRuleCall_4_1_2_1_0_1; }
		
		//('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
		public Group getGroup_4_1_3() { return cGroup_4_1_3; }
		
		//'descriptionField'
		public Keyword getDescriptionFieldKeyword_4_1_3_0() { return cDescriptionFieldKeyword_4_1_3_0; }
		
		//descriptionProperty=UiNestedProperty
		public Assignment getDescriptionPropertyAssignment_4_1_3_1() { return cDescriptionPropertyAssignment_4_1_3_1; }
		
		//UiNestedProperty
		public RuleCall getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0() { return cDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_3_2() { return cSemicolonKeyword_4_1_3_2; }
		
		//('imageField' itemImageProperty=[JvmOperation])?
		public Group getGroup_4_1_4() { return cGroup_4_1_4; }
		
		//'imageField'
		public Keyword getImageFieldKeyword_4_1_4_0() { return cImageFieldKeyword_4_1_4_0; }
		
		//itemImageProperty=[JvmOperation]
		public Assignment getItemImagePropertyAssignment_4_1_4_1() { return cItemImagePropertyAssignment_4_1_4_1; }
		
		//[JvmOperation]
		public CrossReference getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0() { return cItemImagePropertyJvmOperationCrossReference_4_1_4_1_0; }
		
		//ID
		public RuleCall getItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1() { return cItemImagePropertyJvmOperationIDTerminalRuleCall_4_1_4_1_0_1; }
		
		//(consumeBeanService?='useBeanService' ';'?)?
		public Group getGroup_4_1_5() { return cGroup_4_1_5; }
		
		//consumeBeanService?='useBeanService'
		public Assignment getConsumeBeanServiceAssignment_4_1_5_0() { return cConsumeBeanServiceAssignment_4_1_5_0; }
		
		//'useBeanService'
		public Keyword getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0() { return cConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4_1_5_1() { return cSemicolonKeyword_4_1_5_1; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_4_1_6() { return cReadonlyAssignment_4_1_6; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_4_1_6_0() { return cReadonlyReadonlyKeyword_4_1_6_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_2() { return cAlternatives_4_2; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_2_0() { return cValidatorsAssignment_4_2_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_2_0_0() { return cValidatorsUiValidatorParserRuleCall_4_2_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_2_1() { return cBindingsAssignment_4_2_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_2_1_0() { return cBindingsUiBindingParserRuleCall_4_2_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_3() { return cProcessorAssignmentsAssignment_4_3; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_4() { return cRightCurlyBracketKeyword_4_4; }
	}
	public class UiColumnsAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiColumnsAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiColumnsAssignmentAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cColumnsKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cColumnsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cColumnsUiColumnParserRuleCall_3_0 = (RuleCall)cColumnsAssignment_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiColumnsAssignment:
		//	{UiColumnsAssignment}
		//	'columns' '{'
		//	columns+=UiColumn*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiColumnsAssignment} 'columns' '{' columns+=UiColumn* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiColumnsAssignment}
		public Action getUiColumnsAssignmentAction_0() { return cUiColumnsAssignmentAction_0; }
		
		//'columns'
		public Keyword getColumnsKeyword_1() { return cColumnsKeyword_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//columns+=UiColumn*
		public Assignment getColumnsAssignment_3() { return cColumnsAssignment_3; }
		
		//UiColumn
		public RuleCall getColumnsUiColumnParserRuleCall_3_0() { return cColumnsUiColumnParserRuleCall_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}
	public class UiSortOrderAssignmentElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSortOrderAssignment");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiSortOrderAssignmentAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSortKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cColumnsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cColumnsUiSortOrderParserRuleCall_3_0 = (RuleCall)cColumnsAssignment_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiSortOrderAssignment:
		//	{UiSortOrderAssignment}
		//	'sort' '{'
		//	columns+=UiSortOrder*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiSortOrderAssignment} 'sort' '{' columns+=UiSortOrder* '}'
		public Group getGroup() { return cGroup; }
		
		//{UiSortOrderAssignment}
		public Action getUiSortOrderAssignmentAction_0() { return cUiSortOrderAssignmentAction_0; }
		
		//'sort'
		public Keyword getSortKeyword_1() { return cSortKeyword_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//columns+=UiSortOrder*
		public Assignment getColumnsAssignment_3() { return cColumnsAssignment_3; }
		
		//UiSortOrder
		public RuleCall getColumnsUiSortOrderParserRuleCall_3_0() { return cColumnsUiSortOrderParserRuleCall_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}
	public class UiSortOrderElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSortOrder");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cColumnKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cPropertyAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPropertyUiNestedPropertyParserRuleCall_1_0 = (RuleCall)cPropertyAssignment_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Keyword cDescKeyword_2_0 = (Keyword)cAlternatives_2.eContents().get(0);
		private final Assignment cAscAssignment_2_1 = (Assignment)cAlternatives_2.eContents().get(1);
		private final Keyword cAscAscKeyword_2_1_0 = (Keyword)cAscAssignment_2_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_3 = (Keyword)cGroup.eContents().get(3);
		
		//UiSortOrder:
		//	'column' property=UiNestedProperty ('desc' | asc?="asc")? ';'?;
		@Override public ParserRule getRule() { return rule; }
		
		//'column' property=UiNestedProperty ('desc' | asc?="asc")? ';'?
		public Group getGroup() { return cGroup; }
		
		//'column'
		public Keyword getColumnKeyword_0() { return cColumnKeyword_0; }
		
		//property=UiNestedProperty
		public Assignment getPropertyAssignment_1() { return cPropertyAssignment_1; }
		
		//UiNestedProperty
		public RuleCall getPropertyUiNestedPropertyParserRuleCall_1_0() { return cPropertyUiNestedPropertyParserRuleCall_1_0; }
		
		//('desc' | asc?="asc")?
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//'desc'
		public Keyword getDescKeyword_2_0() { return cDescKeyword_2_0; }
		
		//asc?="asc"
		public Assignment getAscAssignment_2_1() { return cAscAssignment_2_1; }
		
		//"asc"
		public Keyword getAscAscKeyword_2_1_0() { return cAscAscKeyword_2_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_3() { return cSemicolonKeyword_3; }
	}
	public class UiColumnElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiColumn");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiColumnAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cColumnKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cPropertyAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cPropertyUiNestedPropertyParserRuleCall_2_0 = (RuleCall)cPropertyAssignment_2.eContents().get(0);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Keyword cIconKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Assignment cIconNameAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cIconNameSTRINGTerminalRuleCall_3_1_0 = (RuleCall)cIconNameAssignment_3_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiColumn:
		//	{UiColumn}
		//	'column' property=UiNestedProperty ('icon' iconName=STRING)? ';'?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiColumn} 'column' property=UiNestedProperty ('icon' iconName=STRING)? ';'?
		public Group getGroup() { return cGroup; }
		
		//{UiColumn}
		public Action getUiColumnAction_0() { return cUiColumnAction_0; }
		
		//'column'
		public Keyword getColumnKeyword_1() { return cColumnKeyword_1; }
		
		//property=UiNestedProperty
		public Assignment getPropertyAssignment_2() { return cPropertyAssignment_2; }
		
		//UiNestedProperty
		public RuleCall getPropertyUiNestedPropertyParserRuleCall_2_0() { return cPropertyUiNestedPropertyParserRuleCall_2_0; }
		
		//('icon' iconName=STRING)?
		public Group getGroup_3() { return cGroup_3; }
		
		//'icon'
		public Keyword getIconKeyword_3_0() { return cIconKeyword_3_0; }
		
		//iconName=STRING
		public Assignment getIconNameAssignment_3_1() { return cIconNameAssignment_3_1; }
		
		//STRING
		public RuleCall getIconNameSTRINGTerminalRuleCall_3_1_0() { return cIconNameSTRINGTerminalRuleCall_3_1_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	public class UiEmbeddableElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiLayoutParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiActionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiTabSheetParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//UiEmbeddable:
		//	UiLayout | UiField | UiAction | UiTabSheet;
		@Override public ParserRule getRule() { return rule; }
		
		//UiLayout | UiField | UiAction | UiTabSheet
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UiLayout
		public RuleCall getUiLayoutParserRuleCall_0() { return cUiLayoutParserRuleCall_0; }
		
		//UiField
		public RuleCall getUiFieldParserRuleCall_1() { return cUiFieldParserRuleCall_1; }
		
		//UiAction
		public RuleCall getUiActionParserRuleCall_2() { return cUiActionParserRuleCall_2; }
		
		//UiTabSheet
		public RuleCall getUiTabSheetParserRuleCall_3() { return cUiTabSheetParserRuleCall_3; }
	}
	public class UiMobileEmbeddableElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMobileLayoutParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiMobileFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiMobileTabSheetParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiMobileActionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//UiMobileEmbeddable:
		//	UiMobileLayout | UiMobileField | UiMobileTabSheet | UiMobileAction;
		@Override public ParserRule getRule() { return rule; }
		
		//UiMobileLayout | UiMobileField | UiMobileTabSheet | UiMobileAction
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UiMobileLayout
		public RuleCall getUiMobileLayoutParserRuleCall_0() { return cUiMobileLayoutParserRuleCall_0; }
		
		//UiMobileField
		public RuleCall getUiMobileFieldParserRuleCall_1() { return cUiMobileFieldParserRuleCall_1; }
		
		//UiMobileTabSheet
		public RuleCall getUiMobileTabSheetParserRuleCall_2() { return cUiMobileTabSheetParserRuleCall_2; }
		
		//UiMobileAction
		public RuleCall getUiMobileActionParserRuleCall_3() { return cUiMobileActionParserRuleCall_3; }
	}
	public class UiMobileLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileLayout");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMobileHorizontalButtonGroupParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiMobileVerticalComponentGroupParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiMobileNavigationPageParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiMobileHorizontalLayoutParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiMobileVerticalLayoutParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cUiMobileSearchPanelParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cUiMobileNavigationRootParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		
		//UiMobileLayout:
		//	UiMobileHorizontalButtonGroup | UiMobileVerticalComponentGroup | UiMobileNavigationPage | UiMobileHorizontalLayout |
		//	UiMobileVerticalLayout | UiMobileSearchPanel | UiMobileNavigationRoot;
		@Override public ParserRule getRule() { return rule; }
		
		//UiMobileHorizontalButtonGroup | UiMobileVerticalComponentGroup | UiMobileNavigationPage | UiMobileHorizontalLayout |
		//UiMobileVerticalLayout | UiMobileSearchPanel | UiMobileNavigationRoot
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UiMobileHorizontalButtonGroup
		public RuleCall getUiMobileHorizontalButtonGroupParserRuleCall_0() { return cUiMobileHorizontalButtonGroupParserRuleCall_0; }
		
		//UiMobileVerticalComponentGroup
		public RuleCall getUiMobileVerticalComponentGroupParserRuleCall_1() { return cUiMobileVerticalComponentGroupParserRuleCall_1; }
		
		//UiMobileNavigationPage
		public RuleCall getUiMobileNavigationPageParserRuleCall_2() { return cUiMobileNavigationPageParserRuleCall_2; }
		
		//UiMobileHorizontalLayout
		public RuleCall getUiMobileHorizontalLayoutParserRuleCall_3() { return cUiMobileHorizontalLayoutParserRuleCall_3; }
		
		//UiMobileVerticalLayout
		public RuleCall getUiMobileVerticalLayoutParserRuleCall_4() { return cUiMobileVerticalLayoutParserRuleCall_4; }
		
		//UiMobileSearchPanel
		public RuleCall getUiMobileSearchPanelParserRuleCall_5() { return cUiMobileSearchPanelParserRuleCall_5; }
		
		//UiMobileNavigationRoot
		public RuleCall getUiMobileNavigationRootParserRuleCall_6() { return cUiMobileNavigationRootParserRuleCall_6; }
	}
	public class UiMobileFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileField");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMobileSwitchParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiTextFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiMaskedTextFieldParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiMaskedNumericFieldParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiMaskedDecimalFieldParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cUiPrefixedMaskedTextFieldParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cUiRichTextAreaParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cUiPasswordFieldParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cUiSuggestTextFieldParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		private final RuleCall cUiNumericFieldParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		private final RuleCall cUiTableParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
		private final RuleCall cUiComboBoxParserRuleCall_11 = (RuleCall)cAlternatives.eContents().get(11);
		private final RuleCall cUiImageParserRuleCall_12 = (RuleCall)cAlternatives.eContents().get(12);
		private final RuleCall cUiSearchFieldParserRuleCall_13 = (RuleCall)cAlternatives.eContents().get(13);
		private final RuleCall cUiLabelParserRuleCall_14 = (RuleCall)cAlternatives.eContents().get(14);
		private final RuleCall cUiDecimalFieldParserRuleCall_15 = (RuleCall)cAlternatives.eContents().get(15);
		private final RuleCall cUiTextAreaParserRuleCall_16 = (RuleCall)cAlternatives.eContents().get(16);
		private final RuleCall cUiDateFieldParserRuleCall_17 = (RuleCall)cAlternatives.eContents().get(17);
		private final RuleCall cUiBrowserParserRuleCall_18 = (RuleCall)cAlternatives.eContents().get(18);
		private final RuleCall cUiProgressBarParserRuleCall_19 = (RuleCall)cAlternatives.eContents().get(19);
		private final RuleCall cUiOptionsGroupParserRuleCall_20 = (RuleCall)cAlternatives.eContents().get(20);
		
		//UiMobileField:
		//	UiMobileSwitch | UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField |
		//	UiPrefixedMaskedTextField | UiRichTextArea | UiPasswordField | UiSuggestTextField | UiNumericField | UiTable |
		//	UiComboBox | UiImage
		//	| UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar | UiOptionsGroup;
		@Override public ParserRule getRule() { return rule; }
		
		//UiMobileSwitch | UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField |
		//UiPrefixedMaskedTextField | UiRichTextArea | UiPasswordField | UiSuggestTextField | UiNumericField | UiTable |
		//UiComboBox | UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar
		//| UiOptionsGroup
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UiMobileSwitch
		public RuleCall getUiMobileSwitchParserRuleCall_0() { return cUiMobileSwitchParserRuleCall_0; }
		
		//UiTextField
		public RuleCall getUiTextFieldParserRuleCall_1() { return cUiTextFieldParserRuleCall_1; }
		
		//UiMaskedTextField
		public RuleCall getUiMaskedTextFieldParserRuleCall_2() { return cUiMaskedTextFieldParserRuleCall_2; }
		
		//UiMaskedNumericField
		public RuleCall getUiMaskedNumericFieldParserRuleCall_3() { return cUiMaskedNumericFieldParserRuleCall_3; }
		
		//UiMaskedDecimalField
		public RuleCall getUiMaskedDecimalFieldParserRuleCall_4() { return cUiMaskedDecimalFieldParserRuleCall_4; }
		
		//UiPrefixedMaskedTextField
		public RuleCall getUiPrefixedMaskedTextFieldParserRuleCall_5() { return cUiPrefixedMaskedTextFieldParserRuleCall_5; }
		
		//UiRichTextArea
		public RuleCall getUiRichTextAreaParserRuleCall_6() { return cUiRichTextAreaParserRuleCall_6; }
		
		//UiPasswordField
		public RuleCall getUiPasswordFieldParserRuleCall_7() { return cUiPasswordFieldParserRuleCall_7; }
		
		//UiSuggestTextField
		public RuleCall getUiSuggestTextFieldParserRuleCall_8() { return cUiSuggestTextFieldParserRuleCall_8; }
		
		//UiNumericField
		public RuleCall getUiNumericFieldParserRuleCall_9() { return cUiNumericFieldParserRuleCall_9; }
		
		//UiTable
		public RuleCall getUiTableParserRuleCall_10() { return cUiTableParserRuleCall_10; }
		
		//UiComboBox
		public RuleCall getUiComboBoxParserRuleCall_11() { return cUiComboBoxParserRuleCall_11; }
		
		//UiImage
		public RuleCall getUiImageParserRuleCall_12() { return cUiImageParserRuleCall_12; }
		
		//UiSearchField
		public RuleCall getUiSearchFieldParserRuleCall_13() { return cUiSearchFieldParserRuleCall_13; }
		
		//UiLabel
		public RuleCall getUiLabelParserRuleCall_14() { return cUiLabelParserRuleCall_14; }
		
		//UiDecimalField
		public RuleCall getUiDecimalFieldParserRuleCall_15() { return cUiDecimalFieldParserRuleCall_15; }
		
		//UiTextArea
		public RuleCall getUiTextAreaParserRuleCall_16() { return cUiTextAreaParserRuleCall_16; }
		
		//UiDateField
		public RuleCall getUiDateFieldParserRuleCall_17() { return cUiDateFieldParserRuleCall_17; }
		
		//UiBrowser
		public RuleCall getUiBrowserParserRuleCall_18() { return cUiBrowserParserRuleCall_18; }
		
		//UiProgressBar
		public RuleCall getUiProgressBarParserRuleCall_19() { return cUiProgressBarParserRuleCall_19; }
		
		//UiOptionsGroup
		public RuleCall getUiOptionsGroupParserRuleCall_20() { return cUiOptionsGroupParserRuleCall_20; }
	}
	public class UiLayoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiLayout");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiGridLayoutParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiFormLayoutParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiHorizontalLayoutParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiVerticalLayoutParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiSplitpanelParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cUiPanelParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cUiSearchPanelParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		
		//UiLayout:
		//	UiGridLayout | UiFormLayout | UiHorizontalLayout | UiVerticalLayout | UiSplitpanel | UiPanel | UiSearchPanel;
		@Override public ParserRule getRule() { return rule; }
		
		//UiGridLayout | UiFormLayout | UiHorizontalLayout | UiVerticalLayout | UiSplitpanel | UiPanel | UiSearchPanel
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UiGridLayout
		public RuleCall getUiGridLayoutParserRuleCall_0() { return cUiGridLayoutParserRuleCall_0; }
		
		//UiFormLayout
		public RuleCall getUiFormLayoutParserRuleCall_1() { return cUiFormLayoutParserRuleCall_1; }
		
		//UiHorizontalLayout
		public RuleCall getUiHorizontalLayoutParserRuleCall_2() { return cUiHorizontalLayoutParserRuleCall_2; }
		
		//UiVerticalLayout
		public RuleCall getUiVerticalLayoutParserRuleCall_3() { return cUiVerticalLayoutParserRuleCall_3; }
		
		//UiSplitpanel
		public RuleCall getUiSplitpanelParserRuleCall_4() { return cUiSplitpanelParserRuleCall_4; }
		
		//UiPanel
		public RuleCall getUiPanelParserRuleCall_5() { return cUiPanelParserRuleCall_5; }
		
		//UiSearchPanel
		public RuleCall getUiSearchPanelParserRuleCall_6() { return cUiSearchPanelParserRuleCall_6; }
	}
	public class UiFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiField");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiTextFieldParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiMaskedTextFieldParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiMaskedNumericFieldParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiMaskedDecimalFieldParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiPrefixedMaskedTextFieldParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cUiRichTextAreaParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cUiPasswordFieldParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cUiSuggestTextFieldParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cUiListParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		private final RuleCall cUiNumericFieldParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		private final RuleCall cUiCheckBoxParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
		private final RuleCall cUiTableParserRuleCall_11 = (RuleCall)cAlternatives.eContents().get(11);
		private final RuleCall cUiComboBoxParserRuleCall_12 = (RuleCall)cAlternatives.eContents().get(12);
		private final RuleCall cUiImageParserRuleCall_13 = (RuleCall)cAlternatives.eContents().get(13);
		private final RuleCall cUiSearchFieldParserRuleCall_14 = (RuleCall)cAlternatives.eContents().get(14);
		private final RuleCall cUiLabelParserRuleCall_15 = (RuleCall)cAlternatives.eContents().get(15);
		private final RuleCall cUiDecimalFieldParserRuleCall_16 = (RuleCall)cAlternatives.eContents().get(16);
		private final RuleCall cUiTextAreaParserRuleCall_17 = (RuleCall)cAlternatives.eContents().get(17);
		private final RuleCall cUiDateFieldParserRuleCall_18 = (RuleCall)cAlternatives.eContents().get(18);
		private final RuleCall cUiBrowserParserRuleCall_19 = (RuleCall)cAlternatives.eContents().get(19);
		private final RuleCall cUiProgressBarParserRuleCall_20 = (RuleCall)cAlternatives.eContents().get(20);
		private final RuleCall cUiOptionsGroupParserRuleCall_21 = (RuleCall)cAlternatives.eContents().get(21);
		private final RuleCall cUiBeanReferenceFieldParserRuleCall_22 = (RuleCall)cAlternatives.eContents().get(22);
		
		//UiField:
		//	UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField | UiPrefixedMaskedTextField |
		//	UiRichTextArea | UiPasswordField | UiSuggestTextField | UiList | UiNumericField | UiCheckBox | UiTable | UiComboBox |
		//	UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar |
		//	UiOptionsGroup | UiBeanReferenceField;
		@Override public ParserRule getRule() { return rule; }
		
		//UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField | UiPrefixedMaskedTextField |
		//UiRichTextArea | UiPasswordField | UiSuggestTextField | UiList | UiNumericField | UiCheckBox | UiTable | UiComboBox |
		//UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar |
		//UiOptionsGroup | UiBeanReferenceField
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UiTextField
		public RuleCall getUiTextFieldParserRuleCall_0() { return cUiTextFieldParserRuleCall_0; }
		
		//UiMaskedTextField
		public RuleCall getUiMaskedTextFieldParserRuleCall_1() { return cUiMaskedTextFieldParserRuleCall_1; }
		
		//UiMaskedNumericField
		public RuleCall getUiMaskedNumericFieldParserRuleCall_2() { return cUiMaskedNumericFieldParserRuleCall_2; }
		
		//UiMaskedDecimalField
		public RuleCall getUiMaskedDecimalFieldParserRuleCall_3() { return cUiMaskedDecimalFieldParserRuleCall_3; }
		
		//UiPrefixedMaskedTextField
		public RuleCall getUiPrefixedMaskedTextFieldParserRuleCall_4() { return cUiPrefixedMaskedTextFieldParserRuleCall_4; }
		
		//UiRichTextArea
		public RuleCall getUiRichTextAreaParserRuleCall_5() { return cUiRichTextAreaParserRuleCall_5; }
		
		//UiPasswordField
		public RuleCall getUiPasswordFieldParserRuleCall_6() { return cUiPasswordFieldParserRuleCall_6; }
		
		//UiSuggestTextField
		public RuleCall getUiSuggestTextFieldParserRuleCall_7() { return cUiSuggestTextFieldParserRuleCall_7; }
		
		//UiList
		public RuleCall getUiListParserRuleCall_8() { return cUiListParserRuleCall_8; }
		
		//UiNumericField
		public RuleCall getUiNumericFieldParserRuleCall_9() { return cUiNumericFieldParserRuleCall_9; }
		
		//UiCheckBox
		public RuleCall getUiCheckBoxParserRuleCall_10() { return cUiCheckBoxParserRuleCall_10; }
		
		//UiTable
		public RuleCall getUiTableParserRuleCall_11() { return cUiTableParserRuleCall_11; }
		
		//UiComboBox
		public RuleCall getUiComboBoxParserRuleCall_12() { return cUiComboBoxParserRuleCall_12; }
		
		//UiImage
		public RuleCall getUiImageParserRuleCall_13() { return cUiImageParserRuleCall_13; }
		
		//UiSearchField
		public RuleCall getUiSearchFieldParserRuleCall_14() { return cUiSearchFieldParserRuleCall_14; }
		
		//UiLabel
		public RuleCall getUiLabelParserRuleCall_15() { return cUiLabelParserRuleCall_15; }
		
		//UiDecimalField
		public RuleCall getUiDecimalFieldParserRuleCall_16() { return cUiDecimalFieldParserRuleCall_16; }
		
		//UiTextArea
		public RuleCall getUiTextAreaParserRuleCall_17() { return cUiTextAreaParserRuleCall_17; }
		
		//UiDateField
		public RuleCall getUiDateFieldParserRuleCall_18() { return cUiDateFieldParserRuleCall_18; }
		
		//UiBrowser
		public RuleCall getUiBrowserParserRuleCall_19() { return cUiBrowserParserRuleCall_19; }
		
		//UiProgressBar
		public RuleCall getUiProgressBarParserRuleCall_20() { return cUiProgressBarParserRuleCall_20; }
		
		//UiOptionsGroup
		public RuleCall getUiOptionsGroupParserRuleCall_21() { return cUiOptionsGroupParserRuleCall_21; }
		
		//UiBeanReferenceField
		public RuleCall getUiBeanReferenceFieldParserRuleCall_22() { return cUiBeanReferenceFieldParserRuleCall_22; }
	}
	public class UiActionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiAction");
		private final RuleCall cUiButtonParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//UiAction:
		//	UiButton;
		@Override public ParserRule getRule() { return rule; }
		
		//UiButton
		public RuleCall getUiButtonParserRuleCall() { return cUiButtonParserRuleCall; }
	}
	public class UiMobileActionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileAction");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMobileNavigationButtonParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiButtonParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//UiMobileAction:
		//	UiMobileNavigationButton | UiButton;
		@Override public ParserRule getRule() { return rule; }
		
		//UiMobileNavigationButton | UiButton
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UiMobileNavigationButton
		public RuleCall getUiMobileNavigationButtonParserRuleCall_0() { return cUiMobileNavigationButtonParserRuleCall_0; }
		
		//UiButton
		public RuleCall getUiButtonParserRuleCall_1() { return cUiButtonParserRuleCall_1; }
	}
	public class UiNumericFieldElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiNumericField");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiNumericFieldAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNumericFieldKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cNoGroupingAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final Keyword cNoGroupingNoGroupingKeyword_2_1_0_0 = (Keyword)cNoGroupingAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cStylesKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_1_1_0 = (RuleCall)cStylesAssignment_2_1_1_1.eContents().get(0);
		private final Assignment cNoMarkNegativeAssignment_2_1_2 = (Assignment)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cNoMarkNegativeNoMarkNegativeKeyword_2_1_2_0 = (Keyword)cNoMarkNegativeAssignment_2_1_2.eContents().get(0);
		private final Assignment cI18nInfoAssignment_2_1_3 = (Assignment)cUnorderedGroup_2_1.eContents().get(3);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0 = (RuleCall)cI18nInfoAssignment_2_1_3.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_4 = (Assignment)cUnorderedGroup_2_1.eContents().get(4);
		private final Keyword cReadonlyReadonlyKeyword_2_1_4_0 = (Keyword)cReadonlyAssignment_2_1_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiNumericField:
		//	{UiNumericField}
		//	'numericField' ('(' (noGrouping?='noGrouping'?
		//	& ('styles' styles=STRING)?
		//	& noMarkNegative?='noMarkNegative'?
		//	& i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?)
		//	')')?
		//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiNumericField} 'numericField' ('(' (noGrouping?='noGrouping'? & ('styles' styles=STRING)? &
		//noMarkNegative?='noMarkNegative'? & i18nInfo=UiI18nInfo? & readonly?="readonly"?) ')')? name=TRANSLATABLEID? ('{'
		//(validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiNumericField}
		public Action getUiNumericFieldAction_0() { return cUiNumericFieldAction_0; }
		
		//'numericField'
		public Keyword getNumericFieldKeyword_1() { return cNumericFieldKeyword_1; }
		
		//('(' (noGrouping?='noGrouping'? & ('styles' styles=STRING)? & noMarkNegative?='noMarkNegative'? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//noGrouping?='noGrouping'? & ('styles' styles=STRING)? & noMarkNegative?='noMarkNegative'? & i18nInfo=UiI18nInfo? &
		//readonly?="readonly"?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//noGrouping?='noGrouping'?
		public Assignment getNoGroupingAssignment_2_1_0() { return cNoGroupingAssignment_2_1_0; }
		
		//'noGrouping'
		public Keyword getNoGroupingNoGroupingKeyword_2_1_0_0() { return cNoGroupingNoGroupingKeyword_2_1_0_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_1_0() { return cStylesKeyword_2_1_1_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_1_1() { return cStylesAssignment_2_1_1_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_1_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_1_1_0; }
		
		//noMarkNegative?='noMarkNegative'?
		public Assignment getNoMarkNegativeAssignment_2_1_2() { return cNoMarkNegativeAssignment_2_1_2; }
		
		//'noMarkNegative'
		public Keyword getNoMarkNegativeNoMarkNegativeKeyword_2_1_2_0() { return cNoMarkNegativeNoMarkNegativeKeyword_2_1_2_0; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_3() { return cI18nInfoAssignment_2_1_3; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_3_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_4() { return cReadonlyAssignment_2_1_4; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_4_0() { return cReadonlyReadonlyKeyword_2_1_4_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiCheckBoxElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiCheckBox");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiCheckBoxAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cCheckboxKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2_1 = (UnorderedGroup)cGroup_2.eContents().get(1);
		private final Assignment cI18nInfoAssignment_2_1_0 = (Assignment)cUnorderedGroup_2_1.eContents().get(0);
		private final RuleCall cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0 = (RuleCall)cI18nInfoAssignment_2_1_0.eContents().get(0);
		private final Assignment cReadonlyAssignment_2_1_1 = (Assignment)cUnorderedGroup_2_1.eContents().get(1);
		private final Keyword cReadonlyReadonlyKeyword_2_1_1_0 = (Keyword)cReadonlyAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_1_2 = (Group)cUnorderedGroup_2_1.eContents().get(2);
		private final Keyword cStylesKeyword_2_1_2_0 = (Keyword)cGroup_2_1_2.eContents().get(0);
		private final Assignment cStylesAssignment_2_1_2_1 = (Assignment)cGroup_2_1_2.eContents().get(1);
		private final RuleCall cStylesSTRINGTerminalRuleCall_2_1_2_1_0 = (RuleCall)cStylesAssignment_2_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Alternatives cAlternatives_4_1 = (Alternatives)cGroup_4.eContents().get(1);
		private final Assignment cValidatorsAssignment_4_1_0 = (Assignment)cAlternatives_4_1.eContents().get(0);
		private final RuleCall cValidatorsUiValidatorParserRuleCall_4_1_0_0 = (RuleCall)cValidatorsAssignment_4_1_0.eContents().get(0);
		private final Assignment cBindingsAssignment_4_1_1 = (Assignment)cAlternatives_4_1.eContents().get(1);
		private final RuleCall cBindingsUiBindingParserRuleCall_4_1_1_0 = (RuleCall)cBindingsAssignment_4_1_1.eContents().get(0);
		private final Assignment cProcessorAssignmentsAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final RuleCall cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0 = (RuleCall)cProcessorAssignmentsAssignment_4_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		
		//UiCheckBox:
		//	{UiCheckBox}
		//	'checkbox' ('(' (i18nInfo=UiI18nInfo?
		//	& readonly?="readonly"?
		//	& ('styles' styles=STRING)?)
		//	')')? name=TRANSLATABLEID? ('{' (validators+=UiValidator
		//	| bindings+=UiBinding)*
		//	processorAssignments+=UiVisibilityProcessorAssignment*
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiCheckBox} 'checkbox' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
		//name=TRANSLATABLEID? ('{' (validators+=UiValidator | bindings+=UiBinding)*
		//processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup() { return cGroup; }
		
		//{UiCheckBox}
		public Action getUiCheckBoxAction_0() { return cUiCheckBoxAction_0; }
		
		//'checkbox'
		public Keyword getCheckboxKeyword_1() { return cCheckboxKeyword_1; }
		
		//('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?
		public UnorderedGroup getUnorderedGroup_2_1() { return cUnorderedGroup_2_1; }
		
		//i18nInfo=UiI18nInfo?
		public Assignment getI18nInfoAssignment_2_1_0() { return cI18nInfoAssignment_2_1_0; }
		
		//UiI18nInfo
		public RuleCall getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0() { return cI18nInfoUiI18nInfoParserRuleCall_2_1_0_0; }
		
		//readonly?="readonly"?
		public Assignment getReadonlyAssignment_2_1_1() { return cReadonlyAssignment_2_1_1; }
		
		//"readonly"
		public Keyword getReadonlyReadonlyKeyword_2_1_1_0() { return cReadonlyReadonlyKeyword_2_1_1_0; }
		
		//('styles' styles=STRING)?
		public Group getGroup_2_1_2() { return cGroup_2_1_2; }
		
		//'styles'
		public Keyword getStylesKeyword_2_1_2_0() { return cStylesKeyword_2_1_2_0; }
		
		//styles=STRING
		public Assignment getStylesAssignment_2_1_2_1() { return cStylesAssignment_2_1_2_1; }
		
		//STRING
		public RuleCall getStylesSTRINGTerminalRuleCall_2_1_2_1_0() { return cStylesSTRINGTerminalRuleCall_2_1_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//name=TRANSLATABLEID?
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_3_0() { return cNameTRANSLATABLEIDParserRuleCall_3_0; }
		
		//('{' (validators+=UiValidator | bindings+=UiBinding)* processorAssignments+=UiVisibilityProcessorAssignment* '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//(validators+=UiValidator | bindings+=UiBinding)*
		public Alternatives getAlternatives_4_1() { return cAlternatives_4_1; }
		
		//validators+=UiValidator
		public Assignment getValidatorsAssignment_4_1_0() { return cValidatorsAssignment_4_1_0; }
		
		//UiValidator
		public RuleCall getValidatorsUiValidatorParserRuleCall_4_1_0_0() { return cValidatorsUiValidatorParserRuleCall_4_1_0_0; }
		
		//bindings+=UiBinding
		public Assignment getBindingsAssignment_4_1_1() { return cBindingsAssignment_4_1_1; }
		
		//UiBinding
		public RuleCall getBindingsUiBindingParserRuleCall_4_1_1_0() { return cBindingsUiBindingParserRuleCall_4_1_1_0; }
		
		//processorAssignments+=UiVisibilityProcessorAssignment*
		public Assignment getProcessorAssignmentsAssignment_4_2() { return cProcessorAssignmentsAssignment_4_2; }
		
		//UiVisibilityProcessorAssignment
		public RuleCall getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0() { return cProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_3() { return cRightCurlyBracketKeyword_4_3; }
	}
	public class UiValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cUiMaxLengthValidatorParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cUiMinLengthValidatorParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUiRegexpValidatorParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cUiXbaseValidatorParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cUiBeanValidationValidatorParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		
		//UiValidator:
		//	UiMaxLengthValidator | UiMinLengthValidator | UiRegexpValidator | UiXbaseValidator | UiBeanValidationValidator;
		@Override public ParserRule getRule() { return rule; }
		
		//UiMaxLengthValidator | UiMinLengthValidator | UiRegexpValidator | UiXbaseValidator | UiBeanValidationValidator
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UiMaxLengthValidator
		public RuleCall getUiMaxLengthValidatorParserRuleCall_0() { return cUiMaxLengthValidatorParserRuleCall_0; }
		
		//UiMinLengthValidator
		public RuleCall getUiMinLengthValidatorParserRuleCall_1() { return cUiMinLengthValidatorParserRuleCall_1; }
		
		//UiRegexpValidator
		public RuleCall getUiRegexpValidatorParserRuleCall_2() { return cUiRegexpValidatorParserRuleCall_2; }
		
		//UiXbaseValidator
		public RuleCall getUiXbaseValidatorParserRuleCall_3() { return cUiXbaseValidatorParserRuleCall_3; }
		
		//UiBeanValidationValidator
		public RuleCall getUiBeanValidationValidatorParserRuleCall_4() { return cUiBeanValidationValidatorParserRuleCall_4; }
	}
	public class UiMaxLengthValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMaxLengthValidator");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMaxLengthValidatorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMaxLengthValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cMaxLengthAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cMaxLengthINTTerminalRuleCall_4_0 = (RuleCall)cMaxLengthAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cErrorCodeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cErrorCodeUiErrorCodeParserRuleCall_6_0 = (RuleCall)cErrorCodeAssignment_6.eContents().get(0);
		
		//UiMaxLengthValidator:
		//	{UiMaxLengthValidator}
		//	'MaxLengthValidator' name=ID? '(' maxLength=INT ')' errorCode=UiErrorCode?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiMaxLengthValidator} 'MaxLengthValidator' name=ID? '(' maxLength=INT ')' errorCode=UiErrorCode?
		public Group getGroup() { return cGroup; }
		
		//{UiMaxLengthValidator}
		public Action getUiMaxLengthValidatorAction_0() { return cUiMaxLengthValidatorAction_0; }
		
		//'MaxLengthValidator'
		public Keyword getMaxLengthValidatorKeyword_1() { return cMaxLengthValidatorKeyword_1; }
		
		//name=ID?
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }
		
		//maxLength=INT
		public Assignment getMaxLengthAssignment_4() { return cMaxLengthAssignment_4; }
		
		//INT
		public RuleCall getMaxLengthINTTerminalRuleCall_4_0() { return cMaxLengthINTTerminalRuleCall_4_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
		
		//errorCode=UiErrorCode?
		public Assignment getErrorCodeAssignment_6() { return cErrorCodeAssignment_6; }
		
		//UiErrorCode
		public RuleCall getErrorCodeUiErrorCodeParserRuleCall_6_0() { return cErrorCodeUiErrorCodeParserRuleCall_6_0; }
	}
	public class UiMinLengthValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiMinLengthValidator");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiMinLengthValidatorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMinLengthValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cMinLengthAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cMinLengthINTTerminalRuleCall_4_0 = (RuleCall)cMinLengthAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cErrorCodeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cErrorCodeUiErrorCodeParserRuleCall_6_0 = (RuleCall)cErrorCodeAssignment_6.eContents().get(0);
		
		//UiMinLengthValidator:
		//	{UiMinLengthValidator}
		//	'MinLengthValidator' name=ID? '(' minLength=INT ')' errorCode=UiErrorCode?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiMinLengthValidator} 'MinLengthValidator' name=ID? '(' minLength=INT ')' errorCode=UiErrorCode?
		public Group getGroup() { return cGroup; }
		
		//{UiMinLengthValidator}
		public Action getUiMinLengthValidatorAction_0() { return cUiMinLengthValidatorAction_0; }
		
		//'MinLengthValidator'
		public Keyword getMinLengthValidatorKeyword_1() { return cMinLengthValidatorKeyword_1; }
		
		//name=ID?
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }
		
		//minLength=INT
		public Assignment getMinLengthAssignment_4() { return cMinLengthAssignment_4; }
		
		//INT
		public RuleCall getMinLengthINTTerminalRuleCall_4_0() { return cMinLengthINTTerminalRuleCall_4_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
		
		//errorCode=UiErrorCode?
		public Assignment getErrorCodeAssignment_6() { return cErrorCodeAssignment_6; }
		
		//UiErrorCode
		public RuleCall getErrorCodeUiErrorCodeParserRuleCall_6_0() { return cErrorCodeUiErrorCodeParserRuleCall_6_0; }
	}
	public class UiRegexpValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiRegexpValidator");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiRegexpValidatorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cRegexValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cRegExpressionAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cRegExpressionSTRINGTerminalRuleCall_4_0 = (RuleCall)cRegExpressionAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cErrorCodeAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cErrorCodeUiErrorCodeParserRuleCall_6_0 = (RuleCall)cErrorCodeAssignment_6.eContents().get(0);
		
		//UiRegexpValidator:
		//	{UiRegexpValidator}
		//	'RegexValidator' name=ID? '(' regExpression=STRING ')' errorCode=UiErrorCode?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiRegexpValidator} 'RegexValidator' name=ID? '(' regExpression=STRING ')' errorCode=UiErrorCode?
		public Group getGroup() { return cGroup; }
		
		//{UiRegexpValidator}
		public Action getUiRegexpValidatorAction_0() { return cUiRegexpValidatorAction_0; }
		
		//'RegexValidator'
		public Keyword getRegexValidatorKeyword_1() { return cRegexValidatorKeyword_1; }
		
		//name=ID?
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }
		
		//regExpression=STRING
		public Assignment getRegExpressionAssignment_4() { return cRegExpressionAssignment_4; }
		
		//STRING
		public RuleCall getRegExpressionSTRINGTerminalRuleCall_4_0() { return cRegExpressionSTRINGTerminalRuleCall_4_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
		
		//errorCode=UiErrorCode?
		public Assignment getErrorCodeAssignment_6() { return cErrorCodeAssignment_6; }
		
		//UiErrorCode
		public RuleCall getErrorCodeUiErrorCodeParserRuleCall_6_0() { return cErrorCodeUiErrorCodeParserRuleCall_6_0; }
	}
	public class UiXbaseValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiXbaseValidator");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiXbaseValidatorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cExpressionKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cJvmTypeAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cJvmTypeJvmTypeReferenceParserRuleCall_4_0 = (RuleCall)cJvmTypeAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cErrorCodesAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cErrorCodesUiErrorCodeParserRuleCall_6_0 = (RuleCall)cErrorCodesAssignment_6.eContents().get(0);
		private final Assignment cExpressionAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cExpressionXBlockExpressionParserRuleCall_7_0 = (RuleCall)cExpressionAssignment_7.eContents().get(0);
		
		//UiXbaseValidator:
		//	{UiXbaseValidator}
		//	'Expression' name=ID '(' jvmType=JvmTypeReference ')'
		//	errorCodes+=UiErrorCode* expression=XBlockExpression?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiXbaseValidator} 'Expression' name=ID '(' jvmType=JvmTypeReference ')' errorCodes+=UiErrorCode*
		//expression=XBlockExpression?
		public Group getGroup() { return cGroup; }
		
		//{UiXbaseValidator}
		public Action getUiXbaseValidatorAction_0() { return cUiXbaseValidatorAction_0; }
		
		//'Expression'
		public Keyword getExpressionKeyword_1() { return cExpressionKeyword_1; }
		
		//name=ID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_3() { return cLeftParenthesisKeyword_3; }
		
		//jvmType=JvmTypeReference
		public Assignment getJvmTypeAssignment_4() { return cJvmTypeAssignment_4; }
		
		//JvmTypeReference
		public RuleCall getJvmTypeJvmTypeReferenceParserRuleCall_4_0() { return cJvmTypeJvmTypeReferenceParserRuleCall_4_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
		
		//errorCodes+=UiErrorCode*
		public Assignment getErrorCodesAssignment_6() { return cErrorCodesAssignment_6; }
		
		//UiErrorCode
		public RuleCall getErrorCodesUiErrorCodeParserRuleCall_6_0() { return cErrorCodesUiErrorCodeParserRuleCall_6_0; }
		
		//expression=XBlockExpression?
		public Assignment getExpressionAssignment_7() { return cExpressionAssignment_7; }
		
		//XBlockExpression
		public RuleCall getExpressionXBlockExpressionParserRuleCall_7_0() { return cExpressionXBlockExpressionParserRuleCall_7_0; }
	}
	public class UiBeanValidationValidatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanValidationValidator");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiBeanValidationValidatorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cBeanValidationValidatorKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		
		//UiBeanValidationValidator:
		//	{UiBeanValidationValidator}
		//	'BeanValidationValidator' name=ID?;
		@Override public ParserRule getRule() { return rule; }
		
		//{UiBeanValidationValidator} 'BeanValidationValidator' name=ID?
		public Group getGroup() { return cGroup; }
		
		//{UiBeanValidationValidator}
		public Action getUiBeanValidationValidatorAction_0() { return cUiBeanValidationValidatorAction_0; }
		
		//'BeanValidationValidator'
		public Keyword getBeanValidationValidatorKeyword_1() { return cBeanValidationValidatorKeyword_1; }
		
		//name=ID?
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
	}
	public class UiErrorCodeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cCodeKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameIDTerminalRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cDefaultMessageAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDefaultMessageSTRINGTerminalRuleCall_2_0 = (RuleCall)cDefaultMessageAssignment_2.eContents().get(0);
		
		//UiErrorCode:
		//	'code' name=ID defaultMessage=STRING?;
		@Override public ParserRule getRule() { return rule; }
		
		//'code' name=ID defaultMessage=STRING?
		public Group getGroup() { return cGroup; }
		
		//'code'
		public Keyword getCodeKeyword_0() { return cCodeKeyword_0; }
		
		//name=ID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_1_0() { return cNameIDTerminalRuleCall_1_0; }
		
		//defaultMessage=STRING?
		public Assignment getDefaultMessageAssignment_2() { return cDefaultMessageAssignment_2; }
		
		//STRING
		public RuleCall getDefaultMessageSTRINGTerminalRuleCall_2_0() { return cDefaultMessageSTRINGTerminalRuleCall_2_0; }
	}
	public class UiVisibilityProcessorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessor");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUiVisibilityProcessorAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cVisibilityKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameIDTerminalRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Assignment cDataUsedAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
		private final RuleCall cDataUsedUiBindingEndpointAliasParserRuleCall_4_0_0 = (RuleCall)cDataUsedAssignment_4_0.eContents().get(0);
		private final Assignment cChangeTriggersAssignment_4_1 = (Assignment)cAlternatives_4.eContents().get(1);
		private final RuleCall cChangeTriggersUiChangeTriggerParserRuleCall_4_1_0 = (RuleCall)cChangeTriggersAssignment_4_1.eContents().get(0);
		private final Assignment cImportedElementsAssignment_4_2 = (Assignment)cAlternatives_4.eContents().get(2);
		private final RuleCall cImportedElementsUiTypedBindableRawTypeAliasParserRuleCall_4_2_0 = (RuleCall)cImportedElementsAssignment_4_2.eContents().get(0);
		private final Assignment cRuleAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cRuleUiXbaseVisibilityRuleParserRuleCall_5_0 = (RuleCall)cRuleAssignment_5.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//UiVisibilityProcessor:
		//	{UiVisibilityProcessor}
		//	'visibility' name=ID '{' (dataUsed+=UiBindingEndpointAlias
		//	| changeTriggers+=UiChangeTrigger
		//	| importedElements+=UiTypedBindableRawTypeAlias)*
		//	rule=UiXbaseVisibilityRule?
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{UiVisibilityProcessor} 'visibility' name=ID '{' (dataUsed+=UiBindingEndpointAlias | changeTriggers+=UiChangeTrigger |
		//importedElements+=UiTypedBindableRawTypeAlias)* rule=UiXbaseVisibilityRule? '}'
		public Group getGroup() { return cGroup; }
		
		//{UiVisibilityProcessor}
		public Action getUiVisibilityProcessorAction_0() { return cUiVisibilityProcessorAction_0; }
		
		//'visibility'
		public Keyword getVisibilityKeyword_1() { return cVisibilityKeyword_1; }
		
		//name=ID
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ID
		public RuleCall getNameIDTerminalRuleCall_2_0() { return cNameIDTerminalRuleCall_2_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
		
		//(dataUsed+=UiBindingEndpointAlias | changeTriggers+=UiChangeTrigger | importedElements+=UiTypedBindableRawTypeAlias)*
		public Alternatives getAlternatives_4() { return cAlternatives_4; }
		
		//dataUsed+=UiBindingEndpointAlias
		public Assignment getDataUsedAssignment_4_0() { return cDataUsedAssignment_4_0; }
		
		//UiBindingEndpointAlias
		public RuleCall getDataUsedUiBindingEndpointAliasParserRuleCall_4_0_0() { return cDataUsedUiBindingEndpointAliasParserRuleCall_4_0_0; }
		
		//changeTriggers+=UiChangeTrigger
		public Assignment getChangeTriggersAssignment_4_1() { return cChangeTriggersAssignment_4_1; }
		
		//UiChangeTrigger
		public RuleCall getChangeTriggersUiChangeTriggerParserRuleCall_4_1_0() { return cChangeTriggersUiChangeTriggerParserRuleCall_4_1_0; }
		
		//importedElements+=UiTypedBindableRawTypeAlias
		public Assignment getImportedElementsAssignment_4_2() { return cImportedElementsAssignment_4_2; }
		
		//UiTypedBindableRawTypeAlias
		public RuleCall getImportedElementsUiTypedBindableRawTypeAliasParserRuleCall_4_2_0() { return cImportedElementsUiTypedBindableRawTypeAliasParserRuleCall_4_2_0; }
		
		//rule=UiXbaseVisibilityRule?
		public Assignment getRuleAssignment_5() { return cRuleAssignment_5; }
		
		//UiXbaseVisibilityRule
		public RuleCall getRuleUiXbaseVisibilityRuleParserRuleCall_5_0() { return cRuleUiXbaseVisibilityRuleParserRuleCall_5_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
	}
	public class UiXbaseVisibilityRuleElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiXbaseVisibilityRule");
		private final Assignment cExpressionAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cExpressionXBlockExpressionParserRuleCall_0 = (RuleCall)cExpressionAssignment.eContents().get(0);
		
		//UiXbaseVisibilityRule:
		//	expression=XBlockExpression;
		@Override public ParserRule getRule() { return rule; }
		
		//expression=XBlockExpression
		public Assignment getExpressionAssignment() { return cExpressionAssignment; }
		
		//XBlockExpression
		public RuleCall getExpressionXBlockExpressionParserRuleCall_0() { return cExpressionXBlockExpressionParserRuleCall_0; }
	}
	public class UiChangeTriggerElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiChangeTrigger");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cFireOnKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cEndpointAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cEndpointUiBindingEndpointAssignmentParserRuleCall_1_0 = (RuleCall)cEndpointAssignment_1.eContents().get(0);
		private final Keyword cAsKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cAliasAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAliasIDTerminalRuleCall_3_0 = (RuleCall)cAliasAssignment_3.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//UiChangeTrigger:
		//	'fireOn' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?;
		@Override public ParserRule getRule() { return rule; }
		
		//'fireOn' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?
		public Group getGroup() { return cGroup; }
		
		//'fireOn'
		public Keyword getFireOnKeyword_0() { return cFireOnKeyword_0; }
		
		//endpoint=UiBindingEndpointAssignment
		public Assignment getEndpointAssignment_1() { return cEndpointAssignment_1; }
		
		//UiBindingEndpointAssignment
		public RuleCall getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0() { return cEndpointUiBindingEndpointAssignmentParserRuleCall_1_0; }
		
		//'as'
		public Keyword getAsKeyword_2() { return cAsKeyword_2; }
		
		//alias=ID
		public Assignment getAliasAssignment_3() { return cAliasAssignment_3; }
		
		//ID
		public RuleCall getAliasIDTerminalRuleCall_3_0() { return cAliasIDTerminalRuleCall_3_0; }
		
		//';'?
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	public class TRANSLATABLEIDElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.TRANSLATABLEID");
		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//TRANSLATABLEID:
		//	ID;
		@Override public ParserRule getRule() { return rule; }
		
		//ID
		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
	}
	
	public class UiDateFormatElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateFormat");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cDATEEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cDATEDateKeyword_0_0 = (Keyword)cDATEEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cDATE_TIMEEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cDATE_TIMEDatetimeKeyword_1_0 = (Keyword)cDATE_TIMEEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cTIMEEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cTIMETimeKeyword_2_0 = (Keyword)cTIMEEnumLiteralDeclaration_2.eContents().get(0);
		
		//enum UiDateFormat:
		//	DATE="date" | DATE_TIME="datetime" | TIME="time";
		public EnumRule getRule() { return rule; }
		
		//DATE="date" | DATE_TIME="datetime" | TIME="time"
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//DATE="date"
		public EnumLiteralDeclaration getDATEEnumLiteralDeclaration_0() { return cDATEEnumLiteralDeclaration_0; }
		
		//"date"
		public Keyword getDATEDateKeyword_0_0() { return cDATEDateKeyword_0_0; }
		
		//DATE_TIME="datetime"
		public EnumLiteralDeclaration getDATE_TIMEEnumLiteralDeclaration_1() { return cDATE_TIMEEnumLiteralDeclaration_1; }
		
		//"datetime"
		public Keyword getDATE_TIMEDatetimeKeyword_1_0() { return cDATE_TIMEDatetimeKeyword_1_0; }
		
		//TIME="time"
		public EnumLiteralDeclaration getTIMEEnumLiteralDeclaration_2() { return cTIMEEnumLiteralDeclaration_2; }
		
		//"time"
		public Keyword getTIMETimeKeyword_2_0() { return cTIMETimeKeyword_2_0; }
	}
	public class UiDateTimeResolutionElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateTimeResolution");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cUNDEFINEDEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cUNDEFINEDUndefinedKeyword_0_0 = (Keyword)cUNDEFINEDEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cSECONDEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cSECONDSecondKeyword_1_0 = (Keyword)cSECONDEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cMINUTEEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cMINUTEMinuteKeyword_2_0 = (Keyword)cMINUTEEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cHOUREnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cHOURHourKeyword_3_0 = (Keyword)cHOUREnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cDAYEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cDAYDayKeyword_4_0 = (Keyword)cDAYEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cMONTHEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cMONTHMonthKeyword_5_0 = (Keyword)cMONTHEnumLiteralDeclaration_5.eContents().get(0);
		private final EnumLiteralDeclaration cYEAREnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
		private final Keyword cYEARYearKeyword_6_0 = (Keyword)cYEAREnumLiteralDeclaration_6.eContents().get(0);
		
		//enum UiDateTimeResolution:
		//	UNDEFINED="undefined" | SECOND="second" | MINUTE="minute" | HOUR="hour" | DAY="day" | MONTH="month" | YEAR="year";
		public EnumRule getRule() { return rule; }
		
		//UNDEFINED="undefined" | SECOND="second" | MINUTE="minute" | HOUR="hour" | DAY="day" | MONTH="month" | YEAR="year"
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UNDEFINED="undefined"
		public EnumLiteralDeclaration getUNDEFINEDEnumLiteralDeclaration_0() { return cUNDEFINEDEnumLiteralDeclaration_0; }
		
		//"undefined"
		public Keyword getUNDEFINEDUndefinedKeyword_0_0() { return cUNDEFINEDUndefinedKeyword_0_0; }
		
		//SECOND="second"
		public EnumLiteralDeclaration getSECONDEnumLiteralDeclaration_1() { return cSECONDEnumLiteralDeclaration_1; }
		
		//"second"
		public Keyword getSECONDSecondKeyword_1_0() { return cSECONDSecondKeyword_1_0; }
		
		//MINUTE="minute"
		public EnumLiteralDeclaration getMINUTEEnumLiteralDeclaration_2() { return cMINUTEEnumLiteralDeclaration_2; }
		
		//"minute"
		public Keyword getMINUTEMinuteKeyword_2_0() { return cMINUTEMinuteKeyword_2_0; }
		
		//HOUR="hour"
		public EnumLiteralDeclaration getHOUREnumLiteralDeclaration_3() { return cHOUREnumLiteralDeclaration_3; }
		
		//"hour"
		public Keyword getHOURHourKeyword_3_0() { return cHOURHourKeyword_3_0; }
		
		//DAY="day"
		public EnumLiteralDeclaration getDAYEnumLiteralDeclaration_4() { return cDAYEnumLiteralDeclaration_4; }
		
		//"day"
		public Keyword getDAYDayKeyword_4_0() { return cDAYDayKeyword_4_0; }
		
		//MONTH="month"
		public EnumLiteralDeclaration getMONTHEnumLiteralDeclaration_5() { return cMONTHEnumLiteralDeclaration_5; }
		
		//"month"
		public Keyword getMONTHMonthKeyword_5_0() { return cMONTHMonthKeyword_5_0; }
		
		//YEAR="year"
		public EnumLiteralDeclaration getYEAREnumLiteralDeclaration_6() { return cYEAREnumLiteralDeclaration_6; }
		
		//"year"
		public Keyword getYEARYearKeyword_6_0() { return cYEARYearKeyword_6_0; }
	}
	public class UiSelectionTypeElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiSelectionType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cSINGLEEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cSINGLESingleKeyword_0_0 = (Keyword)cSINGLEEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cMULTIEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cMULTIMultiKeyword_1_0 = (Keyword)cMULTIEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cNONEEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cNONENoneKeyword_2_0 = (Keyword)cNONEEnumLiteralDeclaration_2.eContents().get(0);
		
		//enum UiSelectionType:
		//	SINGLE='single' | MULTI='multi' | NONE='none';
		public EnumRule getRule() { return rule; }
		
		//SINGLE='single' | MULTI='multi' | NONE='none'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//SINGLE='single'
		public EnumLiteralDeclaration getSINGLEEnumLiteralDeclaration_0() { return cSINGLEEnumLiteralDeclaration_0; }
		
		//'single'
		public Keyword getSINGLESingleKeyword_0_0() { return cSINGLESingleKeyword_0_0; }
		
		//MULTI='multi'
		public EnumLiteralDeclaration getMULTIEnumLiteralDeclaration_1() { return cMULTIEnumLiteralDeclaration_1; }
		
		//'multi'
		public Keyword getMULTIMultiKeyword_1_0() { return cMULTIMultiKeyword_1_0; }
		
		//NONE='none'
		public EnumLiteralDeclaration getNONEEnumLiteralDeclaration_2() { return cNONEEnumLiteralDeclaration_2; }
		
		//'none'
		public Keyword getNONENoneKeyword_2_0() { return cNONENoneKeyword_2_0; }
	}
	public class UiAlignmentElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cUNDEFINEDEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cUNDEFINEDUndefinedKeyword_0_0 = (Keyword)cUNDEFINEDEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cBOTTOM_CENTEREnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cBOTTOM_CENTERBottomCenterKeyword_1_0 = (Keyword)cBOTTOM_CENTEREnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cBOTTOM_LEFTEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cBOTTOM_LEFTBottomLeftKeyword_2_0 = (Keyword)cBOTTOM_LEFTEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cBOTTOM_RIGHTEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cBOTTOM_RIGHTBottomRightKeyword_3_0 = (Keyword)cBOTTOM_RIGHTEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cBOTTOM_FILLEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cBOTTOM_FILLBottomFillKeyword_4_0 = (Keyword)cBOTTOM_FILLEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cMIDDLE_CENTEREnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cMIDDLE_CENTERMiddleCenterKeyword_5_0 = (Keyword)cMIDDLE_CENTEREnumLiteralDeclaration_5.eContents().get(0);
		private final EnumLiteralDeclaration cMIDDLE_LEFTEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
		private final Keyword cMIDDLE_LEFTMiddleLeftKeyword_6_0 = (Keyword)cMIDDLE_LEFTEnumLiteralDeclaration_6.eContents().get(0);
		private final EnumLiteralDeclaration cMIDDLE_RIGHTEnumLiteralDeclaration_7 = (EnumLiteralDeclaration)cAlternatives.eContents().get(7);
		private final Keyword cMIDDLE_RIGHTMiddleRightKeyword_7_0 = (Keyword)cMIDDLE_RIGHTEnumLiteralDeclaration_7.eContents().get(0);
		private final EnumLiteralDeclaration cMIDDLE_FILLEnumLiteralDeclaration_8 = (EnumLiteralDeclaration)cAlternatives.eContents().get(8);
		private final Keyword cMIDDLE_FILLMiddleFillKeyword_8_0 = (Keyword)cMIDDLE_FILLEnumLiteralDeclaration_8.eContents().get(0);
		private final EnumLiteralDeclaration cTOP_CENTEREnumLiteralDeclaration_9 = (EnumLiteralDeclaration)cAlternatives.eContents().get(9);
		private final Keyword cTOP_CENTERTopCenterKeyword_9_0 = (Keyword)cTOP_CENTEREnumLiteralDeclaration_9.eContents().get(0);
		private final EnumLiteralDeclaration cTOP_LEFTEnumLiteralDeclaration_10 = (EnumLiteralDeclaration)cAlternatives.eContents().get(10);
		private final Keyword cTOP_LEFTTopLeftKeyword_10_0 = (Keyword)cTOP_LEFTEnumLiteralDeclaration_10.eContents().get(0);
		private final EnumLiteralDeclaration cTOP_RIGHTEnumLiteralDeclaration_11 = (EnumLiteralDeclaration)cAlternatives.eContents().get(11);
		private final Keyword cTOP_RIGHTTopRightKeyword_11_0 = (Keyword)cTOP_RIGHTEnumLiteralDeclaration_11.eContents().get(0);
		private final EnumLiteralDeclaration cTOP_FILLEnumLiteralDeclaration_12 = (EnumLiteralDeclaration)cAlternatives.eContents().get(12);
		private final Keyword cTOP_FILLTopFillKeyword_12_0 = (Keyword)cTOP_FILLEnumLiteralDeclaration_12.eContents().get(0);
		private final EnumLiteralDeclaration cFILL_CENTEREnumLiteralDeclaration_13 = (EnumLiteralDeclaration)cAlternatives.eContents().get(13);
		private final Keyword cFILL_CENTERFillCenterKeyword_13_0 = (Keyword)cFILL_CENTEREnumLiteralDeclaration_13.eContents().get(0);
		private final EnumLiteralDeclaration cFILL_LEFTEnumLiteralDeclaration_14 = (EnumLiteralDeclaration)cAlternatives.eContents().get(14);
		private final Keyword cFILL_LEFTFillLeftKeyword_14_0 = (Keyword)cFILL_LEFTEnumLiteralDeclaration_14.eContents().get(0);
		private final EnumLiteralDeclaration cFILL_RIGHTEnumLiteralDeclaration_15 = (EnumLiteralDeclaration)cAlternatives.eContents().get(15);
		private final Keyword cFILL_RIGHTFillRightKeyword_15_0 = (Keyword)cFILL_RIGHTEnumLiteralDeclaration_15.eContents().get(0);
		private final EnumLiteralDeclaration cFILL_FILLEnumLiteralDeclaration_16 = (EnumLiteralDeclaration)cAlternatives.eContents().get(16);
		private final Keyword cFILL_FILLFillFillKeyword_16_0 = (Keyword)cFILL_FILLEnumLiteralDeclaration_16.eContents().get(0);
		
		//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";
		public EnumRule getRule() { return rule; }
		
		//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"
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//UNDEFINED="undefined"
		public EnumLiteralDeclaration getUNDEFINEDEnumLiteralDeclaration_0() { return cUNDEFINEDEnumLiteralDeclaration_0; }
		
		//"undefined"
		public Keyword getUNDEFINEDUndefinedKeyword_0_0() { return cUNDEFINEDUndefinedKeyword_0_0; }
		
		//BOTTOM_CENTER="bottom-center"
		public EnumLiteralDeclaration getBOTTOM_CENTEREnumLiteralDeclaration_1() { return cBOTTOM_CENTEREnumLiteralDeclaration_1; }
		
		//"bottom-center"
		public Keyword getBOTTOM_CENTERBottomCenterKeyword_1_0() { return cBOTTOM_CENTERBottomCenterKeyword_1_0; }
		
		//BOTTOM_LEFT="bottom-left"
		public EnumLiteralDeclaration getBOTTOM_LEFTEnumLiteralDeclaration_2() { return cBOTTOM_LEFTEnumLiteralDeclaration_2; }
		
		//"bottom-left"
		public Keyword getBOTTOM_LEFTBottomLeftKeyword_2_0() { return cBOTTOM_LEFTBottomLeftKeyword_2_0; }
		
		//BOTTOM_RIGHT="bottom-right"
		public EnumLiteralDeclaration getBOTTOM_RIGHTEnumLiteralDeclaration_3() { return cBOTTOM_RIGHTEnumLiteralDeclaration_3; }
		
		//"bottom-right"
		public Keyword getBOTTOM_RIGHTBottomRightKeyword_3_0() { return cBOTTOM_RIGHTBottomRightKeyword_3_0; }
		
		//BOTTOM_FILL="bottom-fill"
		public EnumLiteralDeclaration getBOTTOM_FILLEnumLiteralDeclaration_4() { return cBOTTOM_FILLEnumLiteralDeclaration_4; }
		
		//"bottom-fill"
		public Keyword getBOTTOM_FILLBottomFillKeyword_4_0() { return cBOTTOM_FILLBottomFillKeyword_4_0; }
		
		//MIDDLE_CENTER="middle-center"
		public EnumLiteralDeclaration getMIDDLE_CENTEREnumLiteralDeclaration_5() { return cMIDDLE_CENTEREnumLiteralDeclaration_5; }
		
		//"middle-center"
		public Keyword getMIDDLE_CENTERMiddleCenterKeyword_5_0() { return cMIDDLE_CENTERMiddleCenterKeyword_5_0; }
		
		//MIDDLE_LEFT="middle-left"
		public EnumLiteralDeclaration getMIDDLE_LEFTEnumLiteralDeclaration_6() { return cMIDDLE_LEFTEnumLiteralDeclaration_6; }
		
		//"middle-left"
		public Keyword getMIDDLE_LEFTMiddleLeftKeyword_6_0() { return cMIDDLE_LEFTMiddleLeftKeyword_6_0; }
		
		//MIDDLE_RIGHT="middle-right"
		public EnumLiteralDeclaration getMIDDLE_RIGHTEnumLiteralDeclaration_7() { return cMIDDLE_RIGHTEnumLiteralDeclaration_7; }
		
		//"middle-right"
		public Keyword getMIDDLE_RIGHTMiddleRightKeyword_7_0() { return cMIDDLE_RIGHTMiddleRightKeyword_7_0; }
		
		//MIDDLE_FILL="middle-fill"
		public EnumLiteralDeclaration getMIDDLE_FILLEnumLiteralDeclaration_8() { return cMIDDLE_FILLEnumLiteralDeclaration_8; }
		
		//"middle-fill"
		public Keyword getMIDDLE_FILLMiddleFillKeyword_8_0() { return cMIDDLE_FILLMiddleFillKeyword_8_0; }
		
		//TOP_CENTER="top-center"
		public EnumLiteralDeclaration getTOP_CENTEREnumLiteralDeclaration_9() { return cTOP_CENTEREnumLiteralDeclaration_9; }
		
		//"top-center"
		public Keyword getTOP_CENTERTopCenterKeyword_9_0() { return cTOP_CENTERTopCenterKeyword_9_0; }
		
		//TOP_LEFT="top-left"
		public EnumLiteralDeclaration getTOP_LEFTEnumLiteralDeclaration_10() { return cTOP_LEFTEnumLiteralDeclaration_10; }
		
		//"top-left"
		public Keyword getTOP_LEFTTopLeftKeyword_10_0() { return cTOP_LEFTTopLeftKeyword_10_0; }
		
		//TOP_RIGHT="top-right"
		public EnumLiteralDeclaration getTOP_RIGHTEnumLiteralDeclaration_11() { return cTOP_RIGHTEnumLiteralDeclaration_11; }
		
		//"top-right"
		public Keyword getTOP_RIGHTTopRightKeyword_11_0() { return cTOP_RIGHTTopRightKeyword_11_0; }
		
		//TOP_FILL="top-fill"
		public EnumLiteralDeclaration getTOP_FILLEnumLiteralDeclaration_12() { return cTOP_FILLEnumLiteralDeclaration_12; }
		
		//"top-fill"
		public Keyword getTOP_FILLTopFillKeyword_12_0() { return cTOP_FILLTopFillKeyword_12_0; }
		
		//FILL_CENTER="fill-center"
		public EnumLiteralDeclaration getFILL_CENTEREnumLiteralDeclaration_13() { return cFILL_CENTEREnumLiteralDeclaration_13; }
		
		//"fill-center"
		public Keyword getFILL_CENTERFillCenterKeyword_13_0() { return cFILL_CENTERFillCenterKeyword_13_0; }
		
		//FILL_LEFT="fill-left"
		public EnumLiteralDeclaration getFILL_LEFTEnumLiteralDeclaration_14() { return cFILL_LEFTEnumLiteralDeclaration_14; }
		
		//"fill-left"
		public Keyword getFILL_LEFTFillLeftKeyword_14_0() { return cFILL_LEFTFillLeftKeyword_14_0; }
		
		//FILL_RIGHT="fill-right"
		public EnumLiteralDeclaration getFILL_RIGHTEnumLiteralDeclaration_15() { return cFILL_RIGHTEnumLiteralDeclaration_15; }
		
		//"fill-right"
		public Keyword getFILL_RIGHTFillRightKeyword_15_0() { return cFILL_RIGHTFillRightKeyword_15_0; }
		
		//FILL_FILL="fill-fill"
		public EnumLiteralDeclaration getFILL_FILLEnumLiteralDeclaration_16() { return cFILL_FILLEnumLiteralDeclaration_16; }
		
		//"fill-fill"
		public Keyword getFILL_FILLFillFillKeyword_16_0() { return cFILL_FILLFillFillKeyword_16_0; }
	}
	
	private final UiModelElements pUiModel;
	private final UiRootElementsElements pUiRootElements;
	private final UiValidatorAliasElements pUiValidatorAlias;
	private final UiValidatorAssignmentElements pUiValidatorAssignment;
	private final UiValidatorDefElements pUiValidatorDef;
	private final UiViewSetElements pUiViewSet;
	private final UiBindingEndpointAliasElements pUiBindingEndpointAlias;
	private final UiBeanSlotElements pUiBeanSlot;
	private final UiBindingElements pUiBinding;
	private final UiBindingEndpointAssignmentElements pUiBindingEndpointAssignment;
	private final UiPathSegmentElements pUiPathSegment;
	private final UiNestedPropertyElements pUiNestedProperty;
	private final UiTypedBindableDefElements pUiTypedBindableDef;
	private final UiTypedBindableRawTypeElements pUiTypedBindableRawType;
	private final UiTypedBindableRawTypeAliasElements pUiTypedBindableRawTypeAlias;
	private final UiRawBindablePathSegmentElements pUiRawBindablePathSegment;
	private final UiCommandBindableDefElements pUiCommandBindableDef;
	private final UiCommandElements pUiCommand;
	private final UiMobileNavigationCommandElements pUiMobileNavigationCommand;
	private final UiOpenDialogCommandElements pUiOpenDialogCommand;
	private final UiSearchWithDialogCommandElements pUiSearchWithDialogCommand;
	private final UiAddToTableCommandElements pUiAddToTableCommand;
	private final UiRemoveFromTableCommandElements pUiRemoveFromTableCommand;
	private final UiSetNewInstanceCommandElements pUiSetNewInstanceCommand;
	private final UiSendEventCommandElements pUiSendEventCommand;
	private final UiViewElements pUiView;
	private final UiIDEViewElements pUiIDEView;
	private final UiDisplayViewElements pUiDisplayView;
	private final UiExposedActionElements pUiExposedAction;
	private final UiMobileNavBarActionElements pUiMobileNavBarAction;
	private final UiMobileViewElements pUiMobileView;
	private final UiI18nInfoElements pUiI18nInfo;
	private final UiGridLayoutElements pUiGridLayout;
	private final UiVisibilityProcessorAssignmentElements pUiVisibilityProcessorAssignment;
	private final UiGridLayoutAssigmentElements pUiGridLayoutAssigment;
	private final UiFormLayoutElements pUiFormLayout;
	private final UiFormLayoutAssigmentElements pUiFormLayoutAssigment;
	private final UiVerticalLayoutElements pUiVerticalLayout;
	private final UiVerticalLayoutAssigmentElements pUiVerticalLayoutAssigment;
	private final UiMobileVerticalLayoutElements pUiMobileVerticalLayout;
	private final UiMobileVerticalLayoutAssigmentElements pUiMobileVerticalLayoutAssigment;
	private final UiMobileNavigationRootElements pUiMobileNavigationRoot;
	private final UiMobileNavigationRootAssigmentElements pUiMobileNavigationRootAssigment;
	private final UiHorizontalLayoutElements pUiHorizontalLayout;
	private final UiHorizontalLayoutAssigmentElements pUiHorizontalLayoutAssigment;
	private final UiMobileHorizontalLayoutElements pUiMobileHorizontalLayout;
	private final UiMobileHorizontalLayoutAssigmentElements pUiMobileHorizontalLayoutAssigment;
	private final UiMobileHorizontalButtonGroupElements pUiMobileHorizontalButtonGroup;
	private final UiMobileHorizontalButtonGroupAssigmentElements pUiMobileHorizontalButtonGroupAssigment;
	private final UiMobileVerticalComponentGroupElements pUiMobileVerticalComponentGroup;
	private final UiMobileVerticalComponentGroupAssigmentElements pUiMobileVerticalComponentGroupAssigment;
	private final UiSearchPanelElements pUiSearchPanel;
	private final UiMobileSearchPanelElements pUiMobileSearchPanel;
	private final UiMobileTabSheetElements pUiMobileTabSheet;
	private final UiMobileTabAssignmentElements pUiMobileTabAssignment;
	private final UiTabSheetElements pUiTabSheet;
	private final UiTabAssignmentElements pUiTabAssignment;
	private final UiSplitpanelElements pUiSplitpanel;
	private final UiSplitpanelAssigmentElements pUiSplitpanelAssigment;
	private final UiPanelElements pUiPanel;
	private final UiDialogElements pUiDialog;
	private final UiDialogAssignmentElements pUiDialogAssignment;
	private final UiSearchDialogElements pUiSearchDialog;
	private final UiDialogSearchFieldAssignmentElements pUiDialogSearchFieldAssignment;
	private final UiMobileNavigationPageElements pUiMobileNavigationPage;
	private final UiMobileNavigationPageAssignmentElements pUiMobileNavigationPageAssignment;
	private final UiPointElements pUiPoint;
	private final UiTextFieldElements pUiTextField;
	private final UiPasswordFieldElements pUiPasswordField;
	private final UiMaskedTextFieldElements pUiMaskedTextField;
	private final UiMaskedNumericFieldElements pUiMaskedNumericField;
	private final UiMaskedDecimalFieldElements pUiMaskedDecimalField;
	private final UiPrefixedMaskedTextFieldElements pUiPrefixedMaskedTextField;
	private final UiPrefixToMaskMapEntryElements pUiPrefixToMaskMapEntry;
	private final UiRichTextAreaElements pUiRichTextArea;
	private final UiSuggestTextFieldElements pUiSuggestTextField;
	private final UiBeanReferenceFieldElements pUiBeanReferenceField;
	private final UiSearchFieldElements pUiSearchField;
	private final UiTextAreaElements pUiTextArea;
	private final UiDateFieldElements pUiDateField;
	private final UiDateFormatElements eUiDateFormat;
	private final UiDateTimeResolutionElements eUiDateTimeResolution;
	private final UiBrowserElements pUiBrowser;
	private final UiProgressBarElements pUiProgressBar;
	private final UiImageElements pUiImage;
	private final UiTableElements pUiTable;
	private final UiComboBoxElements pUiComboBox;
	private final UiButtonElements pUiButton;
	private final UiMobileNavigationButtonElements pUiMobileNavigationButton;
	private final UiMobileSwitchElements pUiMobileSwitch;
	private final UiLabelElements pUiLabel;
	private final UiDecimalFieldElements pUiDecimalField;
	private final UiOptionsGroupElements pUiOptionsGroup;
	private final UiListElements pUiList;
	private final UiSelectionTypeElements eUiSelectionType;
	private final UiAlignmentElements eUiAlignment;
	private final UiColumnsAssignmentElements pUiColumnsAssignment;
	private final UiSortOrderAssignmentElements pUiSortOrderAssignment;
	private final UiSortOrderElements pUiSortOrder;
	private final UiColumnElements pUiColumn;
	private final UiEmbeddableElements pUiEmbeddable;
	private final UiMobileEmbeddableElements pUiMobileEmbeddable;
	private final UiMobileLayoutElements pUiMobileLayout;
	private final UiMobileFieldElements pUiMobileField;
	private final UiLayoutElements pUiLayout;
	private final UiFieldElements pUiField;
	private final UiActionElements pUiAction;
	private final UiMobileActionElements pUiMobileAction;
	private final UiNumericFieldElements pUiNumericField;
	private final UiCheckBoxElements pUiCheckBox;
	private final UiValidatorElements pUiValidator;
	private final UiMaxLengthValidatorElements pUiMaxLengthValidator;
	private final UiMinLengthValidatorElements pUiMinLengthValidator;
	private final UiRegexpValidatorElements pUiRegexpValidator;
	private final UiXbaseValidatorElements pUiXbaseValidator;
	private final UiBeanValidationValidatorElements pUiBeanValidationValidator;
	private final UiErrorCodeElements pUiErrorCode;
	private final UiVisibilityProcessorElements pUiVisibilityProcessor;
	private final UiXbaseVisibilityRuleElements pUiXbaseVisibilityRule;
	private final UiChangeTriggerElements pUiChangeTrigger;
	private final TRANSLATABLEIDElements pTRANSLATABLEID;
	
	private final Grammar grammar;
	
	private final OXtypeGrammarAccess gaOXtype;
	
	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
	
	private final XbaseGrammarAccess gaXbase;
	
	private final XtypeGrammarAccess gaXtype;

	@Inject
	public UIGrammarGrammarAccess(GrammarProvider grammarProvider,
			OXtypeGrammarAccess gaOXtype,
			XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations,
			XbaseGrammarAccess gaXbase,
			XtypeGrammarAccess gaXtype) {
		this.grammar = internalFindGrammar(grammarProvider);
		this.gaOXtype = gaOXtype;
		this.gaXbaseWithAnnotations = gaXbaseWithAnnotations;
		this.gaXbase = gaXbase;
		this.gaXtype = gaXtype;
		this.pUiModel = new UiModelElements();
		this.pUiRootElements = new UiRootElementsElements();
		this.pUiValidatorAlias = new UiValidatorAliasElements();
		this.pUiValidatorAssignment = new UiValidatorAssignmentElements();
		this.pUiValidatorDef = new UiValidatorDefElements();
		this.pUiViewSet = new UiViewSetElements();
		this.pUiBindingEndpointAlias = new UiBindingEndpointAliasElements();
		this.pUiBeanSlot = new UiBeanSlotElements();
		this.pUiBinding = new UiBindingElements();
		this.pUiBindingEndpointAssignment = new UiBindingEndpointAssignmentElements();
		this.pUiPathSegment = new UiPathSegmentElements();
		this.pUiNestedProperty = new UiNestedPropertyElements();
		this.pUiTypedBindableDef = new UiTypedBindableDefElements();
		this.pUiTypedBindableRawType = new UiTypedBindableRawTypeElements();
		this.pUiTypedBindableRawTypeAlias = new UiTypedBindableRawTypeAliasElements();
		this.pUiRawBindablePathSegment = new UiRawBindablePathSegmentElements();
		this.pUiCommandBindableDef = new UiCommandBindableDefElements();
		this.pUiCommand = new UiCommandElements();
		this.pUiMobileNavigationCommand = new UiMobileNavigationCommandElements();
		this.pUiOpenDialogCommand = new UiOpenDialogCommandElements();
		this.pUiSearchWithDialogCommand = new UiSearchWithDialogCommandElements();
		this.pUiAddToTableCommand = new UiAddToTableCommandElements();
		this.pUiRemoveFromTableCommand = new UiRemoveFromTableCommandElements();
		this.pUiSetNewInstanceCommand = new UiSetNewInstanceCommandElements();
		this.pUiSendEventCommand = new UiSendEventCommandElements();
		this.pUiView = new UiViewElements();
		this.pUiIDEView = new UiIDEViewElements();
		this.pUiDisplayView = new UiDisplayViewElements();
		this.pUiExposedAction = new UiExposedActionElements();
		this.pUiMobileNavBarAction = new UiMobileNavBarActionElements();
		this.pUiMobileView = new UiMobileViewElements();
		this.pUiI18nInfo = new UiI18nInfoElements();
		this.pUiGridLayout = new UiGridLayoutElements();
		this.pUiVisibilityProcessorAssignment = new UiVisibilityProcessorAssignmentElements();
		this.pUiGridLayoutAssigment = new UiGridLayoutAssigmentElements();
		this.pUiFormLayout = new UiFormLayoutElements();
		this.pUiFormLayoutAssigment = new UiFormLayoutAssigmentElements();
		this.pUiVerticalLayout = new UiVerticalLayoutElements();
		this.pUiVerticalLayoutAssigment = new UiVerticalLayoutAssigmentElements();
		this.pUiMobileVerticalLayout = new UiMobileVerticalLayoutElements();
		this.pUiMobileVerticalLayoutAssigment = new UiMobileVerticalLayoutAssigmentElements();
		this.pUiMobileNavigationRoot = new UiMobileNavigationRootElements();
		this.pUiMobileNavigationRootAssigment = new UiMobileNavigationRootAssigmentElements();
		this.pUiHorizontalLayout = new UiHorizontalLayoutElements();
		this.pUiHorizontalLayoutAssigment = new UiHorizontalLayoutAssigmentElements();
		this.pUiMobileHorizontalLayout = new UiMobileHorizontalLayoutElements();
		this.pUiMobileHorizontalLayoutAssigment = new UiMobileHorizontalLayoutAssigmentElements();
		this.pUiMobileHorizontalButtonGroup = new UiMobileHorizontalButtonGroupElements();
		this.pUiMobileHorizontalButtonGroupAssigment = new UiMobileHorizontalButtonGroupAssigmentElements();
		this.pUiMobileVerticalComponentGroup = new UiMobileVerticalComponentGroupElements();
		this.pUiMobileVerticalComponentGroupAssigment = new UiMobileVerticalComponentGroupAssigmentElements();
		this.pUiSearchPanel = new UiSearchPanelElements();
		this.pUiMobileSearchPanel = new UiMobileSearchPanelElements();
		this.pUiMobileTabSheet = new UiMobileTabSheetElements();
		this.pUiMobileTabAssignment = new UiMobileTabAssignmentElements();
		this.pUiTabSheet = new UiTabSheetElements();
		this.pUiTabAssignment = new UiTabAssignmentElements();
		this.pUiSplitpanel = new UiSplitpanelElements();
		this.pUiSplitpanelAssigment = new UiSplitpanelAssigmentElements();
		this.pUiPanel = new UiPanelElements();
		this.pUiDialog = new UiDialogElements();
		this.pUiDialogAssignment = new UiDialogAssignmentElements();
		this.pUiSearchDialog = new UiSearchDialogElements();
		this.pUiDialogSearchFieldAssignment = new UiDialogSearchFieldAssignmentElements();
		this.pUiMobileNavigationPage = new UiMobileNavigationPageElements();
		this.pUiMobileNavigationPageAssignment = new UiMobileNavigationPageAssignmentElements();
		this.pUiPoint = new UiPointElements();
		this.pUiTextField = new UiTextFieldElements();
		this.pUiPasswordField = new UiPasswordFieldElements();
		this.pUiMaskedTextField = new UiMaskedTextFieldElements();
		this.pUiMaskedNumericField = new UiMaskedNumericFieldElements();
		this.pUiMaskedDecimalField = new UiMaskedDecimalFieldElements();
		this.pUiPrefixedMaskedTextField = new UiPrefixedMaskedTextFieldElements();
		this.pUiPrefixToMaskMapEntry = new UiPrefixToMaskMapEntryElements();
		this.pUiRichTextArea = new UiRichTextAreaElements();
		this.pUiSuggestTextField = new UiSuggestTextFieldElements();
		this.pUiBeanReferenceField = new UiBeanReferenceFieldElements();
		this.pUiSearchField = new UiSearchFieldElements();
		this.pUiTextArea = new UiTextAreaElements();
		this.pUiDateField = new UiDateFieldElements();
		this.eUiDateFormat = new UiDateFormatElements();
		this.eUiDateTimeResolution = new UiDateTimeResolutionElements();
		this.pUiBrowser = new UiBrowserElements();
		this.pUiProgressBar = new UiProgressBarElements();
		this.pUiImage = new UiImageElements();
		this.pUiTable = new UiTableElements();
		this.pUiComboBox = new UiComboBoxElements();
		this.pUiButton = new UiButtonElements();
		this.pUiMobileNavigationButton = new UiMobileNavigationButtonElements();
		this.pUiMobileSwitch = new UiMobileSwitchElements();
		this.pUiLabel = new UiLabelElements();
		this.pUiDecimalField = new UiDecimalFieldElements();
		this.pUiOptionsGroup = new UiOptionsGroupElements();
		this.pUiList = new UiListElements();
		this.eUiSelectionType = new UiSelectionTypeElements();
		this.eUiAlignment = new UiAlignmentElements();
		this.pUiColumnsAssignment = new UiColumnsAssignmentElements();
		this.pUiSortOrderAssignment = new UiSortOrderAssignmentElements();
		this.pUiSortOrder = new UiSortOrderElements();
		this.pUiColumn = new UiColumnElements();
		this.pUiEmbeddable = new UiEmbeddableElements();
		this.pUiMobileEmbeddable = new UiMobileEmbeddableElements();
		this.pUiMobileLayout = new UiMobileLayoutElements();
		this.pUiMobileField = new UiMobileFieldElements();
		this.pUiLayout = new UiLayoutElements();
		this.pUiField = new UiFieldElements();
		this.pUiAction = new UiActionElements();
		this.pUiMobileAction = new UiMobileActionElements();
		this.pUiNumericField = new UiNumericFieldElements();
		this.pUiCheckBox = new UiCheckBoxElements();
		this.pUiValidator = new UiValidatorElements();
		this.pUiMaxLengthValidator = new UiMaxLengthValidatorElements();
		this.pUiMinLengthValidator = new UiMinLengthValidatorElements();
		this.pUiRegexpValidator = new UiRegexpValidatorElements();
		this.pUiXbaseValidator = new UiXbaseValidatorElements();
		this.pUiBeanValidationValidator = new UiBeanValidationValidatorElements();
		this.pUiErrorCode = new UiErrorCodeElements();
		this.pUiVisibilityProcessor = new UiVisibilityProcessorElements();
		this.pUiXbaseVisibilityRule = new UiXbaseVisibilityRuleElements();
		this.pUiChangeTrigger = new UiChangeTriggerElements();
		this.pTRANSLATABLEID = new TRANSLATABLEIDElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.osbp.ecview.dsl.UIGrammar".equals(grammar.getName())) {
				return grammar;
			}
			List<Grammar> grammars = grammar.getUsedGrammars();
			if (!grammars.isEmpty()) {
				grammar = grammars.iterator().next();
			} else {
				return null;
			}
		}
		return grammar;
	}
	
	@Override
	public Grammar getGrammar() {
		return grammar;
	}
	
	
	public OXtypeGrammarAccess getOXtypeGrammarAccess() {
		return gaOXtype;
	}
	
	public XbaseWithAnnotationsGrammarAccess getXbaseWithAnnotationsGrammarAccess() {
		return gaXbaseWithAnnotations;
	}
	
	public XbaseGrammarAccess getXbaseGrammarAccess() {
		return gaXbase;
	}
	
	public XtypeGrammarAccess getXtypeGrammarAccess() {
		return gaXtype;
	}

	
	//UiModel:
	//	'package' packageName=QualifiedName
	//	importSection=XImportSection?
	//	roots+=UiRootElements*;
	public UiModelElements getUiModelAccess() {
		return pUiModel;
	}
	
	public ParserRule getUiModelRule() {
		return getUiModelAccess().getRule();
	}
	
	//UiRootElements:
	//	UiView | UiDisplayView | UiViewSet | UiValidatorAlias | UiMobileView;
	public UiRootElementsElements getUiRootElementsAccess() {
		return pUiRootElements;
	}
	
	public ParserRule getUiRootElementsRule() {
		return getUiRootElementsAccess().getRule();
	}
	
	//UiValidatorAlias:
	//	'validatorAlias' validator=UiValidator 'as' alias=ID ';'?;
	public UiValidatorAliasElements getUiValidatorAliasAccess() {
		return pUiValidatorAlias;
	}
	
	public ParserRule getUiValidatorAliasRule() {
		return getUiValidatorAliasAccess().getRule();
	}
	
	//UiValidatorAssignment:
	//	'fieldValidation' field=[UiField] '+=' (validatorDef=UiValidatorDef | validatorAlias=[UiValidatorAlias|QualifiedName]
	//	';'?);
	public UiValidatorAssignmentElements getUiValidatorAssignmentAccess() {
		return pUiValidatorAssignment;
	}
	
	public ParserRule getUiValidatorAssignmentRule() {
		return getUiValidatorAssignmentAccess().getRule();
	}
	
	//UiValidatorDef:
	//	validator=UiValidator;
	public UiValidatorDefElements getUiValidatorDefAccess() {
		return pUiValidatorDef;
	}
	
	public ParserRule getUiValidatorDefRule() {
		return getUiValidatorDefAccess().getRule();
	}
	
	//UiViewSet:
	//	'viewset' name=ID '{'
	//	beanSlots+=UiBeanSlot*
	//	bindingEndpointAlias+=UiBindingEndpointAlias*
	//	'}';
	public UiViewSetElements getUiViewSetAccess() {
		return pUiViewSet;
	}
	
	public ParserRule getUiViewSetRule() {
		return getUiViewSetAccess().getRule();
	}
	
	//UiBindingEndpointAlias:
	//	'dataAlias' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?;
	public UiBindingEndpointAliasElements getUiBindingEndpointAliasAccess() {
		return pUiBindingEndpointAlias;
	}
	
	public ParserRule getUiBindingEndpointAliasRule() {
		return getUiBindingEndpointAliasAccess().getRule();
	}
	
	//UiBeanSlot:
	//	'datasource' name=ID ':' jvmType=JvmTypeReference ('eventTopic' eventTopic=STRING)? ';'?;
	public UiBeanSlotElements getUiBeanSlotAccess() {
		return pUiBeanSlot;
	}
	
	public ParserRule getUiBeanSlotRule() {
		return getUiBeanSlotAccess().getRule();
	}
	
	//UiBinding:
	//	'bind' listBinding?='list'? source=UiBindingEndpointAssignment (targetToSource?='<'? '--'
	//	sourceToTarget?='>'?) target=UiBindingEndpointAssignment ';'?;
	public UiBindingElements getUiBindingAccess() {
		return pUiBinding;
	}
	
	public ParserRule getUiBindingRule() {
		return getUiBindingAccess().getRule();
	}
	
	//UiBindingEndpointAssignment UiBindingExpression:
	//	UiTypedBindableDef {UiBindingEndpointAssignment.typedBindableDef=current} path=UiPathSegment? | UiCommandBindableDef
	//	{UiBindingEndpointAssignment.typedBindableDef=current} | {UiBindingEndpointAssignment}
	//	typedBindableAlias=[UiTypedBindable] path=UiPathSegment?;
	public UiBindingEndpointAssignmentElements getUiBindingEndpointAssignmentAccess() {
		return pUiBindingEndpointAssignment;
	}
	
	public ParserRule getUiBindingEndpointAssignmentRule() {
		return getUiBindingEndpointAssignmentAccess().getRule();
	}
	
	//UiPathSegment:
	//	{UiPathSegment}
	//	'.' getter=[JvmOperation] path=UiPathSegment?;
	public UiPathSegmentElements getUiPathSegmentAccess() {
		return pUiPathSegment;
	}
	
	public ParserRule getUiPathSegmentRule() {
		return getUiPathSegmentAccess().getRule();
	}
	
	//UiNestedProperty:
	//	{UiNestedProperty} getter=[JvmOperation] path=UiPathSegment?;
	public UiNestedPropertyElements getUiNestedPropertyAccess() {
		return pUiNestedProperty;
	}
	
	public ParserRule getUiNestedPropertyRule() {
		return getUiNestedPropertyAccess().getRule();
	}
	
	//UiTypedBindableDef UiBindingExpression:
	//	{UiTypedBindableDef} ('[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']' '.'
	//	method=[cfg::UxEndpointDef]);
	public UiTypedBindableDefElements getUiTypedBindableDefAccess() {
		return pUiTypedBindableDef;
	}
	
	public ParserRule getUiTypedBindableDefRule() {
		return getUiTypedBindableDefAccess().getRule();
	}
	
	//UiTypedBindableRawType UiBindingExpression:
	//	{UiTypedBindableRawType}
	//	'[' rawBindable=[UiRawBindable] rawBindablePath=UiRawBindablePathSegment? ']';
	public UiTypedBindableRawTypeElements getUiTypedBindableRawTypeAccess() {
		return pUiTypedBindableRawType;
	}
	
	public ParserRule getUiTypedBindableRawTypeRule() {
		return getUiTypedBindableRawTypeAccess().getRule();
	}
	
	//UiTypedBindableRawTypeAlias:
	//	'ui' type=UiTypedBindableRawType 'as' alias=ID ';'?;
	public UiTypedBindableRawTypeAliasElements getUiTypedBindableRawTypeAliasAccess() {
		return pUiTypedBindableRawTypeAlias;
	}
	
	public ParserRule getUiTypedBindableRawTypeAliasRule() {
		return getUiTypedBindableRawTypeAliasAccess().getRule();
	}
	
	//UiRawBindablePathSegment:
	//	{UiRawBindablePathSegment} ('.' | toParent?='..') rawBindable=[UiRawBindable] path=UiRawBindablePathSegment?;
	public UiRawBindablePathSegmentElements getUiRawBindablePathSegmentAccess() {
		return pUiRawBindablePathSegment;
	}
	
	public ParserRule getUiRawBindablePathSegmentRule() {
		return getUiRawBindablePathSegmentAccess().getRule();
	}
	
	//UiCommandBindableDef:
	//	{UiCommandBindableDef} command=UiCommand;
	public UiCommandBindableDefElements getUiCommandBindableDefAccess() {
		return pUiCommandBindableDef;
	}
	
	public ParserRule getUiCommandBindableDefRule() {
		return getUiCommandBindableDefAccess().getRule();
	}
	
	//UiCommand:
	//	UiMobileNavigationCommand | UiOpenDialogCommand | UiSearchWithDialogCommand | UiAddToTableCommand |
	//	UiRemoveFromTableCommand | UiSendEventCommand | UiSetNewInstanceCommand;
	public UiCommandElements getUiCommandAccess() {
		return pUiCommand;
	}
	
	public ParserRule getUiCommandRule() {
		return getUiCommandAccess().getRule();
	}
	
	//UiMobileNavigationCommand:
	//	{UiMobileNavigationCommand}
	//	'navigateTo' targetPage=UiMobileNavigationPage;
	public UiMobileNavigationCommandElements getUiMobileNavigationCommandAccess() {
		return pUiMobileNavigationCommand;
	}
	
	public ParserRule getUiMobileNavigationCommandRule() {
		return getUiMobileNavigationCommandAccess().getRule();
	}
	
	//UiOpenDialogCommand:
	//	{UiOpenDialogCommand}
	//	'openDialog' dialog=UiDialog;
	public UiOpenDialogCommandElements getUiOpenDialogCommandAccess() {
		return pUiOpenDialogCommand;
	}
	
	public ParserRule getUiOpenDialogCommandRule() {
		return getUiOpenDialogCommandAccess().getRule();
	}
	
	//UiSearchWithDialogCommand:
	//	{UiSearchWithDialogCommand}
	//	'searchWith' dialog=UiSearchDialog;
	public UiSearchWithDialogCommandElements getUiSearchWithDialogCommandAccess() {
		return pUiSearchWithDialogCommand;
	}
	
	public ParserRule getUiSearchWithDialogCommandRule() {
		return getUiSearchWithDialogCommandAccess().getRule();
	}
	
	//UiAddToTableCommand:
	//	{UiAddToTableCommand}
	//	'addToTable' table=[UiTable];
	public UiAddToTableCommandElements getUiAddToTableCommandAccess() {
		return pUiAddToTableCommand;
	}
	
	public ParserRule getUiAddToTableCommandRule() {
		return getUiAddToTableCommandAccess().getRule();
	}
	
	//UiRemoveFromTableCommand:
	//	{UiRemoveFromTableCommand}
	//	'removeFromTable' table=[UiTable];
	public UiRemoveFromTableCommandElements getUiRemoveFromTableCommandAccess() {
		return pUiRemoveFromTableCommand;
	}
	
	public ParserRule getUiRemoveFromTableCommandRule() {
		return getUiRemoveFromTableCommandAccess().getRule();
	}
	
	//UiSetNewInstanceCommand:
	//	{UiSetNewInstanceCommand}
	//	'newInstance' ('for' jvmType=JvmTypeReference)? ('at' target=UiBindingEndpointAssignment);
	public UiSetNewInstanceCommandElements getUiSetNewInstanceCommandAccess() {
		return pUiSetNewInstanceCommand;
	}
	
	public ParserRule getUiSetNewInstanceCommandRule() {
		return getUiSetNewInstanceCommandAccess().getRule();
	}
	
	//UiSendEventCommand:
	//	{UiSendEventCommand}
	//	'sendEvent' '(' noAutoTrigger?='noAutoTrigger'? eventTopic=STRING ')';
	public UiSendEventCommandElements getUiSendEventCommandAccess() {
		return pUiSendEventCommand;
	}
	
	public ParserRule getUiSendEventCommandRule() {
		return getUiSendEventCommandAccess().getRule();
	}
	
	//UiView:
	//	UiIDEView;
	public UiViewElements getUiViewAccess() {
		return pUiView;
	}
	
	public ParserRule getUiViewRule() {
		return getUiViewAccess().getRule();
	}
	
	//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)*
	//	'}';
	public UiIDEViewElements getUiIDEViewAccess() {
		return pUiIDEView;
	}
	
	public ParserRule getUiIDEViewRule() {
		return getUiIDEViewAccess().getRule();
	}
	
	//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)*
	//	'}';
	public UiDisplayViewElements getUiDisplayViewAccess() {
		return pUiDisplayView;
	}
	
	public ParserRule getUiDisplayViewRule() {
		return getUiDisplayViewAccess().getRule();
	}
	
	//UiExposedAction:
	//	name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING)
	//	checkDirty?='checkDirty'? ('externalCommand' externalCommandId=STRING)? ';'?;
	public UiExposedActionElements getUiExposedActionAccess() {
		return pUiExposedAction;
	}
	
	public ParserRule getUiExposedActionRule() {
		return getUiExposedActionAccess().getRule();
	}
	
	//UiMobileNavBarAction:
	//	name=ID ('icon' iconName=STRING)? 'id' (=> actionReference=[cfg::UxAction|QualifiedName] | actionID=STRING) ';'?;
	public UiMobileNavBarActionElements getUiMobileNavBarActionAccess() {
		return pUiMobileNavBarAction;
	}
	
	public ParserRule getUiMobileNavBarActionRule() {
		return getUiMobileNavBarActionAccess().getRule();
	}
	
	//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)*
	//	'}';
	public UiMobileViewElements getUiMobileViewAccess() {
		return pUiMobileView;
	}
	
	public ParserRule getUiMobileViewRule() {
		return getUiMobileViewAccess().getRule();
	}
	
	//UiI18nInfo:
	//	'i18n' (noCaption?='noCaption' | key=STRING);
	public UiI18nInfoElements getUiI18nInfoAccess() {
		return pUiI18nInfo;
	}
	
	public ParserRule getUiI18nInfoRule() {
		return getUiI18nInfoAccess().getRule();
	}
	
	//UiGridLayout:
	//	{UiGridLayout}
	//	'gridlayout' ('(' (('columns=' columns=INT)?
	//	& i18nInfo=UiI18nInfo?
	//	& ('styles' styles=STRING)?
	//	& readonly?="readonly"?)
	//	')')?
	//	name=ID?
	//	'{'
	//	contents+=UiGridLayoutAssigment*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiGridLayoutElements getUiGridLayoutAccess() {
		return pUiGridLayout;
	}
	
	public ParserRule getUiGridLayoutRule() {
		return getUiGridLayoutAccess().getRule();
	}
	
	//UiVisibilityProcessorAssignment:
	//	{UiVisibilityProcessorAssignment} processor=UiVisibilityProcessor;
	public UiVisibilityProcessorAssignmentElements getUiVisibilityProcessorAssignmentAccess() {
		return pUiVisibilityProcessorAssignment;
	}
	
	public ParserRule getUiVisibilityProcessorAssignmentRule() {
		return getUiVisibilityProcessorAssignmentAccess().getRule();
	}
	
	//UiGridLayoutAssigment:
	//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
	public UiGridLayoutAssigmentElements getUiGridLayoutAssigmentAccess() {
		return pUiGridLayoutAssigment;
	}
	
	public ParserRule getUiGridLayoutAssigmentRule() {
		return getUiGridLayoutAssigmentAccess().getRule();
	}
	
	//UiFormLayout:
	//	{UiFormLayout}
	//	'form' ('('
	//	i18nInfo=UiI18nInfo?
	//	& ('styles' styles=STRING)?
	//	& readonly?="readonly"?
	//	')')?
	//	name=ID?
	//	'{'
	//	contents+=UiFormLayoutAssigment*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiFormLayoutElements getUiFormLayoutAccess() {
		return pUiFormLayout;
	}
	
	public ParserRule getUiFormLayoutRule() {
		return getUiFormLayoutAccess().getRule();
	}
	
	//UiFormLayoutAssigment:
	//	element=UiEmbeddable;
	public UiFormLayoutAssigmentElements getUiFormLayoutAssigmentAccess() {
		return pUiFormLayoutAssigment;
	}
	
	public ParserRule getUiFormLayoutAssigmentRule() {
		return getUiFormLayoutAssigmentAccess().getRule();
	}
	
	//UiVerticalLayout:
	//	{UiVerticalLayout}
	//	'verticalLayout' ('('
	//	i18nInfo=UiI18nInfo?
	//	& ('styles' styles=STRING)?
	//	& readonly?="readonly"?
	//	')')?
	//	name=ID?
	//	'{'
	//	contents+=UiVerticalLayoutAssigment*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiVerticalLayoutElements getUiVerticalLayoutAccess() {
		return pUiVerticalLayout;
	}
	
	public ParserRule getUiVerticalLayoutRule() {
		return getUiVerticalLayoutAccess().getRule();
	}
	
	//UiVerticalLayoutAssigment:
	//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
	public UiVerticalLayoutAssigmentElements getUiVerticalLayoutAssigmentAccess() {
		return pUiVerticalLayoutAssigment;
	}
	
	public ParserRule getUiVerticalLayoutAssigmentRule() {
		return getUiVerticalLayoutAssigmentAccess().getRule();
	}
	
	//UiMobileVerticalLayout UiVerticalLayout:
	//	{UiVerticalLayout}
	//	'mobileVerticalLayout' ('('
	//	i18nInfo=UiI18nInfo?
	//	& ('styles' styles=STRING)?
	//	& readonly?="readonly"?
	//	')')?
	//	name=ID?
	//	'{'
	//	contents+=UiMobileVerticalLayoutAssigment*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiMobileVerticalLayoutElements getUiMobileVerticalLayoutAccess() {
		return pUiMobileVerticalLayout;
	}
	
	public ParserRule getUiMobileVerticalLayoutRule() {
		return getUiMobileVerticalLayoutAccess().getRule();
	}
	
	//UiMobileVerticalLayoutAssigment UiVerticalLayoutAssigment:
	//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
	public UiMobileVerticalLayoutAssigmentElements getUiMobileVerticalLayoutAssigmentAccess() {
		return pUiMobileVerticalLayoutAssigment;
	}
	
	public ParserRule getUiMobileVerticalLayoutAssigmentRule() {
		return getUiMobileVerticalLayoutAssigmentAccess().getRule();
	}
	
	//UiMobileNavigationRoot:
	//	{UiMobileNavigationRoot}
	//	'navRoot'
	//	name=ID?
	//	'{'
	//	contents+=UiMobileNavigationRootAssigment '}';
	public UiMobileNavigationRootElements getUiMobileNavigationRootAccess() {
		return pUiMobileNavigationRoot;
	}
	
	public ParserRule getUiMobileNavigationRootRule() {
		return getUiMobileNavigationRootAccess().getRule();
	}
	
	//UiMobileNavigationRootAssigment:
	//	element=UiMobileNavigationPage;
	public UiMobileNavigationRootAssigmentElements getUiMobileNavigationRootAssigmentAccess() {
		return pUiMobileNavigationRootAssigment;
	}
	
	public ParserRule getUiMobileNavigationRootAssigmentRule() {
		return getUiMobileNavigationRootAssigmentAccess().getRule();
	}
	
	//UiHorizontalLayout:
	//	{UiHorizontalLayout}
	//	'horizontalLayout' ('('
	//	i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?
	//	& ('styles' styles=STRING)?
	//	')')?
	//	name=ID?
	//	'{'
	//	//	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
	//	contents+=UiHorizontalLayoutAssigment*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiHorizontalLayoutElements getUiHorizontalLayoutAccess() {
		return pUiHorizontalLayout;
	}
	
	public ParserRule getUiHorizontalLayoutRule() {
		return getUiHorizontalLayoutAccess().getRule();
	}
	
	//UiHorizontalLayoutAssigment:
	//	element=UiEmbeddable ('align' alignment=UiAlignment)?;
	public UiHorizontalLayoutAssigmentElements getUiHorizontalLayoutAssigmentAccess() {
		return pUiHorizontalLayoutAssigment;
	}
	
	public ParserRule getUiHorizontalLayoutAssigmentRule() {
		return getUiHorizontalLayoutAssigmentAccess().getRule();
	}
	
	//UiMobileHorizontalLayout UiHorizontalLayout:
	//	{UiHorizontalLayout}
	//	'mobileHorizontalLayout' ('('
	//	i18nInfo=UiI18nInfo?
	//	& ('styles' styles=STRING)?
	//	& readonly?="readonly"?
	//	')')?
	//	name=ID?
	//	'{'
	//	//	(autowire?="autowire" 'source' autoWireSource=UiBindingEndpointAssignment)?
	//	contents+=UiMobileHorizontalLayoutAssigment*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiMobileHorizontalLayoutElements getUiMobileHorizontalLayoutAccess() {
		return pUiMobileHorizontalLayout;
	}
	
	public ParserRule getUiMobileHorizontalLayoutRule() {
		return getUiMobileHorizontalLayoutAccess().getRule();
	}
	
	//UiMobileHorizontalLayoutAssigment UiHorizontalLayoutAssigment:
	//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
	public UiMobileHorizontalLayoutAssigmentElements getUiMobileHorizontalLayoutAssigmentAccess() {
		return pUiMobileHorizontalLayoutAssigment;
	}
	
	public ParserRule getUiMobileHorizontalLayoutAssigmentRule() {
		return getUiMobileHorizontalLayoutAssigmentAccess().getRule();
	}
	
	//UiMobileHorizontalButtonGroup UiHorizontalButtonGroup:
	//	{UiHorizontalButtonGroup}
	//	'horizontalButtonGroup' ('(' (i18nInfo=UiI18nInfo?
	//	& ('styles' styles=STRING)?
	//	& readonly?="readonly"?) ')')?
	//	name=TRANSLATABLEID?
	//	'{'
	//	contents+=UiMobileHorizontalButtonGroupAssigment*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiMobileHorizontalButtonGroupElements getUiMobileHorizontalButtonGroupAccess() {
		return pUiMobileHorizontalButtonGroup;
	}
	
	public ParserRule getUiMobileHorizontalButtonGroupRule() {
		return getUiMobileHorizontalButtonGroupAccess().getRule();
	}
	
	//UiMobileHorizontalButtonGroupAssigment UiHorizontalButtonGroupAssigment:
	//	element=UiMobileEmbeddable;
	public UiMobileHorizontalButtonGroupAssigmentElements getUiMobileHorizontalButtonGroupAssigmentAccess() {
		return pUiMobileHorizontalButtonGroupAssigment;
	}
	
	public ParserRule getUiMobileHorizontalButtonGroupAssigmentRule() {
		return getUiMobileHorizontalButtonGroupAssigmentAccess().getRule();
	}
	
	//UiMobileVerticalComponentGroup UiVerticalComponentGroup:
	//	{UiVerticalComponentGroup}
	//	'verticalGroup' ('(' (i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?
	//	& ('styles' styles=STRING)?)
	//	')')?
	//	name=ID?
	//	'{'
	//	contents+=UiMobileVerticalComponentGroupAssigment*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiMobileVerticalComponentGroupElements getUiMobileVerticalComponentGroupAccess() {
		return pUiMobileVerticalComponentGroup;
	}
	
	public ParserRule getUiMobileVerticalComponentGroupRule() {
		return getUiMobileVerticalComponentGroupAccess().getRule();
	}
	
	//UiMobileVerticalComponentGroupAssigment UiVerticalComponentGroupAssigment:
	//	element=UiMobileEmbeddable;
	public UiMobileVerticalComponentGroupAssigmentElements getUiMobileVerticalComponentGroupAssigmentAccess() {
		return pUiMobileVerticalComponentGroupAssigment;
	}
	
	public ParserRule getUiMobileVerticalComponentGroupAssigmentRule() {
		return getUiMobileVerticalComponentGroupAssigmentAccess().getRule();
	}
	
	//UiSearchPanel:
	//	{UiSearchPanel}
	//	'searchPanel' ('(' (i18nInfo=UiI18nInfo?
	//	& ('styles' styles=STRING)?)
	//	')')?
	//	name=TRANSLATABLEID?
	//	'{'
	//	'type' jvmType=JvmTypeReference ';'?
	//	contents+=UiSearchField*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiSearchPanelElements getUiSearchPanelAccess() {
		return pUiSearchPanel;
	}
	
	public ParserRule getUiSearchPanelRule() {
		return getUiSearchPanelAccess().getRule();
	}
	
	//UiMobileSearchPanel:
	//	{UiMobileSearchPanel}
	//	'mobileSearchPanel' ('(' (i18nInfo=UiI18nInfo?
	//	& ('styles' styles=STRING)?)
	//	')')?
	//	name=TRANSLATABLEID?
	//	'{'
	//	'type' jvmType=JvmTypeReference ';'?
	//	contents+=UiSearchField*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiMobileSearchPanelElements getUiMobileSearchPanelAccess() {
		return pUiMobileSearchPanel;
	}
	
	public ParserRule getUiMobileSearchPanelRule() {
		return getUiMobileSearchPanelAccess().getRule();
	}
	
	//UiMobileTabSheet:
	//	{UiMobileTabSheet}
	//	'mobileTab' ('(' (i18nInfo=UiI18nInfo?
	//	& ('styles' styles=STRING)?)
	//	')')?
	//	name=ID?
	//	'{'
	//	tabs+=UiMobileTabAssignment*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiMobileTabSheetElements getUiMobileTabSheetAccess() {
		return pUiMobileTabSheet;
	}
	
	public ParserRule getUiMobileTabSheetRule() {
		return getUiMobileTabSheetAccess().getRule();
	}
	
	//UiMobileTabAssignment:
	//	'tab' name=TRANSLATABLEID? element=UiMobileEmbeddable;
	public UiMobileTabAssignmentElements getUiMobileTabAssignmentAccess() {
		return pUiMobileTabAssignment;
	}
	
	public ParserRule getUiMobileTabAssignmentRule() {
		return getUiMobileTabAssignmentAccess().getRule();
	}
	
	//UiTabSheet:
	//	{UiTabSheet}
	//	'tabsheet' ('(' (i18nInfo=UiI18nInfo?
	//	& ('styles' styles=STRING)?)
	//	')')?
	//	name=ID?
	//	'{'
	//	tabs+=UiTabAssignment*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiTabSheetElements getUiTabSheetAccess() {
		return pUiTabSheet;
	}
	
	public ParserRule getUiTabSheetRule() {
		return getUiTabSheetAccess().getRule();
	}
	
	//UiTabAssignment:
	//	'tab' name=TRANSLATABLEID? element=UiEmbeddable;
	public UiTabAssignmentElements getUiTabAssignmentAccess() {
		return pUiTabAssignment;
	}
	
	public ParserRule getUiTabAssignmentRule() {
		return getUiTabAssignmentAccess().getRule();
	}
	
	//UiSplitpanel:
	//	'splitter' ('(' i18nInfo=UiI18nInfo? & ('styles' styles=STRING)? ')')? name=ID
	//	'{' ('first' firstContent=UiSplitpanelAssigment & 'second' secondContent=UiSplitpanelAssigment & ('splitPos'
	//	splitPosition=INT)?
	//	& readonly?="readonly"?) bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiSplitpanelElements getUiSplitpanelAccess() {
		return pUiSplitpanel;
	}
	
	public ParserRule getUiSplitpanelRule() {
		return getUiSplitpanelAccess().getRule();
	}
	
	//UiSplitpanelAssigment:
	//	element=UiEmbeddable;
	public UiSplitpanelAssigmentElements getUiSplitpanelAssigmentAccess() {
		return pUiSplitpanelAssigment;
	}
	
	public ParserRule getUiSplitpanelAssigmentRule() {
		return getUiSplitpanelAssigmentAccess().getRule();
	}
	
	//UiPanel:
	//	'panel' ('(' (i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?
	//	& ('styles' styles=STRING)?)
	//	')')?
	//	name=TRANSLATABLEID
	//	'{'
	//	'content' content=UiEmbeddable
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiPanelElements getUiPanelAccess() {
		return pUiPanel;
	}
	
	public ParserRule getUiPanelRule() {
		return getUiPanelAccess().getRule();
	}
	
	//UiDialog:
	//	{UiDialog}
	//	'dialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? '{' ('type'
	//	jvmType=JvmTypeReference ';'?)? (content=UiDialogAssignment ';'?)?
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiDialogElements getUiDialogAccess() {
		return pUiDialog;
	}
	
	public ParserRule getUiDialogRule() {
		return getUiDialogAccess().getRule();
	}
	
	//UiDialogAssignment:
	//	element=UiEmbeddable;
	public UiDialogAssignmentElements getUiDialogAssignmentAccess() {
		return pUiDialogAssignment;
	}
	
	public ParserRule getUiDialogAssignmentRule() {
		return getUiDialogAssignmentAccess().getRule();
	}
	
	//UiSearchDialog:
	//	{UiSearchDialog}
	//	'searchdialog' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? '{' ('type'
	//	jvmType=JvmTypeReference)? ('search' '{'
	//	searchFields+=UiDialogSearchFieldAssignment*
	//	'}')? ('content' '{'
	//	content=UiDialogAssignment
	//	'}')?
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiSearchDialogElements getUiSearchDialogAccess() {
		return pUiSearchDialog;
	}
	
	public ParserRule getUiSearchDialogRule() {
		return getUiSearchDialogAccess().getRule();
	}
	
	//UiDialogSearchFieldAssignment:
	//	element=UiSearchField;
	public UiDialogSearchFieldAssignmentElements getUiDialogSearchFieldAssignmentAccess() {
		return pUiDialogSearchFieldAssignment;
	}
	
	public ParserRule getUiDialogSearchFieldAssignmentRule() {
		return getUiDialogSearchFieldAssignmentAccess().getRule();
	}
	
	//UiMobileNavigationPage:
	//	{UiMobileNavigationPage}
	//	'navPage' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=ID? '{' ('type' jvmType=JvmTypeReference
	//	';'?)? ('navbarActions' '{'
	//	barActions+=UiMobileNavBarAction*
	//	'}')?
	//	contents+=UiMobileNavigationPageAssignment*
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}';
	public UiMobileNavigationPageElements getUiMobileNavigationPageAccess() {
		return pUiMobileNavigationPage;
	}
	
	public ParserRule getUiMobileNavigationPageRule() {
		return getUiMobileNavigationPageAccess().getRule();
	}
	
	//UiMobileNavigationPageAssignment:
	//	element=UiMobileEmbeddable ('align' alignment=UiAlignment)?;
	public UiMobileNavigationPageAssignmentElements getUiMobileNavigationPageAssignmentAccess() {
		return pUiMobileNavigationPageAssignment;
	}
	
	public ParserRule getUiMobileNavigationPageAssignmentRule() {
		return getUiMobileNavigationPageAssignmentAccess().getRule();
	}
	
	//UiPoint:
	//	x=INT '/' y=INT;
	public UiPointElements getUiPointAccess() {
		return pUiPoint;
	}
	
	public ParserRule getUiPointRule() {
		return getUiPointAccess().getRule();
	}
	
	//UiTextField:
	//	{UiTextField}
	//	'textfield' ('(' (('maxLength=' maxLength=INT)?
	//	& ('minLength=' minLength=INT)?
	//	& ('regex=' regex=STRING)?
	//	& ('styles' styles=STRING)?
	//	& i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiTextFieldElements getUiTextFieldAccess() {
		return pUiTextField;
	}
	
	public ParserRule getUiTextFieldRule() {
		return getUiTextFieldAccess().getRule();
	}
	
	//UiPasswordField:
	//	{UiPasswordField}
	//	'passwordField' ('(' (('styles' styles=STRING)?
	//	& i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiPasswordFieldElements getUiPasswordFieldAccess() {
		return pUiPasswordField;
	}
	
	public ParserRule getUiPasswordFieldRule() {
		return getUiPasswordFieldAccess().getRule();
	}
	
	//UiMaskedTextField:
	//	{UiMaskedTextField}
	//	'maskedText' ('(' (('styles' styles=STRING)?
	//	& ('mask=' mask=STRING)?
	//	& i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiMaskedTextFieldElements getUiMaskedTextFieldAccess() {
		return pUiMaskedTextField;
	}
	
	public ParserRule getUiMaskedTextFieldRule() {
		return getUiMaskedTextFieldAccess().getRule();
	}
	
	//UiMaskedNumericField:
	//	{UiMaskedNumericField}
	//	'maskedNumeric' ('(' (('styles' styles=STRING)?
	//	& i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiMaskedNumericFieldElements getUiMaskedNumericFieldAccess() {
		return pUiMaskedNumericField;
	}
	
	public ParserRule getUiMaskedNumericFieldRule() {
		return getUiMaskedNumericFieldAccess().getRule();
	}
	
	//UiMaskedDecimalField:
	//	{UiMaskedDecimalField}
	//	'maskedDecimal' ('(' (('styles' styles=STRING)?
	//	& ('mask=' mask=STRING)?
	//	& i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiMaskedDecimalFieldElements getUiMaskedDecimalFieldAccess() {
		return pUiMaskedDecimalField;
	}
	
	public ParserRule getUiMaskedDecimalFieldRule() {
		return getUiMaskedDecimalFieldAccess().getRule();
	}
	
	//UiPrefixedMaskedTextField:
	//	{UiPrefixedMaskedTextField}
	//	'maskedTextWithPrefix' ('(' (('styles' styles=STRING)?
	//	& ('mask=' mask=STRING)?
	//	& ('prefixes=' '(' prefixMasks+=UiPrefixToMaskMapEntry (',' prefixMasks+=UiPrefixToMaskMapEntry)* ')')?
	//	& i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiPrefixedMaskedTextFieldElements getUiPrefixedMaskedTextFieldAccess() {
		return pUiPrefixedMaskedTextField;
	}
	
	public ParserRule getUiPrefixedMaskedTextFieldRule() {
		return getUiPrefixedMaskedTextFieldAccess().getRule();
	}
	
	//UiPrefixToMaskMapEntry:
	//	{UiPrefixToMaskMapEntry}
	//	'prefix' key=STRING 'mask' value=STRING;
	public UiPrefixToMaskMapEntryElements getUiPrefixToMaskMapEntryAccess() {
		return pUiPrefixToMaskMapEntry;
	}
	
	public ParserRule getUiPrefixToMaskMapEntryRule() {
		return getUiPrefixToMaskMapEntryAccess().getRule();
	}
	
	//UiRichTextArea:
	//	{UiRichTextArea}
	//	'richtextArea' ('(' (('styles' styles=STRING)?
	//	& i18nInfo=UiI18nInfo?
	//	& asBlob?="asBlob"?
	//	& readonly?="readonly"?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiRichTextAreaElements getUiRichTextAreaAccess() {
		return pUiRichTextArea;
	}
	
	public ParserRule getUiRichTextAreaRule() {
		return getUiRichTextAreaAccess().getRule();
	}
	
	//UiSuggestTextField:
	//	{UiSuggestTextField}
	//	'suggestText' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' (('type'
	//	jvmType=JvmTypeReference ';'?)?
	//	& ('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
	//	& ('filterField' itemFilterProperty=[JvmOperation] ';'?)?
	//	& ('uuidField' itemUUIDProperty=[JvmOperation] ';'?)?
	//	& autoHidePopup?='autoHidePopup'?
	//	& readonly?='readonly'?) (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiSuggestTextFieldElements getUiSuggestTextFieldAccess() {
		return pUiSuggestTextField;
	}
	
	public ParserRule getUiSuggestTextFieldRule() {
		return getUiSuggestTextFieldAccess().getRule();
	}
	
	//UiBeanReferenceField:
	//	{UiBeanReferenceField}
	//	'referenceField' ('(' (i18nInfo=UiI18nInfo?
	//	& ('styles' styles=STRING)?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (('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*
	//	'}')?;
	public UiBeanReferenceFieldElements getUiBeanReferenceFieldAccess() {
		return pUiBeanReferenceField;
	}
	
	public ParserRule getUiBeanReferenceFieldRule() {
		return getUiBeanReferenceFieldAccess().getRule();
	}
	
	//UiSearchField:
	//	{UiSearchField}
	//	'searchfield' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? property=UiNestedProperty;
	public UiSearchFieldElements getUiSearchFieldAccess() {
		return pUiSearchField;
	}
	
	public ParserRule getUiSearchFieldRule() {
		return getUiSearchFieldAccess().getRule();
	}
	
	//UiTextArea:
	//	{UiTextArea}
	//	'textarea' ('(' (i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?
	//	& ('styles' styles=STRING)?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiTextAreaElements getUiTextAreaAccess() {
		return pUiTextArea;
	}
	
	public ParserRule getUiTextAreaRule() {
		return getUiTextAreaAccess().getRule();
	}
	
	//UiDateField:
	//	{UiDateField}
	//	'datefield' ('(' (dateFormat=UiDateFormat?
	//	& resolution=UiDateTimeResolution?
	//	& ('styles' styles=STRING)?
	//	& i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiDateFieldElements getUiDateFieldAccess() {
		return pUiDateField;
	}
	
	public ParserRule getUiDateFieldRule() {
		return getUiDateFieldAccess().getRule();
	}
	
	//enum UiDateFormat:
	//	DATE="date" | DATE_TIME="datetime" | TIME="time";
	public UiDateFormatElements getUiDateFormatAccess() {
		return eUiDateFormat;
	}
	
	public EnumRule getUiDateFormatRule() {
		return getUiDateFormatAccess().getRule();
	}
	
	//enum UiDateTimeResolution:
	//	UNDEFINED="undefined" | SECOND="second" | MINUTE="minute" | HOUR="hour" | DAY="day" | MONTH="month" | YEAR="year";
	public UiDateTimeResolutionElements getUiDateTimeResolutionAccess() {
		return eUiDateTimeResolution;
	}
	
	public EnumRule getUiDateTimeResolutionRule() {
		return getUiDateTimeResolutionAccess().getRule();
	}
	
	//UiBrowser:
	//	{UiBrowser}
	//	'browser' ('(' (i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?
	//	& ('styles' styles=STRING)?)
	//	')')? name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiBrowserElements getUiBrowserAccess() {
		return pUiBrowser;
	}
	
	public ParserRule getUiBrowserRule() {
		return getUiBrowserAccess().getRule();
	}
	
	//UiProgressBar:
	//	{UiProgressBar}
	//	'progressbar' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{'
	//	(validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiProgressBarElements getUiProgressBarAccess() {
		return pUiProgressBar;
	}
	
	public ParserRule getUiProgressBarRule() {
		return getUiProgressBarAccess().getRule();
	}
	
	//UiImage:
	//	{UiImage}
	//	'image' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' ('iconPath'
	//	value=STRING ';'?)?
	//	bindings+=UiBinding*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiImageElements getUiImageAccess() {
		return pUiImage;
	}
	
	public ParserRule getUiImageRule() {
		return getUiImageAccess().getRule();
	}
	
	//UiTable:
	//	{UiTable}
	//	'table' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' (('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*
	//	'}')?;
	public UiTableElements getUiTableAccess() {
		return pUiTable;
	}
	
	public ParserRule getUiTableRule() {
		return getUiTableAccess().getRule();
	}
	
	//UiComboBox:
	//	{UiComboBox}
	//	'combo' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{' (('type'
	//	jvmType=JvmTypeReference ';'?)?
	//	& ('captionField' itemCaptionProperty=[JvmOperation] ';'?)?
	//	& ('descriptionField' descriptionProperty=UiNestedProperty ';'?)?
	//	& ('imageField' itemImageProperty=[JvmOperation] ';'?)?
	//	& (consumeBeanService?='useBeanService' ';'?)?
	//	& readonly?='readonly'?) (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiComboBoxElements getUiComboBoxAccess() {
		return pUiComboBox;
	}
	
	public ParserRule getUiComboBoxRule() {
		return getUiComboBoxAccess().getRule();
	}
	
	//UiButton:
	//	{UiButton}
	//	'button' ('(' (i18nInfo=UiI18nInfo?
	//	& readonly?='readonly'?
	//	& ('styles' styles=STRING)?)
	//	')')? name=TRANSLATABLEID?;
	public UiButtonElements getUiButtonAccess() {
		return pUiButton;
	}
	
	public ParserRule getUiButtonRule() {
		return getUiButtonAccess().getRule();
	}
	
	//UiMobileNavigationButton:
	//	{UiMobileNavigationButton}
	//	'navButton' ('(' (i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?
	//	& ('styles' styles=STRING)?)
	//	')')?
	//	name=TRANSLATABLEID? (targetPage=UiMobileNavigationPage | 'alias'
	//	targetPageAlias=[UiMobileNavigationPage]);
	public UiMobileNavigationButtonElements getUiMobileNavigationButtonAccess() {
		return pUiMobileNavigationButton;
	}
	
	public ParserRule getUiMobileNavigationButtonRule() {
		return getUiMobileNavigationButtonAccess().getRule();
	}
	
	//UiMobileSwitch UiSwitch:
	//	{UiSwitch}
	//	'switchIt' ('(' (i18nInfo=UiI18nInfo? & readonly?="readonly"? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID?
	//	('{'
	//	processorAssignments+=UiVisibilityProcessorAssignment* (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	'}')?;
	public UiMobileSwitchElements getUiMobileSwitchAccess() {
		return pUiMobileSwitch;
	}
	
	public ParserRule getUiMobileSwitchRule() {
		return getUiMobileSwitchAccess().getRule();
	}
	
	//UiLabel:
	//	{UiLabel}
	//	'label' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')? name=TRANSLATABLEID? ('{'
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	bindings+=UiBinding*
	//	'}')?;
	public UiLabelElements getUiLabelAccess() {
		return pUiLabel;
	}
	
	public ParserRule getUiLabelRule() {
		return getUiLabelAccess().getRule();
	}
	
	//UiDecimalField:
	//	{UiDecimalField}
	//	'decimalField' ('(' (noGrouping?='noGrouping'?
	//	& noMarkNegative?='noMarkNegative'?
	//	& ('styles' styles=STRING)?
	//	& ('precision=' precision=INT)?
	//	& i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiDecimalFieldElements getUiDecimalFieldAccess() {
		return pUiDecimalField;
	}
	
	public ParserRule getUiDecimalFieldRule() {
		return getUiDecimalFieldAccess().getRule();
	}
	
	//UiOptionsGroup:
	//	{UiOptionsGroup}
	//	'optionsgroup' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
	//	name=TRANSLATABLEID? ('{' (('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*
	//	'}')?;
	public UiOptionsGroupElements getUiOptionsGroupAccess() {
		return pUiOptionsGroup;
	}
	
	public ParserRule getUiOptionsGroupRule() {
		return getUiOptionsGroupAccess().getRule();
	}
	
	//UiList:
	//	{UiList}
	//	'listSelect' ('(' (i18nInfo=UiI18nInfo? & ('styles' styles=STRING)?) ')')?
	//	name=TRANSLATABLEID? ('{' (('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*
	//	'}')?;
	public UiListElements getUiListAccess() {
		return pUiList;
	}
	
	public ParserRule getUiListRule() {
		return getUiListAccess().getRule();
	}
	
	//enum UiSelectionType:
	//	SINGLE='single' | MULTI='multi' | NONE='none';
	public UiSelectionTypeElements getUiSelectionTypeAccess() {
		return eUiSelectionType;
	}
	
	public EnumRule getUiSelectionTypeRule() {
		return getUiSelectionTypeAccess().getRule();
	}
	
	//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";
	public UiAlignmentElements getUiAlignmentAccess() {
		return eUiAlignment;
	}
	
	public EnumRule getUiAlignmentRule() {
		return getUiAlignmentAccess().getRule();
	}
	
	//UiColumnsAssignment:
	//	{UiColumnsAssignment}
	//	'columns' '{'
	//	columns+=UiColumn*
	//	'}';
	public UiColumnsAssignmentElements getUiColumnsAssignmentAccess() {
		return pUiColumnsAssignment;
	}
	
	public ParserRule getUiColumnsAssignmentRule() {
		return getUiColumnsAssignmentAccess().getRule();
	}
	
	//UiSortOrderAssignment:
	//	{UiSortOrderAssignment}
	//	'sort' '{'
	//	columns+=UiSortOrder*
	//	'}';
	public UiSortOrderAssignmentElements getUiSortOrderAssignmentAccess() {
		return pUiSortOrderAssignment;
	}
	
	public ParserRule getUiSortOrderAssignmentRule() {
		return getUiSortOrderAssignmentAccess().getRule();
	}
	
	//UiSortOrder:
	//	'column' property=UiNestedProperty ('desc' | asc?="asc")? ';'?;
	public UiSortOrderElements getUiSortOrderAccess() {
		return pUiSortOrder;
	}
	
	public ParserRule getUiSortOrderRule() {
		return getUiSortOrderAccess().getRule();
	}
	
	//UiColumn:
	//	{UiColumn}
	//	'column' property=UiNestedProperty ('icon' iconName=STRING)? ';'?;
	public UiColumnElements getUiColumnAccess() {
		return pUiColumn;
	}
	
	public ParserRule getUiColumnRule() {
		return getUiColumnAccess().getRule();
	}
	
	//UiEmbeddable:
	//	UiLayout | UiField | UiAction | UiTabSheet;
	public UiEmbeddableElements getUiEmbeddableAccess() {
		return pUiEmbeddable;
	}
	
	public ParserRule getUiEmbeddableRule() {
		return getUiEmbeddableAccess().getRule();
	}
	
	//UiMobileEmbeddable:
	//	UiMobileLayout | UiMobileField | UiMobileTabSheet | UiMobileAction;
	public UiMobileEmbeddableElements getUiMobileEmbeddableAccess() {
		return pUiMobileEmbeddable;
	}
	
	public ParserRule getUiMobileEmbeddableRule() {
		return getUiMobileEmbeddableAccess().getRule();
	}
	
	//UiMobileLayout:
	//	UiMobileHorizontalButtonGroup | UiMobileVerticalComponentGroup | UiMobileNavigationPage | UiMobileHorizontalLayout |
	//	UiMobileVerticalLayout | UiMobileSearchPanel | UiMobileNavigationRoot;
	public UiMobileLayoutElements getUiMobileLayoutAccess() {
		return pUiMobileLayout;
	}
	
	public ParserRule getUiMobileLayoutRule() {
		return getUiMobileLayoutAccess().getRule();
	}
	
	//UiMobileField:
	//	UiMobileSwitch | UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField |
	//	UiPrefixedMaskedTextField | UiRichTextArea | UiPasswordField | UiSuggestTextField | UiNumericField | UiTable |
	//	UiComboBox | UiImage
	//	| UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar | UiOptionsGroup;
	public UiMobileFieldElements getUiMobileFieldAccess() {
		return pUiMobileField;
	}
	
	public ParserRule getUiMobileFieldRule() {
		return getUiMobileFieldAccess().getRule();
	}
	
	//UiLayout:
	//	UiGridLayout | UiFormLayout | UiHorizontalLayout | UiVerticalLayout | UiSplitpanel | UiPanel | UiSearchPanel;
	public UiLayoutElements getUiLayoutAccess() {
		return pUiLayout;
	}
	
	public ParserRule getUiLayoutRule() {
		return getUiLayoutAccess().getRule();
	}
	
	//UiField:
	//	UiTextField | UiMaskedTextField | UiMaskedNumericField | UiMaskedDecimalField | UiPrefixedMaskedTextField |
	//	UiRichTextArea | UiPasswordField | UiSuggestTextField | UiList | UiNumericField | UiCheckBox | UiTable | UiComboBox |
	//	UiImage | UiSearchField | UiLabel | UiDecimalField | UiTextArea | UiDateField | UiBrowser | UiProgressBar |
	//	UiOptionsGroup | UiBeanReferenceField;
	public UiFieldElements getUiFieldAccess() {
		return pUiField;
	}
	
	public ParserRule getUiFieldRule() {
		return getUiFieldAccess().getRule();
	}
	
	//UiAction:
	//	UiButton;
	public UiActionElements getUiActionAccess() {
		return pUiAction;
	}
	
	public ParserRule getUiActionRule() {
		return getUiActionAccess().getRule();
	}
	
	//UiMobileAction:
	//	UiMobileNavigationButton | UiButton;
	public UiMobileActionElements getUiMobileActionAccess() {
		return pUiMobileAction;
	}
	
	public ParserRule getUiMobileActionRule() {
		return getUiMobileActionAccess().getRule();
	}
	
	//UiNumericField:
	//	{UiNumericField}
	//	'numericField' ('(' (noGrouping?='noGrouping'?
	//	& ('styles' styles=STRING)?
	//	& noMarkNegative?='noMarkNegative'?
	//	& i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?)
	//	')')?
	//	name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiNumericFieldElements getUiNumericFieldAccess() {
		return pUiNumericField;
	}
	
	public ParserRule getUiNumericFieldRule() {
		return getUiNumericFieldAccess().getRule();
	}
	
	//UiCheckBox:
	//	{UiCheckBox}
	//	'checkbox' ('(' (i18nInfo=UiI18nInfo?
	//	& readonly?="readonly"?
	//	& ('styles' styles=STRING)?)
	//	')')? name=TRANSLATABLEID? ('{' (validators+=UiValidator
	//	| bindings+=UiBinding)*
	//	processorAssignments+=UiVisibilityProcessorAssignment*
	//	'}')?;
	public UiCheckBoxElements getUiCheckBoxAccess() {
		return pUiCheckBox;
	}
	
	public ParserRule getUiCheckBoxRule() {
		return getUiCheckBoxAccess().getRule();
	}
	
	//UiValidator:
	//	UiMaxLengthValidator | UiMinLengthValidator | UiRegexpValidator | UiXbaseValidator | UiBeanValidationValidator;
	public UiValidatorElements getUiValidatorAccess() {
		return pUiValidator;
	}
	
	public ParserRule getUiValidatorRule() {
		return getUiValidatorAccess().getRule();
	}
	
	//UiMaxLengthValidator:
	//	{UiMaxLengthValidator}
	//	'MaxLengthValidator' name=ID? '(' maxLength=INT ')' errorCode=UiErrorCode?;
	public UiMaxLengthValidatorElements getUiMaxLengthValidatorAccess() {
		return pUiMaxLengthValidator;
	}
	
	public ParserRule getUiMaxLengthValidatorRule() {
		return getUiMaxLengthValidatorAccess().getRule();
	}
	
	//UiMinLengthValidator:
	//	{UiMinLengthValidator}
	//	'MinLengthValidator' name=ID? '(' minLength=INT ')' errorCode=UiErrorCode?;
	public UiMinLengthValidatorElements getUiMinLengthValidatorAccess() {
		return pUiMinLengthValidator;
	}
	
	public ParserRule getUiMinLengthValidatorRule() {
		return getUiMinLengthValidatorAccess().getRule();
	}
	
	//UiRegexpValidator:
	//	{UiRegexpValidator}
	//	'RegexValidator' name=ID? '(' regExpression=STRING ')' errorCode=UiErrorCode?;
	public UiRegexpValidatorElements getUiRegexpValidatorAccess() {
		return pUiRegexpValidator;
	}
	
	public ParserRule getUiRegexpValidatorRule() {
		return getUiRegexpValidatorAccess().getRule();
	}
	
	//UiXbaseValidator:
	//	{UiXbaseValidator}
	//	'Expression' name=ID '(' jvmType=JvmTypeReference ')'
	//	errorCodes+=UiErrorCode* expression=XBlockExpression?;
	public UiXbaseValidatorElements getUiXbaseValidatorAccess() {
		return pUiXbaseValidator;
	}
	
	public ParserRule getUiXbaseValidatorRule() {
		return getUiXbaseValidatorAccess().getRule();
	}
	
	//UiBeanValidationValidator:
	//	{UiBeanValidationValidator}
	//	'BeanValidationValidator' name=ID?;
	public UiBeanValidationValidatorElements getUiBeanValidationValidatorAccess() {
		return pUiBeanValidationValidator;
	}
	
	public ParserRule getUiBeanValidationValidatorRule() {
		return getUiBeanValidationValidatorAccess().getRule();
	}
	
	//UiErrorCode:
	//	'code' name=ID defaultMessage=STRING?;
	public UiErrorCodeElements getUiErrorCodeAccess() {
		return pUiErrorCode;
	}
	
	public ParserRule getUiErrorCodeRule() {
		return getUiErrorCodeAccess().getRule();
	}
	
	//UiVisibilityProcessor:
	//	{UiVisibilityProcessor}
	//	'visibility' name=ID '{' (dataUsed+=UiBindingEndpointAlias
	//	| changeTriggers+=UiChangeTrigger
	//	| importedElements+=UiTypedBindableRawTypeAlias)*
	//	rule=UiXbaseVisibilityRule?
	//	'}';
	public UiVisibilityProcessorElements getUiVisibilityProcessorAccess() {
		return pUiVisibilityProcessor;
	}
	
	public ParserRule getUiVisibilityProcessorRule() {
		return getUiVisibilityProcessorAccess().getRule();
	}
	
	//UiXbaseVisibilityRule:
	//	expression=XBlockExpression;
	public UiXbaseVisibilityRuleElements getUiXbaseVisibilityRuleAccess() {
		return pUiXbaseVisibilityRule;
	}
	
	public ParserRule getUiXbaseVisibilityRuleRule() {
		return getUiXbaseVisibilityRuleAccess().getRule();
	}
	
	//UiChangeTrigger:
	//	'fireOn' endpoint=UiBindingEndpointAssignment 'as' alias=ID ';'?;
	public UiChangeTriggerElements getUiChangeTriggerAccess() {
		return pUiChangeTrigger;
	}
	
	public ParserRule getUiChangeTriggerRule() {
		return getUiChangeTriggerAccess().getRule();
	}
	
	//TRANSLATABLEID:
	//	ID;
	public TRANSLATABLEIDElements getTRANSLATABLEIDAccess() {
		return pTRANSLATABLEID;
	}
	
	public ParserRule getTRANSLATABLEIDRule() {
		return getTRANSLATABLEIDAccess().getRule();
	}
	
	//@ Override XImportDeclaration OXImportDeclaration:
	//	{OXImportDeclaration}
	//	'import' (static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
	//	(wildcard?='*' | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
	//	importedNamespace=QualifiedNameWithWildcard
	//	| fqnImport?='ns' importedFullyQualifiedName=QualifiedName) ';'?;
	public OXtypeGrammarAccess.XImportDeclarationElements getXImportDeclarationAccess() {
		return gaOXtype.getXImportDeclarationAccess();
	}
	
	public ParserRule getXImportDeclarationRule() {
		return getXImportDeclarationAccess().getRule();
	}
	
	//XAnnotation:
	//	{XAnnotation}
	//	'@' annotationType=[types::JvmAnnotationType|QualifiedName] (=> '(' (elementValuePairs+=XAnnotationElementValuePair
	//	(',' elementValuePairs+=XAnnotationElementValuePair)*
	//	| value=XAnnotationElementValueOrCommaList)?
	//	')')?;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElements getXAnnotationAccess() {
		return gaXbaseWithAnnotations.getXAnnotationAccess();
	}
	
	public ParserRule getXAnnotationRule() {
		return getXAnnotationAccess().getRule();
	}
	
	//XAnnotationElementValuePair:
	//	=> (element=[types::JvmOperation|ValidID] '=') value=XAnnotationElementValue;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValuePairElements getXAnnotationElementValuePairAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValuePairAccess();
	}
	
	public ParserRule getXAnnotationElementValuePairRule() {
		return getXAnnotationElementValuePairAccess().getRule();
	}
	
	//XAnnotationElementValueOrCommaList xbase::XExpression:
	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
	//	| XAnnotationOrExpression ({xbase::XListLiteral.elements+=current} (',' elements+=XAnnotationOrExpression)+)?;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueOrCommaListElements getXAnnotationElementValueOrCommaListAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValueOrCommaListAccess();
	}
	
	public ParserRule getXAnnotationElementValueOrCommaListRule() {
		return getXAnnotationElementValueOrCommaListAccess().getRule();
	}
	
	//XAnnotationElementValue xbase::XExpression:
	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
	//	| XAnnotationOrExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueElements getXAnnotationElementValueAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValueAccess();
	}
	
	public ParserRule getXAnnotationElementValueRule() {
		return getXAnnotationElementValueAccess().getRule();
	}
	
	//XAnnotationOrExpression xbase::XExpression:
	//	XAnnotation | XExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationOrExpressionElements getXAnnotationOrExpressionAccess() {
		return gaXbaseWithAnnotations.getXAnnotationOrExpressionAccess();
	}
	
	public ParserRule getXAnnotationOrExpressionRule() {
		return getXAnnotationOrExpressionAccess().getRule();
	}
	
	//XExpression:
	//	XAssignment;
	public XbaseGrammarAccess.XExpressionElements getXExpressionAccess() {
		return gaXbase.getXExpressionAccess();
	}
	
	public ParserRule getXExpressionRule() {
		return getXExpressionAccess().getRule();
	}
	
	//XAssignment XExpression:
	//	{XAssignment} feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign value=XAssignment | XOrExpression
	//	(=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMultiAssign])
	//	rightOperand=XAssignment)?;
	public XbaseGrammarAccess.XAssignmentElements getXAssignmentAccess() {
		return gaXbase.getXAssignmentAccess();
	}
	
	public ParserRule getXAssignmentRule() {
		return getXAssignmentAccess().getRule();
	}
	
	//OpSingleAssign:
	//	'=';
	public XbaseGrammarAccess.OpSingleAssignElements getOpSingleAssignAccess() {
		return gaXbase.getOpSingleAssignAccess();
	}
	
	public ParserRule getOpSingleAssignRule() {
		return getOpSingleAssignAccess().getRule();
	}
	
	//OpMultiAssign:
	//	'+=' | '-=' | '*=' | '/=' | '%=' |
	//	'<' '<' '=' |
	//	'>' '>'? '>=';
	public XbaseGrammarAccess.OpMultiAssignElements getOpMultiAssignAccess() {
		return gaXbase.getOpMultiAssignAccess();
	}
	
	public ParserRule getOpMultiAssignRule() {
		return getOpMultiAssignAccess().getRule();
	}
	
	//XOrExpression XExpression:
	//	XAndExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOr])
	//	rightOperand=XAndExpression)*;
	public XbaseGrammarAccess.XOrExpressionElements getXOrExpressionAccess() {
		return gaXbase.getXOrExpressionAccess();
	}
	
	public ParserRule getXOrExpressionRule() {
		return getXOrExpressionAccess().getRule();
	}
	
	//OpOr:
	//	'||';
	public XbaseGrammarAccess.OpOrElements getOpOrAccess() {
		return gaXbase.getOpOrAccess();
	}
	
	public ParserRule getOpOrRule() {
		return getOpOrAccess().getRule();
	}
	
	//XAndExpression XExpression:
	//	XEqualityExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAnd])
	//	rightOperand=XEqualityExpression)*;
	public XbaseGrammarAccess.XAndExpressionElements getXAndExpressionAccess() {
		return gaXbase.getXAndExpressionAccess();
	}
	
	public ParserRule getXAndExpressionRule() {
		return getXAndExpressionAccess().getRule();
	}
	
	//OpAnd:
	//	'&&';
	public XbaseGrammarAccess.OpAndElements getOpAndAccess() {
		return gaXbase.getOpAndAccess();
	}
	
	public ParserRule getOpAndRule() {
		return getOpAndAccess().getRule();
	}
	
	//XEqualityExpression XExpression:
	//	XRelationalExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpEquality])
	//	rightOperand=XRelationalExpression)*;
	public XbaseGrammarAccess.XEqualityExpressionElements getXEqualityExpressionAccess() {
		return gaXbase.getXEqualityExpressionAccess();
	}
	
	public ParserRule getXEqualityExpressionRule() {
		return getXEqualityExpressionAccess().getRule();
	}
	
	//OpEquality:
	//	'==' | '!=' | '===' | '!==';
	public XbaseGrammarAccess.OpEqualityElements getOpEqualityAccess() {
		return gaXbase.getOpEqualityAccess();
	}
	
	public ParserRule getOpEqualityRule() {
		return getOpEqualityAccess().getRule();
	}
	
	//XRelationalExpression XExpression:
	//	XOtherOperatorExpression (=> ({XInstanceOfExpression.expression=current} 'instanceof') type=JvmTypeReference |
	//	=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpCompare])
	//	rightOperand=XOtherOperatorExpression)*;
	public XbaseGrammarAccess.XRelationalExpressionElements getXRelationalExpressionAccess() {
		return gaXbase.getXRelationalExpressionAccess();
	}
	
	public ParserRule getXRelationalExpressionRule() {
		return getXRelationalExpressionAccess().getRule();
	}
	
	//OpCompare:
	//	'>=' | '<' '=' | '>' | '<';
	public XbaseGrammarAccess.OpCompareElements getOpCompareAccess() {
		return gaXbase.getOpCompareAccess();
	}
	
	public ParserRule getOpCompareRule() {
		return getOpCompareAccess().getRule();
	}
	
	//XOtherOperatorExpression XExpression:
	//	XAdditiveExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOther])
	//	rightOperand=XAdditiveExpression)*;
	public XbaseGrammarAccess.XOtherOperatorExpressionElements getXOtherOperatorExpressionAccess() {
		return gaXbase.getXOtherOperatorExpressionAccess();
	}
	
	public ParserRule getXOtherOperatorExpressionRule() {
		return getXOtherOperatorExpressionAccess().getRule();
	}
	
	//OpOther:
	//	'->'
	//	| '..<'
	//	| '>' '..'
	//	| '..'
	//	| '=>'
	//	| '>' (=> ('>' '>') | '>') | '<' (=> ('<' '<') | '<' | '=>') | '<>'
	//	| '?:';
	public XbaseGrammarAccess.OpOtherElements getOpOtherAccess() {
		return gaXbase.getOpOtherAccess();
	}
	
	public ParserRule getOpOtherRule() {
		return getOpOtherAccess().getRule();
	}
	
	//XAdditiveExpression XExpression:
	//	XMultiplicativeExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAdd])
	//	rightOperand=XMultiplicativeExpression)*;
	public XbaseGrammarAccess.XAdditiveExpressionElements getXAdditiveExpressionAccess() {
		return gaXbase.getXAdditiveExpressionAccess();
	}
	
	public ParserRule getXAdditiveExpressionRule() {
		return getXAdditiveExpressionAccess().getRule();
	}
	
	//OpAdd:
	//	'+' | '-';
	public XbaseGrammarAccess.OpAddElements getOpAddAccess() {
		return gaXbase.getOpAddAccess();
	}
	
	public ParserRule getOpAddRule() {
		return getOpAddAccess().getRule();
	}
	
	//XMultiplicativeExpression XExpression:
	//	XUnaryOperation (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMulti])
	//	rightOperand=XUnaryOperation)*;
	public XbaseGrammarAccess.XMultiplicativeExpressionElements getXMultiplicativeExpressionAccess() {
		return gaXbase.getXMultiplicativeExpressionAccess();
	}
	
	public ParserRule getXMultiplicativeExpressionRule() {
		return getXMultiplicativeExpressionAccess().getRule();
	}
	
	//OpMulti:
	//	'*' | '**' | '/' | '%';
	public XbaseGrammarAccess.OpMultiElements getOpMultiAccess() {
		return gaXbase.getOpMultiAccess();
	}
	
	public ParserRule getOpMultiRule() {
		return getOpMultiAccess().getRule();
	}
	
	//XUnaryOperation XExpression:
	//	{XUnaryOperation} feature=[types::JvmIdentifiableElement|OpUnary] operand=XUnaryOperation
	//	| XCastedExpression;
	public XbaseGrammarAccess.XUnaryOperationElements getXUnaryOperationAccess() {
		return gaXbase.getXUnaryOperationAccess();
	}
	
	public ParserRule getXUnaryOperationRule() {
		return getXUnaryOperationAccess().getRule();
	}
	
	//OpUnary:
	//	"!" | "-" | "+";
	public XbaseGrammarAccess.OpUnaryElements getOpUnaryAccess() {
		return gaXbase.getOpUnaryAccess();
	}
	
	public ParserRule getOpUnaryRule() {
		return getOpUnaryAccess().getRule();
	}
	
	//XCastedExpression XExpression:
	//	XPostfixOperation (=> ({XCastedExpression.target=current} 'as') type=JvmTypeReference)*;
	public XbaseGrammarAccess.XCastedExpressionElements getXCastedExpressionAccess() {
		return gaXbase.getXCastedExpressionAccess();
	}
	
	public ParserRule getXCastedExpressionRule() {
		return getXCastedExpressionAccess().getRule();
	}
	
	//XPostfixOperation XExpression:
	//	XMemberFeatureCall => ({XPostfixOperation.operand=current} feature=[types::JvmIdentifiableElement|OpPostfix])?;
	public XbaseGrammarAccess.XPostfixOperationElements getXPostfixOperationAccess() {
		return gaXbase.getXPostfixOperationAccess();
	}
	
	public ParserRule getXPostfixOperationRule() {
		return getXPostfixOperationAccess().getRule();
	}
	
	//OpPostfix:
	//	"++" | "--";
	public XbaseGrammarAccess.OpPostfixElements getOpPostfixAccess() {
		return gaXbase.getOpPostfixAccess();
	}
	
	public ParserRule getOpPostfixRule() {
		return getOpPostfixAccess().getRule();
	}
	
	//XMemberFeatureCall XExpression:
	//	XPrimaryExpression (=> ({XAssignment.assignable=current} ('.' | explicitStatic?="::")
	//	feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign) value=XAssignment
	//	| => ({XMemberFeatureCall.memberCallTarget=current} ("." | nullSafe?="?." | explicitStatic?="::")) ('<'
	//	typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (memberCallArguments+=XShortClosure
	//	| memberCallArguments+=XExpression (',' memberCallArguments+=XExpression)*)?
	//	')')?
	//	memberCallArguments+=XClosure?)*;
	public XbaseGrammarAccess.XMemberFeatureCallElements getXMemberFeatureCallAccess() {
		return gaXbase.getXMemberFeatureCallAccess();
	}
	
	public ParserRule getXMemberFeatureCallRule() {
		return getXMemberFeatureCallAccess().getRule();
	}
	
	//XPrimaryExpression XExpression:
	//	XConstructorCall | XBlockExpression | XSwitchExpression | XSynchronizedExpression | XFeatureCall | XLiteral |
	//	XIfExpression | XForLoopExpression | XBasicForLoopExpression | XWhileExpression | XDoWhileExpression |
	//	XThrowExpression | XReturnExpression | XTryCatchFinallyExpression | XParenthesizedExpression;
	public XbaseGrammarAccess.XPrimaryExpressionElements getXPrimaryExpressionAccess() {
		return gaXbase.getXPrimaryExpressionAccess();
	}
	
	public ParserRule getXPrimaryExpressionRule() {
		return getXPrimaryExpressionAccess().getRule();
	}
	
	//XLiteral XExpression:
	//	XCollectionLiteral | XClosure | XBooleanLiteral | XNumberLiteral | XNullLiteral | XStringLiteral | XTypeLiteral;
	public XbaseGrammarAccess.XLiteralElements getXLiteralAccess() {
		return gaXbase.getXLiteralAccess();
	}
	
	public ParserRule getXLiteralRule() {
		return getXLiteralAccess().getRule();
	}
	
	//XCollectionLiteral:
	//	XSetLiteral | XListLiteral;
	public XbaseGrammarAccess.XCollectionLiteralElements getXCollectionLiteralAccess() {
		return gaXbase.getXCollectionLiteralAccess();
	}
	
	public ParserRule getXCollectionLiteralRule() {
		return getXCollectionLiteralAccess().getRule();
	}
	
	//XSetLiteral:
	//	{XSetLiteral} '#' '{' (elements+=XExpression (',' elements+=XExpression)*)? '}';
	public XbaseGrammarAccess.XSetLiteralElements getXSetLiteralAccess() {
		return gaXbase.getXSetLiteralAccess();
	}
	
	public ParserRule getXSetLiteralRule() {
		return getXSetLiteralAccess().getRule();
	}
	
	//XListLiteral:
	//	{XListLiteral} '#' '[' (elements+=XExpression (',' elements+=XExpression)*)? ']';
	public XbaseGrammarAccess.XListLiteralElements getXListLiteralAccess() {
		return gaXbase.getXListLiteralAccess();
	}
	
	public ParserRule getXListLiteralRule() {
		return getXListLiteralAccess().getRule();
	}
	
	//XClosure XExpression:
	//	=> ({XClosure}
	//	'[')
	//	=> ((declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
	//	explicitSyntax?='|')?
	//	expression=XExpressionInClosure
	//	']';
	public XbaseGrammarAccess.XClosureElements getXClosureAccess() {
		return gaXbase.getXClosureAccess();
	}
	
	public ParserRule getXClosureRule() {
		return getXClosureAccess().getRule();
	}
	
	//XExpressionInClosure XExpression:
	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ';'?)*;
	public XbaseGrammarAccess.XExpressionInClosureElements getXExpressionInClosureAccess() {
		return gaXbase.getXExpressionInClosureAccess();
	}
	
	public ParserRule getXExpressionInClosureRule() {
		return getXExpressionInClosureAccess().getRule();
	}
	
	//XShortClosure XExpression:
	//	=> ({XClosure} (declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
	//	explicitSyntax?='|') expression=XExpression;
	public XbaseGrammarAccess.XShortClosureElements getXShortClosureAccess() {
		return gaXbase.getXShortClosureAccess();
	}
	
	public ParserRule getXShortClosureRule() {
		return getXShortClosureAccess().getRule();
	}
	
	//XParenthesizedExpression XExpression:
	//	'(' XExpression ')';
	public XbaseGrammarAccess.XParenthesizedExpressionElements getXParenthesizedExpressionAccess() {
		return gaXbase.getXParenthesizedExpressionAccess();
	}
	
	public ParserRule getXParenthesizedExpressionRule() {
		return getXParenthesizedExpressionAccess().getRule();
	}
	
	//XIfExpression XExpression:
	//	{XIfExpression}
	//	'if' '(' if=XExpression ')'
	//	then=XExpression (=> 'else' else=XExpression)?;
	public XbaseGrammarAccess.XIfExpressionElements getXIfExpressionAccess() {
		return gaXbase.getXIfExpressionAccess();
	}
	
	public ParserRule getXIfExpressionRule() {
		return getXIfExpressionAccess().getRule();
	}
	
	//XSwitchExpression XExpression:
	//	{XSwitchExpression}
	//	'switch' (=> ('(' declaredParam=JvmFormalParameter ':') switch=XExpression ')'
	//	| => (declaredParam=JvmFormalParameter ':')? switch=XExpression) '{'
	//	cases+=XCasePart* ('default' ':' default=XExpression)?
	//	'}';
	public XbaseGrammarAccess.XSwitchExpressionElements getXSwitchExpressionAccess() {
		return gaXbase.getXSwitchExpressionAccess();
	}
	
	public ParserRule getXSwitchExpressionRule() {
		return getXSwitchExpressionAccess().getRule();
	}
	
	//XCasePart:
	//	{XCasePart} typeGuard=JvmTypeReference? ('case' case=XExpression)? (':' then=XExpression | fallThrough?=',');
	public XbaseGrammarAccess.XCasePartElements getXCasePartAccess() {
		return gaXbase.getXCasePartAccess();
	}
	
	public ParserRule getXCasePartRule() {
		return getXCasePartAccess().getRule();
	}
	
	//XForLoopExpression XExpression:
	//	=> ({XForLoopExpression}
	//	'for' '(' declaredParam=JvmFormalParameter ':') forExpression=XExpression ')'
	//	eachExpression=XExpression;
	public XbaseGrammarAccess.XForLoopExpressionElements getXForLoopExpressionAccess() {
		return gaXbase.getXForLoopExpressionAccess();
	}
	
	public ParserRule getXForLoopExpressionRule() {
		return getXForLoopExpressionAccess().getRule();
	}
	
	//XBasicForLoopExpression XExpression:
	//	{XBasicForLoopExpression}
	//	'for' '(' (initExpressions+=XExpressionOrVarDeclaration (',' initExpressions+=XExpressionOrVarDeclaration)*)? ';'
	//	expression=XExpression? ';' (updateExpressions+=XExpression (',' updateExpressions+=XExpression)*)? ')'
	//	eachExpression=XExpression;
	public XbaseGrammarAccess.XBasicForLoopExpressionElements getXBasicForLoopExpressionAccess() {
		return gaXbase.getXBasicForLoopExpressionAccess();
	}
	
	public ParserRule getXBasicForLoopExpressionRule() {
		return getXBasicForLoopExpressionAccess().getRule();
	}
	
	//XWhileExpression XExpression:
	//	{XWhileExpression}
	//	'while' '(' predicate=XExpression ')'
	//	body=XExpression;
	public XbaseGrammarAccess.XWhileExpressionElements getXWhileExpressionAccess() {
		return gaXbase.getXWhileExpressionAccess();
	}
	
	public ParserRule getXWhileExpressionRule() {
		return getXWhileExpressionAccess().getRule();
	}
	
	//XDoWhileExpression XExpression:
	//	{XDoWhileExpression}
	//	'do'
	//	body=XExpression
	//	'while' '(' predicate=XExpression ')';
	public XbaseGrammarAccess.XDoWhileExpressionElements getXDoWhileExpressionAccess() {
		return gaXbase.getXDoWhileExpressionAccess();
	}
	
	public ParserRule getXDoWhileExpressionRule() {
		return getXDoWhileExpressionAccess().getRule();
	}
	
	//XBlockExpression XExpression:
	//	{XBlockExpression}
	//	'{' (expressions+=XExpressionOrVarDeclaration ';'?)*
	//	'}';
	public XbaseGrammarAccess.XBlockExpressionElements getXBlockExpressionAccess() {
		return gaXbase.getXBlockExpressionAccess();
	}
	
	public ParserRule getXBlockExpressionRule() {
		return getXBlockExpressionAccess().getRule();
	}
	
	//XExpressionOrVarDeclaration XExpression:
	//	XVariableDeclaration | XExpression;
	public XbaseGrammarAccess.XExpressionOrVarDeclarationElements getXExpressionOrVarDeclarationAccess() {
		return gaXbase.getXExpressionOrVarDeclarationAccess();
	}
	
	public ParserRule getXExpressionOrVarDeclarationRule() {
		return getXExpressionOrVarDeclarationAccess().getRule();
	}
	
	//XVariableDeclaration XExpression:
	//	{XVariableDeclaration} (writeable?='var' | 'val') (=> (type=JvmTypeReference name=ValidID) | name=ValidID) ('='
	//	right=XExpression)?;
	public XbaseGrammarAccess.XVariableDeclarationElements getXVariableDeclarationAccess() {
		return gaXbase.getXVariableDeclarationAccess();
	}
	
	public ParserRule getXVariableDeclarationRule() {
		return getXVariableDeclarationAccess().getRule();
	}
	
	//JvmFormalParameter types::JvmFormalParameter:
	//	parameterType=JvmTypeReference? name=ValidID;
	public XbaseGrammarAccess.JvmFormalParameterElements getJvmFormalParameterAccess() {
		return gaXbase.getJvmFormalParameterAccess();
	}
	
	public ParserRule getJvmFormalParameterRule() {
		return getJvmFormalParameterAccess().getRule();
	}
	
	//FullJvmFormalParameter types::JvmFormalParameter:
	//	parameterType=JvmTypeReference name=ValidID;
	public XbaseGrammarAccess.FullJvmFormalParameterElements getFullJvmFormalParameterAccess() {
		return gaXbase.getFullJvmFormalParameterAccess();
	}
	
	public ParserRule getFullJvmFormalParameterRule() {
		return getFullJvmFormalParameterAccess().getRule();
	}
	
	//XFeatureCall XExpression:
	//	{XFeatureCall} ('<' typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (featureCallArguments+=XShortClosure
	//	| featureCallArguments+=XExpression (',' featureCallArguments+=XExpression)*)?
	//	')')?
	//	featureCallArguments+=XClosure?;
	public XbaseGrammarAccess.XFeatureCallElements getXFeatureCallAccess() {
		return gaXbase.getXFeatureCallAccess();
	}
	
	public ParserRule getXFeatureCallRule() {
		return getXFeatureCallAccess().getRule();
	}
	
	//FeatureCallID:
	//	ValidID | 'extends' | 'static' | 'import' | 'extension';
	public XbaseGrammarAccess.FeatureCallIDElements getFeatureCallIDAccess() {
		return gaXbase.getFeatureCallIDAccess();
	}
	
	public ParserRule getFeatureCallIDRule() {
		return getFeatureCallIDAccess().getRule();
	}
	
	//IdOrSuper:
	//	FeatureCallID | 'super';
	public XbaseGrammarAccess.IdOrSuperElements getIdOrSuperAccess() {
		return gaXbase.getIdOrSuperAccess();
	}
	
	public ParserRule getIdOrSuperRule() {
		return getIdOrSuperAccess().getRule();
	}
	
	//XConstructorCall XExpression:
	//	{XConstructorCall}
	//	'new' constructor=[types::JvmConstructor|QualifiedName] (=> '<' typeArguments+=JvmArgumentTypeReference (','
	//	typeArguments+=JvmArgumentTypeReference)* '>')? (=> explicitConstructorCall?='(' (arguments+=XShortClosure
	//	| arguments+=XExpression (',' arguments+=XExpression)*)?
	//	')')?
	//	arguments+=XClosure?;
	public XbaseGrammarAccess.XConstructorCallElements getXConstructorCallAccess() {
		return gaXbase.getXConstructorCallAccess();
	}
	
	public ParserRule getXConstructorCallRule() {
		return getXConstructorCallAccess().getRule();
	}
	
	//XBooleanLiteral XExpression:
	//	{XBooleanLiteral} ('false' | isTrue?='true');
	public XbaseGrammarAccess.XBooleanLiteralElements getXBooleanLiteralAccess() {
		return gaXbase.getXBooleanLiteralAccess();
	}
	
	public ParserRule getXBooleanLiteralRule() {
		return getXBooleanLiteralAccess().getRule();
	}
	
	//XNullLiteral XExpression:
	//	{XNullLiteral} 'null';
	public XbaseGrammarAccess.XNullLiteralElements getXNullLiteralAccess() {
		return gaXbase.getXNullLiteralAccess();
	}
	
	public ParserRule getXNullLiteralRule() {
		return getXNullLiteralAccess().getRule();
	}
	
	//XNumberLiteral XExpression:
	//	{XNumberLiteral} value=Number;
	public XbaseGrammarAccess.XNumberLiteralElements getXNumberLiteralAccess() {
		return gaXbase.getXNumberLiteralAccess();
	}
	
	public ParserRule getXNumberLiteralRule() {
		return getXNumberLiteralAccess().getRule();
	}
	
	//XStringLiteral XExpression:
	//	{XStringLiteral} value=STRING;
	public XbaseGrammarAccess.XStringLiteralElements getXStringLiteralAccess() {
		return gaXbase.getXStringLiteralAccess();
	}
	
	public ParserRule getXStringLiteralRule() {
		return getXStringLiteralAccess().getRule();
	}
	
	//XTypeLiteral XExpression:
	//	{XTypeLiteral} 'typeof' '(' type=[types::JvmType|QualifiedName] arrayDimensions+=ArrayBrackets* ')';
	public XbaseGrammarAccess.XTypeLiteralElements getXTypeLiteralAccess() {
		return gaXbase.getXTypeLiteralAccess();
	}
	
	public ParserRule getXTypeLiteralRule() {
		return getXTypeLiteralAccess().getRule();
	}
	
	//XThrowExpression XExpression:
	//	{XThrowExpression} 'throw' expression=XExpression;
	public XbaseGrammarAccess.XThrowExpressionElements getXThrowExpressionAccess() {
		return gaXbase.getXThrowExpressionAccess();
	}
	
	public ParserRule getXThrowExpressionRule() {
		return getXThrowExpressionAccess().getRule();
	}
	
	//XReturnExpression XExpression:
	//	{XReturnExpression} 'return' -> expression=XExpression?;
	public XbaseGrammarAccess.XReturnExpressionElements getXReturnExpressionAccess() {
		return gaXbase.getXReturnExpressionAccess();
	}
	
	public ParserRule getXReturnExpressionRule() {
		return getXReturnExpressionAccess().getRule();
	}
	
	//XTryCatchFinallyExpression XExpression:
	//	{XTryCatchFinallyExpression}
	//	'try'
	//	expression=XExpression (catchClauses+=XCatchClause+ (=> 'finally' finallyExpression=XExpression)?
	//	| 'finally' finallyExpression=XExpression);
	public XbaseGrammarAccess.XTryCatchFinallyExpressionElements getXTryCatchFinallyExpressionAccess() {
		return gaXbase.getXTryCatchFinallyExpressionAccess();
	}
	
	public ParserRule getXTryCatchFinallyExpressionRule() {
		return getXTryCatchFinallyExpressionAccess().getRule();
	}
	
	//XSynchronizedExpression XExpression:
	//	=> ({XSynchronizedExpression}
	//	'synchronized' '(') param=XExpression ')' expression=XExpression;
	public XbaseGrammarAccess.XSynchronizedExpressionElements getXSynchronizedExpressionAccess() {
		return gaXbase.getXSynchronizedExpressionAccess();
	}
	
	public ParserRule getXSynchronizedExpressionRule() {
		return getXSynchronizedExpressionAccess().getRule();
	}
	
	//XCatchClause:
	//	=> 'catch' '(' declaredParam=FullJvmFormalParameter ')' expression=XExpression;
	public XbaseGrammarAccess.XCatchClauseElements getXCatchClauseAccess() {
		return gaXbase.getXCatchClauseAccess();
	}
	
	public ParserRule getXCatchClauseRule() {
		return getXCatchClauseAccess().getRule();
	}
	
	//QualifiedName:
	//	ValidID (=> '.' ValidID)*;
	public XbaseGrammarAccess.QualifiedNameElements getQualifiedNameAccess() {
		return gaXbase.getQualifiedNameAccess();
	}
	
	public ParserRule getQualifiedNameRule() {
		return getQualifiedNameAccess().getRule();
	}
	
	//Number hidden():
	//	HEX | (INT | DECIMAL) ('.' (INT | DECIMAL))?;
	public XbaseGrammarAccess.NumberElements getNumberAccess() {
		return gaXbase.getNumberAccess();
	}
	
	public ParserRule getNumberRule() {
		return getNumberAccess().getRule();
	}
	
	///**
	// * Dummy rule, for "better" downwards compatibility, since GrammarAccess generates non-static inner classes, 
	// * which makes downstream grammars break on classloading, when a rule is removed.
	// */ StaticQualifier:
	//	(ValidID '::')+;
	public XbaseGrammarAccess.StaticQualifierElements getStaticQualifierAccess() {
		return gaXbase.getStaticQualifierAccess();
	}
	
	public ParserRule getStaticQualifierRule() {
		return getStaticQualifierAccess().getRule();
	}
	
	//terminal HEX:
	//	('0x' | '0X') ('0'..'9' | 'a'..'f' | 'A'..'F' | '_')+ ('#' (('b' | 'B') ('i' | 'I') | ('l' | 'L')))?;
	public TerminalRule getHEXRule() {
		return gaXbase.getHEXRule();
	}
	
	//terminal INT returns ecore::EInt:
	//	'0'..'9' ('0'..'9' | '_')*;
	public TerminalRule getINTRule() {
		return gaXbase.getINTRule();
	}
	
	//terminal DECIMAL:
	//	INT (('e' | 'E') ('+' | '-')? INT)? (('b' | 'B') ('i' | 'I' | 'd' | 'D') | ('l' | 'L' | 'd' | 'D' | 'f' | 'F'))?;
	public TerminalRule getDECIMALRule() {
		return gaXbase.getDECIMALRule();
	}
	
	//JvmTypeReference:
	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)*
	//	| XFunctionTypeRef;
	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
		return gaXtype.getJvmTypeReferenceAccess();
	}
	
	public ParserRule getJvmTypeReferenceRule() {
		return getJvmTypeReferenceAccess().getRule();
	}
	
	//ArrayBrackets:
	//	'[' ']';
	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
		return gaXtype.getArrayBracketsAccess();
	}
	
	public ParserRule getArrayBracketsRule() {
		return getArrayBracketsAccess().getRule();
	}
	
	//XFunctionTypeRef:
	//	('(' (paramTypes+=JvmTypeReference (',' paramTypes+=JvmTypeReference)*)? ')')? '=>' returnType=JvmTypeReference;
	public XtypeGrammarAccess.XFunctionTypeRefElements getXFunctionTypeRefAccess() {
		return gaXtype.getXFunctionTypeRefAccess();
	}
	
	public ParserRule getXFunctionTypeRefRule() {
		return getXFunctionTypeRefAccess().getRule();
	}
	
	//JvmParameterizedTypeReference:
	//	type=[JvmType|super::QualifiedName] (=> '<' arguments+=JvmArgumentTypeReference (','
	//	arguments+=JvmArgumentTypeReference)* '>' (=> ({JvmInnerTypeReference.outer=current} '.') type=[JvmType|ValidID] (=>
	//	'<' arguments+=JvmArgumentTypeReference (',' arguments+=JvmArgumentTypeReference)* '>')?)*)?;
	public XtypeGrammarAccess.JvmParameterizedTypeReferenceElements getJvmParameterizedTypeReferenceAccess() {
		return gaXtype.getJvmParameterizedTypeReferenceAccess();
	}
	
	public ParserRule getJvmParameterizedTypeReferenceRule() {
		return getJvmParameterizedTypeReferenceAccess().getRule();
	}
	
	//JvmArgumentTypeReference JvmTypeReference:
	//	JvmTypeReference | JvmWildcardTypeReference;
	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
		return gaXtype.getJvmArgumentTypeReferenceAccess();
	}
	
	public ParserRule getJvmArgumentTypeReferenceRule() {
		return getJvmArgumentTypeReferenceAccess().getRule();
	}
	
	//JvmWildcardTypeReference:
	//	{JvmWildcardTypeReference} '?' (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*
	//	| constraints+=JvmLowerBound constraints+=JvmLowerBoundAnded*)?;
	public XtypeGrammarAccess.JvmWildcardTypeReferenceElements getJvmWildcardTypeReferenceAccess() {
		return gaXtype.getJvmWildcardTypeReferenceAccess();
	}
	
	public ParserRule getJvmWildcardTypeReferenceRule() {
		return getJvmWildcardTypeReferenceAccess().getRule();
	}
	
	//JvmUpperBound:
	//	'extends' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
		return gaXtype.getJvmUpperBoundAccess();
	}
	
	public ParserRule getJvmUpperBoundRule() {
		return getJvmUpperBoundAccess().getRule();
	}
	
	//JvmUpperBoundAnded JvmUpperBound:
	//	'&' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
		return gaXtype.getJvmUpperBoundAndedAccess();
	}
	
	public ParserRule getJvmUpperBoundAndedRule() {
		return getJvmUpperBoundAndedAccess().getRule();
	}
	
	//JvmLowerBound:
	//	'super' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
		return gaXtype.getJvmLowerBoundAccess();
	}
	
	public ParserRule getJvmLowerBoundRule() {
		return getJvmLowerBoundAccess().getRule();
	}
	
	//JvmLowerBoundAnded JvmLowerBound:
	//	'&' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
		return gaXtype.getJvmLowerBoundAndedAccess();
	}
	
	public ParserRule getJvmLowerBoundAndedRule() {
		return getJvmLowerBoundAndedAccess().getRule();
	}
	
	//JvmTypeParameter:
	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
		return gaXtype.getJvmTypeParameterAccess();
	}
	
	public ParserRule getJvmTypeParameterRule() {
		return getJvmTypeParameterAccess().getRule();
	}
	
	//QualifiedNameWithWildcard:
	//	super::QualifiedName '.' '*';
	public XtypeGrammarAccess.QualifiedNameWithWildcardElements getQualifiedNameWithWildcardAccess() {
		return gaXtype.getQualifiedNameWithWildcardAccess();
	}
	
	public ParserRule getQualifiedNameWithWildcardRule() {
		return getQualifiedNameWithWildcardAccess().getRule();
	}
	
	//ValidID:
	//	ID;
	public XtypeGrammarAccess.ValidIDElements getValidIDAccess() {
		return gaXtype.getValidIDAccess();
	}
	
	public ParserRule getValidIDRule() {
		return getValidIDAccess().getRule();
	}
	
	//XImportSection:
	//	importDeclarations+=super::XImportDeclaration+;
	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
		return gaXtype.getXImportSectionAccess();
	}
	
	public ParserRule getXImportSectionRule() {
		return getXImportSectionAccess().getRule();
	}
	
	//QualifiedNameInStaticImport:
	//	(ValidID '.')+;
	public XtypeGrammarAccess.QualifiedNameInStaticImportElements getQualifiedNameInStaticImportAccess() {
		return gaXtype.getQualifiedNameInStaticImportAccess();
	}
	
	public ParserRule getQualifiedNameInStaticImportRule() {
		return getQualifiedNameInStaticImportAccess().getRule();
	}
	
	//terminal ID:
	//	'^'? ('a'..'z' | 'A'..'Z' | '$' | '_') ('a'..'z' | 'A'..'Z' | '$' | '_' | '0'..'9')*;
	public TerminalRule getIDRule() {
		return gaXtype.getIDRule();
	}
	
	//terminal STRING:
	//	'"' ('\\' . | !('\\' | '"'))* '"'? |
	//	"'" ('\\' . | !('\\' | "'"))* "'"?;
	public TerminalRule getSTRINGRule() {
		return gaXtype.getSTRINGRule();
	}
	
	//terminal ML_COMMENT:
	//	'/*'->'*/';
	public TerminalRule getML_COMMENTRule() {
		return gaXtype.getML_COMMENTRule();
	}
	
	//terminal SL_COMMENT:
	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
	public TerminalRule getSL_COMMENTRule() {
		return gaXtype.getSL_COMMENTRule();
	}
	
	//terminal WS:
	//	' ' | '\t' | '\r' | '\n'+;
	public TerminalRule getWSRule() {
		return gaXtype.getWSRule();
	}
	
	//terminal ANY_OTHER:
	//	.;
	public TerminalRule getANY_OTHERRule() {
		return gaXtype.getANY_OTHERRule();
	}
}
