
<%
/**
 * 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 v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.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.getModelName()%> Edit Support
providerName = www.example.org
<%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%>
<%}%>
<%}%>
