1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.shared.renderkit.html;
20
21 import org.apache.commons.logging.Log;
22 import org.apache.commons.logging.LogFactory;
23 import org.apache.myfaces.shared.renderkit.JSFAttr;
24 import org.apache.myfaces.shared.renderkit.RendererUtils;
25
26 import javax.faces.component.*;
27 import javax.faces.component.html.HtmlSelectOneRadio;
28 import javax.faces.context.FacesContext;
29 import javax.faces.context.ResponseWriter;
30 import javax.faces.convert.Converter;
31 import javax.faces.convert.ConverterException;
32 import javax.faces.model.SelectItem;
33 import javax.faces.model.SelectItemGroup;
34 import java.io.IOException;
35 import java.util.Iterator;
36 import java.util.List;
37
38 /***
39 * @author Manfred Geiler (latest modification by $Author: lu4242 $)
40 * @author Thomas Spiegl
41 * @version $Revision: 684924 $ $Date: 2008-08-11 15:59:26 -0500 (Mon, 11 Aug 2008) $
42 */
43 public class HtmlRadioRendererBase
44 extends HtmlRenderer
45 {
46 private static final Log log = LogFactory.getLog(HtmlRadioRendererBase.class);
47
48 private static final String PAGE_DIRECTION = "pageDirection";
49 private static final String LINE_DIRECTION = "lineDirection";
50
51 public void encodeEnd(FacesContext facesContext, UIComponent uiComponent) throws IOException
52 {
53 org.apache.myfaces.shared.renderkit.RendererUtils.checkParamValidity(facesContext, uiComponent, UISelectOne.class);
54
55 UISelectOne selectOne = (UISelectOne)uiComponent;
56
57 String layout = getLayout(selectOne);
58
59 boolean pageDirectionLayout = false;
60 if (layout != null)
61 {
62 if (layout.equals(PAGE_DIRECTION))
63 {
64 pageDirectionLayout = true;
65 }
66 else if (layout.equals(LINE_DIRECTION))
67 {
68 pageDirectionLayout = false;
69 }
70 else
71 {
72 log.error("Wrong layout attribute for component " + selectOne.getClientId(facesContext) + ": " + layout);
73 }
74 }
75
76 ResponseWriter writer = facesContext.getResponseWriter();
77
78 writer.startElement(HTML.TABLE_ELEM, selectOne);
79 HtmlRendererUtils.renderHTMLAttributes(writer, selectOne,
80 HTML.SELECT_TABLE_PASSTHROUGH_ATTRIBUTES);
81 HtmlRendererUtils.writeIdIfNecessary(writer, uiComponent, facesContext);
82
83 if (!pageDirectionLayout) writer.startElement(HTML.TR_ELEM, selectOne);
84
85 Converter converter;
86 List selectItemList = org.apache.myfaces.shared.renderkit.RendererUtils.getSelectItemList(selectOne);
87 converter = HtmlRendererUtils.findUIOutputConverterFailSafe(facesContext, selectOne);
88
89 Object currentValue = org.apache.myfaces.shared.renderkit.RendererUtils.getObjectValue(selectOne);
90
91 currentValue = org.apache.myfaces.shared.renderkit.RendererUtils.getConvertedStringValue(facesContext, selectOne, converter, currentValue);
92
93 int itemNum = 0;
94
95 for (Iterator it = selectItemList.iterator(); it.hasNext(); )
96 {
97 SelectItem selectItem = (SelectItem)it.next();
98
99 renderGroupOrItemRadio(facesContext, selectOne,
100 selectItem, currentValue,
101 converter, pageDirectionLayout, new Integer(itemNum));
102
103 itemNum++;
104 }
105
106 if (!pageDirectionLayout) writer.endElement(HTML.TR_ELEM);
107 writer.endElement(HTML.TABLE_ELEM);
108 }
109
110
111 protected String getLayout(UIComponent selectOne)
112 {
113 if (selectOne instanceof HtmlSelectOneRadio)
114 {
115 return ((HtmlSelectOneRadio)selectOne).getLayout();
116 }
117
118 return (String)selectOne.getAttributes().get(JSFAttr.LAYOUT_ATTR);
119 }
120
121
122 protected String getStyleClass(UISelectOne selectOne)
123 {
124 if (selectOne instanceof HtmlSelectOneRadio)
125 {
126 return ((HtmlSelectOneRadio)selectOne).getStyleClass();
127 }
128
129 return (String)selectOne.getAttributes().get(JSFAttr.STYLE_CLASS_ATTR);
130 }
131
132
133 protected void renderGroupOrItemRadio(FacesContext facesContext,
134 UIComponent uiComponent, SelectItem selectItem,
135 Object currentValue,
136 Converter converter, boolean pageDirectionLayout,
137 Integer itemNum) throws IOException{
138
139 ResponseWriter writer = facesContext.getResponseWriter();
140
141 boolean isSelectItemGroup = (selectItem instanceof SelectItemGroup);
142
143
144
145
146
147 UISelectOne selectOne = (UISelectOne)uiComponent;
148
149 if (isSelectItemGroup) {
150 if (pageDirectionLayout)
151 writer.startElement(HTML.TR_ELEM, selectOne);
152
153 writer.startElement(HTML.TD_ELEM, selectOne);
154 writer.write(selectItem.getLabel());
155 writer.endElement(HTML.TD_ELEM);
156
157 if (pageDirectionLayout) {
158 writer.endElement(HTML.TR_ELEM);
159 writer.startElement(HTML.TR_ELEM, selectOne);
160 }
161 writer.startElement(HTML.TD_ELEM, selectOne);
162
163 writer.startElement(HTML.TABLE_ELEM, selectOne);
164 writer.writeAttribute(HTML.BORDER_ATTR, "0", null);
165
166 SelectItemGroup group = (SelectItemGroup) selectItem;
167 SelectItem[] selectItems = group.getSelectItems();
168
169 for (int i=0; i<selectItems.length; i++) {
170 renderGroupOrItemRadio(facesContext, selectOne, selectItems[i], currentValue, converter,
171 pageDirectionLayout, new Integer(i));
172 }
173
174 writer.endElement(HTML.TD_ELEM);
175 writer.endElement(HTML.TR_ELEM);
176 writer.endElement(HTML.TABLE_ELEM);
177 writer.endElement(HTML.TD_ELEM);
178
179 if (pageDirectionLayout)
180 writer.endElement(HTML.TR_ELEM);
181
182 } else {
183
184 writer.write("\t\t");
185 if (pageDirectionLayout)
186 writer.startElement(HTML.TR_ELEM, selectOne);
187 writer.startElement(HTML.TD_ELEM, selectOne);
188
189 String itemStrValue = org.apache.myfaces.shared.renderkit.RendererUtils.getConvertedStringValue(facesContext, selectOne, converter, selectItem.getValue());
190 boolean itemDisabled = selectItem.isDisabled();
191
192 boolean itemChecked = itemStrValue.equals(currentValue);
193
194 String itemId = renderRadio(facesContext, selectOne, itemStrValue, itemDisabled, itemChecked, false, itemNum);
195
196
197 boolean componentDisabled = isDisabled(facesContext, selectOne);
198 boolean disabled = (componentDisabled || itemDisabled);
199
200 HtmlRendererUtils.renderLabel(writer, selectOne, itemId, selectItem, disabled);
201
202 writer.endElement(HTML.TD_ELEM);
203 if (pageDirectionLayout)
204 writer.endElement(HTML.TR_ELEM);
205 }
206 }
207
208 @Deprecated
209 protected void renderRadio(FacesContext facesContext,
210 UIComponent uiComponent,
211 String value,
212 String label,
213 boolean disabled,
214 boolean checked, boolean renderId)
215 throws IOException
216 {
217 renderRadio(facesContext, (UIInput) uiComponent, value, 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,
226 String value,
227 boolean disabled,
228 boolean checked,
229 boolean renderId,
230 Integer itemNum)
231 throws IOException
232 {
233 String clientId = uiComponent.getClientId(facesContext);
234
235 String itemId = (itemNum == null)? null : clientId + NamingContainer.SEPARATOR_CHAR + itemNum;
236
237 ResponseWriter writer = facesContext.getResponseWriter();
238
239 writer.startElement(HTML.INPUT_ELEM, uiComponent);
240
241 if (itemId != null)
242 {
243 writer.writeAttribute(HTML.ID_ATTR, itemId, null);
244 }
245 writer.writeAttribute(HTML.TYPE_ATTR, HTML.INPUT_TYPE_RADIO, null);
246 writer.writeAttribute(HTML.NAME_ATTR, clientId, null);
247
248 if (disabled) {
249 writer.writeAttribute(HTML.DISABLED_ATTR, HTML.DISABLED_ATTR, null);
250 }
251
252 if (renderId) {
253 writer.writeAttribute(HTML.ID_ATTR, clientId, null);
254 }
255
256 if (checked)
257 {
258 writer.writeAttribute(HTML.CHECKED_ATTR, HTML.CHECKED_ATTR, null);
259 }
260
261 if (value != null)
262 {
263 writer.writeAttribute(HTML.VALUE_ATTR, value, null);
264 }
265
266 HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.INPUT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_STYLE);
267 if (isDisabled(facesContext, uiComponent))
268 {
269 writer.writeAttribute(org.apache.myfaces.shared.renderkit.html.HTML.DISABLED_ATTR, Boolean.TRUE, null);
270 }
271
272 writer.endElement(HTML.INPUT_ELEM);
273
274 return itemId;
275 }
276
277
278 protected boolean isDisabled(FacesContext facesContext, UIComponent uiComponent)
279 {
280
281 if (uiComponent instanceof HtmlSelectOneRadio)
282 {
283 return ((HtmlSelectOneRadio)uiComponent).isDisabled();
284 }
285
286 return org.apache.myfaces.shared.renderkit.RendererUtils.getBooleanAttribute(uiComponent, HTML.DISABLED_ATTR, false);
287 }
288
289
290 public void decode(FacesContext facesContext, UIComponent uiComponent)
291 {
292 org.apache.myfaces.shared.renderkit.RendererUtils.checkParamValidity(facesContext, uiComponent, null);
293 if (uiComponent instanceof UIInput)
294 {
295 HtmlRendererUtils.decodeUISelectOne(facesContext, uiComponent);
296 }
297 }
298
299
300 public Object getConvertedValue(FacesContext facesContext, UIComponent uiComponent, Object submittedValue) throws ConverterException
301 {
302 RendererUtils.checkParamValidity(facesContext, uiComponent, UISelectOne.class);
303 return org.apache.myfaces.shared.renderkit.RendererUtils.getConvertedUISelectOneValue(facesContext,
304 (UISelectOne)uiComponent,
305 submittedValue);
306 }
307
308 }