##### Coverage Report - org.apache.turbine.util.DateSelector

Classes in this File | Line Coverage | Branch Coverage | Complexity
DateSelector |
0% | 0/104
0% | 0/30
| 1.8421052631578947;1,842

1 |  |
     package org.apache.turbine.util;
2 |  |
3 |  |
4 |  |
     /*
5 |  |
      * Licensed to the Apache Software Foundation (ASF) under one
6 |  |
      * or more contributor license agreements.  See the NOTICE file
7 |  |
      * distributed with this work for additional information
8 |  |
      * regarding copyright ownership.  The ASF licenses this file
9 |  |
      * to you under the Apache License, Version 2.0 (the
10 |  |
      * "License"); you may not use this file except in compliance
11 |  |
      * with the License.  You may obtain a copy of the License at
12 |  |
      *
13 |  |
      *   http://www.apache.org/licenses/LICENSE-2.0
14 |  |
      *
15 |  |
      * Unless required by applicable law or agreed to in writing,
16 |  |
      * software distributed under the License is distributed on an
17 |  |
      * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18 |  |
      * KIND, either express or implied.  See the License for the
19 |  |
      * specific language governing permissions and limitations
20 |  |
      * under the License.
21 |  |
      */
22 |  |
23 |  |
24 |  |
     import java.text.DateFormatSymbols;
25 |  |
     import java.util.Calendar;
26 |  |
     import java.util.Date;
27 |  |
28 |  |
     import org.apache.ecs.ConcreteElement;
29 |  |
     import org.apache.ecs.ElementContainer;
30 |  |
     import org.apache.ecs.html.Input;
31 |  |
     import org.apache.ecs.html.Option;
32 |  |
     import org.apache.ecs.html.Select;
33 |  |
34 |  |
     /**
35 |  |
      * DateSelector is a utility class to handle the creation of a set of
36 |  |
      * date popup menus.  The code is broken into a set of static methods
37 |  |
      * for quick and easy access to the individual select objects:
38 |  |
      *
39 |  |
      *  <pre>
40 |  |
      *  ElementContainer ec dateSelect = new ElementContainer();
41 |  |
      *  String myName = "mydate";
42 |  |
      *  ec.addElement(DateSelector.getMonthSelector(myName));
43 |  |
      *  ec.addElement(DateSelector.getDaySelector(myName));
44 |  |
      *  ec.addElement(DateSelector.getYearSelector(myName));
45 |  |
      *  </pre>
46 |  |
      *
47 |  |
      * There are also methods which will use attributes to build a
48 |  |
      * complete month,day,year selector:
49 |  |
      *
50 |  |
      *  <pre>
51 |  |
      *  DateSelector ds = new DateSelector(myName);
52 |  |
      *  dateSelect = ds.ecsOutput();
53 |  |
      *  </pre>
54 |  |
      *
55 |  |
      * The above element container would use the onChange setting and may
56 |  |
      * hide the selected day if set via showDays().<br>
57 |  |
      *
58 |  |
      * @author <a href="mailto:ekkerbj@netscape.net">Jeffrey D. Brekke</a>
59 |  |
      * @author <a href="mailto:jon@clearink.com">Jon S. Stevens</a>
60 |  |
      * @author <a href="mailto:leon@clearink.com">Leon Atkinson</a>
61 |  |
      * @version $Id: DateSelector.java 615328 2008-01-25 20:25:05Z tv $
62 |  |
      */
63 |  |
     public class DateSelector
64 |  |
     {
65 |  |
         /** Prefix for date names. */
66 |  |
         public static final String DEFAULT_PREFIX = "DateSelector";
67 |  |
68 |  |
         /** Suffix for day parameter. */
69 |  |
         public static final String DAY_SUFFIX = "_day";
70 |  |
71 |  |
         /** Suffix for month parameter. */
72 |  |
         public static final String MONTH_SUFFIX = "_month";
73 |  |
74 |  |
         /** Suffix for year parameter. */
75 |  |
         public static final String YEAR_SUFFIX = "_year";
76 |  |
77 | 0 |
         private Calendar useDate = null;
78 | 0 |
         private String selName = null;
79 | 0 |
         private static final String[] monthName =
80 |  |
                 new DateFormatSymbols().getMonths();
81 | 0 |
         private String onChange = null;
82 | 0 |
         private boolean onChangeSet = false;
83 | 0 |
         private boolean showDays = true;
84 | 0 |
         private int setDay = 0;
85 | 0 |
         private boolean useYears = false;
86 | 0 |
         private int firstYear = 0;
87 | 0 |
         private int lastYear = 0;
88 | 0 |
         private int selectedYear = 0;
89 |  |
90 |  |
         /**
91 |  |
          * Constructor defaults to current date and uses the default
92 |  |
          * prefix: <pre>DateSelector.DEFAULT</pre>
93 |  |
          */
94 |  |
         public DateSelector()
95 | 0 |
         {
96 | 0 |
             this.selName = DEFAULT_PREFIX;
97 | 0 |
             this.useDate = Calendar.getInstance();
98 | 0 |
             this.useDate.setTime(new Date());
99 | 0 |
         }
100 |  |
101 |  |
         /**
102 |  |
          * Constructor, uses the date set in a calendar that has been
103 |  |
          * already passed in (with the date set correctly).
104 |  |
          *
105 |  |
          * @param selName A String with the selector name.
106 |  |
          * @param useDate A Calendar with a date.
107 |  |
          */
108 |  |
         public DateSelector(String selName, Calendar useDate)
109 | 0 |
         {
110 | 0 |
             this.useDate = useDate;
111 | 0 |
             this.selName = selName;
112 | 0 |
         }
113 |  |
114 |  |
         /**
115 |  |
          * Constructor defaults to current date.
116 |  |
          *
117 |  |
          * @param selName A String with the selector name.
118 |  |
          */
119 |  |
         public DateSelector(String selName)
120 | 0 |
         {
121 | 0 |
             this.selName = selName;
122 | 0 |
             this.useDate = Calendar.getInstance();
123 | 0 |
             this.useDate.setTime(new Date());
124 | 0 |
         }
125 |  |
126 |  |
         /**
127 |  |
          * Adds the onChange to all of &lt;SELECT&gt; tags.  This is limited to
128 |  |
          * one function for all three popups and is only used when the
129 |  |
          * output() methods are used.  Individual getMonth, getDay,
130 |  |
          * getYear static methods will not use this setting.
131 |  |
          *
132 |  |
          * @param string A String to use for onChange attribute.  If null,
133 |  |
          * then nothing will be set.
134 |  |
          * @return A DateSelector (self).
135 |  |
          */
136 |  |
         public DateSelector setOnChange(String onChange)
137 |  |
         {
138 | 0 |
             if (onChange != null)
139 |  |
             {
140 | 0 |
                 this.onChange = onChange;
141 | 0 |
                 this.onChangeSet = true;
142 |  |
             }
143 |  |
             else
144 |  |
             {
145 | 0 |
                 this.onChange = null;
146 | 0 |
                 this.onChangeSet = false;
147 |  |
             }
148 | 0 |
             return this;
149 |  |
         }
150 |  |
151 |  |
         /**
152 |  |
          * Select the day to be selected if the showDays(false) behavior
153 |  |
          * is used.  Individual getMonth, getDay, getYear static methods
154 |  |
          * will not use this setting.
155 |  |
          *
156 |  |
          * @param day The day.
157 |  |
          * @return A DateSelector (self).
158 |  |
          */
159 |  |
         public DateSelector setDay(int day)
160 |  |
         {
161 | 0 |
             this.setDay = day;
162 | 0 |
             this.showDays = false;
163 | 0 |
             return this;
164 |  |
         }
165 |  |
166 |  |
         /**
167 |  |
          * Whether or not to show the days as a popup menu.  The days will
168 |  |
          * be a hidden parameter and the value set with setDay is used.
169 |  |
          * Individual getMonth, getDay, getYear static methods will not
170 |  |
          * use this setting.
171 |  |
          *
172 |  |
          * @param show True if the day should be shown.
173 |  |
          * @return A DateSelector (self).
174 |  |
          */
175 |  |
         public DateSelector setShowDay(boolean show)
176 |  |
         {
177 | 0 |
             this.showDays = false;
178 | 0 |
             return this;
179 |  |
         }
180 |  |
181 |  |
         /**
182 |  |
          * Set the selector name prefix.  Individual getMonth, getDay,
183 |  |
          * getYear static methods will not use this setting.
184 |  |
          *
185 |  |
          * @param selname A String with the select name prefix.
186 |  |
          */
187 |  |
         public void setSelName(String selName)
188 |  |
         {
189 | 0 |
             this.selName = selName;
190 | 0 |
         }
191 |  |
192 |  |
         /**
193 |  |
          * Get the selector name prefix.
194 |  |
          *
195 |  |
          * @return A String with the select name prefix.
196 |  |
          */
197 |  |
         public String getSelName()
198 |  |
         {
199 | 0 |
             return selName;
200 |  |
         }
201 |  |
202 |  |
         /**
203 |  |
          * Return a month selector.
204 |  |
          *
205 |  |
          * @param name The name to use for the selected month.
206 |  |
          * @return A select object with all the months.
207 |  |
          */
208 |  |
         public static Select getMonthSelector(String name)
209 |  |
         {
210 | 0 |
             return (getMonthSelector(name, Calendar.getInstance()));
211 |  |
         }
212 |  |
213 |  |
         /**
214 |  |
          * Return a month selector.
215 |  |
          *
216 |  |
          * Note: The values of the month placed into the select list are
217 |  |
          * the month integers starting at 0 (ie: if the user selects
218 |  |
          * February, the selected value will be 1).
219 |  |
          *
220 |  |
          * @param name The name to use for the selected month.
221 |  |
          * @param now Calendar to start with.
222 |  |
          * @return A select object with all the months.
223 |  |
          */
224 |  |
         public static Select getMonthSelector(String name, Calendar now)
225 |  |
         {
226 | 0 |
             Select monthSelect = new Select().setName(name);
227 |  |
228 | 0 |
             for (int curMonth = 0; curMonth <= 11; curMonth++)
229 |  |
             {
230 | 0 |
                 Option o = new Option();
231 | 0 |
                 o.addElement(monthName[curMonth]);
232 | 0 |
                 o.setValue(curMonth);
233 | 0 |
                 if ((now.get(Calendar.MONTH)) == curMonth)
234 |  |
                 {
235 | 0 |
                     o.setSelected(true);
236 |  |
                 }
237 | 0 |
                 monthSelect.addElement(o);
238 |  |
             }
239 | 0 |
             return (monthSelect);
240 |  |
         }
241 |  |
242 |  |
         /**
243 |  |
          * Return a day selector.
244 |  |
          *
245 |  |
          * @param name The name to use for the selected day.
246 |  |
          * @return A select object with all the days in a month.
247 |  |
          */
248 |  |
         public static Select getDaySelector(String name)
249 |  |
         {
250 | 0 |
             return (getDaySelector(name, Calendar.getInstance()));
251 |  |
         }
252 |  |
253 |  |
         /**
254 |  |
          * Return a day selector.
255 |  |
          *
256 |  |
          * @param name The name to use for the selected day.
257 |  |
          * @param now Calendar to start with.
258 |  |
          * @return A select object with all the days in a month.
259 |  |
          */
260 |  |
         public static Select getDaySelector(String name, Calendar now)
261 |  |
         {
262 | 0 |
             Select daySelect = new Select().setName(name);
263 |  |
264 | 0 |
             for (int currentDay = 1; currentDay <= 31; currentDay++)
265 |  |
             {
266 | 0 |
                 Option o = new Option();
267 | 0 |
                 o.addElement(Integer.toString(currentDay));
268 | 0 |
                 o.setValue(currentDay);
269 | 0 |
                 if (now.get(Calendar.DAY_OF_MONTH) == currentDay)
270 |  |
                 {
271 | 0 |
                     o.setSelected(true);
272 |  |
                 }
273 | 0 |
                 daySelect.addElement(o);
274 |  |
             }
275 | 0 |
             return (daySelect);
276 |  |
         }
277 |  |
278 |  |
         /**
279 |  |
          * Return a year selector.
280 |  |
          *
281 |  |
          * @param name The name to use for the selected year.
282 |  |
          * @return A select object with all the years starting five years
283 |  |
          * from now and five years before this year.
284 |  |
          */
285 |  |
         public static Select getYearSelector(String name)
286 |  |
         {
287 | 0 |
             return (getYearSelector(name, Calendar.getInstance()));
288 |  |
         }
289 |  |
290 |  |
         /**
291 |  |
          * Return a year selector.
292 |  |
          *
293 |  |
          * @param name The name to use for the selected year.
294 |  |
          * @param now Calendar to start with.
295 |  |
          * @return A select object with all the years starting five years
296 |  |
          * from now and five years before this year.
297 |  |
          */
298 |  |
         public static Select getYearSelector(String name, Calendar now)
299 |  |
         {
300 | 0 |
             int startYear = now.get(Calendar.YEAR);
301 | 0 |
             return (getYearSelector(name, startYear - 5, startYear + 5, startYear));
302 |  |
         }
303 |  |
304 |  |
         /**
305 |  |
          * Return a year selector.
306 |  |
          *
307 |  |
          * @param name The name to use for the selected year.
308 |  |
          * @param firstYear the first (earliest) year in the selector.
309 |  |
          * @param lastYear the last (latest) year in the selector.
310 |  |
          * @param selectedYear the year initially selected in the Select html.
311 |  |
          * @return A select object with all the years from firstyear
312 |  |
          * to lastyear..
313 |  |
          */
314 |  |
         public static Select getYearSelector(String name,
315 |  |
                                              int firstYear, int lastYear,
316 |  |
                                              int selectedYear)
317 |  |
         {
318 | 0 |
             Select yearSelect = new Select().setName(name);
319 |  |
320 | 0 |
             for (int currentYear = firstYear;
321 | 0 |
                  currentYear <= lastYear;
322 |  |
323 | 0 |
                  currentYear++)
324 |  |
             {
325 | 0 |
                 Option o = new Option();
326 | 0 |
                 o.addElement(Integer.toString(currentYear));
327 | 0 |
                 o.setValue(currentYear);
328 | 0 |
                 if (currentYear == selectedYear)
329 |  |
                 {
330 | 0 |
                     o.setSelected(true);
331 |  |
                 }
332 | 0 |
                 yearSelect.addElement(o);
333 |  |
             }
334 | 0 |
             return (yearSelect);
335 |  |
         }
336 |  |
337 |  |
         /**
338 |  |
          * Select the day to be selected if the showDays(false) behavior
339 |  |
          * is used.  Individual getMonth, getDay, getYear static methods
340 |  |
          * will not use this setting.
341 |  |
          *
342 |  |
          * @param day The day.
343 |  |
          * @return A DateSelector (self).
344 |  |
          */
345 |  |
         public boolean setYear(int firstYear, int lastYear, int selectedYear)
346 |  |
         {
347 | 0 |
             if (firstYear <= lastYear && firstYear <= selectedYear
348 |  |
                     && selectedYear <= lastYear)
349 |  |
             {
350 | 0 |
                 this.useYears = true;
351 | 0 |
                 this.firstYear = firstYear;
352 | 0 |
                 this.lastYear = lastYear;
353 | 0 |
                 this.selectedYear = selectedYear;
354 | 0 |
                 return true;
355 |  |
             }
356 |  |
             else
357 |  |
             {
358 | 0 |
                 return false;
359 |  |
             }
360 |  |
         }
361 |  |
362 |  |
         /**
363 |  |
          * Used to build the popupmenu in HTML.  The properties set in the
364 |  |
          * object are used to generate the correct HTML.  The selName
365 |  |
          * attribute is used to seed the names of the select lists.  The
366 |  |
          * names will be generated as follows:
367 |  |
          *
368 |  |
          * <ul>
369 |  |
          *  <li>selName + "_month"</li>
370 |  |
          *  <li>selName + "_day"</li>
371 |  |
          *  <li>selName + "_year"</li>
372 |  |
          * </ul>
373 |  |
          *
374 |  |
          * If onChange was set it is also used in the generation of the
375 |  |
          * output.  The output HTML will list the select lists in the
376 |  |
          * following order: month day year.
377 |  |
          *
378 |  |
          * @return A String with the correct HTML for the date selector.
379 |  |
          */
380 |  |
         public String output()
381 |  |
         {
382 | 0 |
             return (ecsOutput().toString());
383 |  |
         }
384 |  |
385 |  |
         /**
386 |  |
          * Used to build the popupmenu in HTML.  The properties set in the
387 |  |
          * object are used to generate the correct HTML.  The selName
388 |  |
          * attribute is used to seed the names of the select lists.  The
389 |  |
          * names will be generated as follows:
390 |  |
          *
391 |  |
          * <ul>
392 |  |
          *  <li>selName + "_month"</li>
393 |  |
          *  <li>selName + "_day"</li>
394 |  |
          *  <li>selName + "_year"</li>
395 |  |
          * </ul>
396 |  |
          *
397 |  |
          * The output HTML will list the select lists in the following
398 |  |
          * order: month day year.
399 |  |
          *
400 |  |
          * @return A String with the correct HTML for the date selector.
401 |  |
          */
402 |  |
         public String toString()
403 |  |
         {
404 | 0 |
             return (ecsOutput().toString());
405 |  |
         }
406 |  |
407 |  |
         /*
408 |  |
          * Return an ECS container with the month, day, and year select
409 |  |
          * objects inside.
410 |  |
          *
411 |  |
          * @return An ECS container.
412 |  |
          */
413 |  |
         public ElementContainer ecsOutput()
414 |  |
         {
415 | 0 |
             if (this.useDate == null)
416 |  |
             {
417 | 0 |
                 this.useDate.setTime(new Date());
418 |  |
             }
419 |  |
420 | 0 |
             Select monthSelect = getMonthSelector(selName + MONTH_SUFFIX, useDate);
421 | 0 |
             ConcreteElement daySelect = null;
422 | 0 |
             if (!showDays)
423 |  |
             {
424 | 0 |
                 daySelect = new Input(Input.hidden, selName + DAY_SUFFIX, setDay);
425 |  |
             }
426 |  |
             else
427 |  |
             {
428 | 0 |
                 Select tmp = getDaySelector(selName + DAY_SUFFIX, useDate);
429 | 0 |
                 if (onChangeSet)
430 |  |
                 {
431 | 0 |
                     tmp.setOnChange(onChange);
432 |  |
                 }
433 | 0 |
                 daySelect = tmp;
434 |  |
             }
435 | 0 |
             Select yearSelect = null;
436 | 0 |
             if (useYears)
437 |  |
             {
438 | 0 |
                 yearSelect = getYearSelector(selName + YEAR_SUFFIX,
439 |  |
                         firstYear, lastYear, selectedYear);
440 |  |
             }
441 |  |
             else
442 |  |
             {
443 | 0 |
                 yearSelect = getYearSelector(selName + YEAR_SUFFIX, useDate);
444 |  |
             }
445 | 0 |
             if (onChangeSet)
446 |  |
             {
447 | 0 |
                 monthSelect.setOnChange(onChange);
448 | 0 |
                 yearSelect.setOnChange(onChange);
449 |  |
             }
450 | 0 |
             ElementContainer ec = new ElementContainer();
451 |  |
             // ec.addElement(new Comment("== BEGIN org.apache.turbine.util.DateSelector.ecsOutput() =="));
452 | 0 |
             ec.addElement(monthSelect);
453 | 0 |
             ec.addElement(daySelect);
454 | 0 |
             ec.addElement(yearSelect);
455 |  |
             // ec.addElement(new Comment("== END org.apache.turbine.util.DateSelector.ecsOutput() =="));
456 | 0 |
             return (ec);
457 |  |
         }
458 |  |
     }