/* * Copyright 2010 JBoss Inc * * 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.drools.guvnor.client.modeldriven.ui; import java.util.Date; import org.drools.guvnor.client.messages.Constants; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.PopupPanel; /** * * @author Toni Rikkola * */ public class DatePickerPopUp extends PopupPanel { private Label timeColonLabel = new Label( ":" ); private Label timeHyphenLabel = new Label( " - " ); private Constants constants = ((Constants) GWT.create( Constants.class )); // It is show time! (When to show time next to date selectors) protected boolean showTime = false; protected ListBox years = new ListBox(); protected ListBox months = new ListBox(); protected ListBox dates = new ListBox(); protected ListBox hours = new ListBox(); protected ListBox minutes = new ListBox(); /** * * @param okClickHandler What to do when ok, is pressed * @param showTime Can you select time too. */ public DatePickerPopUp(ClickHandler okClickHandler, DateTimeFormat formatter) { setGlassEnabled( true ); HorizontalPanel horizontalPanel = new HorizontalPanel(); // Add years // Take the current year and add 50 to each sides Date now = new Date(); int year = now.getYear() + 1900 - 50; for ( int i = year; i < (year + 100); i++ ) { years.addItem( Integer.toString( i ) ); } years.setSelectedIndex( 50 ); horizontalPanel.add( years ); // Add months months.addItem( constants.January() ); months.addItem( constants.February() ); months.addItem( constants.March() ); months.addItem( constants.April() ); months.addItem( constants.May() ); months.addItem( constants.June() ); months.addItem( constants.July() ); months.addItem( constants.August() ); months.addItem( constants.September() ); months.addItem( constants.October() ); months.addItem( constants.November() ); months.addItem( constants.December() ); months.addChangeHandler( new ChangeHandler() { public void onChange(ChangeEvent event) { fillDates(); } } ); horizontalPanel.add( months ); // Add dates fillDates(); horizontalPanel.add( dates ); showTime = hasTime( formatter ); if ( showTime ) { // Hours for ( int i = 0; i < 24; i++ ) { hours.addItem( Integer.toString( i ) ); } horizontalPanel.add( timeHyphenLabel ); horizontalPanel.add( hours ); // Minutes for ( int i = 0; i < 60; i++ ) { minutes.addItem( Integer.toString( i ) ); } horizontalPanel.add( timeColonLabel ); horizontalPanel.add( minutes ); } Button okButton = new Button( constants.OK() ); okButton.addClickHandler( okClickHandler ); horizontalPanel.add( okButton ); add( horizontalPanel ); } /** * Simple check, if time format has hours it has time. * * @param formatter * @return */ private boolean hasTime(DateTimeFormat formatter) { return formatter.getPattern().contains( "h" ) || formatter.getPattern().contains( "H" ) || formatter.getPattern().contains( "k" ) || formatter.getPattern().contains( "K" ); } private void setTimeVisible(boolean visible) { hours.setVisible( visible ); minutes.setVisible( visible ); timeHyphenLabel.setVisible( visible ); timeColonLabel.setVisible( visible ); } /** * Sets the current year, month ect to dropdowns. */ public void setDropdowns(DateTimeFormat formatter, String text) { Date date; try { date = formatter.parse( text ); } catch ( Exception e ) { date = new Date(); } // Set year years.clear(); int year = date.getYear() + 1900 - 50; for ( int i = 0; i < 100; i++ ) { years.addItem( Integer.toString( year ) ); if ( year == (date.getYear() + 1900) ) { years.setSelectedIndex( i ); } year++; } // month months.setSelectedIndex( date.getMonth() ); // day dates.setSelectedIndex( date.getDate() - 1 ); setTimeVisible( showTime ); if ( showTime ) { // hours hours.setSelectedIndex( date.getHours() ); // minutes minutes.setSelectedIndex( date.getMinutes() ); } } private void fillDates() { setVisible( false ); dates.clear(); // Check month int days = daysInMonth( months.getSelectedIndex() + 1 ); for ( int i = 1; i <= days; i++ ) { dates.addItem( Integer.toString( i ) ); } setVisible( true ); } private int daysInMonth(int month) { switch ( month ) { case 2 : // Can be 28 or 29, returns 29 just in case return 29; case 4 : case 6 : case 9 : case 11 : return 30; default : return 31; } } }