protected void renderSelectItems( FacesContext context, UIComponent component, ResponseWriter writer, Iterator it, String[] selectedValues) throws IOException { while (it.hasNext()) { final SelectItem selectItem = (SelectItem) it.next(); if (selectItem instanceof SelectItemGroup) { SelectItemGroup selectItemGroup = (SelectItemGroup) selectItem; SelectItem[] selectItems = selectItemGroup.getSelectItems(); Iterator selectItemsIt = new ArrayIterator(selectItems); writer.startElement(JsfConstants.OPTGROUP_ELEM, component); RendererUtil.renderAttribute(writer, JsfConstants.LABEL_ATTR, selectItemGroup.getLabel()); // TODO case: optgroup is disabled renderSelectItems(context, component, writer, selectItemsIt, selectedValues); writer.endElement(JsfConstants.OPTGROUP_ELEM); } else { writer.startElement(JsfConstants.OPTION_ELEM, component); final Object value = selectItem.getValue(); RendererUtil.renderAttribute(writer, JsfConstants.VALUE_ATTR, value); final boolean disabled = UIComponentUtil.isDisabled(component) || selectItem.isDisabled(); final String labelClass = getLabelStyleClass(component, disabled); if (labelClass != null) { RendererUtil.renderAttribute(writer, JsfConstants.CLASS_ATTR, labelClass); } if (value != null && isSelected(selectedValues, value.toString())) { renderSelectedAttribute(writer); } if (selectItem.isDisabled()) { renderDisabledAttribute(writer); } writer.writeText(selectItem.getLabel(), null); writer.endElement(JsfConstants.OPTION_ELEM); } } }