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 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
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
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
172 writer.writeText(HtmlRendererUtils.STR_EMPTY, null);
173 writer.endElement(HTML.SELECT_ELEM);
174 }
175
176 }