1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.struts.taglib.html;
22
23 import org.apache.struts.Globals;
24 import org.apache.struts.taglib.TagUtils;
25 import org.apache.struts.util.MessageResources;
26
27 import javax.servlet.jsp.JspException;
28 import javax.servlet.jsp.tagext.BodyTagSupport;
29
30 /**
31 * Tag for select options. The body of this tag is presented to the user in
32 * the option list, while the value attribute is the value returned to the
33 * server if this option is selected.
34 *
35 * @version $Rev: 479633 $ $Date: 2005-08-21 19:08:45 -0400 (Sun, 21 Aug 2005)
36 * $
37 */
38 public class OptionTag extends BodyTagSupport {
39
40
41 /**
42 * The message resources for this package.
43 */
44 protected static MessageResources messages =
45 MessageResources.getMessageResources(Constants.Package
46 + ".LocalStrings");
47
48
49 /**
50 * The message text to be displayed to the user for this tag (if any)
51 */
52 protected String text = null;
53
54
55
56 /**
57 * The name of the servlet context attribute containing our message
58 * resources.
59 */
60 protected String bundle = Globals.MESSAGES_KEY;
61
62 /**
63 * Is this option disabled?
64 */
65 protected boolean disabled = false;
66
67 /**
68 * Should the label be filtered for HTML sensitive characters?
69 */
70 protected boolean filter = false;
71
72 /**
73 * The key used to look up the text displayed to the user for this option,
74 * if any.
75 */
76 protected String key = null;
77
78 /**
79 * The name of the attribute containing the Locale to be used for looking
80 * up internationalized messages.
81 */
82 protected String locale = Globals.LOCALE_KEY;
83
84 /**
85 * The style associated with this tag.
86 */
87 private String style = null;
88
89 /**
90 * The named style class associated with this tag.
91 */
92 private String styleClass = null;
93
94 /**
95 * The identifier associated with this tag.
96 */
97 protected String styleId = null;
98
99 /**
100 * The language code of this element.
101 */
102 private String lang = null;
103
104 /**
105 * The direction for weak/neutral text of this element.
106 */
107 private String dir = null;
108
109 /**
110 * The server value for this option, also used to match against the
111 * current property value to determine whether this option should be
112 * marked as selected.
113 */
114 protected String value = null;
115
116 public String getBundle() {
117 return (this.bundle);
118 }
119
120 public void setBundle(String bundle) {
121 this.bundle = bundle;
122 }
123
124 public boolean getDisabled() {
125 return (this.disabled);
126 }
127
128 public void setDisabled(boolean disabled) {
129 this.disabled = disabled;
130 }
131
132 public boolean getFilter() {
133 return (this.filter);
134 }
135
136 public void setFilter(boolean filter) {
137 this.filter = filter;
138 }
139
140 public String getKey() {
141 return (this.key);
142 }
143
144 public void setKey(String key) {
145 this.key = key;
146 }
147
148 public String getLocale() {
149 return (this.locale);
150 }
151
152 public void setLocale(String locale) {
153 this.locale = locale;
154 }
155
156 public String getStyle() {
157 return style;
158 }
159
160 public void setStyle(String style) {
161 this.style = style;
162 }
163
164 public String getStyleClass() {
165 return styleClass;
166 }
167
168 public void setStyleClass(String styleClass) {
169 this.styleClass = styleClass;
170 }
171
172 /**
173 * Return the style identifier for this tag.
174 */
175 public String getStyleId() {
176 return (this.styleId);
177 }
178
179 /**
180 * Set the style identifier for this tag.
181 *
182 * @param styleId The new style identifier
183 */
184 public void setStyleId(String styleId) {
185 this.styleId = styleId;
186 }
187
188 public String getValue() {
189 return (this.value);
190 }
191
192 public void setValue(String value) {
193 this.value = value;
194 }
195
196 /**
197 * Returns the language code of this element.
198 *
199 * @since Struts 1.3.6
200 */
201 public String getLang() {
202 return this.lang;
203 }
204
205 /**
206 * Sets the language code of this element.
207 *
208 * @since Struts 1.3.6
209 */
210 public void setLang(String lang) {
211 this.lang = lang;
212 }
213
214 /**
215 * Returns the direction for weak/neutral text this element.
216 *
217 * @since Struts 1.3.6
218 */
219 public String getDir() {
220 return this.dir;
221 }
222
223 /**
224 * Sets the direction for weak/neutral text of this element.
225 *
226 * @since Struts 1.3.6
227 */
228 public void setDir(String dir) {
229 this.dir = dir;
230 }
231
232
233
234 /**
235 * Process the start of this tag.
236 *
237 * @throws JspException if a JSP exception has occurred
238 */
239 public int doStartTag() throws JspException {
240
241 this.text = null;
242
243
244 return (EVAL_BODY_TAG);
245 }
246
247 /**
248 * Process the body text of this tag (if any).
249 *
250 * @throws JspException if a JSP exception has occurred
251 */
252 public int doAfterBody() throws JspException {
253 if (bodyContent != null) {
254 String text = bodyContent.getString();
255
256 if (text != null) {
257 text = text.trim();
258
259 if (text.length() > 0) {
260 this.text = text;
261 }
262 }
263 }
264
265 return (SKIP_BODY);
266 }
267
268 /**
269 * Process the end of this tag.
270 *
271 * @throws JspException if a JSP exception has occurred
272 */
273 public int doEndTag() throws JspException {
274 TagUtils.getInstance().write(pageContext, this.renderOptionElement());
275
276 return (EVAL_PAGE);
277 }
278
279 /**
280 * Generate an HTML %lt;option> element.
281 *
282 * @throws JspException
283 * @since Struts 1.1
284 */
285 protected String renderOptionElement()
286 throws JspException {
287 StringBuffer results = new StringBuffer("<option value=\"");
288
289 if (filter) {
290 results.append(TagUtils.getInstance().filter(this.value));
291 }
292 else {
293 results.append(this.value);
294 }
295 results.append("\"");
296
297 if (disabled) {
298 results.append(" disabled=\"disabled\"");
299 }
300
301 if (this.selectTag().isMatched(this.value)) {
302 results.append(" selected=\"selected\"");
303 }
304
305 if (style != null) {
306 results.append(" style=\"");
307 results.append(style);
308 results.append("\"");
309 }
310
311 if (styleId != null) {
312 results.append(" id=\"");
313 results.append(styleId);
314 results.append("\"");
315 }
316
317 if (styleClass != null) {
318 results.append(" class=\"");
319 results.append(styleClass);
320 results.append("\"");
321 }
322
323 if (dir != null) {
324 results.append(" dir=\"");
325 results.append(dir);
326 results.append("\"");
327 }
328
329 if (lang != null) {
330 results.append(" lang=\"");
331 results.append(lang);
332 results.append("\"");
333 }
334
335 results.append(">");
336
337 results.append(text());
338
339 results.append("</option>");
340
341 return results.toString();
342 }
343
344 /**
345 * Acquire the select tag we are associated with.
346 *
347 * @throws JspException
348 */
349 private SelectTag selectTag()
350 throws JspException {
351 SelectTag selectTag =
352 (SelectTag) pageContext.getAttribute(Constants.SELECT_KEY);
353
354 if (selectTag == null) {
355 JspException e =
356 new JspException(messages.getMessage("optionTag.select"));
357
358 TagUtils.getInstance().saveException(pageContext, e);
359 throw e;
360 }
361
362 return selectTag;
363 }
364
365 /**
366 * Release any acquired resources.
367 */
368 public void release() {
369 super.release();
370 bundle = Globals.MESSAGES_KEY;
371 dir = null;
372 disabled = false;
373 key = null;
374 lang = null;
375 locale = Globals.LOCALE_KEY;
376 style = null;
377 styleClass = null;
378 text = null;
379 value = null;
380 }
381
382
383
384 /**
385 * Return the text to be displayed to the user for this option (if any).
386 *
387 * @throws JspException if an error occurs
388 */
389 protected String text() throws JspException {
390 String optionText = this.text;
391
392 if ((optionText == null) && (this.key != null)) {
393 optionText =
394 TagUtils.getInstance().message(pageContext, bundle, locale, key);
395 }
396
397
398 if (optionText == null) {
399 optionText = this.value;
400 }
401
402 return optionText;
403 }
404 }