public static PropertyValue createFromSuggested(
      DesignComponent component,
      String suggestedMainName,
      Collection<String> additionalReservedNames) {
    assert component.getDocument().getTransactionManager().isAccess();
    Collection<? extends CodeNamePresenter> presenters =
        component.getPresenters(CodeNamePresenter.class);
    if (presenters.isEmpty())
      Debug.warning("CodeNamePresenter is missing for", component); // NOI18N
    HashSet<String> names = new HashSet<String>();
    gatherNames(component.getDocument().getRootComponent(), component, names);
    if (additionalReservedNames != null) names.addAll(additionalReservedNames);

    suggestedMainName = checkForJavaIdentifierCompliant(suggestedMainName);
    if (checkIfNameAlreadyReserved(presenters, suggestedMainName, names)) {
      int index = suggestedMainName.length();
      while (index >= 1 && Character.isDigit(suggestedMainName.charAt(index - 1))) index--;
      int number =
          index < suggestedMainName.length()
              ? Integer.parseInt(suggestedMainName.substring(index))
              : 1;
      suggestedMainName = suggestedMainName.substring(0, index);

      suggestedMainName = findNumberedInstanceName(presenters, suggestedMainName, number, names);
    }
    return MidpTypes.createStringValue(suggestedMainName);
  }
 private static void gatherNames(
     DesignComponent component, DesignComponent excludeComponent, HashSet<String> names) {
   assert component.getDocument().getTransactionManager().isAccess();
   if (component == excludeComponent) return;
   Collection<? extends CodeNamePresenter> presenters =
       component.getPresenters(CodeNamePresenter.class);
   for (CodeNamePresenter presenter : presenters) {
     List<String> reservedNames = presenter.getReservedNames();
     if (reservedNames != null) names.addAll(reservedNames);
   }
   for (DesignComponent child : component.getComponents())
     gatherNames(child, excludeComponent, names);
 }
 @Override
 public void generateParameterCode(
     DesignComponent component, MultiGuardedSection section, int index) {
   PropertyValue value = component.readProperty(PROP_CONSTRAINTS);
   if (value.getKind() == PropertyValue.Kind.VALUE) {
     int constraint = MidpTypes.getInteger(value);
     int core = constraint & TextFieldCD.VALUE_CONSTRAINT_MASK;
     CodeWriter writer = section.getWriter();
     switch (core) {
       case TextFieldCD.VALUE_ANY:
         writer.write("TextField.ANY"); // NOI18N
         break;
       case TextFieldCD.VALUE_EMAILADDR:
         writer.write("TextField.EMAILADDR"); // NOI18N
         break;
       case TextFieldCD.VALUE_NUMERIC:
         writer.write("TextField.NUMERIC"); // NOI18N
         break;
       case TextFieldCD.VALUE_PHONENUMBER:
         writer.write("TextField.PHONENUMBER"); // NOI18N
         break;
       case TextFieldCD.VALUE_URL:
         writer.write("TextField.URL"); // NOI18N
         break;
       case TextFieldCD.VALUE_DECIMAL:
         writer.write("TextField.DECIMAL"); // NOI18N
         break;
       default:
         writer.write(Integer.toString(core));
     }
     if ((constraint & TextFieldCD.VALUE_PASSWORD) != 0) {
       writer.write(" | TextField.PASSWORD"); // NOI18N
     }
     if ((constraint & TextFieldCD.VALUE_UNEDITABLE) != 0) {
       writer.write(" | TextField.UNEDITABLE"); // NOI18N
     }
     if ((constraint & TextFieldCD.VALUE_SENSITIVE) != 0) {
       writer.write(" | TextField.SENSITIVE"); // NOI18N
     }
     if ((constraint & TextFieldCD.VALUE_NON_PREDICTIVE) != 0) {
       writer.write(" | TextField.NON_PREDICTIVE"); // NOI18N
     }
     if ((constraint & TextFieldCD.VALUE_INITIAL_CAPS_WORD) != 0) {
       writer.write(" | TextField.INITIAL_CAPS_WORD"); // NOI18N
     }
     if ((constraint & TextFieldCD.VALUE_INITIAL_CAPS_SENTENCE) != 0) {
       writer.write(" | TextField.INITIAL_CAPS_SENTENCE"); // NOI18N
     }
     return;
   }
   super.generateParameterCode(component, section, index);
 }
 @Override
 public void postInitialize(DesignComponent component) {
   component.writeProperty(PROP_MAX_SIZE, MidpTypes.createIntegerValue(32));
   component.writeProperty(PROP_CONSTRAINTS, MidpTypes.createIntegerValue(VALUE_ANY));
 }