001: /*
002: * Copyright 2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.apache.myfaces.shared_impl.renderkit.html;
017:
018: import org.apache.commons.logging.Log;
019: import org.apache.commons.logging.LogFactory;
020: import org.apache.myfaces.shared_impl.renderkit.JSFAttr;
021: import org.apache.myfaces.shared_impl.renderkit.RendererUtils;
022:
023: import javax.faces.component.*;
024: import javax.faces.component.html.HtmlSelectOneRadio;
025: import javax.faces.context.FacesContext;
026: import javax.faces.context.ResponseWriter;
027: import javax.faces.convert.Converter;
028: import javax.faces.convert.ConverterException;
029: import javax.faces.model.SelectItem;
030: import javax.faces.model.SelectItemGroup;
031: import java.io.IOException;
032: import java.util.Iterator;
033: import java.util.List;
034:
035: /**
036: * @author Manfred Geiler (latest modification by $Author: baranda $)
037: * @author Thomas Spiegl
038: * @version $Revision: 544646 $ $Date: 2007-06-05 23:51:27 +0200 (Di, 05 Jun 2007) $
039: */
040: public class HtmlRadioRendererBase extends HtmlRenderer {
041: private static final Log log = LogFactory
042: .getLog(HtmlRadioRendererBase.class);
043:
044: private static final String PAGE_DIRECTION = "pageDirection";
045: private static final String LINE_DIRECTION = "lineDirection";
046:
047: public void encodeEnd(FacesContext facesContext,
048: UIComponent uiComponent) throws IOException {
049: org.apache.myfaces.shared_impl.renderkit.RendererUtils
050: .checkParamValidity(facesContext, uiComponent,
051: UISelectOne.class);
052:
053: UISelectOne selectOne = (UISelectOne) uiComponent;
054:
055: String layout = getLayout(selectOne);
056:
057: boolean pageDirectionLayout = false; // Defaults to LINE_DIRECTION
058: if (layout != null) {
059: if (layout.equals(PAGE_DIRECTION)) {
060: pageDirectionLayout = true;
061: } else if (layout.equals(LINE_DIRECTION)) {
062: pageDirectionLayout = false;
063: } else {
064: log.error("Wrong layout attribute for component "
065: + selectOne.getClientId(facesContext) + ": "
066: + layout);
067: }
068: }
069:
070: ResponseWriter writer = facesContext.getResponseWriter();
071:
072: writer.startElement(HTML.TABLE_ELEM, selectOne);
073: HtmlRendererUtils.renderHTMLAttributes(writer, selectOne,
074: HTML.SELECT_TABLE_PASSTHROUGH_ATTRIBUTES);
075: HtmlRendererUtils.writeIdIfNecessary(writer, uiComponent,
076: facesContext);
077:
078: if (!pageDirectionLayout)
079: writer.startElement(HTML.TR_ELEM, selectOne);
080:
081: Converter converter;
082: List selectItemList = org.apache.myfaces.shared_impl.renderkit.RendererUtils
083: .getSelectItemList(selectOne);
084: converter = HtmlRendererUtils.findUIOutputConverterFailSafe(
085: facesContext, selectOne);
086:
087: Object currentValue = org.apache.myfaces.shared_impl.renderkit.RendererUtils
088: .getObjectValue(selectOne);
089:
090: currentValue = org.apache.myfaces.shared_impl.renderkit.RendererUtils
091: .getConvertedStringValue(facesContext, selectOne,
092: converter, currentValue);
093:
094: int itemNum = 0;
095:
096: for (Iterator it = selectItemList.iterator(); it.hasNext();) {
097: SelectItem selectItem = (SelectItem) it.next();
098:
099: renderGroupOrItemRadio(facesContext, selectOne, selectItem,
100: currentValue, converter, pageDirectionLayout,
101: new Integer(itemNum));
102:
103: itemNum++;
104: }
105:
106: if (!pageDirectionLayout)
107: writer.endElement(HTML.TR_ELEM);
108: writer.endElement(HTML.TABLE_ELEM);
109: }
110:
111: protected String getLayout(UIComponent selectOne) {
112: if (selectOne instanceof HtmlSelectOneRadio) {
113: return ((HtmlSelectOneRadio) selectOne).getLayout();
114: }
115:
116: return (String) selectOne.getAttributes().get(
117: JSFAttr.LAYOUT_ATTR);
118: }
119:
120: protected String getStyleClass(UISelectOne selectOne) {
121: if (selectOne instanceof HtmlSelectOneRadio) {
122: return ((HtmlSelectOneRadio) selectOne).getStyleClass();
123: }
124:
125: return (String) selectOne.getAttributes().get(
126: JSFAttr.STYLE_CLASS_ATTR);
127: }
128:
129: protected void renderGroupOrItemRadio(FacesContext facesContext,
130: UIComponent uiComponent, SelectItem selectItem,
131: Object currentValue, Converter converter,
132: boolean pageDirectionLayout, Integer itemNum)
133: throws IOException {
134:
135: ResponseWriter writer = facesContext.getResponseWriter();
136:
137: boolean isSelectItemGroup = (selectItem instanceof SelectItemGroup);
138:
139: // TODO : Check here for getSubmittedValue. Look at RendererUtils.getValue
140: // this is useless object creation
141: // Object itemValue = selectItem.getValue();
142:
143: UISelectOne selectOne = (UISelectOne) uiComponent;
144:
145: if (isSelectItemGroup) {
146: if (pageDirectionLayout)
147: writer.startElement(HTML.TR_ELEM, selectOne);
148:
149: writer.startElement(HTML.TD_ELEM, selectOne);
150: writer.write(selectItem.getLabel());
151: writer.endElement(HTML.TD_ELEM);
152:
153: if (pageDirectionLayout) {
154: writer.endElement(HTML.TR_ELEM);
155: writer.startElement(HTML.TR_ELEM, selectOne);
156: }
157: writer.startElement(HTML.TD_ELEM, selectOne);
158:
159: writer.startElement(HTML.TABLE_ELEM, selectOne);
160: writer.writeAttribute(HTML.BORDER_ATTR, "0", null);
161:
162: SelectItemGroup group = (SelectItemGroup) selectItem;
163: SelectItem[] selectItems = group.getSelectItems();
164:
165: for (int i = 0; i < selectItems.length; i++) {
166: renderGroupOrItemRadio(facesContext, selectOne,
167: selectItems[i], currentValue, converter,
168: pageDirectionLayout, new Integer(i));
169: }
170:
171: writer.endElement(HTML.TD_ELEM);
172: writer.endElement(HTML.TR_ELEM);
173: writer.endElement(HTML.TABLE_ELEM);
174: writer.endElement(HTML.TD_ELEM);
175:
176: if (pageDirectionLayout)
177: writer.endElement(HTML.TR_ELEM);
178:
179: } else {
180:
181: writer.write("\t\t");
182: if (pageDirectionLayout)
183: writer.startElement(HTML.TR_ELEM, selectOne);
184: writer.startElement(HTML.TD_ELEM, selectOne);
185:
186: String itemStrValue = org.apache.myfaces.shared_impl.renderkit.RendererUtils
187: .getConvertedStringValue(facesContext, selectOne,
188: converter, selectItem.getValue());
189: boolean itemDisabled = selectItem.isDisabled();
190:
191: boolean itemChecked = itemStrValue.equals(currentValue);
192:
193: String itemId = renderRadio(facesContext, selectOne,
194: itemStrValue, itemDisabled, itemChecked, false,
195: itemNum);
196:
197: // label element after the input
198: boolean componentDisabled = isDisabled(facesContext,
199: selectOne);
200: boolean disabled = (componentDisabled || itemDisabled);
201:
202: HtmlRendererUtils.renderLabel(writer, selectOne, itemId,
203: selectItem.getLabel(), disabled);
204:
205: writer.endElement(HTML.TD_ELEM);
206: if (pageDirectionLayout)
207: writer.endElement(HTML.TR_ELEM);
208: }
209: }
210:
211: @Deprecated
212: protected void renderRadio(FacesContext facesContext,
213: UIComponent uiComponent, String value, String label,
214: boolean disabled, boolean checked, boolean renderId)
215: throws IOException {
216: renderRadio(facesContext, (UIInput) uiComponent, value,
217: disabled, checked, renderId, 0);
218: }
219:
220: /**
221: * Renders the input item
222: * @return the 'id' value of the rendered element
223: */
224: protected String renderRadio(FacesContext facesContext,
225: UIInput uiComponent, String value, boolean disabled,
226: boolean checked, boolean renderId, Integer itemNum)
227: throws IOException {
228: String clientId = uiComponent.getClientId(facesContext);
229:
230: String itemId = (itemNum == null) ? null : clientId
231: + NamingContainer.SEPARATOR_CHAR + itemNum;
232:
233: ResponseWriter writer = facesContext.getResponseWriter();
234:
235: writer.startElement(HTML.INPUT_ELEM, uiComponent);
236:
237: if (itemId != null) {
238: writer.writeAttribute(HTML.ID_ATTR, itemId, null);
239: }
240: writer.writeAttribute(HTML.TYPE_ATTR, HTML.INPUT_TYPE_RADIO,
241: null);
242: writer.writeAttribute(HTML.NAME_ATTR, clientId, null);
243:
244: if (disabled) {
245: writer.writeAttribute(HTML.DISABLED_ATTR,
246: HTML.DISABLED_ATTR, null);
247: }
248:
249: if (renderId) {
250: writer.writeAttribute(HTML.ID_ATTR, clientId, null);
251: }
252:
253: if (checked) {
254: writer.writeAttribute(HTML.CHECKED_ATTR, HTML.CHECKED_ATTR,
255: null);
256: }
257:
258: if ((value != null) && (value.length() > 0)) {
259: writer.writeAttribute(HTML.VALUE_ATTR, value, null);
260: }
261:
262: HtmlRendererUtils
263: .renderHTMLAttributes(
264: writer,
265: uiComponent,
266: HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_STYLE);
267: if (isDisabled(facesContext, uiComponent)) {
268: writer
269: .writeAttribute(
270: org.apache.myfaces.shared_impl.renderkit.html.HTML.DISABLED_ATTR,
271: Boolean.TRUE, null);
272: }
273:
274: writer.endElement(HTML.INPUT_ELEM);
275:
276: return itemId;
277: }
278:
279: protected boolean isDisabled(FacesContext facesContext,
280: UIComponent uiComponent) {
281: //TODO: overwrite in extended HtmlRadioRenderer and check for enabledOnUserRole
282: if (uiComponent instanceof HtmlSelectOneRadio) {
283: return ((HtmlSelectOneRadio) uiComponent).isDisabled();
284: }
285:
286: return org.apache.myfaces.shared_impl.renderkit.RendererUtils
287: .getBooleanAttribute(uiComponent, HTML.DISABLED_ATTR,
288: false);
289: }
290:
291: public void decode(FacesContext facesContext,
292: UIComponent uiComponent) {
293: org.apache.myfaces.shared_impl.renderkit.RendererUtils
294: .checkParamValidity(facesContext, uiComponent, null);
295: if (uiComponent instanceof UIInput) {
296: HtmlRendererUtils.decodeUISelectOne(facesContext,
297: uiComponent);
298: }
299: }
300:
301: public Object getConvertedValue(FacesContext facesContext,
302: UIComponent uiComponent, Object submittedValue)
303: throws ConverterException {
304: RendererUtils.checkParamValidity(facesContext, uiComponent,
305: UIOutput.class);
306: return org.apache.myfaces.shared_impl.renderkit.RendererUtils
307: .getConvertedUIOutputValue(facesContext,
308: (UIOutput) uiComponent, submittedValue);
309: }
310:
311: }
|