private void fillGridRow(
      FormEntryController formEntryController, GridRow gridRow, int columnIndex) throws Exception {
    FormEntryPrompt currentQuestionPrompt = formEntryController.getModel().getQuestionPrompt();
    IAnswerData currentAnswer = currentQuestionPrompt.getAnswerValue();
    if (currentAnswer == null) return;

    final int dataType = currentQuestionPrompt.getDataType();
    QuestionDef questionDef = currentQuestionPrompt.getQuestion();
    String answerAsString = getMartusAnswerStringFromQuestion(currentAnswer, questionDef, dataType);
    gridRow.setCellText(columnIndex, answerAsString);
  }
  private Bulletin createBulletin(
      MartusCrypto signatureGenerator,
      FormEntryController formEntryController,
      FieldSpecCollection fieldsFromXForms)
      throws Exception {
    FieldSpecCollection allFields = new FieldSpecCollection();
    FieldSpecCollection nonEmptytopSectionFieldSpecsFrom = getNonEmptyTopFieldSpecs();
    allFields.addAll(nonEmptytopSectionFieldSpecsFrom);
    allFields.addAll(fieldsFromXForms);

    Bulletin bulletinLoadedFromXForms =
        new Bulletin(signatureGenerator, allFields, new FieldSpecCollection());
    transferAllStandardFields(bulletinLoadedFromXForms, nonEmptytopSectionFieldSpecsFrom);

    resetFormEntryControllerIndex(formEntryController);
    int event;
    while ((event = formEntryController.stepToNextEvent())
        != FormEntryController.EVENT_END_OF_FORM) {
      if (event == FormEntryController.EVENT_REPEAT)
        convertXFormRepeatToGridData(
            formEntryController, fieldsFromXForms, bulletinLoadedFromXForms);

      if (event != FormEntryController.EVENT_QUESTION) continue;

      FormEntryPrompt questionPrompt = formEntryController.getModel().getQuestionPrompt();
      IAnswerData answer = questionPrompt.getAnswerValue();
      if (answer == null) continue;

      QuestionDef question = questionPrompt.getQuestion();
      final int dataType = questionPrompt.getDataType();
      TreeReference reference = (TreeReference) question.getBind().getReference();
      FieldDataPacket fieldDataPacket = bulletinLoadedFromXForms.getFieldDataPacket();
      String xFormsFieldTag = reference.getNameLast();
      String answerAsString = getMartusAnswerStringFromQuestion(answer, question, dataType);
      fieldDataPacket.set(xFormsFieldTag, answerAsString);
    }

    copyPrivateAttachmentProxies(bulletinLoadedFromXForms);
    copyPublicAttachmentProxies(bulletinLoadedFromXForms);

    return bulletinLoadedFromXForms;
  }
  private FieldSpec convertToFieldSpec(FormEntryPrompt questionPrompt) {
    QuestionDef question = questionPrompt.getQuestion();
    final int dataType = questionPrompt.getDataType();
    TreeReference reference = (TreeReference) question.getBind().getReference();
    String tag = reference.getNameLast();
    String questionLabel = questionPrompt.getQuestion().getLabelInnerText();

    if (questionPrompt.isReadOnly())
      return FieldSpec.createCustomField(tag, questionLabel, new FieldTypeMessage());

    if (isNormalFieldType(dataType))
      return FieldSpec.createCustomField(tag, questionLabel, new FieldTypeNormal());

    if (dataType == Constants.DATATYPE_DATE)
      return FieldSpec.createCustomField(tag, questionLabel, new FieldTypeDate());

    if (shouldTreatSingleItemChoiceListAsBooleanField(dataType, question))
      return FieldSpec.createCustomField(tag, questionLabel, new FieldTypeBoolean());

    if (dataType == Constants.DATATYPE_CHOICE) {
      Vector<ChoiceItem> convertedChoices = new Vector<ChoiceItem>();
      List<SelectChoice> choicesToConvert = question.getChoices();
      for (SelectChoice choiceToConvert : choicesToConvert) {
        // String choiceItemCode = choiceToConvert.getValue();
        String choiceItemLabel = choiceToConvert.getLabelInnerText();
        // Martus doesn't keep Code's when exporting so use Label twice instead
        convertedChoices.add(new ChoiceItem(choiceItemLabel, choiceItemLabel));
      }

      FieldSpec fieldSpec = new CustomDropDownFieldSpec(convertedChoices);
      fieldSpec.setTag(tag);
      fieldSpec.setLabel(questionLabel);
      return fieldSpec;
    }
    MartusLogger.log(
        "Warning: BulletinFromXFormsLoader.convertToFieldSpec unknown Field Type:"
            + String.valueOf(dataType));
    return null;
  }
 protected IAnswerData getTemplate() {
   return AnswerDataFactory.template(mPrompt.getControlType(), mPrompt.getDataType());
 }