/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2017 Pentaho Corporation.. All rights reserved. */ package org.pentaho.gwt.widgets.client.controls; import org.pentaho.gwt.widgets.client.ui.ICallback; import org.pentaho.gwt.widgets.client.ui.IChangeHandler; import org.pentaho.gwt.widgets.client.utils.TimeUtil; import org.pentaho.gwt.widgets.client.utils.TimeUtil.TimeOfDay; import java.util.Date; import com.google.gwt.user.client.ui.ChangeListener; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.Widget; // TODO sbarkdull, this code needs to be locale sensitive /** * Although hours combo displays the range 1...12, the hour setter/getters take/return the range 0...11. So setting the * hour to 0 will cause 1 to be selected in the combo. * * @author Steven Barkdull * */ @SuppressWarnings( "deprecation" ) public class TimePicker extends HorizontalPanel implements IChangeHandler { protected ListBox hourLB = new ListBox(); protected ListBox minuteLB = new ListBox(); protected ListBox timeOfDayLB = new ListBox(); private ICallback<IChangeHandler> onChangeHandler = null; private static String DATE_PICKER_SELECT = "date-picker-select"; public TimePicker() { setSpacing( 5 ); // hour list initHourLB(); // minute list initMinuteLB(); // second list // nah! // AM/PM list initAmPmLB(); add( hourLB ); add( minuteLB ); add( timeOfDayLB ); configureOnChangeHandler(); } public void setTime( Date date ) { int hIndex = date.getHours() - 1; hIndex = hIndex > 10 ? hIndex - 12 : hIndex; hIndex = hIndex == -1 ? 11 : hIndex; hourLB.setSelectedIndex( hIndex ); minuteLB.setSelectedIndex( date.getMinutes() ); setTimeOfDay( date.getHours() > 11 ? TimeOfDay.PM : TimeOfDay.AM ); } /** * format of string should be: HH:MM:SS AM/PM, e.g. 7:12:28 PM * * @param time */ public void setTime( String time ) { String[] parts = time.split( ":" ); //$NON-NLS-1$ String[] lastParts = parts[2].split( "\\s" ); //$NON-NLS-1$ setHour( parts[0] ); setMinute( parts[1] ); // setSeconds( lastParts[0] ); TimeOfDay td = TimeOfDay.stringToTimeOfDay( lastParts[1] ); setTimeOfDay( td ); } /** * format of string should be: HH:MM:SS AM/PM, e.g. 7:12:28 PM * * @return */ public String getTime() { StringBuilder sb = new StringBuilder( getHour() ).append( ":" ) //$NON-NLS-1$ .append( getMinute() ).append( ":" ) //$NON-NLS-1$ .append( "00 " ) //$NON-NLS-1$ .append( getTimeOfDay().toString() ); return sb.toString(); } private void initHourLB() { hourLB.setVisibleItemCount( 1 ); for ( int ii = 1; ii <= TimeUtil.MAX_HOUR; ++ii ) { String strHrDisplay = Integer.toString( ii ); strHrDisplay = ( strHrDisplay.length() == 1 ) ? "0" + strHrDisplay : strHrDisplay; // left pad single digit values with 0 //$NON-NLS-1$ String strHrValue = ( ii == 12 ) ? "0" : Integer.toString( ii ); //$NON-NLS-1$ hourLB.addItem( strHrDisplay, strHrValue ); } hourLB.setStyleName( DATE_PICKER_SELECT ); } private void initMinuteLB() { minuteLB.setVisibleItemCount( 1 ); for ( int ii = 0; ii < TimeUtil.MAX_MINUTE; ++ii ) { String strMinute = Integer.toString( ii ); strMinute = ( strMinute.length() == 1 ) ? "0" + strMinute : strMinute; // left pad single digit values with 0 //$NON-NLS-1$ minuteLB.addItem( strMinute ); } minuteLB.setStyleName( DATE_PICKER_SELECT ); } private void initAmPmLB() { timeOfDayLB.setVisibleItemCount( 1 ); timeOfDayLB.addItem( TimeUtil.TimeOfDay.AM.toString() ); timeOfDayLB.addItem( TimeUtil.TimeOfDay.PM.toString() ); timeOfDayLB.setStyleName( DATE_PICKER_SELECT ); } /** * Get the value (not the text) of the current selected item * * NOTE: hours are 0...11, in spite of the fact that the combo displays 1...12 0...11 maps to 12,1,...11 * * @return */ public String getHour() { return hourLB.getValue( hourLB.getSelectedIndex() ); } /** * Set the hour you want to see visible in the control (i.e. 1,2,3,..12) * * NOTE: hours are 0...11, in spite of the fact that the combo displays 1...12 0...11 maps to 12,1,...11 * * @return */ public void setHour( String hour ) { setHour( Integer.parseInt( hour ) ); } public void setHour( int hour ) { hourLB.setSelectedIndex( hour - 1 ); } /** * Get the value (not the text) of the current selected item * * @return */ public String getMinute() { return minuteLB.getValue( minuteLB.getSelectedIndex() ); } /** * Set the minute you want to see visible in the control * * @param minute */ public void setMinute( String minute ) { setMinute( Integer.parseInt( minute ) ); } public void setMinute( int minute ) { minuteLB.setSelectedIndex( minute ); } public TimeUtil.TimeOfDay getTimeOfDay() { return TimeUtil.TimeOfDay.get( timeOfDayLB.getSelectedIndex() ); } public void setTimeOfDay( TimeUtil.TimeOfDay timeOfDay ) { timeOfDayLB.setSelectedIndex( timeOfDay.value() ); } @Override public void setOnChangeHandler( ICallback<IChangeHandler> handler ) { onChangeHandler = handler; } private void changeHandler() { if ( null != onChangeHandler ) { onChangeHandler.onHandle( this ); } } private void configureOnChangeHandler() { final TimePicker localThis = this; ChangeListener changeListener = new ChangeListener() { @Override public void onChange( Widget sender ) { localThis.changeHandler(); } }; hourLB.addChangeListener( changeListener ); minuteLB.addChangeListener( changeListener ); timeOfDayLB.addChangeListener( changeListener ); } public void setEnabled( boolean enabled ) { hourLB.setEnabled( enabled ); minuteLB.setEnabled( enabled ); timeOfDayLB.setEnabled( enabled ); } }