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

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