
<%
/**
 * Copyright (c) 2002-2007 IBM Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 * 
 * Contributors: 
 *   IBM - Initial API and implementation
 */
%>
<%GenModel genModel = (GenModel)argument; /* Trick to import java.util.* without warnings */Iterator.class.getName();%>
<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderProperties" args="parameter:argument"%>

pluginName = <%=genModel.getEditBundleName()%>
providerName = <%=genModel.getEditBundleVendorName()%>
<%if (genModel.getRuntimePlatform() != GenRuntimePlatform.GWT) {%>

<%if (genModel.isCreationCommands()) {%>
_UI_CreateChild_text = {0}
_UI_CreateChild_text2 = {1} <%if (genModel.isCreationSubmenus()) {%>| <%}%>{0}
_UI_CreateChild_text3 = {1}
_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.

<%}%>
_UI_PropertyDescriptor_description = The {0} of the {1}

<%for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
  <%if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) { %>
    <%for (GenClass genClass : genPackage.getGenClasses()) {%>
_UI_<%=genClass.getName()%>_type = <%=genClass.getFormattedName()%>
    <%}%>
  <%}%>
<%}%>
_UI_Unknown_type = Object

_UI_Unknown_datatype= Value

<%for (GenFeature genFeature : genModel.getFilteredAllGenFeatures()) { String description = genFeature.getPropertyDescription();%>
_UI_<%=genFeature.getGenClass().getName()%>_<%=genFeature.getName()%>_feature = <%=genFeature.getFormattedName()%>
  <%if (description != null && description.length() > 0) {%>
_UI_<%=genFeature.getGenClass().getName()%>_<%=genFeature.getName()%>_description = <%=description%>
  <%}%>
<%}%>
_UI_Unknown_feature = Unspecified

<%for (GenPackage genPackage : genModel.getAllGenAndUsedGenPackagesWithClassifiers()) {%>
  <%if (genPackage.getGenModel() == genModel || !genPackage.getGenModel().hasEditSupport()) {%>
    <%for (GenEnum genEnum : genPackage.getGenEnums()) {%>
      <%for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {%>
_UI_<%=genEnum.getName()%>_<%=genEnumLiteral.getName()%>_literal = <%=genEnumLiteral.getLiteral()%>
      <%}%>
    <%}%>
  <%}%>
<%}%>
<%for (String category : genModel.getPropertyCategories()) {%>
<%=genModel.getPropertyCategoryKey(category)%> = <%=category%>
<%}%>
<%}%>
