Jsf 2 可编辑输入”,空); writer.writeAttribute(“类”,SelectOneMenu.LABEL\u类,空); writeAttribute(“tabindex”,-1,null); writeAttribute(“自动完成”、“关闭”、空
可编辑输入”,空); writer.writeAttribute(“类”,SelectOneMenu.LABEL\u类,空); writeAttribute(“tabindex”,-1,null); writeAttribute(“自动完成”、“关闭”、空); if(menu.isDisabled()){ writer.writeAttribute(“已禁用”、“已禁用”、空); } 如果(valueToRender!=null){ writeAttribute(“value”,valueToRender,null); } 编写器。输入(“输入”); } 否则{ startElement(“标签”,空); writeAttribute(“id”,menu.getClientId()+“_标签”,null); writer.writeAttribute(“类”,SelectOneMenu.LABEL\u类,空); 作者:写(“”); 作者:恩德元素(“标签”); } } 受保护的void encodeMenuIcon(最终面上下文、最终selectOne菜单、最终布尔值有效) 抛出IOException { ResponseWriter=context.getResponseWriter(); 字符串iconClass=valid?SelectOneMenu.TRIGGER\u类:SelectOneMenu.TRIGGER\u类+“ui状态错误”; startElement(“div”,菜单); writeAttribute(“类”,iconClass,null); startElement(“span”,菜单); writeAttribute(“类”,“ui图标ui-icon-triangle-1-s”,空); 作者:恩德莱恩(“span”); 作者:恩德莱恩(“div”); } 受保护的空白编码面板(最终面上下文、最终选择一菜单、, 最终列表selectItems,最终布尔值isOptionGroup)引发IOException { ResponseWriter=context.getResponseWriter(); 布尔值customContent=menu.getVar()!=null; int height=calculatePanelHeight(菜单,selectItems.size()); 字符串panelStyle=menu.getPanelStyle()!=null?menu.getPanelStyle():“”; 字符串panelStyleClass=menu.getPanelStyleClass(); panelStyleClass=panelStyleClass==null?SelectOneMenu.PANEL\u类:SelectOneMenu.PANEL\u类+“” +panelStyleClass; 如果(高度!=-1){ panelStyle+=“高度:”+高度+“px”; } startElement(“div”,空); writer.writeAttribute(“id”,menu.getClientId(上下文)+“_面板”,null); writeAttribute(“类”,panelStyleClass,null); 如果(!isValueEmpty(panelStyle)){ writeAttribute(“style”,panelStyle,null); } 如果(自定义内容){ startElement(“表格”,菜单); writer.writeAttribute(“类”,SelectOneMenu.TABLE\u类,空); startElement(“tbody”,菜单); 编码选项稳定(上下文、菜单、selectItems、isOptionGroup); 作者:恩德莱恩(“tbody”); 编者。恩德元素(“表格”); } 否则{ startElement(“ul”,菜单); writer.writeAttribute(“类”,SelectOneMenu.LIST\u类,空); 编码选项列表(上下文、菜单、selectItems、isOptionGroup); 作者:恩德莱恩(“ul”); } 作者:恩德莱恩(“div”); } 受保护的无效编码选项稳定(最终面上下文、最终选择项菜单、, 最终列表selectItems,最终布尔值isOptionGroup)引发IOException { ResponseWriter=context.getResponseWriter(); String var=menu.getVar(); 列表列=menu.getColumns(); 对象值=menu.getValue(); 用于(SelectItem SelectItem:selectItems){ Object itemValue=selectItem.getValue(); context.getExternalContext().getRequestMap().put(var,selectItem.getValue()); startElement(“tr”,空); writer.writeAttribute(“类”,SelectOneMenu.ROW\u类,空); if(selectItem.getDescription()!=null){ writer.writeAttribute(“title”,selectItem.getDescription(),null); } if(字符串的itemValue实例){ startElement(“td”,空); writer.writeAttribute(“colspan”,columns.size(),null); if(等渗组){ 如果(SelectItemGroup的selectItem实例){ writeAttribute(“类”,“ui SelectOne菜单选项组标题”,null); } 否则{ writer.writeAttribute(“类”,SelectOneMenu.ITEM\u类+“ui SelectOneMenu选项组项”, 无效); } } writeText(selectItem.getLabel(),null); 作者:恩德莱恩(“td”); } 否则{ 用于(列:列){ startElement(“td”,空); 列.encodeAll(上下文); 作者:恩德莱恩(“td”); } } 作者:恩德莱恩(tr); } context.getExternalContext().getRequestMap().put(var,null); } 受保护的无效编码选项列表(最终面上下文、最终选择项菜单、, 最终列表selectItems,最终布尔值isOptionGroup)引发IOException { ResponseWriter=context.getResponseWriter(); 对象值=menu.getValue(); 对于(int i=0;iJsf 2 可编辑输入”,空); writer.writeAttribute(“类”,SelectOneMenu.LABEL\u类,空); writeAttribute(“tabindex”,-1,null); writeAttribute(“自动完成”、“关闭”、空,jsf-2,primefaces,Jsf 2,Primefaces,可编辑输入”,空); writer.writeAttribute(“类”,SelectOneMenu.LABEL\u类,空); writeAttribute(“tabindex”,-1,null); writeAttribute(“自动完成”、“关闭”、空); if(menu.isDisabled()){ writer.writeAttribute(“已禁用”、“已禁用”、空); } 如果(valueToRender!=null){ writeAttribute(“value”,valueToR
package org.primefaces.component.selectonemenu;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.component.UISelectOne;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.model.SelectItem;
import javax.faces.model.SelectItemGroup;
import org.primefaces.component.column.Column;
import org.primefaces.renderkit.SelectOneRenderer;
import org.primefaces.util.ComponentUtils;
public class SelectOneMenuRenderer extends SelectOneRenderer {
@Override
public void decode(final FacesContext context, final UIComponent component) {
if (!shouldDecode(component)) {
return;
}
SelectOneMenu menu = (SelectOneMenu)component;
if (menu.isEditable()) {
Map<String, String> params = context.getExternalContext().getRequestParameterMap();
decodeBehaviors(context, menu);
menu.setSubmittedValue(params.get(menu.getClientId(context) + "_editableInput"));
}
else {
super.decode(context, component);
}
}
@Override
public Object getConvertedValue(final FacesContext context, final UIComponent component,
final Object submittedValue) throws ConverterException
{
return context.getRenderKit().getRenderer("javax.faces.SelectOne", "javax.faces.Menu")
.getConvertedValue(context, component, submittedValue);
}
@Override
public void encodeEnd(final FacesContext context, final UIComponent component) throws IOException {
SelectOneMenu menu = (SelectOneMenu)component;
encodeMarkup(context, menu);
encodeScript(context, menu);
}
protected void encodeMarkup(final FacesContext context, final SelectOneMenu menu) throws IOException {
boolean isOptionGroup = false;
ResponseWriter writer = context.getResponseWriter();
List<SelectItem> selectItems = getSelectItems(context, menu);
String clientId = menu.getClientId(context);
Converter converter = menu.getConverter();
Object values = getValues(menu);
Object submittedValues = getSubmittedValues(menu);
boolean valid = menu.isValid();
String style = menu.getStyle();
String styleClass = menu.getStyleClass();
styleClass = styleClass == null ? SelectOneMenu.STYLE_CLASS : SelectOneMenu.STYLE_CLASS + " "
+ styleClass;
styleClass = !valid ? styleClass + " ui-state-error" : styleClass;
styleClass = menu.isDisabled() ? styleClass + " ui-state-disabled" : styleClass;
writer.startElement("div", menu);
writer.writeAttribute("id", clientId, "id");
writer.writeAttribute("class", styleClass, "styleclass");
if (style != null) {
writer.writeAttribute("style", style, "style");
}
// filter selectItems // values
List<SelectItem> selectGroupedItems = new ArrayList<SelectItem>();
for (Object item : selectItems) {
if (item instanceof SelectItemGroup) {
isOptionGroup = true; // Flag, um den (Render-)Modus auf "Optiongroup" umzuschalten
((SelectItemGroup)item).setNoSelectionOption(true);
((SelectItemGroup)item).setDisabled(true);
selectGroupedItems.add((SelectItem)item); // Nicht: SelectItemGroup
SelectItem[] innerItems = ((SelectItemGroup)item).getSelectItems();
for (SelectItem innerItem : innerItems) {
selectGroupedItems.add(innerItem);
}
continue;
}
selectGroupedItems.add((SelectItem)item);
}
// Encode tags
encodeInput(context, menu, clientId, selectGroupedItems, values, submittedValues, converter);
encodeLabel(context, menu, selectGroupedItems);
encodeMenuIcon(context, menu, valid);
encodePanel(context, menu, selectGroupedItems, isOptionGroup);
writer.endElement("div");
}
protected void encodeInput(final FacesContext context, final SelectOneMenu menu, final String clientId,
final List<SelectItem> selectItems, final Object values, final Object submittedValues,
final Converter converter) throws IOException
{
ResponseWriter writer = context.getResponseWriter();
String inputId = clientId + "_input";
writer.startElement("div", menu);
writer.writeAttribute("class", "ui-helper-hidden-accessible", null);
writer.startElement("select", menu);
writer.writeAttribute("id", inputId, "id");
writer.writeAttribute("name", inputId, null);
if (menu.isDisabled()) {
writer.writeAttribute("disabled", "disabled", null);
}
if (menu.getTabindex() != null) {
writer.writeAttribute("tabindex", menu.getTabindex(), null);
}
if (menu.getOnkeydown() != null) {
writer.writeAttribute("onkeydown", menu.getOnkeydown(), null);
}
if (menu.getOnkeyup() != null) {
writer.writeAttribute("onkeyup", menu.getOnkeyup(), null);
}
encodeSelectItems(context, menu, selectItems, values, submittedValues, converter);
writer.endElement("select");
writer.endElement("div");
}
protected void encodeLabel(final FacesContext context, final SelectOneMenu menu,
final List<SelectItem> selectItems) throws IOException
{
ResponseWriter writer = context.getResponseWriter();
String valueToRender = ComponentUtils.getValueToRender(context, menu);
if (menu.isEditable()) {
writer.startElement("input", null);
writer.writeAttribute("type", "text", null);
writer.writeAttribute("name", menu.getClientId() + "_editableInput", null);
writer.writeAttribute("class", SelectOneMenu.LABEL_CLASS, null);
writer.writeAttribute("tabindex", -1, null);
writer.writeAttribute("autocomplete", "off", null);
if (menu.isDisabled()) {
writer.writeAttribute("disabled", "disabled", null);
}
if (valueToRender != null) {
writer.writeAttribute("value", valueToRender, null);
}
writer.endElement("input");
}
else {
writer.startElement("label", null);
writer.writeAttribute("id", menu.getClientId() + "_label", null);
writer.writeAttribute("class", SelectOneMenu.LABEL_CLASS, null);
writer.write(" ");
writer.endElement("label");
}
}
protected void encodeMenuIcon(final FacesContext context, final SelectOneMenu menu, final boolean valid)
throws IOException
{
ResponseWriter writer = context.getResponseWriter();
String iconClass = valid ? SelectOneMenu.TRIGGER_CLASS : SelectOneMenu.TRIGGER_CLASS + " ui-state-error";
writer.startElement("div", menu);
writer.writeAttribute("class", iconClass, null);
writer.startElement("span", menu);
writer.writeAttribute("class", "ui-icon ui-icon-triangle-1-s", null);
writer.endElement("span");
writer.endElement("div");
}
protected void encodePanel(final FacesContext context, final SelectOneMenu menu,
final List<SelectItem> selectItems, final boolean isOptionGroup) throws IOException
{
ResponseWriter writer = context.getResponseWriter();
boolean customContent = menu.getVar() != null;
int height = calculatePanelHeight(menu, selectItems.size());
String panelStyle = menu.getPanelStyle() != null ? menu.getPanelStyle() : "";
String panelStyleClass = menu.getPanelStyleClass();
panelStyleClass = panelStyleClass == null ? SelectOneMenu.PANEL_CLASS : SelectOneMenu.PANEL_CLASS + " "
+ panelStyleClass;
if (height != -1) {
panelStyle += ";height:" + height + "px";
}
writer.startElement("div", null);
writer.writeAttribute("id", menu.getClientId(context) + "_panel", null);
writer.writeAttribute("class", panelStyleClass, null);
if (!isValueEmpty(panelStyle)) {
writer.writeAttribute("style", panelStyle, null);
}
if (customContent) {
writer.startElement("table", menu);
writer.writeAttribute("class", SelectOneMenu.TABLE_CLASS, null);
writer.startElement("tbody", menu);
encodeOptionsAsTable(context, menu, selectItems, isOptionGroup);
writer.endElement("tbody");
writer.endElement("table");
}
else {
writer.startElement("ul", menu);
writer.writeAttribute("class", SelectOneMenu.LIST_CLASS, null);
encodeOptionsAsList(context, menu, selectItems, isOptionGroup);
writer.endElement("ul");
}
writer.endElement("div");
}
protected void encodeOptionsAsTable(final FacesContext context, final SelectOneMenu menu,
final List<SelectItem> selectItems, final boolean isOptionGroup) throws IOException
{
ResponseWriter writer = context.getResponseWriter();
String var = menu.getVar();
List<Column> columns = menu.getColums();
Object value = menu.getValue();
for (SelectItem selectItem : selectItems) {
Object itemValue = selectItem.getValue();
context.getExternalContext().getRequestMap().put(var, selectItem.getValue());
writer.startElement("tr", null);
writer.writeAttribute("class", SelectOneMenu.ROW_CLASS, null);
if (selectItem.getDescription() != null) {
writer.writeAttribute("title", selectItem.getDescription(), null);
}
if (itemValue instanceof String) {
writer.startElement("td", null);
writer.writeAttribute("colspan", columns.size(), null);
if (isOptionGroup) {
if (selectItem instanceof SelectItemGroup) {
writer.writeAttribute("class", "ui-selectonemenu-optiongroup-header", null);
}
else {
writer.writeAttribute("class", SelectOneMenu.ITEM_CLASS + " ui-selectonemenu-optiongroup-items",
null);
}
}
writer.writeText(selectItem.getLabel(), null);
writer.endElement("td");
}
else {
for (Column column : columns) {
writer.startElement("td", null);
column.encodeAll(context);
writer.endElement("td");
}
}
writer.endElement("tr");
}
context.getExternalContext().getRequestMap().put(var, null);
}
protected void encodeOptionsAsList(final FacesContext context, final SelectOneMenu menu,
final List<SelectItem> selectItems, final boolean isOptionGroup) throws IOException
{
ResponseWriter writer = context.getResponseWriter();
Object value = menu.getValue();
for (int i = 0; i < selectItems.size(); i++) {
SelectItem selectItem = selectItems.get(i);
String itemLabel = selectItem.getLabel();
itemLabel = isValueBlank(itemLabel) ? " " : itemLabel;
writer.startElement("li", null);
if (selectItem instanceof SelectItemGroup) {
writer.writeAttribute("class", " ui-selectonemenu-optiongroup-header", null);
}
else {
if (isOptionGroup) {
writer.writeAttribute("class", SelectOneMenu.ITEM_CLASS + " ui-selectonemenu-optiongroup-items",
null);
}
else {
writer.writeAttribute("class", SelectOneMenu.ITEM_CLASS, null);
}
}
if (selectItem.getDescription() != null) {
writer.writeAttribute("title", selectItem.getDescription(), null);
}
if (itemLabel.equals(" ")) {
writer.write(itemLabel);
}
else {
if (selectItem.isEscape()) {
writer.writeText(itemLabel, "value");
}
else {
writer.write(itemLabel);
}
}
writer.endElement("li");
}
}
protected void encodeScript(final FacesContext context, final SelectOneMenu menu) throws IOException {
ResponseWriter writer = context.getResponseWriter();
String clientId = menu.getClientId(context);
startScript(writer, clientId);
writer.write("$(function(){");
writer.write("PrimeFaces.cw('SelectOneMenu','" + menu.resolveWidgetVar() + "',{");
writer.write("id:'" + clientId + "'");
writer.write(",effect:'" + menu.getEffect() + "'");
if (menu.getEffectDuration() != 400) {
writer.write(",effectDuration:" + menu.getEffectDuration());
}
if (menu.isEditable()) {
writer.write(",editable:true");
}
if (menu.getOnchange() != null) {
writer.write(",onchange:function() {" + menu.getOnchange() + "}");
}
encodeClientBehaviors(context, menu);
writer.write("});});");
endScript(writer);
}
protected void encodeSelectItems(final FacesContext context, final SelectOneMenu menu,
final List<SelectItem> selectItems, final Object values, final Object submittedValues,
final Converter converter) throws IOException
{
for (SelectItem selectItem : selectItems) {
encodeOption(context, menu, selectItem, values, submittedValues, converter);
}
}
protected void encodeOption(final FacesContext context, final SelectOneMenu menu, final SelectItem option,
final Object values, final Object submittedValues, final Converter converter) throws IOException
{
ResponseWriter writer = context.getResponseWriter();
String itemValueAsString = getOptionAsString(context, menu, converter, option.getValue());
boolean disabled = option.isDisabled();
Object valuesArray;
Object itemValue;
if (submittedValues != null) {
valuesArray = submittedValues;
itemValue = itemValueAsString;
}
else {
valuesArray = values;
itemValue = option.getValue();
}
boolean selected = isSelected(context, menu, itemValue, valuesArray, converter);
if (option.isNoSelectionOption() && values != null && !selected) {
return;
}
String elem = "option";
if (option instanceof SelectItemGroup) {
selected = false;
}
writer.startElement(elem, null);
writer.writeAttribute("value", itemValueAsString, null);
if (disabled) {
writer.writeAttribute("disabled", "disabled", null);
}
if (selected) {
writer.writeAttribute("selected", "selected", null);
}
if (option.isEscape()) {
writer.writeText(option.getLabel(), "value");
}
else {
writer.write(option.getLabel());
}
writer.endElement(elem);
}
protected int calculatePanelHeight(final SelectOneMenu menu, final int itemSize) {
int height = menu.getHeight();
if (height != Integer.MAX_VALUE) {
return height;
}
else if (itemSize > 10) {
return 200;
}
return -1;
}
@Override
public void encodeChildren(final FacesContext facesContext, final UIComponent component) throws IOException
{
// Rendering happens on encodeEnd
}
@Override
public boolean getRendersChildren() {
return true;
}
@Override
protected String getSubmitParam(final FacesContext context, final UISelectOne selectOne) {
return selectOne.getClientId(context) + "_input";
}
}