Package org.apache.turbine.util

Source Code of org.apache.turbine.util.TimeSelector

package org.apache.turbine.util;

/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 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: TimeSelector.java,v 1.2 2002/07/11 16:53:21 mpoeschl Exp $
*/
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>&lt;SELECT&gt;</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 == this.TWELVE_HOUR)
        {
            ec.addElement(ampmSelect);
        }
        ec.addElement(new Comment(
            "== END org.apache.turbine.util.TimeSelector.ecsOutput() =="));
        return (ec);
    }
}
TOP

Related Classes of org.apache.turbine.util.TimeSelector

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.