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 java.io.IOException;
22  import java.util.List;
23  import java.util.Map;
24  import java.util.Set;
25  import javax.faces.component.UIComponent;
26  import javax.faces.component.UISelectMany;
27  import javax.faces.component.UISelectOne;
28  import javax.faces.component.behavior.ClientBehavior;
29  import javax.faces.component.behavior.ClientBehaviorHolder;
30  import javax.faces.context.FacesContext;
31  import javax.faces.context.ResponseWriter;
32  import javax.faces.convert.Converter;
33  import org.apache.myfaces.shared.renderkit.RendererUtils;
34  import org.apache.myfaces.shared.renderkit.html.util.JavascriptUtils;
35  
36  /**
37   *
38   * @author Leonardo Uribe
39   */
40  public class HtmlSelectableRendererBase extends HtmlRenderer
41  {
42      
43      protected void internalRenderSelect(FacesContext facesContext,
44              UIComponent uiComponent, boolean disabled, int size,
45              boolean selectMany, Converter converter) throws IOException
46      {
47          ResponseWriter writer = facesContext.getResponseWriter();
48          writer.startElement(HTML.SELECT_ELEM, uiComponent);
49          if (uiComponent instanceof ClientBehaviorHolder
50                  && JavascriptUtils.isJavascriptAllowed(facesContext
51                          .getExternalContext())
52                  && !((ClientBehaviorHolder) uiComponent).getClientBehaviors()
53                          .isEmpty())
54          {
55              writer.writeAttribute(HTML.ID_ATTR,
56                      uiComponent.getClientId(facesContext), null);
57          }
58          else
59          {
60              HtmlRendererUtils.writeIdIfNecessary(writer, uiComponent,
61                      facesContext);
62          }
63          writer.writeAttribute(HTML.NAME_ATTR,
64                  uiComponent.getClientId(facesContext), null);
65          List selectItemList;
66          if (selectMany)
67          {
68              writer.writeAttribute(HTML.MULTIPLE_ATTR, HTML.MULTIPLE_ATTR, null);
69              selectItemList = org.apache.myfaces.shared.renderkit.RendererUtils
70                      .getSelectItemList((UISelectMany) uiComponent, facesContext);
71          }
72          else
73          {
74              selectItemList = RendererUtils.getSelectItemList(
75                      (UISelectOne) uiComponent, facesContext);
76          }
77  
78          if (size == Integer.MIN_VALUE)
79          {
80              //No size given (Listbox) --> size is number of select items
81              writer.writeAttribute(HTML.SIZE_ATTR,
82                      Integer.toString(selectItemList.size()), null);
83          }
84          else
85          {
86              writer.writeAttribute(HTML.SIZE_ATTR, Integer.toString(size), null);
87          }
88          Map<String, List<ClientBehavior>> behaviors = null;
89          if (uiComponent instanceof ClientBehaviorHolder
90                  && JavascriptUtils.isJavascriptAllowed(facesContext
91                          .getExternalContext()))
92          {
93              behaviors = ((ClientBehaviorHolder) uiComponent)
94                      .getClientBehaviors();
95              long commonPropertiesMarked = 0L;
96              if (isCommonPropertiesOptimizationEnabled(facesContext))
97              {
98                  commonPropertiesMarked = CommonPropertyUtils.getCommonPropertiesMarked(uiComponent);
99              }
100             if (behaviors.isEmpty() && isCommonPropertiesOptimizationEnabled(facesContext))
101             {
102                 CommonPropertyUtils.renderChangeEventProperty(writer, 
103                         commonPropertiesMarked, uiComponent);
104                 CommonPropertyUtils.renderEventProperties(writer, 
105                         commonPropertiesMarked, uiComponent);
106                 CommonPropertyUtils.renderFieldEventPropertiesWithoutOnchange(writer, 
107                         commonPropertiesMarked, uiComponent);
108             }
109             else
110             {
111                 HtmlRendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer,
112                         uiComponent, behaviors);
113                 if (isCommonEventsOptimizationEnabled(facesContext))
114                 {
115                     Long commonEventsMarked = CommonEventUtils.getCommonEventsMarked(uiComponent);
116                     CommonEventUtils.renderBehaviorizedEventHandlers(facesContext, writer, 
117                             commonPropertiesMarked, commonEventsMarked, uiComponent, behaviors);
118                     CommonEventUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(
119                         facesContext, writer, commonPropertiesMarked, commonEventsMarked, uiComponent, behaviors);
120                 }
121                 else
122                 {
123                     HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, uiComponent,
124                             behaviors);
125                     HtmlRendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(facesContext,
126                             writer, uiComponent, behaviors);
127                 }
128             }
129             if (isCommonPropertiesOptimizationEnabled(facesContext))
130             {
131                 CommonPropertyUtils.renderSelectPassthroughPropertiesWithoutDisabledAndEvents(writer, 
132                         CommonPropertyUtils.getCommonPropertiesMarked(uiComponent), uiComponent);
133             }
134             else
135             {
136                 HtmlRendererUtils.renderHTMLAttributes(
137                         writer,
138                         uiComponent,
139                         HTML.SELECT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_EVENTS);
140             }
141         }
142         else
143         {
144             if (isCommonPropertiesOptimizationEnabled(facesContext))
145             {
146                 CommonPropertyUtils.renderSelectPassthroughPropertiesWithoutDisabled(writer, 
147                         CommonPropertyUtils.getCommonPropertiesMarked(uiComponent), uiComponent);
148             }
149             else
150             {
151                 HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent,
152                         HTML.SELECT_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
153             }
154         }
155 
156         if (disabled)
157         {
158             writer.writeAttribute(HTML.DISABLED_ATTR, Boolean.TRUE, null);
159         }
160 
161         if (HtmlRendererUtils.isReadOnly(uiComponent))
162         {
163             writer.writeAttribute(HTML.READONLY_ATTR, HTML.READONLY_ATTR, null);
164         }
165 
166         Set lookupSet = HtmlRendererUtils.getSubmittedOrSelectedValuesAsSet(selectMany,
167                 uiComponent, facesContext, converter);
168 
169         HtmlRendererUtils.renderSelectOptions(facesContext, uiComponent, converter, lookupSet,
170                 selectItemList);
171         // bug #970747: force separate end tag
172         writer.writeText(HtmlRendererUtils.STR_EMPTY, null);
173         writer.endElement(HTML.SELECT_ELEM);
174     }
175     
176 }