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.custom.calendar;
20  
21  import org.apache.myfaces.component.AlignProperty;
22  import org.apache.myfaces.component.LocationAware;
23  import org.apache.myfaces.component.UserRoleAware;
24  import org.apache.myfaces.component.UserRoleUtils;
25  import org.apache.myfaces.component.html.ext.HtmlInputText;
26  
27  /**
28   *  <p>
29   *  Provides a calendar. The calendar can be "inline", or a button can be rendered
30   *  that displays the calendar in a "popup window" when clicked. Javascript is
31   *  required for the popup window.
32   *  </p>
33   *  <p>
34   *  The two forms of calendar are unfortunately not well integrated; this component is
35   *  effectively two components that happen to use the same component class. Some
36   *  attributes on the component are applicable only to the inline form while others
37   *  are applicable only to the popup form.
38   *  </p>
39   *  <p>
40   *  The appearance of the inline calendar can be controlled via attributes
41   *  such as currentDayCellClass, dayCellClass, weekRowClass, monthYearRowClass. 
42   *  Attributes "styleLocation", "javascriptLocation", "imageLocation" and all
43   *  attributes starting with "popup" have no effect on an inline calendar.
44   *  </p>
45   *  <ul>
46   *  <p>
47   *  The appearance of the popup calendar can be controlled via attributes
48   *  popupTheme, styleLocation, javascriptLocation and imageLocation:
49   *  </p>
50   *    <li>popupTheme: When styleLocation is not overridden then this selects one of the
51   *    built-in themes ("WH" or "DB"); the default is "DB". This also selects the prefix
52   * used for the names of style classes attached to generated dom elements; all style
53   * names are of form "jscalendar-{popupTheme}-*".  
54   * </li>
55   * <li>styleLocation: specifies the URL of a directory in which a "theme.css" file exists.
56   *  A reference to this theme.css file will automatically be output. Specifying "none" as the
57   *  location prevents the generation of this stylesheet reference; it is assumed that the
58   *  necessary style rules will be loaded via some other mechanism. Defaults to a reference
59   *  to a location within the tomahawk jarfile which varies based on popupTheme.</li>
60   * <li>javascriptLocation: specifies the URL of a directory in which all the necessary script
61   *   files can be found. A reference to scripts "prototype.js", "date.js" and "popcalendar.js"
62   *   will automatically be output. Specifying "none" prevents generation of these references;
63   *       it is assumed that the necessary javascript functions will be loaded via some other
64   *       mechanism. Defaults to a reference to a location within the tomahawk jarfile.</li>
65   *    <li>imageLocation: specifies the URL of a directory in which all the necessary icons are
66   *       defined. Defaults to a reference to a location within the tomahawk jarfile which
67   *       varies depending on popupTheme.</li>
68   *  </ul>
69   *  Other styling attributes (eg dayCellClass, weekRowClass) are ignored for the popup calendar.
70   *  <p>
71   *  Unless otherwise specified, all attributes accept static values or EL expressions.
72   *  </p>
73   * 
74   * @JSFComponent
75   *   name = "t:inputCalendar"
76   *   class = "org.apache.myfaces.custom.calendar.HtmlInputCalendar"
77   *   tagClass = "org.apache.myfaces.custom.calendar.HtmlInputCalendarTag"
78   *   tagSuperclass = "org.apache.myfaces.custom.calendar.AbstractHtmlInputCalendarTag"
79   *   tagHandler = "org.apache.myfaces.custom.calendar.HtmlInputCalendarTagHandler"
80   * @since 1.1.7
81   * @author Martin Marinschek (latest modification by $Author: lu4242 $)
82   * @version $Revision: 990311 $ $Date: 2010-08-27 21:04:55 -0500 (Fri, 27 Aug 2010) $
83   */
84  public abstract class AbstractHtmlInputCalendar
85          extends HtmlInputText implements UserRoleAware, LocationAware,
86          AlignProperty
87  {
88  
89      public static final String COMPONENT_TYPE = "org.apache.myfaces.HtmlInputCalendar";
90      private static final String DEFAULT_RENDERER_TYPE = "org.apache.myfaces.Calendar";
91      
92      public boolean isRendered()
93      {
94          if (!UserRoleUtils.isVisibleOnUserRole(this)) return false;
95          return super.isRendered();
96      }
97      
98      /**
99       * Indicate an object used as a bridge between the java.util.Date instance
100      * used by this component internally and the value object used on the bean,
101      * referred as a "business" value.
102      * 
103      * <ul>
104      * <li>If the value is literal, look for the mentioned class instance, 
105      * create a new instance and assign to the component property.</li>
106      * <li>If it the value a EL Expression, set the expression to the 
107      * component property.</li>
108      * </ul> 
109      * 
110      * @JSFProperty stateHolder="true" inheritedTag="true"
111      */
112     public abstract DateBusinessConverter getDateBusinessConverter();
113     
114     public abstract void setDateBusinessConverter(DateBusinessConverter dateBusinessConverter);
115         
116     /**
117      * CSS class to be used on the TR element for the header-row showing month and year.
118      * 
119      * @JSFProperty 
120      */
121     public abstract String getMonthYearRowClass();
122 
123     /**
124      * CSS class to be used on the TR element for the header-row showing the week-days.
125      * 
126      * @JSFProperty 
127      */
128     public abstract String getWeekRowClass();
129 
130     /**
131      * CSS class to be used for the TD element containing a day days.
132      * 
133      * @JSFProperty 
134      */
135     public abstract String getDayCellClass();
136 
137     /**
138      * CSS class to be used for the TD element of the currently selected date.
139      * 
140      * @JSFProperty 
141      */
142     public abstract String getCurrentDayCellClass();
143 
144     /**
145      * Render the input-calendar left of the button, not right like normally done.
146      * 
147      * @JSFProperty
148      *   defaultValue = "false" 
149      */
150     public abstract boolean isPopupLeft();
151 
152     /**
153      * Render the input-calendar as a java-script popup on client.
154      * 
155      * @JSFProperty
156      *   defaultValue = false; 
157      */
158     public abstract boolean isRenderAsPopup();
159 
160     /**
161      * Automatically add the input-calendar scripts and css files to 
162      * the header - set that to false to provide the scripts yourself.
163      * 
164      * @JSFProperty
165      *   defaultValue = "true" 
166      */
167     public abstract boolean isAddResources();
168     
169     public abstract void setAddResources(boolean value);
170     
171     public void setAddResources(Boolean value)
172     {
173         this.setAddResources(value.booleanValue());
174     }
175 
176     /**
177      * Defines the string displayed on the button which leads to 
178      * the calendar-popup-window (... by default).
179      * 
180      * @JSFProperty 
181      */
182     public abstract String getPopupButtonString();
183 
184     /**
185      * Defines the css style for the button which leads to the 
186      * calendar-popup-window.
187      * 
188      * @JSFProperty 
189      */
190     public abstract String getPopupButtonStyle();
191 
192     /**
193      * Defines the css style class for the button which leads to the 
194      * calendar-popup-window.
195      * 
196      * @JSFProperty 
197      */
198     public abstract String getPopupButtonStyleClass();
199 
200     /**
201      * If true, renders a calendar icon instead of the button to pop up the calendar.
202      * 
203      * @JSFProperty
204      *   defaultValue = "false" 
205      */
206     public abstract boolean isRenderPopupButtonAsImage();
207 
208     /**
209      * Defines the date format used by the java-script popup on client.
210      * 
211      * @JSFProperty 
212      */
213     public abstract String getPopupDateFormat();
214     
215     /**
216      * Set the string for "Go To Current Month"
217      * 
218      * @JSFProperty 
219      */
220     public abstract String getPopupGotoString();
221 
222     /**
223      * Set the string for "Today is"
224      * 
225      * @JSFProperty 
226      */
227     public abstract String getPopupTodayString();
228 
229     /**
230      * Defines the date format used by the java-script popup 
231      * on client for the today-is string.
232      * 
233      * @JSFProperty 
234      */
235     public abstract String getPopupTodayDateFormat();
236 
237     /**
238      * Set the string for "Wk"
239      * 
240      * @JSFProperty 
241      */
242     public abstract String getPopupWeekString();
243 
244     /**
245      * Set the string for scrolling to the left.
246      * 
247      * @JSFProperty 
248      */
249     public abstract String getPopupScrollLeftMessage();
250 
251     /**
252      * Set the string for scrolling to the right.
253      * 
254      * @JSFProperty 
255      */
256     public abstract String getPopupScrollRightMessage();
257 
258     /**
259      * Set the string for "Click to select a month".
260      * 
261      * @JSFProperty 
262      */
263     public abstract String getPopupSelectMonthMessage();
264 
265     /**
266      * Set the string for "Click to select a year".
267      * 
268      * @JSFProperty 
269      */
270     public abstract String getPopupSelectYearMessage();
271 
272     /**
273      * Set the string for "Select [date] as date" (do not 
274      * replace [date], it will be replaced by the current date).
275      * 
276      * @JSFProperty 
277      */
278     public abstract String getPopupSelectDateMessage();
279 
280     /**
281      * Set the theme-prefix for this component.
282      * 
283      * @JSFProperty 
284      */
285     public abstract String getPopupTheme();
286 
287     /**
288      * Url to the image for this popupButton.
289      * 
290      * @JSFProperty 
291      */
292     public abstract String getPopupButtonImageUrl();
293 
294     /**
295      * The text that will be rendered in the field - helping the 
296      * user to find the right format to enter into the field.
297      * 
298      * @JSFProperty 
299      */
300     public abstract String getHelpText();
301 
302 
303     /**
304      * <p>
305      * May be "day", "week", "month" or "none":
306      * <ul>
307      * <li>day (default): allow the user to select a day.</li>
308      * <li>week: only allow the user to select a week.</li>
309      * <li>month: only allow the user to select a month.</li> 
310      * <li>none: equivalent to "readonly".</li> 
311      * </ul>
312      * </p>
313      * 
314      * @JSFProperty
315      *   defaultValue = "day" 
316      */
317     public abstract String getPopupSelectMode();
318 }