package org.sakaiproject.jsf.renderer; import java.io.IOException; import java.util.Map; import javax.faces.component.UIComponent; import javax.faces.component.UIData; import javax.faces.component.UIInput; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.render.Renderer; import org.sakaiproject.jsf.component.CustomSelectOneRadio; public class CustomSelectOneRadioRenderer extends Renderer { /** * <p>Decoding is required.</p> * * @param context <code>FacesContext</code>for the current request * @param component <code>UIComponent</code> to be decoded */ public void decode(FacesContext context, UIComponent component) { if ((context == null) || (component == null)) { throw new NullPointerException(); } CustomSelectOneRadio aCustomSelectOneRadio = null; if(component instanceof CustomSelectOneRadio) { aCustomSelectOneRadio = (CustomSelectOneRadio)component; } else { return; } Map map = context.getExternalContext().getRequestParameterMap(); String name = getName(aCustomSelectOneRadio, context); if ( map.containsKey(name) ) { String value = (String)map.get(name); if ( value != null ) { setSubmittedValue(component, value); } } } /** * <p>No begin encoding is required.</p> * * @param context <code>FacesContext</code>for the current request * @param component <code>UIComponent</code> to be decoded */ public void encodeBegin(FacesContext context, UIComponent component) throws IOException { if ((context == null) || (component == null)) { throw new NullPointerException(); } } /** * <p>No children encoding is required.</p> * * @param context <code>FacesContext</code>for the current request * @param component <code>UIComponent</code> to be decoded */ public void encodeChildren(FacesContext context, UIComponent component) throws IOException { if ((context == null) || (component == null)) { throw new NullPointerException(); } } /** * <p>Encode this component.</p> * * @param context <code>FacesContext</code>for the current request * @param component <code>UIComponent</code> to be decoded */ public void encodeEnd(FacesContext context, UIComponent component) throws IOException { if ((context == null) || (component == null)) { throw new NullPointerException(); } CustomSelectOneRadio aCustomSelectOneRadio = (CustomSelectOneRadio)component; if ( component.isRendered() ) { ResponseWriter writer = context.getResponseWriter(); writer.write("<input type=\"radio\""); writer.write(" id=\"" + component.getClientId(context) + "\""); writer.write(" name=\"" + getName(aCustomSelectOneRadio, context) + "\""); if ( aCustomSelectOneRadio.getStyleClass() != null && aCustomSelectOneRadio.getStyleClass().trim().length() > 0 ) { writer.write(" class=\"" + aCustomSelectOneRadio.getStyleClass().trim() + "\""); } if ( aCustomSelectOneRadio.getStyle() != null && aCustomSelectOneRadio.getStyle().trim().length() > 0 ) { writer.write(" style=\"" + aCustomSelectOneRadio.getStyle().trim() + "\""); } if ( aCustomSelectOneRadio.getDisabled() != null && "true".equals((aCustomSelectOneRadio.getDisabled()).trim())) { writer.write(" disabled=\"disabled\""); } if ( aCustomSelectOneRadio.getItemValue() != null ) { writer.write(" value=\"" + aCustomSelectOneRadio.getItemValue().trim() + "\""); } if ( aCustomSelectOneRadio.getOnClick() != null && aCustomSelectOneRadio.getOnClick().trim().length() > 0 ) { writer.write(" onclick=\"" + aCustomSelectOneRadio.getOnClick().trim() + "\""); } if ( aCustomSelectOneRadio.getOnMouseOver() != null && aCustomSelectOneRadio.getOnMouseOver().trim().length() > 0 ) { writer.write(" onmouseover=\"" + aCustomSelectOneRadio.getOnMouseOver().trim() + "\""); } if ( aCustomSelectOneRadio.getOnMouseOut() != null && aCustomSelectOneRadio.getOnMouseOut().trim().length() > 0 ) { writer.write(" onmouseout=\"" + aCustomSelectOneRadio.getOnMouseOut().trim() + "\""); } if ( aCustomSelectOneRadio.getOnFocus() != null && aCustomSelectOneRadio.getOnFocus().trim().length() > 0 ) { writer.write(" onfocus=\"" + aCustomSelectOneRadio.getOnFocus().trim() + "\""); } if ( aCustomSelectOneRadio.getOnBlur() != null && aCustomSelectOneRadio.getOnBlur().trim().length() > 0 ) { writer.write(" onblur=\"" + aCustomSelectOneRadio.getOnBlur().trim() + "\""); } if ( aCustomSelectOneRadio.getValue() != null && aCustomSelectOneRadio.getValue().equals(aCustomSelectOneRadio.getItemValue())) { writer.write(" checked=\"checked\""); } writer.write(">"); if ( aCustomSelectOneRadio.getItemLabel() != null ) { writer.write(aCustomSelectOneRadio.getItemLabel()); } writer.write("</input>"); } } public void setSubmittedValue(UIComponent component, Object obj) { if(component instanceof UIInput){ ((UIInput)component).setSubmittedValue(obj); } } private String getName(CustomSelectOneRadio aCustomSelectOneRadio,FacesContext context) { UIComponent parentUIComponent = getParentDataTableFromHierarchy(aCustomSelectOneRadio); if ( parentUIComponent == null ) { return aCustomSelectOneRadio.getClientId(context); } else { if ( aCustomSelectOneRadio.getOverrideName() != null && aCustomSelectOneRadio.getOverrideName().equals("true")) { return aCustomSelectOneRadio.getName(); } else { String id = aCustomSelectOneRadio.getClientId(context); String[] fields = id.split(":"); // int lastIndexOfColon = id.lastIndexOf(":"); String partName = ""; // if ( lastIndexOfColon != -1 ) { // partName = id.substring(0, lastIndexOfColon + 1); StringBuffer strBuf = new StringBuffer(); for (int i = 0; i< fields.length -2;i++) { strBuf.append(fields[i]); strBuf.append(":"); } partName = strBuf.toString(); if ( aCustomSelectOneRadio.getName() == null ) { partName = partName + "generatedRad"; } else partName = partName + aCustomSelectOneRadio.getName(); // } return partName; } } } private UIComponent getParentDataTableFromHierarchy(UIComponent uiComponent) { if ( uiComponent == null ) { return null; } if ( uiComponent instanceof UIData ) { return uiComponent; } else { //try to find recursively in the Component tree hierarchy return getParentDataTableFromHierarchy(uiComponent.getParent()); } } }