/**
 * Copyright (c) 2014,2016 Loetz GmbH&Co.KG (Heidelberg)
 *  All rights reserved. This program and the accompanying materials 
 *  are made available under the terms of the Eclipse Public License v1.0 
 *  which accompanies this distribution, and is available at 
 *  http{//www.eclipse.org/legal/epl-v10.html 
 * 
 *  Contributors:  
 *  		Loetz GmbH&Co.KG - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.menu;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;

import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;

/**
 * <!-- begin-user-doc -->
 * The <b>Package</b> for the model.
 * It contains accessors for the meta objects to represent
 * <ul>
 *   <li>each class,</li>
 *   <li>each feature of each class,</li>
 *   <li>each operation of each class,</li>
 *   <li>each enum,</li>
 *   <li>and each data type</li>
 * </ul>
 * <!-- end-user-doc -->
 * @see org.eclipse.osbp.xtext.menu.MenuDslFactory
 * @model kind="package"
 *        annotation="http://www.eclipse.org/emf/2002/GenModel fileExtensions='menu' modelName='MenuDsl' prefix='MenuDsl' updateClasspath='false' loadInitialization='false' literalsInterface='true' copyrightText='Copyright (c) 2014,2016 Loetz GmbH&Co.KG (Heidelberg)\r\n All rights reserved. This program and the accompanying materials \r\n are made available under the terms of the Eclipse Public License v1.0 \r\n which accompanies this distribution, and is available at \r\n http{//www.eclipse.org/legal/epl-v10.html \r\n\r\n Contributors:  \r\n \t\tLoetz GmbH&Co.KG - Initial implementation \r\n ' basePackage='org.eclipse.osbp.xtext'"
 *        annotation="http://www.eclipse.org/emf/2002/Ecore rootPackage='menudsl'"
 * @generated
 */
public interface MenuDslPackage extends EPackage {
	/**
	 * The package name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNAME = "menu";

	/**
	 * The package namespace URI.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNS_URI = "http://osbp.eclipse.org/xtext/menu/MenuDsl";

	/**
	 * The package namespace name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNS_PREFIX = "menudsl";

	/**
	 * The singleton instance of the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	MenuDslPackage eINSTANCE = org.eclipse.osbp.xtext.menu.impl.MenuDslPackageImpl.init();

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.menu.impl.MenuModelImpl <em>Menu Model</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.menu.impl.MenuModelImpl
	 * @see org.eclipse.osbp.xtext.menu.impl.MenuDslPackageImpl#getMenuModel()
	 * @generated
	 */
	int MENU_MODEL = 0;

	/**
	 * The feature id for the '<em><b>Import Section</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_MODEL__IMPORT_SECTION = 0;

	/**
	 * The feature id for the '<em><b>Packages</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_MODEL__PACKAGES = 1;

	/**
	 * The number of structural features of the '<em>Menu Model</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_MODEL_FEATURE_COUNT = 2;

	/**
	 * The number of operations of the '<em>Menu Model</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_MODEL_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.menu.impl.MenuLazyResolverImpl <em>Menu Lazy Resolver</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.menu.impl.MenuLazyResolverImpl
	 * @see org.eclipse.osbp.xtext.menu.impl.MenuDslPackageImpl#getMenuLazyResolver()
	 * @generated
	 */
	int MENU_LAZY_RESOLVER = 1;

	/**
	 * The number of structural features of the '<em>Menu Lazy Resolver</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_LAZY_RESOLVER_FEATURE_COUNT = 0;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT = 0;

	/**
	 * The number of operations of the '<em>Menu Lazy Resolver</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_LAZY_RESOLVER_OPERATION_COUNT = 1;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.menu.impl.MenuPackageImpl <em>Menu Package</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.menu.impl.MenuPackageImpl
	 * @see org.eclipse.osbp.xtext.menu.impl.MenuDslPackageImpl#getMenuPackage()
	 * @generated
	 */
	int MENU_PACKAGE = 2;

	/**
	 * The feature id for the '<em><b>Name</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_PACKAGE__NAME = OSBPTypesPackage.LPACKAGE__NAME;

	/**
	 * The feature id for the '<em><b>Entries</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_PACKAGE__ENTRIES = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Sub Menu Is Accordion</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_PACKAGE__SUB_MENU_IS_ACCORDION = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Expanded Image</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_PACKAGE__EXPANDED_IMAGE = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 2;

	/**
	 * The feature id for the '<em><b>Collapsed Image</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_PACKAGE__COLLAPSED_IMAGE = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 3;

	/**
	 * The feature id for the '<em><b>Width</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_PACKAGE__WIDTH = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 4;

	/**
	 * The feature id for the '<em><b>Height</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_PACKAGE__HEIGHT = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 5;

	/**
	 * The feature id for the '<em><b>Has Designer</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_PACKAGE__HAS_DESIGNER = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 6;

	/**
	 * The number of structural features of the '<em>Menu Package</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_PACKAGE_FEATURE_COUNT = OSBPTypesPackage.LPACKAGE_FEATURE_COUNT + 7;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_PACKAGE___ERESOLVE_PROXY__INTERNALEOBJECT = OSBPTypesPackage.LPACKAGE___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Menu Package</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_PACKAGE_OPERATION_COUNT = OSBPTypesPackage.LPACKAGE_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.osbp.xtext.menu.impl.MenuEntryImpl <em>Menu Entry</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.osbp.xtext.menu.impl.MenuEntryImpl
	 * @see org.eclipse.osbp.xtext.menu.impl.MenuDslPackageImpl#getMenuEntry()
	 * @generated
	 */
	int MENU_ENTRY = 3;

	/**
	 * The feature id for the '<em><b>Entryid</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__ENTRYID = MENU_LAZY_RESOLVER_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Has Image</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__HAS_IMAGE = MENU_LAZY_RESOLVER_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Image</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__IMAGE = MENU_LAZY_RESOLVER_FEATURE_COUNT + 2;

	/**
	 * The feature id for the '<em><b>Description</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__DESCRIPTION = MENU_LAZY_RESOLVER_FEATURE_COUNT + 3;

	/**
	 * The feature id for the '<em><b>Description Value</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__DESCRIPTION_VALUE = MENU_LAZY_RESOLVER_FEATURE_COUNT + 4;

	/**
	 * The feature id for the '<em><b>Subentries</b></em>' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__SUBENTRIES = MENU_LAZY_RESOLVER_FEATURE_COUNT + 5;

	/**
	 * The feature id for the '<em><b>Has Process</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__HAS_PROCESS = MENU_LAZY_RESOLVER_FEATURE_COUNT + 6;

	/**
	 * The feature id for the '<em><b>Process</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__PROCESS = MENU_LAZY_RESOLVER_FEATURE_COUNT + 7;

	/**
	 * The feature id for the '<em><b>Has Perspective</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__HAS_PERSPECTIVE = MENU_LAZY_RESOLVER_FEATURE_COUNT + 8;

	/**
	 * The feature id for the '<em><b>Perspective</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__PERSPECTIVE = MENU_LAZY_RESOLVER_FEATURE_COUNT + 9;

	/**
	 * The feature id for the '<em><b>Show Badge</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__SHOW_BADGE = MENU_LAZY_RESOLVER_FEATURE_COUNT + 10;

	/**
	 * The feature id for the '<em><b>Has Table</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__HAS_TABLE = MENU_LAZY_RESOLVER_FEATURE_COUNT + 11;

	/**
	 * The feature id for the '<em><b>Table</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__TABLE = MENU_LAZY_RESOLVER_FEATURE_COUNT + 12;

	/**
	 * The feature id for the '<em><b>Has Dialog</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__HAS_DIALOG = MENU_LAZY_RESOLVER_FEATURE_COUNT + 13;

	/**
	 * The feature id for the '<em><b>Dialog</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__DIALOG = MENU_LAZY_RESOLVER_FEATURE_COUNT + 14;

	/**
	 * The feature id for the '<em><b>Has User Filter</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__HAS_USER_FILTER = MENU_LAZY_RESOLVER_FEATURE_COUNT + 15;

	/**
	 * The feature id for the '<em><b>Has Key Binding</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY__HAS_KEY_BINDING = MENU_LAZY_RESOLVER_FEATURE_COUNT + 16;

	/**
	 * The number of structural features of the '<em>Menu Entry</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY_FEATURE_COUNT = MENU_LAZY_RESOLVER_FEATURE_COUNT + 17;

	/**
	 * The operation id for the '<em>EResolve Proxy</em>' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY___ERESOLVE_PROXY__INTERNALEOBJECT = MENU_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;

	/**
	 * The number of operations of the '<em>Menu Entry</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MENU_ENTRY_OPERATION_COUNT = MENU_LAZY_RESOLVER_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '<em>Internal EObject</em>' data type.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.InternalEObject
	 * @see org.eclipse.osbp.xtext.menu.impl.MenuDslPackageImpl#getInternalEObject()
	 * @generated
	 */
	int INTERNAL_EOBJECT = 4;


	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.menu.MenuModel <em>Menu Model</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Menu Model</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuModel
	 * @generated
	 */
	EClass getMenuModel();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.menu.MenuModel#getImportSection <em>Import Section</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Import Section</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuModel#getImportSection()
	 * @see #getMenuModel()
	 * @generated
	 */
	EReference getMenuModel_ImportSection();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.menu.MenuModel#getPackages <em>Packages</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Packages</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuModel#getPackages()
	 * @see #getMenuModel()
	 * @generated
	 */
	EReference getMenuModel_Packages();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.menu.MenuLazyResolver <em>Menu Lazy Resolver</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Menu Lazy Resolver</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuLazyResolver
	 * @generated
	 */
	EClass getMenuLazyResolver();

	/**
	 * Returns the meta object for the '{@link org.eclipse.osbp.xtext.menu.MenuLazyResolver#eResolveProxy(org.eclipse.emf.ecore.InternalEObject) <em>EResolve Proxy</em>}' operation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the '<em>EResolve Proxy</em>' operation.
	 * @see org.eclipse.osbp.xtext.menu.MenuLazyResolver#eResolveProxy(org.eclipse.emf.ecore.InternalEObject)
	 * @generated
	 */
	EOperation getMenuLazyResolver__EResolveProxy__InternalEObject();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.menu.MenuPackage <em>Menu Package</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Menu Package</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuPackage
	 * @generated
	 */
	EClass getMenuPackage();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.menu.MenuPackage#getEntries <em>Entries</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Entries</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuPackage#getEntries()
	 * @see #getMenuPackage()
	 * @generated
	 */
	EReference getMenuPackage_Entries();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuPackage#isSubMenuIsAccordion <em>Sub Menu Is Accordion</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Sub Menu Is Accordion</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuPackage#isSubMenuIsAccordion()
	 * @see #getMenuPackage()
	 * @generated
	 */
	EAttribute getMenuPackage_SubMenuIsAccordion();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuPackage#getExpandedImage <em>Expanded Image</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Expanded Image</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuPackage#getExpandedImage()
	 * @see #getMenuPackage()
	 * @generated
	 */
	EAttribute getMenuPackage_ExpandedImage();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuPackage#getCollapsedImage <em>Collapsed Image</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Collapsed Image</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuPackage#getCollapsedImage()
	 * @see #getMenuPackage()
	 * @generated
	 */
	EAttribute getMenuPackage_CollapsedImage();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuPackage#getWidth <em>Width</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Width</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuPackage#getWidth()
	 * @see #getMenuPackage()
	 * @generated
	 */
	EAttribute getMenuPackage_Width();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuPackage#getHeight <em>Height</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Height</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuPackage#getHeight()
	 * @see #getMenuPackage()
	 * @generated
	 */
	EAttribute getMenuPackage_Height();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuPackage#isHasDesigner <em>Has Designer</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Has Designer</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuPackage#isHasDesigner()
	 * @see #getMenuPackage()
	 * @generated
	 */
	EAttribute getMenuPackage_HasDesigner();

	/**
	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.menu.MenuEntry <em>Menu Entry</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Menu Entry</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry
	 * @generated
	 */
	EClass getMenuEntry();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#getEntryid <em>Entryid</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Entryid</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#getEntryid()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_Entryid();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#isHasImage <em>Has Image</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Has Image</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#isHasImage()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_HasImage();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#getImage <em>Image</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Image</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#getImage()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_Image();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#isDescription <em>Description</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Description</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#isDescription()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_Description();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#getDescriptionValue <em>Description Value</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Description Value</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#getDescriptionValue()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_DescriptionValue();

	/**
	 * Returns the meta object for the containment reference list '{@link org.eclipse.osbp.xtext.menu.MenuEntry#getSubentries <em>Subentries</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference list '<em>Subentries</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#getSubentries()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EReference getMenuEntry_Subentries();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#isHasProcess <em>Has Process</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Has Process</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#isHasProcess()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_HasProcess();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.menu.MenuEntry#getProcess <em>Process</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Process</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#getProcess()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EReference getMenuEntry_Process();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#isHasPerspective <em>Has Perspective</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Has Perspective</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#isHasPerspective()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_HasPerspective();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.menu.MenuEntry#getPerspective <em>Perspective</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Perspective</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#getPerspective()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EReference getMenuEntry_Perspective();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#isShowBadge <em>Show Badge</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Show Badge</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#isShowBadge()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_ShowBadge();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#isHasTable <em>Has Table</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Has Table</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#isHasTable()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_HasTable();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.menu.MenuEntry#getTable <em>Table</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Table</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#getTable()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EReference getMenuEntry_Table();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#isHasDialog <em>Has Dialog</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Has Dialog</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#isHasDialog()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_HasDialog();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.menu.MenuEntry#getDialog <em>Dialog</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Dialog</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#getDialog()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EReference getMenuEntry_Dialog();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#isHasUserFilter <em>Has User Filter</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Has User Filter</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#isHasUserFilter()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_HasUserFilter();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.menu.MenuEntry#isHasKeyBinding <em>Has Key Binding</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Has Key Binding</em>'.
	 * @see org.eclipse.osbp.xtext.menu.MenuEntry#isHasKeyBinding()
	 * @see #getMenuEntry()
	 * @generated
	 */
	EAttribute getMenuEntry_HasKeyBinding();

	/**
	 * Returns the meta object for data type '{@link org.eclipse.emf.ecore.InternalEObject <em>Internal EObject</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for data type '<em>Internal EObject</em>'.
	 * @see org.eclipse.emf.ecore.InternalEObject
	 * @model instanceClass="org.eclipse.emf.ecore.InternalEObject"
	 * @generated
	 */
	EDataType getInternalEObject();

	/**
	 * Returns the factory that creates the instances of the model.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the factory that creates the instances of the model.
	 * @generated
	 */
	MenuDslFactory getMenuDslFactory();

	/**
	 * <!-- begin-user-doc -->
	 * Defines literals for the meta objects that represent
	 * <ul>
	 *   <li>each class,</li>
	 *   <li>each feature of each class,</li>
	 *   <li>each operation of each class,</li>
	 *   <li>each enum,</li>
	 *   <li>and each data type</li>
	 * </ul>
	 * <!-- end-user-doc -->
	 * @generated
	 */
	interface Literals {
		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.menu.impl.MenuModelImpl <em>Menu Model</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.menu.impl.MenuModelImpl
		 * @see org.eclipse.osbp.xtext.menu.impl.MenuDslPackageImpl#getMenuModel()
		 * @generated
		 */
		EClass MENU_MODEL = eINSTANCE.getMenuModel();

		/**
		 * The meta object literal for the '<em><b>Import Section</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference MENU_MODEL__IMPORT_SECTION = eINSTANCE.getMenuModel_ImportSection();

		/**
		 * The meta object literal for the '<em><b>Packages</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference MENU_MODEL__PACKAGES = eINSTANCE.getMenuModel_Packages();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.menu.impl.MenuLazyResolverImpl <em>Menu Lazy Resolver</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.menu.impl.MenuLazyResolverImpl
		 * @see org.eclipse.osbp.xtext.menu.impl.MenuDslPackageImpl#getMenuLazyResolver()
		 * @generated
		 */
		EClass MENU_LAZY_RESOLVER = eINSTANCE.getMenuLazyResolver();

		/**
		 * The meta object literal for the '<em><b>EResolve Proxy</b></em>' operation.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EOperation MENU_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT = eINSTANCE.getMenuLazyResolver__EResolveProxy__InternalEObject();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.menu.impl.MenuPackageImpl <em>Menu Package</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.menu.impl.MenuPackageImpl
		 * @see org.eclipse.osbp.xtext.menu.impl.MenuDslPackageImpl#getMenuPackage()
		 * @generated
		 */
		EClass MENU_PACKAGE = eINSTANCE.getMenuPackage();

		/**
		 * The meta object literal for the '<em><b>Entries</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference MENU_PACKAGE__ENTRIES = eINSTANCE.getMenuPackage_Entries();

		/**
		 * The meta object literal for the '<em><b>Sub Menu Is Accordion</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_PACKAGE__SUB_MENU_IS_ACCORDION = eINSTANCE.getMenuPackage_SubMenuIsAccordion();

		/**
		 * The meta object literal for the '<em><b>Expanded Image</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_PACKAGE__EXPANDED_IMAGE = eINSTANCE.getMenuPackage_ExpandedImage();

		/**
		 * The meta object literal for the '<em><b>Collapsed Image</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_PACKAGE__COLLAPSED_IMAGE = eINSTANCE.getMenuPackage_CollapsedImage();

		/**
		 * The meta object literal for the '<em><b>Width</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_PACKAGE__WIDTH = eINSTANCE.getMenuPackage_Width();

		/**
		 * The meta object literal for the '<em><b>Height</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_PACKAGE__HEIGHT = eINSTANCE.getMenuPackage_Height();

		/**
		 * The meta object literal for the '<em><b>Has Designer</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_PACKAGE__HAS_DESIGNER = eINSTANCE.getMenuPackage_HasDesigner();

		/**
		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.menu.impl.MenuEntryImpl <em>Menu Entry</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.osbp.xtext.menu.impl.MenuEntryImpl
		 * @see org.eclipse.osbp.xtext.menu.impl.MenuDslPackageImpl#getMenuEntry()
		 * @generated
		 */
		EClass MENU_ENTRY = eINSTANCE.getMenuEntry();

		/**
		 * The meta object literal for the '<em><b>Entryid</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__ENTRYID = eINSTANCE.getMenuEntry_Entryid();

		/**
		 * The meta object literal for the '<em><b>Has Image</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__HAS_IMAGE = eINSTANCE.getMenuEntry_HasImage();

		/**
		 * The meta object literal for the '<em><b>Image</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__IMAGE = eINSTANCE.getMenuEntry_Image();

		/**
		 * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__DESCRIPTION = eINSTANCE.getMenuEntry_Description();

		/**
		 * The meta object literal for the '<em><b>Description Value</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__DESCRIPTION_VALUE = eINSTANCE.getMenuEntry_DescriptionValue();

		/**
		 * The meta object literal for the '<em><b>Subentries</b></em>' containment reference list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference MENU_ENTRY__SUBENTRIES = eINSTANCE.getMenuEntry_Subentries();

		/**
		 * The meta object literal for the '<em><b>Has Process</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__HAS_PROCESS = eINSTANCE.getMenuEntry_HasProcess();

		/**
		 * The meta object literal for the '<em><b>Process</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference MENU_ENTRY__PROCESS = eINSTANCE.getMenuEntry_Process();

		/**
		 * The meta object literal for the '<em><b>Has Perspective</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__HAS_PERSPECTIVE = eINSTANCE.getMenuEntry_HasPerspective();

		/**
		 * The meta object literal for the '<em><b>Perspective</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference MENU_ENTRY__PERSPECTIVE = eINSTANCE.getMenuEntry_Perspective();

		/**
		 * The meta object literal for the '<em><b>Show Badge</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__SHOW_BADGE = eINSTANCE.getMenuEntry_ShowBadge();

		/**
		 * The meta object literal for the '<em><b>Has Table</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__HAS_TABLE = eINSTANCE.getMenuEntry_HasTable();

		/**
		 * The meta object literal for the '<em><b>Table</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference MENU_ENTRY__TABLE = eINSTANCE.getMenuEntry_Table();

		/**
		 * The meta object literal for the '<em><b>Has Dialog</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__HAS_DIALOG = eINSTANCE.getMenuEntry_HasDialog();

		/**
		 * The meta object literal for the '<em><b>Dialog</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference MENU_ENTRY__DIALOG = eINSTANCE.getMenuEntry_Dialog();

		/**
		 * The meta object literal for the '<em><b>Has User Filter</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__HAS_USER_FILTER = eINSTANCE.getMenuEntry_HasUserFilter();

		/**
		 * The meta object literal for the '<em><b>Has Key Binding</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MENU_ENTRY__HAS_KEY_BINDING = eINSTANCE.getMenuEntry_HasKeyBinding();

		/**
		 * The meta object literal for the '<em>Internal EObject</em>' data type.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.emf.ecore.InternalEObject
		 * @see org.eclipse.osbp.xtext.menu.impl.MenuDslPackageImpl#getInternalEObject()
		 * @generated
		 */
		EDataType INTERNAL_EOBJECT = eINSTANCE.getInternalEObject();

	}

} //MenuDslPackage
