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