/* * (C) Copyright 2006-2007 Nuxeo SAS (http://nuxeo.com/) and contributors. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License * (LGPL) version 2.1 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * Contributors: * Nuxeo - initial API and implementation * * $Id$ */ package org.nuxeo.ecm.platform.ui.web.directory; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Map; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.render.Renderer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuxeo.common.utils.i18n.I18NUtils; import com.sun.faces.renderkit.RenderKitUtils; /** * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a> * */ public class ChainSelectListboxRenderer extends Renderer { @SuppressWarnings("unused") private static final Log log = LogFactory.getLog(ChainSelectListboxRenderer.class); @Override public void decode(FacesContext facesContext, UIComponent component) { } @Override public void encodeBegin(FacesContext context, UIComponent component) throws IOException { ChainSelectListboxComponent comp = (ChainSelectListboxComponent) component; ResponseWriter writer = context.getResponseWriter(); Boolean displayValueOnly = comp.getChain().getBooleanProperty( "displayValueOnly", false); if (displayValueOnly) { return; } encodeInput(context, writer, comp); } private static void encodeInput(FacesContext context, ResponseWriter writer, ChainSelectListboxComponent comp) throws IOException { String id = comp.getClientId(context); ChainSelect chain = comp.getChain(); String cssStyleClass = comp.getStringProperty("cssStyleClass", null); String cssStyle = comp.getStringProperty("cssStyle", null); String onchange = comp.getStringProperty("onchange", null); // XXX hack: add onchange set on the chain select String chainOnchange = chain.getOnchange(); if (chainOnchange != null) { if (onchange == null) { onchange = chainOnchange; } else { if (onchange.endsWith(";")) { onchange += chainOnchange; } else { onchange += "; " + chainOnchange; } } } boolean multiSelect = comp.getBooleanProperty("multiSelect", false); String size = comp.getStringProperty("size", null); boolean displayIdAndLabel = comp.getBooleanProperty( "displayIdAndLabel", false); String displayIdAndLabelSeparator = comp.getStringProperty( "displayIdAndLabelSeparator", " "); boolean localize = comp.getBooleanProperty("localize", false); String display = comp.getStringProperty("display", ""); if (chain.getBooleanProperty("displayValueOnly", false)) { return; } writer.startElement("select", comp); writer.writeAttribute("id", id, "id"); writer.writeAttribute("name", id, "name"); if (onchange != null) { writer.writeAttribute("onchange", onchange, "onchange"); } if (cssStyleClass != null) { writer.writeAttribute("class", cssStyleClass, "class"); } if (cssStyle != null) { writer.writeAttribute("style", cssStyle, "style"); } if (multiSelect) { writer.writeAttribute("multiple", "true", "multiple"); } if (size != null && Integer.valueOf(size) > 0) { writer.writeAttribute("size", size, "size"); } RenderKitUtils.renderOnchange(context, comp, false); List<String> valueList = new ArrayList<String>(); int index = comp.getIndex(); Selection[] selections = chain.getSelections(); if (selections != null) { for (Selection selection : selections) { valueList.add(selection.getColumnValue(index)); } } String optionsLabel = translate(context, "label.vocabulary.selectValue"); writer.startElement("option", comp); writer.writeAttribute("value", "", "value"); writer.writeText(optionsLabel, null); writer.endElement("option"); writer.write("\n"); Map<String, DirectorySelectItem> options = comp.getOptions(); if (options != null) { for (DirectorySelectItem item : options.values()) { String optionId = (String) item.getValue(); String optionLabel = item.getLabel(); writer.startElement("option", comp); writer.writeAttribute("value", optionId, "value"); if (valueList.contains(optionId)) { writer.writeAttribute("selected", "true", "selected"); } if (localize) { optionLabel = translate(context, optionLabel); } writer.writeText(DirectoryHelper.instance().getOptionValue( optionId, optionLabel, display, displayIdAndLabel, displayIdAndLabelSeparator), null); writer.endElement("option"); } } writer.endElement("select"); writer.write("\n"); } protected static String translate(FacesContext context, String label) { String bundleName = context.getApplication().getMessageBundle(); Locale locale = context.getViewRoot().getLocale(); label = I18NUtils.getMessageString(bundleName, label, null, locale); return label; } }