blob: 29bc6588a75218ece5d5ebcba59fafbedd980d01 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.ofbiz.widget.renderer.fo;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.ofbiz.base.util.UtilFormatOut;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.widget.WidgetWorker;
import org.ofbiz.widget.model.FieldInfo;
import org.ofbiz.widget.model.ModelForm;
import org.ofbiz.widget.model.ModelFormField;
import org.ofbiz.widget.model.ModelFormField.CheckField;
import org.ofbiz.widget.model.ModelFormField.ContainerField;
import org.ofbiz.widget.model.ModelFormField.DateFindField;
import org.ofbiz.widget.model.ModelFormField.DateTimeField;
import org.ofbiz.widget.model.ModelFormField.DisplayField;
import org.ofbiz.widget.model.ModelFormField.DropDownField;
import org.ofbiz.widget.model.ModelFormField.FieldInfoWithOptions;
import org.ofbiz.widget.model.ModelFormField.FileField;
import org.ofbiz.widget.model.ModelFormField.HiddenField;
import org.ofbiz.widget.model.ModelFormField.HyperlinkField;
import org.ofbiz.widget.model.ModelFormField.IgnoredField;
import org.ofbiz.widget.model.ModelFormField.ImageField;
import org.ofbiz.widget.model.ModelFormField.LookupField;
import org.ofbiz.widget.model.ModelFormField.PasswordField;
import org.ofbiz.widget.model.ModelFormField.RadioField;
import org.ofbiz.widget.model.ModelFormField.RangeFindField;
import org.ofbiz.widget.model.ModelFormField.ResetField;
import org.ofbiz.widget.model.ModelFormField.SubmitField;
import org.ofbiz.widget.model.ModelFormField.TextField;
import org.ofbiz.widget.model.ModelFormField.TextFindField;
import org.ofbiz.widget.model.ModelFormField.TextareaField;
import org.ofbiz.widget.model.ModelWidget;
import org.ofbiz.widget.renderer.FormStringRenderer;
import org.ofbiz.widget.renderer.html.HtmlWidgetRenderer;
/**
* Widget Library - FO Form Renderer implementation
*
*/
public class FoFormRenderer extends HtmlWidgetRenderer implements FormStringRenderer {
public static final String module = FoFormRenderer.class.getName();
HttpServletRequest request;
HttpServletResponse response;
public FoFormRenderer() {}
public FoFormRenderer(HttpServletRequest request, HttpServletResponse response) throws IOException {
this.request = request;
this.response = response;
}
private void makeBlockString(Appendable writer, String widgetStyle, String text) throws IOException {
writer.append("<fo:block");
if (UtilValidate.isNotEmpty(widgetStyle)) {
writer.append(" ");
writer.append(FoScreenRenderer.getFoStyle(widgetStyle));
}
writer.append(">");
writer.append(UtilFormatOut.encodeXmlValue(text));
writer.append("</fo:block>");
}
public void renderDisplayField(Appendable writer, Map<String, Object> context, DisplayField displayField) throws IOException {
ModelFormField modelFormField = displayField.getModelFormField();
this.makeBlockString(writer, modelFormField.getWidgetStyle(), displayField.getDescription(context));
appendWhitespace(writer);
}
public void renderHyperlinkField(Appendable writer, Map<String, Object> context, HyperlinkField hyperlinkField) throws IOException {
ModelFormField modelFormField = hyperlinkField.getModelFormField();
this.makeBlockString(writer, modelFormField.getWidgetStyle(), hyperlinkField.getDescription(context));
appendWhitespace(writer);
}
public void renderTextField(Appendable writer, Map<String, Object> context, TextField textField) throws IOException {
ModelFormField modelFormField = textField.getModelFormField();
this.makeBlockString(writer, modelFormField.getWidgetStyle(), modelFormField.getEntry(context, textField.getDefaultValue(context)));
appendWhitespace(writer);
}
public void renderTextareaField(Appendable writer, Map<String, Object> context, TextareaField textareaField) throws IOException {
ModelFormField modelFormField = textareaField.getModelFormField();
this.makeBlockString(writer, modelFormField.getWidgetStyle(), modelFormField.getEntry(context, textareaField.getDefaultValue(context)));
appendWhitespace(writer);
}
public void renderDateTimeField(Appendable writer, Map<String, Object> context, DateTimeField dateTimeField) throws IOException {
ModelFormField modelFormField = dateTimeField.getModelFormField();
this.makeBlockString(writer, modelFormField.getWidgetStyle(), modelFormField.getEntry(context, dateTimeField.getDefaultValue(context)));
appendWhitespace(writer);
}
public void renderDropDownField(Appendable writer, Map<String, Object> context, DropDownField dropDownField) throws IOException {
ModelFormField modelFormField = dropDownField.getModelFormField();
String currentValue = modelFormField.getEntry(context);
List<ModelFormField.OptionValue> allOptionValues = dropDownField.getAllOptionValues(context, WidgetWorker.getDelegator(context));
// if the current value should go first, display it
if (UtilValidate.isNotEmpty(currentValue) && "first-in-list".equals(dropDownField.getCurrent())) {
String explicitDescription = dropDownField.getCurrentDescription(context);
if (UtilValidate.isNotEmpty(explicitDescription)) {
this.makeBlockString(writer, modelFormField.getWidgetStyle(), explicitDescription);
} else {
this.makeBlockString(writer, modelFormField.getWidgetStyle(), FieldInfoWithOptions.getDescriptionForOptionKey(currentValue, allOptionValues));
}
} else {
boolean optionSelected = false;
for (ModelFormField.OptionValue optionValue : allOptionValues) {
String noCurrentSelectedKey = dropDownField.getNoCurrentSelectedKey(context);
if ((UtilValidate.isNotEmpty(currentValue) && currentValue.equals(optionValue.getKey()) && "selected".equals(dropDownField.getCurrent())) ||
(UtilValidate.isEmpty(currentValue) && noCurrentSelectedKey != null && noCurrentSelectedKey.equals(optionValue.getKey()))) {
this.makeBlockString(writer, modelFormField.getWidgetStyle(), optionValue.getDescription());
optionSelected = true;
break;
}
}
if (!optionSelected) {
this.makeBlockString(writer, null, "");
}
}
appendWhitespace(writer);
}
public void renderCheckField(Appendable writer, Map<String, Object> context, CheckField checkField) throws IOException {
this.makeBlockString(writer, null, "");
}
public void renderRadioField(Appendable writer, Map<String, Object> context, RadioField radioField) throws IOException {
this.makeBlockString(writer, null, "");
}
public void renderSubmitField(Appendable writer, Map<String, Object> context, SubmitField submitField) throws IOException {
this.makeBlockString(writer, null, "");
}
public void renderResetField(Appendable writer, Map<String, Object> context, ResetField resetField) throws IOException {
this.makeBlockString(writer, null, "");
}
public void renderHiddenField(Appendable writer, Map<String, Object> context, HiddenField hiddenField) throws IOException {
}
public void renderHiddenField(Appendable writer, Map<String, Object> context, ModelFormField modelFormField, String value) throws IOException {
}
public void renderIgnoredField(Appendable writer, Map<String, Object> context, IgnoredField ignoredField) throws IOException {
}
public void renderFieldTitle(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
String tempTitleText = modelFormField.getTitle(context);
writer.append(tempTitleText);
}
public void renderSingleFormFieldTitle(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
renderFieldTitle(writer, context, modelFormField);
}
public void renderFormOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
this.widgetCommentsEnabled = ModelWidget.widgetBoundaryCommentsEnabled(context);
renderBeginningBoundaryComment(writer, "Form Widget", modelForm);
}
public void renderFormClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
renderEndingBoundaryComment(writer, "Form Widget", modelForm);
}
public void renderMultiFormClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
renderEndingBoundaryComment(writer, "Form Widget", modelForm);
}
public void renderFormatListWrapperOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("<fo:table border=\"solid black\">");
List<ModelFormField> childFieldList = modelForm.getFieldList();
for (ModelFormField childField : childFieldList) {
int childFieldType = childField.getFieldInfo().getFieldType();
if (childFieldType == FieldInfo.HIDDEN || childFieldType == FieldInfo.IGNORED) {
continue;
}
writer.append("<fo:table-column");
String areaStyle = childField.getTitleAreaStyle();
if (UtilValidate.isNotEmpty(areaStyle)) {
writer.append(" ");
writer.append(FoScreenRenderer.getFoStyle(areaStyle));
}
writer.append("/>");
appendWhitespace(writer);
}
appendWhitespace(writer);
}
public void renderFormatListWrapperClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("</fo:table-body>");
writer.append("</fo:table>");
appendWhitespace(writer);
}
public void renderFormatHeaderRowOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("<fo:table-header>");
writer.append("<fo:table-row>");
appendWhitespace(writer);
}
public void renderFormatHeaderRowClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("</fo:table-row>");
writer.append("</fo:table-header>");
writer.append("<fo:table-body>");
// FIXME: this is an hack to avoid FOP rendering errors for empty lists (fo:table-body cannot be null)
writer.append("<fo:table-row><fo:table-cell><fo:block/></fo:table-cell></fo:table-row>");
appendWhitespace(writer);
}
public void renderFormatHeaderRowCellOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm, ModelFormField modelFormField, int positionSpan) throws IOException {
writer.append("<fo:table-cell ");
if (positionSpan > 1) {
writer.append("number-columns-spanned=\"");
writer.append(Integer.toString(positionSpan));
writer.append("\" ");
}
writer.append("font-weight=\"bold\" text-align=\"center\" border=\"solid black\" padding=\"2pt\"");
writer.append(">");
writer.append("<fo:block>");
appendWhitespace(writer);
}
public void renderFormatHeaderRowCellClose(Appendable writer, Map<String, Object> context, ModelForm modelForm, ModelFormField modelFormField) throws IOException {
writer.append("</fo:block>");
writer.append("</fo:table-cell>");
appendWhitespace(writer);
}
public void renderFormatHeaderRowFormCellOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("<fo:table-cell>");
appendWhitespace(writer);
}
public void renderFormatHeaderRowFormCellClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("</fo:table-cell>");
appendWhitespace(writer);
}
public void renderFormatHeaderRowFormCellTitleSeparator(Appendable writer, Map<String, Object> context, ModelForm modelForm, ModelFormField modelFormField, boolean isLast) throws IOException {
}
public void renderFormatItemRowOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("<fo:table-row>");
appendWhitespace(writer);
}
public void renderFormatItemRowClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("</fo:table-row>");
appendWhitespace(writer);
}
public void renderFormatItemRowCellOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm, ModelFormField modelFormField, int positionSpan) throws IOException {
writer.append("<fo:table-cell ");
if (positionSpan > 1) {
writer.append("number-columns-spanned=\"");
writer.append(Integer.toString(positionSpan));
writer.append("\" ");
}
String areaStyle = modelFormField.getWidgetAreaStyle();
if (UtilValidate.isEmpty(areaStyle)) {
areaStyle = "tabletext";
}
writer.append(FoScreenRenderer.getFoStyle(areaStyle));
writer.append(">");
appendWhitespace(writer);
}
public void renderFormatItemRowCellClose(Appendable writer, Map<String, Object> context, ModelForm modelForm, ModelFormField modelFormField) throws IOException {
writer.append("</fo:table-cell>");
appendWhitespace(writer);
}
public void renderFormatItemRowFormCellOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("<fo:table-cell>");
appendWhitespace(writer);
}
public void renderFormatItemRowFormCellClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("</fo:table-cell>");
appendWhitespace(writer);
}
// TODO: multi columns (position attribute) in single forms are still not implemented
public void renderFormatSingleWrapperOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("<fo:table>");
appendWhitespace(writer);
writer.append("<fo:table-column column-width=\"2in\"/>");
appendWhitespace(writer);
writer.append("<fo:table-column/>");
appendWhitespace(writer);
writer.append("<fo:table-body>");
appendWhitespace(writer);
}
public void renderFormatSingleWrapperClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("</fo:table-body>");
writer.append("</fo:table>");
appendWhitespace(writer);
}
public void renderFormatFieldRowOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("<fo:table-row>");
appendWhitespace(writer);
}
public void renderFormatFieldRowClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
writer.append("</fo:table-row>");
appendWhitespace(writer);
}
public void renderFormatFieldRowTitleCellOpen(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
writer.append("<fo:table-cell font-weight=\"bold\" text-align=\"right\" padding=\"3pt\">");
writer.append("<fo:block>");
appendWhitespace(writer);
}
public void renderFormatFieldRowTitleCellClose(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
writer.append("</fo:block>");
writer.append("</fo:table-cell>");
appendWhitespace(writer);
}
public void renderFormatFieldRowSpacerCell(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
}
public void renderFormatFieldRowWidgetCellOpen(Appendable writer, Map<String, Object> context, ModelFormField modelFormField, int positions, int positionSpan, Integer nextPositionInRow) throws IOException {
writer.append("<fo:table-cell text-align=\"left\" padding=\"2pt\" padding-left=\"5pt\">");
appendWhitespace(writer);
}
public void renderFormatFieldRowWidgetCellClose(Appendable writer, Map<String, Object> context, ModelFormField modelFormField, int positions, int positionSpan, Integer nextPositionInRow) throws IOException {
writer.append("</fo:table-cell>");
appendWhitespace(writer);
}
public void renderFormatEmptySpace(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
// TODO
}
public void renderTextFindField(Appendable writer, Map<String, Object> context, TextFindField textFindField) throws IOException {
ModelFormField modelFormField = textFindField.getModelFormField();
this.makeBlockString(writer, modelFormField.getWidgetStyle(), modelFormField.getEntry(context, textFindField.getDefaultValue(context)));
appendWhitespace(writer);
}
public void renderRangeFindField(Appendable writer, Map<String, Object> context, RangeFindField rangeFindField) throws IOException {
ModelFormField modelFormField = rangeFindField.getModelFormField();
this.makeBlockString(writer, modelFormField.getWidgetStyle(), modelFormField.getEntry(context, rangeFindField.getDefaultValue(context)));
appendWhitespace(writer);
}
public void renderDateFindField(Appendable writer, Map<String, Object> context, DateFindField dateFindField) throws IOException {
ModelFormField modelFormField = dateFindField.getModelFormField();
this.makeBlockString(writer, modelFormField.getWidgetStyle(), modelFormField.getEntry(context, dateFindField.getDefaultValue(context)));
appendWhitespace(writer);
}
public void renderLookupField(Appendable writer, Map<String, Object> context, LookupField lookupField) throws IOException {
ModelFormField modelFormField = lookupField.getModelFormField();
this.makeBlockString(writer, modelFormField.getWidgetStyle(), modelFormField.getEntry(context, lookupField.getDefaultValue(context)));
appendWhitespace(writer);
}
public void renderNextPrev(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
}
public void renderFileField(Appendable writer, Map<String, Object> context, FileField textField) throws IOException {
ModelFormField modelFormField = textField.getModelFormField();
this.makeBlockString(writer, modelFormField.getWidgetStyle(), modelFormField.getEntry(context, textField.getDefaultValue(context)));
appendWhitespace(writer);
}
public void renderPasswordField(Appendable writer, Map<String, Object> context, PasswordField passwordField) throws IOException {
this.makeBlockString(writer, null, "");
}
public void renderImageField(Appendable writer, Map<String, Object> context, ImageField imageField) throws IOException {
// TODO
this.makeBlockString(writer, null, "");
}
public void renderFieldGroupOpen(Appendable writer, Map<String, Object> context, ModelForm.FieldGroup fieldGroup) throws IOException {
// TODO
}
public void renderFieldGroupClose(Appendable writer, Map<String, Object> context, ModelForm.FieldGroup fieldGroup) throws IOException {
// TODO
}
public void renderBanner(Appendable writer, Map<String, Object> context, ModelForm.Banner banner) throws IOException {
// TODO
this.makeBlockString(writer, null, "");
}
public void renderHyperlinkTitle(Appendable writer, Map<String, Object> context, ModelFormField modelFormField, String titleText) throws IOException {
}
public void renderContainerFindField(Appendable writer, Map<String, Object> context, ContainerField containerField) throws IOException {
}
}