View Javadoc

1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    * 
10   *  http://www.apache.org/licenses/LICENSE-2.0
11   * 
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License.
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; // Defaults to LINE_DIRECTION
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         // TODO : Check here for getSubmittedValue. Look at RendererUtils.getValue
144         // this is useless object creation
145 //        Object itemValue = selectItem.getValue();
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         // label element after the input
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         //TODO: overwrite in extended HtmlRadioRenderer and check for enabledOnUserRole
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 }