View Javadoc

1   package org.apache.myfaces.tobago.taglib.extension12;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one or more
5    * contributor license agreements.  See the NOTICE file distributed with
6    * this work for additional information regarding copyright ownership.
7    * The ASF licenses this file to You under the Apache License, Version 2.0
8    * (the "License"); you may not use this file except in compliance with
9    * the License.  You may obtain a copy of the License at
10   *
11   *      http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing, software
14   * distributed under the License is distributed on an "AS IS" BASIS,
15   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16   * See the License for the specific language governing permissions and
17   * limitations under the License.
18   */
19  
20  import org.apache.myfaces.tobago.apt.annotation.ExtensionTag;
21  import org.apache.myfaces.tobago.apt.annotation.Tag;
22  import org.apache.myfaces.tobago.apt.annotation.TagAttribute;
23  import org.apache.myfaces.tobago.apt.annotation.UIComponentTagAttribute;
24  import org.apache.myfaces.tobago.apt.annotation.DynamicExpression;
25  import org.apache.myfaces.tobago.internal.taglib.DatePickerTag;
26  import org.apache.myfaces.tobago.internal.taglib.DateTag;
27  import org.apache.myfaces.tobago.internal.taglib.FormTag;
28  
29  import javax.servlet.jsp.JspException;
30  
31  /*
32   * Date: 19.12.2005
33   * Time: 20:13:26
34   */
35  /**
36   * Renders a date input field with a date picker and a label.
37   * <br />
38   * Short syntax of:
39   * <p/>
40   * <pre>
41   * &lt;tc:panel>
42   *   &lt;f:facet name="layout">
43   *     &lt;tc:gridLayout columns="fixed;*"/>
44   *   &lt;/f:facet>
45   *   &lt;tc:label value="#{label}" for="@auto"/>
46   *   &lt;tc:date value="#{value}">
47   *     ...
48   *   &lt;/tc:in>
49   * &lt;/tc:panel>
50   * </pre>
51   */
52  @Tag(name = "date")
53  @ExtensionTag(baseClassName = "org.apache.myfaces.tobago.internal.taglib.DateTag")
54  public class DateExtensionTag extends TobagoExtensionBodyTagSupport {
55  
56    private static final long serialVersionUID = 2044784791513107420L;
57  
58    private javax.el.ValueExpression binding;
59    private javax.el.ValueExpression converter;
60    private javax.el.MethodExpression validator;
61    private javax.el.ValueExpression disabled;
62    private javax.el.ValueExpression focus;
63    private javax.el.ValueExpression label;
64    private javax.el.ValueExpression readonly;
65    private javax.el.ValueExpression rendered;
66    private javax.el.ValueExpression required;
67    private javax.el.ValueExpression tip;
68    private javax.el.ValueExpression value;
69    private javax.el.MethodExpression valueChangeListener;
70    private javax.el.ValueExpression inline;
71    private javax.el.ValueExpression onchange;
72    private javax.el.ValueExpression tabIndex;
73    private javax.el.ValueExpression markup;
74    private javax.el.ValueExpression validatorMessage;
75    private javax.el.ValueExpression converterMessage;
76    private javax.el.ValueExpression requiredMessage;  
77  
78    private javax.el.ValueExpression labelWidth;
79    private LabelExtensionTag labelTag;
80    private DateTag dateTag;
81  
82    @Override
83    public int doStartTag() throws JspException {
84  
85      labelTag = new LabelExtensionTag();
86      labelTag.setPageContext(pageContext);
87      if (label != null) {
88        labelTag.setValue(label);
89      }
90  
91      if (labelWidth != null) {
92        labelTag.setColumns(createStringValueExpression(labelWidth.getExpressionString() + ";*;fixed"));
93      } else {
94        labelTag.setColumns(createStringValueExpression("fixed;*;fixed"));
95      }
96      if (tip != null) {
97        labelTag.setTip(tip);
98      }
99      if (rendered != null) {
100       labelTag.setRendered(rendered);
101     }
102     if (markup != null) {
103       labelTag.setMarkup(markup);
104     }
105     labelTag.setParent(getParent());
106     labelTag.doStartTag();
107 
108     dateTag = new DateTag();
109     dateTag.setPageContext(pageContext);
110     if (value != null) {
111       dateTag.setValue(value);
112     }
113     if (valueChangeListener != null) {
114       dateTag.setValueChangeListener(valueChangeListener);
115     }
116     if (binding != null) {
117       dateTag.setBinding(binding);
118     }
119     if (converter != null) {
120       dateTag.setConverter(converter);
121     }
122     if (validator != null) {
123       dateTag.setValidator(validator);
124     }
125     if (disabled != null) {
126       dateTag.setDisabled(disabled);
127     }
128     if (onchange != null) {
129       dateTag.setOnchange(onchange);
130     }
131     if (focus != null) {
132       dateTag.setFocus(focus);
133     }
134     if (id != null) {
135       dateTag.setId(id);
136     }
137     if (inline != null) {
138       dateTag.setInline(inline);
139     }
140     if (readonly != null) {
141       dateTag.setReadonly(readonly);
142     }
143     if (required != null) {
144       dateTag.setRequired(required);
145     }
146     if (markup != null) {
147       dateTag.setMarkup(markup);
148     }
149     if (tabIndex != null) {
150       dateTag.setTabIndex(tabIndex);
151     }
152     if (validatorMessage != null) {
153       dateTag.setValidatorMessage(validatorMessage);
154     }
155     if (converterMessage != null) {
156       dateTag.setConverterMessage(converterMessage);
157     }
158     if (requiredMessage != null) {
159       dateTag.setRequiredMessage(requiredMessage);
160     }
161 
162     dateTag.setParent(labelTag);
163     dateTag.doStartTag();
164 
165     return super.doStartTag();
166   }
167 
168 
169 
170   @Override
171   public int doEndTag() throws JspException {
172     dateTag.doEndTag();
173     FormTag formTag = new FormTag();
174     formTag.setPageContext(pageContext);
175     formTag.setParent(labelTag);
176     formTag.doStartTag();
177 
178     DatePickerTag datePicker = new DatePickerTag();
179     datePicker.setPageContext(pageContext);
180     datePicker.setFor("@auto");
181     if (tabIndex != null) {
182       datePicker.setTabIndex(tabIndex);
183     }
184     datePicker.setParent(formTag);
185     datePicker.doStartTag();
186     datePicker.doEndTag();
187     formTag.doEndTag();
188 
189     labelTag.doEndTag();
190     return super.doEndTag();
191   }
192 
193   @Override
194   public void release() {
195     super.release();
196     binding = null;
197     converter = null;
198     validator = null;
199     disabled = null;
200     labelWidth = null;
201     focus = null;
202     label = null;
203     inline = null;
204     readonly = null;
205     rendered = null;
206     required = null;
207     tip = null;
208     value = null;
209     valueChangeListener = null;
210     onchange = null;
211     markup = null;
212     tabIndex = null;
213     labelTag = null;
214     dateTag = null;
215     validatorMessage = null;
216     converterMessage = null;
217     requiredMessage = null;
218   }
219 
220   /**
221    * The current value of this component.
222    */
223   @TagAttribute
224   @UIComponentTagAttribute(type = "java.lang.Object")
225   public void setValue(javax.el.ValueExpression value) {
226     this.value = value;
227   }
228 
229   /**
230    * MethodBinding representing a value change listener method
231    * that will be notified when a new value has been set for this input component.
232    * The expression must evaluate to a public method that takes a ValueChangeEvent
233    * parameter, with a return type of void.
234    *
235    * @param valueChangeListener
236    */
237   @TagAttribute
238   @UIComponentTagAttribute(
239           type = {},
240           expression = DynamicExpression.METHOD_BINDING_REQUIRED,
241           methodSignature = "javax.faces.event.ValueChangeEvent")
242   public void setValueChangeListener(javax.el.MethodExpression valueChangeListener) {
243     this.valueChangeListener = valueChangeListener;
244   }
245 
246   /**
247    * Text value to display as label.
248    * If text contains an underscore the next character is used as accesskey.
249    */
250   @TagAttribute
251   @UIComponentTagAttribute()
252   public void setLabel(javax.el.ValueExpression label) {
253     this.label = label;
254   }
255 
256   /**
257    * Clientside script function to add to this component's onchange handler.
258    */
259   @TagAttribute
260   @UIComponentTagAttribute()
261   public void setOnchange(javax.el.ValueExpression onchange) {
262     this.onchange = onchange;
263   }
264 
265   /**
266    * Flag indicating this component should recieve the focus.
267    */
268   @TagAttribute
269   @UIComponentTagAttribute(type = "java.lang.Boolean")
270   public void setFocus(javax.el.ValueExpression focus) {
271     this.focus = focus;
272   }
273 
274   /**
275    * The value binding expression linking this
276    * component to a property in a backing bean.
277    */
278   @TagAttribute
279   @UIComponentTagAttribute(type = "javax.faces.component.UIComponent")
280   public void setBinding(javax.el.ValueExpression binding) {
281     this.binding = binding;
282   }
283 
284   /**
285    * Flag indicating whether or not this component should be rendered
286    * (during Render Response Phase), or processed on any subsequent form submit.
287    */
288   @TagAttribute
289   @UIComponentTagAttribute(type = "java.lang.Boolean", defaultValue = "true")
290   public void setRendered(javax.el.ValueExpression rendered) {
291     this.rendered = rendered;
292   }
293 
294   /**
295    * An expression that specifies the Converter for this component.
296    * If the value binding expression is a String,
297    * the String is used as an ID to look up a Converter.
298    * If the value binding expression is a Converter,
299    * uses that instance as the converter.
300    * The value can either be a static value (ID case only)
301    * or an EL expression.
302    */
303   @TagAttribute
304   @UIComponentTagAttribute(type = "javax.faces.convert.Converter",
305       expression = DynamicExpression.VALUE_BINDING)
306   public void setConverter(javax.el.ValueExpression converter) {
307     this.converter = converter;
308   }
309 
310   /**
311    * A method binding EL expression,
312    * accepting FacesContext, UIComponent,
313    * and Object parameters, and returning void, that validates
314    * the component's local value.
315    */
316   @TagAttribute
317   @UIComponentTagAttribute(type = {},
318       expression = DynamicExpression.METHOD_BINDING,
319       methodSignature = { "javax.faces.context.FacesContext", "javax.faces.component.UIComponent", "java.lang.Object" })
320   public void setValidator(javax.el.MethodExpression validator) {
321     this.validator = validator;
322   }
323 
324   /**
325    * Flag indicating this component should rendered as an inline element.
326    */
327   @TagAttribute
328   @UIComponentTagAttribute(type = "java.lang.Boolean")
329   public void setInline(javax.el.ValueExpression inline) {
330     this.inline = inline;
331   }
332 
333   /**
334    * Flag indicating that this component will prohibit changes by the user.
335    */
336   @TagAttribute
337   @UIComponentTagAttribute(type = "java.lang.Boolean")
338   public void setReadonly(javax.el.ValueExpression readonly) {
339     this.readonly = readonly;
340   }
341 
342   /**
343    * Flag indicating that this element is disabled.
344    */
345   @TagAttribute()
346   @UIComponentTagAttribute(type = "java.lang.Boolean", defaultValue = "false")
347   public void setDisabled(javax.el.ValueExpression disabled) {
348     this.disabled = disabled;
349   }
350 
351   /**
352    * Flag indicating that a value is required.
353    * If the value is an empty string a
354    * ValidationError occurs and a Error Message is rendered.
355    */
356   @TagAttribute
357   @UIComponentTagAttribute(type = "java.lang.Boolean")
358   public void setRequired(javax.el.ValueExpression required) {
359     this.required = required;
360   }
361 
362   /**
363    * Text value to display as tooltip.
364    */
365   @TagAttribute
366   @UIComponentTagAttribute()
367   public void setTip(javax.el.ValueExpression tip) {
368     this.tip = tip;
369   }
370 
371    /**
372    * The width for the label component. Default: 'fixed'.
373    * This value is used in the gridLayouts columns attribute.
374    * See gridLayout tag for valid values.
375    */
376   @TagAttribute
377   @UIComponentTagAttribute()
378   public void setLabelWidth(javax.el.ValueExpression labelWidth) {
379     this.labelWidth = labelWidth;
380   }
381 
382   /**
383    * Indicate markup of this component.
384    * Possible value is 'none'. But this can be overridden in the theme.
385    */
386   @TagAttribute
387   @UIComponentTagAttribute(defaultValue = "none", type = "java.lang.String[]")
388   public void setMarkup(javax.el.ValueExpression markup) {
389     this.markup = markup;
390   }
391 
392   @TagAttribute
393   @UIComponentTagAttribute(type = "java.lang.Integer")
394   public void setTabIndex(javax.el.ValueExpression tabIndex) {
395     this.tabIndex = tabIndex;
396   }
397 
398   /**
399    * An expression that specifies the validator message
400    */
401   @TagAttribute
402   @UIComponentTagAttribute()
403   public void setValidatorMessage(javax.el.ValueExpression validatorMessage) {
404     this.validatorMessage = validatorMessage;
405   }
406 
407   /**
408    * An expression that specifies the converter message
409    */
410   @TagAttribute
411   @UIComponentTagAttribute()
412   public void setConverterMessage(javax.el.ValueExpression converterMessage) {
413     this.converterMessage = converterMessage;
414   }
415 
416   /**
417    * An expression that specifies the required message
418    */
419   @TagAttribute
420   @UIComponentTagAttribute()
421   public void setRequiredMessage(javax.el.ValueExpression requiredMessage) {
422     this.requiredMessage = requiredMessage;
423   }
424 
425 }