in framework/widget/src/main/java/org/apache/ofbiz/widget/renderer/FormRenderer.java [988:1236]
private void renderSingleFormString(Appendable writer, Map<String, Object> context,
int positions) throws IOException {
List<ModelFormField> tempFieldList = modelForm.getFieldList().stream()
.filter(usedFields(context))
.collect(Collectors.toList());
Set<String> alreadyRendered = new TreeSet<>();
FieldGroup lastFieldGroup = null;
// render form open
if (!modelForm.getSkipStart()) {
formStringRenderer.renderFormOpen(writer, context, modelForm);
if (HtmlWidgetRenderer.NAMED_BORDER_TYPE != ModelWidget.NamedBorderType.NONE) {
HttpServletRequest request = (HttpServletRequest) context.get("request");
writer.append(HtmlWidgetRenderer.beginNamedBorder("Form",
modelForm.getFormLocation() + "#" + modelForm.getName(),
request.getContextPath()));
}
}
// render all hidden & ignored fields
List<ModelFormField> hiddenIgnoredFieldList = getHiddenIgnoredFields(context, alreadyRendered, tempFieldList, modelForm, -1);
renderHiddenIgnoredFields(writer, context, formStringRenderer, hiddenIgnoredFieldList);
// render formatting wrapper open
// This should be covered by fieldGroup.renderStartString
//formStringRenderer.renderFormatSingleWrapperOpen(writer, context, this);
// render each field row, except hidden & ignored rows
Iterator<ModelFormField> fieldIter = tempFieldList.iterator();
ModelFormField lastFormField = null;
ModelFormField currentFormField = null;
ModelFormField nextFormField = null;
if (fieldIter.hasNext()) {
currentFormField = fieldIter.next();
}
if (fieldIter.hasNext()) {
nextFormField = fieldIter.next();
}
FieldGroup currentFieldGroup = null;
String currentFieldGroupName = null;
String lastFieldGroupName = null;
if (currentFormField != null) {
currentFieldGroup = (FieldGroup) modelForm.getFieldGroupMap().get(currentFormField.getFieldName());
if (currentFieldGroup == null) {
currentFieldGroup = modelForm.getDefaultFieldGroup();
}
if (currentFieldGroup != null) {
currentFieldGroupName = currentFieldGroup.getId();
}
}
boolean isFirstPass = true;
boolean haveRenderedOpenFieldRow = false;
while (currentFormField != null) {
// do the check/get next stuff at the beginning so we can still use the continue stuff easily
// don't do it on the first pass though...
if (isFirstPass) {
isFirstPass = false;
List<FieldGroupBase> inbetweenList = getInbetweenList(lastFieldGroup, currentFieldGroup);
for (FieldGroupBase obj : inbetweenList) {
if (obj instanceof ModelForm.Banner) {
// CHECKSTYLE_OFF: ALMOST_ALL
((ModelForm.Banner) obj).renderString(writer, context, formStringRenderer);
// CHECKSTYLE_ON: ALMOST_ALL
}
}
if (currentFieldGroup != null && (lastFieldGroup == null || !lastFieldGroupName.equals(currentFieldGroupName))) {
currentFieldGroup.renderStartString(writer, context, formStringRenderer);
lastFieldGroup = currentFieldGroup;
}
} else {
if (fieldIter.hasNext()) {
// at least two loops left
lastFormField = currentFormField;
currentFormField = nextFormField;
nextFormField = fieldIter.next();
} else if (nextFormField != null) {
// okay, just one loop left
lastFormField = currentFormField;
currentFormField = nextFormField;
nextFormField = null;
} else {
// at the end...
currentFormField = null;
// nextFormField is already null
break;
}
currentFieldGroup = null;
if (currentFormField != null) {
currentFieldGroup = (FieldGroup) modelForm.getFieldGroupMap().get(currentFormField.getName());
}
if (currentFieldGroup == null) {
currentFieldGroup = modelForm.getDefaultFieldGroup();
}
currentFieldGroupName = currentFieldGroup.getId();
if (lastFieldGroup != null) {
lastFieldGroupName = lastFieldGroup.getId();
if (!lastFieldGroupName.equals(currentFieldGroupName)) {
if (haveRenderedOpenFieldRow) {
formStringRenderer.renderFormatFieldRowClose(writer, context, modelForm);
haveRenderedOpenFieldRow = false;
}
lastFieldGroup.renderEndString(writer, context, formStringRenderer);
List<FieldGroupBase> inbetweenList = getInbetweenList(lastFieldGroup, currentFieldGroup);
for (FieldGroupBase obj : inbetweenList) {
if (obj instanceof ModelForm.Banner) {
// CHECKSTYLE_OFF: ALMOST_ALL
((ModelForm.Banner) obj).renderString(writer, context, formStringRenderer);
// CHECKSTYLE_ON: ALMOST_ALL
}
}
}
}
if (lastFieldGroup == null || !lastFieldGroupName.equals(currentFieldGroupName)) {
currentFieldGroup.renderStartString(writer, context, formStringRenderer);
lastFieldGroup = currentFieldGroup;
}
}
FieldInfo fieldInfo = null;
if (currentFormField != null) {
fieldInfo = currentFormField.getFieldInfo();
}
if (fieldInfo != null) {
if (fieldInfo.getFieldType() == FieldInfo.HIDDEN
|| fieldInfo.getFieldType() == FieldInfo.IGNORED) {
continue;
}
}
if (alreadyRendered.contains(currentFormField.getName())) {
continue;
}
if (!currentFormField.shouldUse(context)) {
if (UtilValidate.isNotEmpty(lastFormField)) {
currentFormField = lastFormField;
}
continue;
}
alreadyRendered.add(currentFormField.getName());
if (focusFieldName.isEmpty()) {
if (fieldInfo.getFieldType() != FieldInfo.DISPLAY && fieldInfo.getFieldType() != FieldInfo.HIDDEN
&& fieldInfo.getFieldType() != FieldInfo.DISPLAY_ENTITY
&& fieldInfo.getFieldType() != FieldInfo.IGNORED
&& fieldInfo.getFieldType() != FieldInfo.IMAGE) {
focusFieldName = currentFormField.getName();
context.put(modelForm.getName().concat(".focusFieldName"), focusFieldName);
}
}
boolean stayingOnRow = false;
if (lastFormField != null) {
if (lastFormField.getPosition() >= currentFormField.getPosition()) {
// moving to next row
stayingOnRow = false;
} else {
// staying on same row
stayingOnRow = true;
}
}
int positionSpan = 1;
Integer nextPositionInRow = null;
if (nextFormField != null) {
if (nextFormField.getPosition() > currentFormField.getPosition()) {
positionSpan = nextFormField.getPosition() - currentFormField.getPosition() - 1;
nextPositionInRow = nextFormField.getPosition();
} else {
positionSpan = positions - currentFormField.getPosition();
}
}
if (stayingOnRow) {
// no spacer cell, might add later though...
//formStringRenderer.renderFormatFieldRowSpacerCell(writer, context, currentFormField);
Debug.logVerbose("no spacer cell, might add later though...", MODULE);
} else {
if (haveRenderedOpenFieldRow) {
// render row formatting close
formStringRenderer.renderFormatFieldRowClose(writer, context, modelForm);
haveRenderedOpenFieldRow = false;
}
// render row formatting open
formStringRenderer.renderFormatFieldRowOpen(writer, context, modelForm);
haveRenderedOpenFieldRow = true;
}
//
// It must be a row open before rendering a field. If not, open it
//
if (!haveRenderedOpenFieldRow) {
formStringRenderer.renderFormatFieldRowOpen(writer, context, modelForm);
haveRenderedOpenFieldRow = true;
}
// render title formatting open
formStringRenderer.renderFormatFieldRowTitleCellOpen(writer, context, currentFormField);
// render title (unless this is a submit or a reset field)
if (fieldInfo.getFieldType() != FieldInfo.SUBMIT
&& fieldInfo.getFieldType() != FieldInfo.RESET) {
formStringRenderer.renderFieldTitle(writer, context, currentFormField);
} else {
formStringRenderer.renderFormatEmptySpace(writer, context, modelForm);
}
// render title formatting close
formStringRenderer.renderFormatFieldRowTitleCellClose(writer, context, currentFormField);
// render separator
formStringRenderer.renderFormatFieldRowSpacerCell(writer, context, currentFormField);
// render widget formatting open
formStringRenderer.renderFormatFieldRowWidgetCellOpen(writer, context, currentFormField, positions, positionSpan,
nextPositionInRow);
// render widget
currentFormField.renderFieldString(writer, context, formStringRenderer);
// render widget formatting close
formStringRenderer.renderFormatFieldRowWidgetCellClose(writer, context, currentFormField, positions, positionSpan,
nextPositionInRow);
}
// render row formatting close after the end if needed
if (haveRenderedOpenFieldRow) {
formStringRenderer.renderFormatFieldRowClose(writer, context, modelForm);
}
if (lastFieldGroup != null) {
lastFieldGroup.renderEndString(writer, context, formStringRenderer);
}
// render formatting wrapper close
// should be handled by renderEndString
//formStringRenderer.renderFormatSingleWrapperClose(writer, context, this);
// render form close
if (!modelForm.getSkipEnd()) {
if (HtmlWidgetRenderer.NAMED_BORDER_TYPE != ModelWidget.NamedBorderType.NONE) {
writer.append(HtmlWidgetRenderer.endNamedBorder("Form",
modelForm.getFormLocation() + "#" + modelForm.getName()));
}
formStringRenderer.renderFormClose(writer, context, modelForm);
}
}