Package org.spiffyui.client.widgets

Source Code of org.spiffyui.client.widgets.TimePickerTextBox

/*******************************************************************************
*
* Copyright 2011 Spiffy UI Team  
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
package org.spiffyui.client.widgets;

import java.util.Date;

import com.google.gwt.dom.client.Document;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Event.NativePreviewEvent;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.TextBox;

import org.spiffyui.client.JSDateUtil;

/**
* This widget uses a simple GWT TextBox and attaches the JQuery
* time picker.  When the field gets focus the date picker will become
* visible.
*/
public class TimePickerTextBox extends TextBox implements Event.NativePreviewHandler
{
    private String m_timePickerDivId;
   
    /**
     * Create a TimePickerTextBox with a random ID.  The ID is required
     * because the JQuery data picker needs a specific ID to connect to.
     *
     */
    public TimePickerTextBox()
    {
        this(HTMLPanel.createUniqueId());
    }
   
   
    /**
     * Create a TimePickerTextBox with the specified ID.  The ID is required
     * because the JQuery data picker needs a specific ID to connect to.
     *
     * @param id     the id for the text box
     */
    public TimePickerTextBox(String id)
    {
        super();
        getElement().setId(id);
        m_timePickerDivId = id + "-ui-timepicker-div";
        //A time picker div ID (tpDivId) was added by rpt because there may be more than one
        //time picker on a single page so each id would need to be unique.  The id was added in rpt
        //in order for this control to be fully functional in IE (see onPreviewNativeEvent).
       
        Event.addNativePreviewHandler(this);
    }

    @Override
    public void onAttach()
    {
        super.onAttach();

        addTimePickerJS(getElement().getId(), JSDateUtil.is24Time(), m_timePickerDivId);
    }

    private native void addTimePickerJS(String id, boolean is24Hour, String tpDivId) /*-{
        try {
            $wnd.jQuery("#" + id).timePicker({
                startTime: is24Hour ? "0:00" : "12:00", // Using string. Can take string or Date object.
                show24Hours: is24Hour,
                step: 30,
                timeFormat: $wnd.Date.CultureInfo.formatPatterns.shortTime,
                amDesignator: $wnd.Date.CultureInfo.amDesignator,
                pmDesignator: $wnd.Date.CultureInfo.pmDesignator,
                tpDivId: tpDivId});
        } catch(err) {
            $wnd.console.error(err);
        }
    }-*/;
   
    /**
     * Sets the value to be the short time of the date
     *
     * @param date the date value to set
     */
    public void setDateValue(Date date)
    {
        setValue(JSDateUtil.getShortTime(date));
    }
   
    /**
     * Sets the value to be the time of the date on the or rounded up to
     * the nearest hour or half hour
     *
     * @param date the date value to set
     */
    public void setDateValueRounded(Date date)
    {
        setValue(JSDateUtil.getShortTimeRounded(date.getTime() + ""));
    }
   
    /**
     * Gets the current hours value of the text box
     *
     * @return the hours value or -1 if it isn't specified
     */
    public int getHours()
    {
        if (getValue().length() == 0) {
            return -1;
        } else {
            try {
                return JSDateUtil.getHours(getValue());
            } catch (Exception e) {
                //if unparseable return -1
                return -1;               
            }
        }
    }
   
    /**
     * Gets the current minutes value of the text box
     *
     * @return the hours value or -1 if it isn't specified
     */
    public int getMinutes()
    {
        if (getValue().length() == 0) {
            return -1;
        } else {
            try {
                return JSDateUtil.getMinutes(getValue());
            } catch (Exception e) {
                //if unparseable return -1;
                return -1;               
            }
        }
    }
   
    /**
     * Convenience method to determine if the value is empty
     * since the getHours and getMinutes will return -1 for empty as well as unparseable.
     * @return boolean true if empty
     */
    public boolean isEmpty()
    {
        return getValue().length() == 0;
    }

    @Override
    public void onPreviewNativeEvent(NativePreviewEvent event)
    {
        /*
         * This is necessary for IE since an onchange event is not fired when a time is selected.
         * And trying to have the jquery call a JSNI would call the correct Java method, but it would not be able
         * to fireEvent because it did not think it had any Handlers.  Even a call to getValue would not work,
         * resulting in an AssertionError saying that the Widget may not have been initialized.
         */
        if (event.getTypeInt() != Event.ONCLICK) {
            return;
        }
        Element target = (Element) com.google.gwt.dom.client.Element.as(event.getNativeEvent().getEventTarget());
        if (null == target) {
            return;
        }

        /*
         * See if it is a child LI tag within ui-timepicker-div because all times are in <LI>
         */
        if (DOM.isOrHasChild(DOM.getElementById(m_timePickerDivId), target) &&
                "LI".equalsIgnoreCase(target.getTagName())) {

            NativeEvent nativeEvent = Document.get().createChangeEvent();
            ChangeEvent.fireNativeEvent(nativeEvent, this);
           
            return;
        }
    }
}
TOP

Related Classes of org.spiffyui.client.widgets.TimePickerTextBox

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.