/* * (C) Copyright 2014 JBoss RichFaces 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-2.1.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: * Anahide Tchertchian */ package org.nuxeo.ecm.platform.ui.web.component.radio; import java.io.IOException; import javax.faces.component.UIComponent; import javax.faces.component.html.HtmlSelectOneRadio; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import org.richfaces.component.util.InputUtils; import org.richfaces.renderkit.RenderKitUtils; import org.richfaces.renderkit.RendererBase; /** * Renderer for a single radio button, given a target original radio component * and index for original button attributes retrieval. * * @since 6.0 */ public class SingleRadioRenderer extends RendererBase { public static final String RENDERER_TYPE = SingleRadioRenderer.class.getName(); private String convertToString(Object obj) { return (obj == null ? "" : obj.toString()); } @Override protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent _component) throws IOException { UIRadio component = (UIRadio) _component; java.lang.String clientId = component.getClientId(context); final UIComponent targetComponent = getUtils().findComponentFor( component, component.getFor()); final javax.faces.model.SelectItem item = component.getSelectItem( context, targetComponent); boolean checked = false; if (targetComponent instanceof javax.faces.component.UIOutput) { final Object currentValue = ((javax.faces.component.UIOutput) targetComponent).getValue(); final Object itemValue = item.getValue(); checked = itemValue == null ? currentValue == null : itemValue.equals(currentValue); } writer.startElement("input", component); writer.writeAttribute("id", clientId, "id"); writer.writeAttribute("name", getUtils().clientId(context, targetComponent), "name"); writer.writeAttribute("type", "radio", "type"); writer.writeAttribute("value", InputUtils.getConvertedStringValue( context, targetComponent, item.getValue()), "value"); if (checked) { writer.writeAttribute("checked", "checked", "checked"); } if (isDisabled(targetComponent) || isReadonly(targetComponent)) { writer.writeAttribute("disabled", "disabled", "disabled"); } String targetOnchange = null; if (targetComponent != null) { targetOnchange = convertToString(RenderKitUtils.getAttributeAndBehaviorsValue( context, targetComponent, RenderKitUtils.attributes().generic("onchange", "onchange", "change", "valueChange").first())); } String onchange = convertToString(RenderKitUtils.getAttributeAndBehaviorsValue( context, component, RenderKitUtils.attributes().generic("onchange", "onchange", "change", "valueChange").first())); if (targetOnchange != null && !targetOnchange.trim().isEmpty()) { onchange = onchange == null ? targetOnchange : targetOnchange + ";" + onchange; } if (onchange != null && onchange.trim().length() > 0) { writer.writeAttribute("onchange", onchange, "onchange"); } getUtils().encodeAttributesFromArray( context, component, new String[] { "accept", "accesskey", "align", "alt", "checked", "dir", "disabled", "lang", "maxlength", "onblur", "onclick", "ondblclick", "onfocus", "onkeydown", "onkeypress", "onkeyup", "onmousedown", "onmousemove", "onmouseout", "onmouseover", "onmouseup", "onselect", "readonly", "size", "src", "style", "tabindex", "title", "usemap", "xml:lang" }); writer.endElement("input"); writer.startElement("label", component); writer.writeAttribute("for", clientId, "for"); writer.writeText(convertToString(item.getLabel()), null); writer.endElement("label"); } @Override protected Class<? extends UIComponent> getComponentClass() { return UIRadio.class; } private boolean isDisabled(UIComponent targetComponent) { if (targetComponent instanceof HtmlSelectOneRadio) { return ((HtmlSelectOneRadio) targetComponent).isDisabled(); } else { final Object disabled = targetComponent.getAttributes().get( "disabled"); return Boolean.TRUE.equals(disabled); } } private boolean isReadonly(UIComponent targetComponent) { if (targetComponent instanceof HtmlSelectOneRadio) { return ((HtmlSelectOneRadio) targetComponent).isReadonly(); } else { final Object readonly = targetComponent.getAttributes().get( "readonly"); return Boolean.TRUE.equals(readonly); } } }