in tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/RendererBase.java [433:517]
protected void renderSelectItems(
final UIInput component, final TobagoClass optionClass,
final Iterable<SelectItem> items, final Object[] values, final String[] submittedValues,
final Boolean onlySelected, final TobagoResponseWriter writer, final FacesContext facesContext)
throws IOException {
if (LOG.isDebugEnabled()) {
LOG.debug("component id = '{}'", component.getId());
LOG.debug("values = '{}'", Arrays.toString(values));
LOG.debug("submittedValues = '{}'", Arrays.toString(submittedValues));
}
for (final SelectItem item : items) {
if (item instanceof SelectItemGroup) {
writer.startElement(HtmlElements.OPTGROUP);
writer.writeAttribute(HtmlAttributes.LABEL, item.getLabel(), true);
if (item.isDisabled()) {
writer.writeAttribute(HtmlAttributes.DISABLED, true);
}
final SelectItem[] selectItems = ((SelectItemGroup) item).getSelectItems();
renderSelectItems(component, optionClass, Arrays.asList(selectItems), values, submittedValues,
onlySelected, writer, facesContext);
writer.endElement(HtmlElements.OPTGROUP);
} else {
Object itemValue = item.getValue();
// when using selectItem tag with a literal value: use the converted value
if (itemValue instanceof String && values != null && values.length > 0 && !(values[0] instanceof String)) {
itemValue = ComponentUtils.getConvertedValue(facesContext, component, (String) itemValue);
}
final String formattedValue = getFormattedValue(facesContext, (T) component, itemValue);
final boolean contains;
if (submittedValues == null) {
contains = ArrayUtils.contains(values, itemValue);
} else {
contains = ArrayUtils.contains(submittedValues, formattedValue);
}
if (item.isNoSelectionOption() && component.isRequired() && values != null && values.length > 0 && !contains) {
// skip the noSelectionOption if there is another value selected and required
continue;
}
if (onlySelected != null) {
if (onlySelected) {
if (!contains) {
continue;
}
} else {
if (contains) {
continue;
}
}
}
writer.startElement(HtmlElements.OPTION);
writer.writeAttribute(HtmlAttributes.VALUE, formattedValue, true);
if (item instanceof org.apache.myfaces.tobago.model.SelectItem) {
final String image = ((org.apache.myfaces.tobago.model.SelectItem) item).getImage();
if (image != null) {
final AbstractUIStyle style = (AbstractUIStyle) facesContext.getApplication()
.createComponent(facesContext, Tags.style.componentType(), RendererTypes.Style.name());
style.setTransient(true);
style.setBackgroundImage(image);
style.setSelector(
StyleRenderUtils.encodeIdSelector(component.getClientId(facesContext))
+ " option[value=" + formattedValue + "]");
// XXX This works not in common browsers...
component.getChildren().add(style);
}
}
Markup markup = item instanceof Visual ? ((Visual) item).getMarkup() : Markup.NULL;
if (onlySelected == null && contains) {
writer.writeAttribute(HtmlAttributes.SELECTED, true);
markup = Markup.SELECTED.add(markup);
}
if (item.isDisabled()) {
writer.writeAttribute(HtmlAttributes.DISABLED, true);
markup = Markup.DISABLED.add(markup);
}
writer.writeClassAttribute(optionClass);
final String label = item.getLabel();
if (label != null) {
writer.writeText(label);
}
writer.endElement(HtmlElements.OPTION);
}
}
}