| package org.apache.turbine.util; |
| |
| /* ==================================================================== |
| * The Apache Software License, Version 1.1 |
| * |
| * Copyright (c) 2001-2003 The Apache Software Foundation. All rights |
| * reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * |
| * 3. The end-user documentation included with the redistribution, |
| * if any, must include the following acknowledgment: |
| * "This product includes software developed by the |
| * Apache Software Foundation (http://www.apache.org/)." |
| * Alternately, this acknowledgment may appear in the software itself, |
| * if and wherever such third-party acknowledgments normally appear. |
| * |
| * 4. The names "Apache" and "Apache Software Foundation" and |
| * "Apache Turbine" must not be used to endorse or promote products |
| * derived from this software without prior written permission. For |
| * written permission, please contact apache@apache.org. |
| * |
| * 5. Products derived from this software may not be called "Apache", |
| * "Apache Turbine", nor may "Apache" appear in their name, without |
| * prior written permission of the Apache Software Foundation. |
| * |
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR |
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF |
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
| * SUCH DAMAGE. |
| * ==================================================================== |
| * |
| * This software consists of voluntary contributions made by many |
| * individuals on behalf of the Apache Software Foundation. For more |
| * information on the Apache Software Foundation, please see |
| * <http://www.apache.org/>. |
| */ |
| |
| import java.text.NumberFormat; |
| import java.util.Calendar; |
| import java.util.Date; |
| |
| import org.apache.ecs.ConcreteElement; |
| import org.apache.ecs.ElementContainer; |
| import org.apache.ecs.html.Comment; |
| import org.apache.ecs.html.Input; |
| import org.apache.ecs.html.Option; |
| import org.apache.ecs.html.Select; |
| |
| /** |
| * TimeSelector is a utility class to handle the creation of a set of |
| * time drop-down menus. The code is broken into a set of static methods |
| * for quick and easy access to the individual select objects: |
| * |
| * <pre> |
| * ElementContainer ec timeSelect = new ElementContainer(); |
| * String myName = "mytime"; |
| * ec.addElement(TimeSelector.getHourSelector(myName)); |
| * ec.addElement(TimeSelector.getMinuteSelector(myName)); |
| * ec.addElement(TimeSelector.getAMPMSelector(myName)); |
| * </pre> |
| * |
| * There are also methods which will use attributes to build a |
| * complete time selector in the default 12hr format (eg HH:MM am/pm): |
| * |
| * <pre> |
| * TimeSelector ts = new TimeSelector(myName); |
| * timeSelect = ts.ecsOutput(); |
| * </pre> |
| * |
| * Minutes/Seconds are by default rounded to the nearest 5 units |
| * although this can be easily changed. |
| * |
| * 24hr TimeSelectors can also be produced. The following example |
| * creates a full precision TimeSelector (eg HH:MM:SS): |
| * |
| * <pre> |
| * TimeSelector ts = new TimeSelector(myName); |
| * ts.setTimeFormat(TimeSelector.TWENTY_FOUR_HOUR); |
| * ts.setMinuteInterval(1); |
| * ts.setSecondInterval(1); |
| * ts.setShowSeconds(true); |
| * timeSelect = ts.toString(); |
| * </pre> |
| * |
| * @author <a href="mailto:ekkerbj@netscape.net">Jeffrey D. Brekke</a> |
| * @author <a href="mailto:rich@thenetrevolution.com">Rich Aston</a> |
| * @version $Id$ |
| */ |
| public class TimeSelector |
| { |
| /** Prefix for time names. */ |
| public static final String DEFAULT_PREFIX = "TimeSelector"; |
| |
| /** Suffix for hour parameter. */ |
| public static final String HOUR_SUFFIX = "_hour"; |
| |
| /** Suffix for minute parameter. */ |
| public static final String MINUTE_SUFFIX = "_minute"; |
| |
| /** Suffix for second parameter. */ |
| public static final String SECOND_SUFFIX = "_second"; |
| |
| /** Suffix for am/pm parameter. */ |
| public static final String AMPM_SUFFIX = "_ampm"; |
| |
| /** Constant for 12hr format */ |
| public static final int TWELVE_HOUR = 0; |
| |
| /** Constant for 24hr format */ |
| public static final int TWENTY_FOUR_HOUR = 1; |
| |
| /** TODO: Add ability to specify Locale. */ |
| private static final NumberFormat nbrFmt; |
| |
| private static final int DEFAULT_MINUTE_INTERVAL = 5; |
| private static final int DEFAULT_SECOND_INTERVAL = 5; |
| private static final int DEFAULT_TIME_FORMAT = TWELVE_HOUR; |
| |
| private int timeFormat = DEFAULT_TIME_FORMAT; |
| private int minuteInterval = DEFAULT_MINUTE_INTERVAL; |
| private int secondInterval = DEFAULT_SECOND_INTERVAL; |
| |
| private Calendar useDate = null; |
| private String selName = null; |
| private String onChange = null; |
| private boolean onChangeSet = false; |
| private boolean showSeconds = false; |
| private int setSeconds = 0; |
| |
| static |
| { |
| nbrFmt = NumberFormat.getInstance(); |
| nbrFmt.setMinimumIntegerDigits(2); |
| nbrFmt.setMaximumIntegerDigits(2); |
| } |
| |
| /** |
| * Constructor defaults to current date/time and uses the default |
| * prefix: <pre>TimeSelector.DEFAULT</pre> |
| */ |
| public TimeSelector() |
| { |
| this.selName = DEFAULT_PREFIX; |
| this.useDate = Calendar.getInstance(); |
| this.useDate.setTime(new Date()); |
| } |
| |
| /** |
| * Constructor, uses the date/time set in the calendar |
| * passed in (with the date/time set correctly). |
| * |
| * @param selName A String with the selector name. |
| * @param useDate A Calendar with a date/time. |
| */ |
| public TimeSelector(String selName, Calendar useDate) |
| { |
| this.useDate = useDate; |
| this.selName = selName; |
| } |
| |
| /** |
| * Constructor defaults to current date/time. |
| * |
| * @param selName A String with the selector name. |
| */ |
| public TimeSelector(String selName) |
| { |
| this.selName = selName; |
| this.useDate = Calendar.getInstance(); |
| this.useDate.setTime(new Date()); |
| } |
| |
| /** |
| * Adds the onChange to all of <code><SELECT></code> tags. |
| * This is limited to one function for all three popups and is only |
| * used when the output() methods are used. Individual getHour, |
| * getMinute, getSecond, getAMPM static methods will not use this |
| * setting. |
| * |
| * @param onChange A String to use for onChange attribute. If null, |
| * then nothing will be set. |
| * @return A TimeSelector (self). |
| */ |
| public TimeSelector setOnChange(String onChange) |
| { |
| if (onChange != null) |
| { |
| this.onChange = onChange; |
| this.onChangeSet = true; |
| } |
| else |
| { |
| this.onChange = null; |
| this.onChangeSet = false; |
| } |
| return this; |
| } |
| |
| /** |
| * Select the second to be selected if the showSeconds(false) behavior |
| * is used. Individual getHour, getMinute, getSecond, getAMPM |
| * static methods will not use this setting. |
| * |
| * @param seconds The second. |
| * @return A TimeSelector (self). |
| */ |
| public TimeSelector setSeconds(int seconds) |
| { |
| this.setSeconds = seconds; |
| this.showSeconds = false; |
| return this; |
| } |
| |
| /** |
| * Set the interval between options in the minute select box. |
| * Individual getHour, getMinute, getSecond, getAMPM static methods |
| * will not use this setting. |
| * |
| * @param minutes Interval in minutes. |
| * @return A TimeSelector (self). |
| */ |
| public TimeSelector setMinuteInterval(int minutes) |
| { |
| this.minuteInterval = minutes; |
| return this; |
| } |
| |
| /** |
| * Set the interval between options in the second select box. |
| * Individual getHour, getMinute, getSecond, getAMPM static methods |
| * will not use this setting. |
| * |
| * @param seconds Interval in seconds. |
| * @return A TimeSelector (self). |
| */ |
| public TimeSelector setSecondInterval(int seconds) |
| { |
| this.secondInterval = seconds; |
| return this; |
| } |
| |
| /** |
| * Set the time format to 12 or 24 hour. Individual getHour, |
| * getMinute, getSecond, getAMPM static methods |
| * will not use this setting. |
| * |
| * @param format Time format. |
| * @return A TimeSelector (self). |
| */ |
| public TimeSelector setTimeFormat(int format) |
| { |
| this.timeFormat = format; |
| return this; |
| } |
| |
| /** |
| * Whether or not to show the seconds as a popup menu. The seconds will |
| * be a hidden parameter and the value set with setSeconds is used. |
| * Individual getHour, getMinute, getSecond, getAMPM static methods |
| * will not use this setting. |
| * |
| * @param show True if the second should be shown. |
| * @return A TimeSelector (self). |
| */ |
| public TimeSelector setShowSeconds(boolean show) |
| { |
| this.showSeconds = show; |
| return this; |
| } |
| |
| /** |
| * Set the selector name prefix. Individual getHour, getMinute, |
| * getSeconds, getAMPM static methods will not use this setting. |
| * |
| * @param selname A String with the select name prefix. |
| */ |
| public void setSelName(String selName) |
| { |
| this.selName = selName; |
| } |
| |
| /** |
| * Get the selector name prefix. |
| * |
| * @return A String with the select name prefix. |
| */ |
| public String getSelName() |
| { |
| return selName; |
| } |
| |
| /** |
| * Return a second selector. |
| * |
| * @param name The name to use for the selected second. |
| * @return A select object with second options. |
| */ |
| public static Select getSecondSelector(String name) |
| { |
| return (getSecondSelector(name, Calendar.getInstance())); |
| } |
| |
| /** |
| * Return a second selector. |
| * |
| * @param name The name to use for the selected second. |
| * @param now Calendar to start with. |
| * @return A select object with second options. |
| */ |
| public static Select getSecondSelector(String name, Calendar now) |
| { |
| return (getSecondSelector(name, Calendar.getInstance(), |
| DEFAULT_SECOND_INTERVAL)); |
| } |
| |
| /** |
| * Return a second selector. |
| * |
| * @param name The name to use for the selected second. |
| * @param now Calendar to start with. |
| * @param interval Interval between options. |
| * @return A select object with second options. |
| */ |
| public static Select getSecondSelector(String name, Calendar now, |
| int interval) |
| { |
| Select secondSelect = new Select().setName(name); |
| |
| for (int currentSecond = 0; currentSecond <= 59; currentSecond += interval) |
| { |
| Option o = new Option(); |
| o.addElement(nbrFmt.format(currentSecond)); |
| o.setValue(currentSecond); |
| int nearestSecond = |
| ((now.get(Calendar.SECOND) / interval) * interval); |
| |
| if (nearestSecond == currentSecond) |
| { |
| o.setSelected(true); |
| } |
| secondSelect.addElement(o); |
| } |
| return (secondSelect); |
| } |
| |
| /** |
| * Return a minute selector. |
| * |
| * @param name The name to use for the selected minute. |
| * @return A select object with minute options. |
| */ |
| public static Select getMinuteSelector(String name) |
| { |
| return (getMinuteSelector(name, Calendar.getInstance())); |
| } |
| |
| /** |
| * Return a minute selector. |
| * |
| * @param name The name to use for the selected minute. |
| * @return A select object with minute options. |
| */ |
| public static Select getMinuteSelector(String name, Calendar now) |
| { |
| return (getMinuteSelector(name, now, DEFAULT_MINUTE_INTERVAL)); |
| } |
| |
| /** |
| * Return a minute selector. |
| * |
| * @param name The name to use for the selected minute. |
| * @param now Calendar to start with. |
| * @param interval Interval between options. |
| * @return A select object with minute options. |
| */ |
| public static Select getMinuteSelector(String name, Calendar now, |
| int interval) |
| { |
| Select minuteSelect = new Select().setName(name); |
| |
| for (int curMinute = 0; curMinute <= 59; curMinute += interval) |
| { |
| Option o = new Option(); |
| o.addElement(nbrFmt.format(curMinute)); |
| o.setValue(curMinute); |
| int nearestMinute = |
| ((now.get(Calendar.MINUTE)) / interval) * interval; |
| |
| if (nearestMinute == curMinute) |
| { |
| o.setSelected(true); |
| } |
| minuteSelect.addElement(o); |
| } |
| return (minuteSelect); |
| } |
| |
| /** |
| * Return an 12 hour selector. |
| * |
| * @param name The name to use for the selected hour. |
| * @return A select object with all the hours. |
| */ |
| public static Select getHourSelector(String name) |
| { |
| return (getHourSelector(name, Calendar.getInstance())); |
| } |
| |
| /** |
| * Return an 12 hour selector. |
| * |
| * @param name The name to use for the selected hour. |
| * @param now Calendar to start with. |
| * @return A select object with all the hours. |
| */ |
| public static Select getHourSelector(String name, Calendar now) |
| { |
| return (getHourSelector(name, Calendar.getInstance(), TWELVE_HOUR)); |
| } |
| |
| /** |
| * Return an hour selector (either 12hr or 24hr depending on |
| * <code>format</code>. |
| * |
| * @param name The name to use for the selected hour. |
| * @param now Calendar to start with. |
| * @param format Time format. |
| * @return A select object with all the hours. |
| */ |
| public static Select getHourSelector(String name, Calendar now, int format) |
| { |
| Select hourSelect = new Select().setName(name); |
| |
| if (format == TWENTY_FOUR_HOUR) |
| { |
| for (int currentHour = 0; currentHour <= 23; currentHour++) |
| { |
| Option o = new Option(); |
| o.addElement(nbrFmt.format(currentHour)); |
| o.setValue(currentHour); |
| if (now.get(Calendar.HOUR_OF_DAY) == currentHour) |
| { |
| o.setSelected(true); |
| } |
| hourSelect.addElement(o); |
| } |
| } |
| else |
| { |
| for (int curHour = 1; curHour <= 12; curHour++) |
| { |
| Option o = new Option(); |
| |
| o.addElement(nbrFmt.format((long) curHour)); |
| o.setValue(curHour); |
| if (now.get(Calendar.AM_PM) == Calendar.AM) |
| { |
| if (((now.get(Calendar.HOUR_OF_DAY)) == 0) && |
| (curHour == 12)) |
| { |
| o.setSelected(true); |
| } |
| else |
| { |
| if (now.get(Calendar.HOUR_OF_DAY) == curHour) |
| { |
| o.setSelected(true); |
| } |
| } |
| } |
| else |
| { |
| if (((now.get(Calendar.HOUR_OF_DAY)) == 12) && |
| (curHour == 12)) |
| { |
| o.setSelected(true); |
| } |
| else |
| { |
| if (now.get(Calendar.HOUR_OF_DAY) == curHour + 12) |
| { |
| o.setSelected(true); |
| } |
| } |
| } |
| hourSelect.addElement(o); |
| } |
| } |
| return (hourSelect); |
| } |
| |
| /** |
| * Return an am/pm selector. |
| * |
| * @param name The name to use for the selected am/pm. |
| * @return A select object with am/pm |
| */ |
| public static Select getAMPMSelector(String name) |
| { |
| Calendar c = Calendar.getInstance(); |
| c.setTime(new Date()); |
| return (getAMPMSelector(name, c)); |
| } |
| |
| /** |
| * Return an am/pm selector. |
| * |
| * @param name The name to use for the selected am/pm. |
| * @param now Calendar to start with. |
| * @return A select object with am/pm. |
| */ |
| public static Select getAMPMSelector(String name, |
| Calendar now) |
| { |
| Select ampmSelect = new Select().setName(name); |
| |
| Option o = new Option(); |
| o.addElement("am"); |
| o.setValue(Calendar.AM); |
| if (now.get(Calendar.AM_PM) == Calendar.AM) |
| { |
| o.setSelected(true); |
| } |
| ampmSelect.addElement(o); |
| |
| o = new Option(); |
| o.addElement("pm"); |
| o.setValue(Calendar.PM); |
| if (now.get(Calendar.AM_PM) == Calendar.PM) |
| { |
| o.setSelected(true); |
| } |
| ampmSelect.addElement(o); |
| |
| return (ampmSelect); |
| } |
| |
| /** |
| * Used to build the popupmenu in HTML. The properties set in the |
| * object are used to generate the correct HTML. The selName |
| * attribute is used to seed the names of the select lists. The |
| * names will be generated as follows: |
| * |
| * <ul> |
| * <li>selName + "_hour"</li> |
| * <li>selName + "_minute"</li> |
| * <li>selName + "_ampm"</li> |
| * </ul> |
| * |
| * If onChange was set it is also used in the generation of the |
| * output. The output HTML will list the select lists in the |
| * following order: hour minute ampm. |
| * |
| * If setShowSeconds(true) is used then an addition second select box |
| * is produced after the minute select box. |
| * |
| * If setTimeFormat(TimeSelector.TWENTY_FOUR_HOUR) is used then |
| * the ampm select box is omitted. |
| * |
| * @return A String with the correct HTML for the date selector. |
| */ |
| public String output() |
| { |
| return (ecsOutput().toString()); |
| } |
| |
| /** |
| * Used to build the popupmenu in HTML. The properties set in the |
| * object are used to generate the correct HTML. The selName |
| * attribute is used to seed the names of the select lists. The |
| * names will be generated as follows: |
| * |
| * <ul> |
| * <li>selName + "_hour"</li> |
| * <li>selName + "_minute"</li> |
| * <li>selName + "_ampm"</li> |
| * </ul> |
| * |
| * If onChange was set it is also used in the generation of the |
| * output. The output HTML will list the select lists in the |
| * following order: hour minute ampm. |
| * |
| * If setShowSeconds(true) is used then an addition second select box |
| * is produced after the minute select box. |
| * |
| * If setTimeFormat(TimeSelector.TWENTY_FOUR_HOUR) is used then |
| * the ampm select box is omitted. |
| * |
| * @return A String with the correct HTML for the date selector. |
| */ |
| public String toString() |
| { |
| return (ecsOutput().toString()); |
| } |
| |
| /** |
| * Return an ECS container with the select objects inside. |
| * |
| * @return An ECS container. |
| */ |
| public ElementContainer ecsOutput() |
| { |
| if (this.useDate == null) |
| { |
| this.useDate = Calendar.getInstance(); |
| this.useDate.setTime(new Date()); |
| } |
| |
| ConcreteElement secondSelect = null; |
| |
| Select ampmSelect = getAMPMSelector(selName + AMPM_SUFFIX, useDate); |
| |
| Select hourSelect = getHourSelector(selName + HOUR_SUFFIX, |
| useDate, this.timeFormat); |
| |
| Select minuteSelect = getMinuteSelector(selName + MINUTE_SUFFIX, |
| useDate, this.minuteInterval); |
| |
| if (this.showSeconds) |
| { |
| Select tmp = getSecondSelector(selName + SECOND_SUFFIX, useDate, |
| this.secondInterval); |
| if (onChangeSet) |
| tmp.setOnChange(onChange); |
| secondSelect = tmp; |
| } |
| else |
| { |
| secondSelect = new Input(Input.hidden, |
| selName + SECOND_SUFFIX, |
| setSeconds); |
| } |
| |
| if (onChangeSet) |
| { |
| hourSelect.setOnChange(onChange); |
| minuteSelect.setOnChange(onChange); |
| ampmSelect.setOnChange(onChange); |
| } |
| |
| ElementContainer ec = new ElementContainer(); |
| ec.addElement(new Comment( |
| "== BEGIN org.apache.turbine.util.TimeSelector.ecsOutput() ==")); |
| ec.addElement(hourSelect); |
| ec.addElement(":"); |
| ec.addElement(minuteSelect); |
| if (this.showSeconds == true) |
| ec.addElement(":"); |
| ec.addElement(secondSelect); |
| if (this.timeFormat == TimeSelector.TWELVE_HOUR) |
| { |
| ec.addElement(ampmSelect); |
| } |
| ec.addElement(new Comment( |
| "== END org.apache.turbine.util.TimeSelector.ecsOutput() ==")); |
| return (ec); |
| } |
| } |