/*! * 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 com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.ui.CaptionPanel; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.KeyboardListener; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RadioButton; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.user.datepicker.client.DateBox.DefaultFormat; import org.pentaho.gwt.widgets.client.messages.Messages; import org.pentaho.gwt.widgets.client.ui.ICallback; import org.pentaho.gwt.widgets.client.ui.IChangeHandler; import java.util.Date; /** * @author Steven Barkdull * */ @SuppressWarnings( "deprecation" ) public class DateRangeEditor extends CaptionPanel implements IChangeHandler { private static final String SCHEDULE_EDITOR_CAPTION_PANEL = "schedule-editor-caption-panel"; //$NON-NLS-1$ private static final String END_DATE_RB_GROUP = "end-date-group"; //$NON-NLS-1$ private static final String END_DATE_PICKER = "end-date-picker"; //$NON-NLS-1$ private static final String START_DATE_PICKER = "start-date-picker"; //$NON-NLS-1$ private static final String ROR_INNER_HP = "ror-inner-hp"; private DatePickerEx startDatePicker = null; private EndDatePanel endDatePanel = null; private ErrorLabel startLabel = null; private ICallback<IChangeHandler> onChangeHandler = null; private static int uniqueInstanceNumber = 0; public DateRangeEditor( Date date ) { super( Messages.getString( "DateRangeEditor.rangeOfRecurrence" ) ); this.addStyleName( SCHEDULE_EDITOR_CAPTION_PANEL ); uniqueInstanceNumber += 1; HorizontalPanel outerHP = new HorizontalPanel(); add( outerHP ); HorizontalPanel hp = new HorizontalPanel(); hp.getElement().setId( ROR_INNER_HP ); Label l = new Label( Messages.getString( "DateRangeEditor.startLabel" ) ); l.setStyleName( "startLabel" ); //$NON-NLS-1$ hp.add( l ); DefaultFormat format = new DefaultFormat( DateTimeFormat.getShortDateFormat() ); startDatePicker = new DatePickerEx( format ); startDatePicker.getDatePicker().setStyleName( START_DATE_PICKER ); hp.add( startDatePicker.getDatePicker() ); startLabel = new ErrorLabel( hp ); outerHP.add( startLabel ); endDatePanel = new EndDatePanel( date ); outerHP.add( endDatePanel ); reset( date ); configureOnChangeHandler(); } public void setStartDateError( String errorMsg ) { startLabel.setErrorMsg( errorMsg ); } public Date getStartDate() { return startDatePicker.getSelectedDate(); } public void setStartDate( Date d ) { startDatePicker.getDatePicker().setValue( d ); } public Date getEndDate() { return endDatePanel.getDate(); } public void setEndDate( Date d ) { endDatePanel.setDate( d ); } public void reset( Date d ) { startDatePicker.getDatePicker().setValue( d ); endDatePanel.reset( d ); } public void setNoEndDate() { endDatePanel.setNoEndDate(); } public boolean isEndBy() { return endDatePanel.isEndBy(); } public void setEndBy() { endDatePanel.setEndBy(); } public boolean isNoEndDate() { return endDatePanel.isNoEndDate(); } public void setEndByError( String errorMsg ) { endDatePanel.setEndByError( errorMsg ); } public void setOnChangeHandler( ICallback<IChangeHandler> handler ) { this.onChangeHandler = handler; } private void changeHandler() { if ( null != onChangeHandler ) { onChangeHandler.onHandle( this ); } } private void configureOnChangeHandler() { final DateRangeEditor localThis = this; ICallback<IChangeHandler> handler = new ICallback<IChangeHandler>() { public void onHandle( IChangeHandler o ) { localThis.changeHandler(); } }; startDatePicker.setOnChangeHandler( handler ); endDatePanel.setOnChangeHandler( handler ); } private class EndDatePanel extends VerticalPanel implements IChangeHandler { private DatePickerEx endDatePicker = null; private RadioButton noEndDateRb = null; private RadioButton endByRb = null; private ErrorLabel endByLabel = null; private ICallback<IChangeHandler> onChangeHandler = null; private static final String END_DATE_PANEL = "end-date-panel"; public EndDatePanel( Date date ) { this.getElement().setId( END_DATE_PANEL ); final EndDatePanel localThis = this; noEndDateRb = new RadioButton( END_DATE_RB_GROUP + uniqueInstanceNumber, Messages.getString( "DateRangeEditor.noEndDateLabel" ) ); noEndDateRb.setStyleName( "recurrenceRadioButton" ); //$NON-NLS-1$ noEndDateRb.setValue( true ); add( noEndDateRb ); HorizontalPanel hp = new HorizontalPanel(); add( hp ); HorizontalPanel endByPanel = new HorizontalPanel(); endByRb = new RadioButton( END_DATE_RB_GROUP + uniqueInstanceNumber, Messages.getString( "DateRangeEditor.endByLabel" ) ); endByRb.setStyleName( "recurrenceRadioButton" ); //$NON-NLS-1$ endByPanel.add( endByRb ); DefaultFormat format = new DefaultFormat( DateTimeFormat.getShortDateFormat() ); endDatePicker = new DatePickerEx( format ); endDatePicker.getDatePicker().setStyleName( END_DATE_PICKER ); endDatePicker.getDatePicker().setEnabled( false ); endByPanel.add( endDatePicker.getDatePicker() ); endByLabel = new ErrorLabel( endByPanel ); hp.add( endByLabel ); noEndDateRb.addClickListener( new ClickListener() { public void onClick( Widget sender ) { localThis.endDatePicker.getDatePicker().setEnabled( false ); } } ); endByRb.addClickListener( new ClickListener() { public void onClick( Widget sender ) { localThis.endDatePicker.getDatePicker().setEnabled( true ); } } ); reset( date ); configureOnChangeHandler(); } public void reset( Date d ) { setNoEndDate(); endDatePicker.getDatePicker().setValue( d ); } @SuppressWarnings( "unused" ) public DatePickerEx getEndDatePicker() { return endDatePicker; } public void setNoEndDate() { endByRb.setValue( false ); noEndDateRb.setValue( true ); endDatePicker.getDatePicker().setEnabled( false ); } public boolean isEndBy() { return endByRb.getValue(); } public void setEndBy() { noEndDateRb.setValue( false ); endByRb.setValue( true ); endDatePicker.getDatePicker().setEnabled( true ); } public boolean isNoEndDate() { return noEndDateRb.getValue(); } public Date getDate() { return isEndBy() ? endDatePicker.getSelectedDate() : null; } public void setDate( Date d ) { endDatePicker.getDatePicker().setValue( d ); } public void setEndByError( String errorMsg ) { endByLabel.setErrorMsg( errorMsg ); } public void setOnChangeHandler( ICallback<IChangeHandler> handler ) { this.onChangeHandler = handler; } private void changeHandler() { if ( null != onChangeHandler ) { onChangeHandler.onHandle( this ); } } private void configureOnChangeHandler() { final EndDatePanel localThis = this; ICallback<IChangeHandler> handler = new ICallback<IChangeHandler>() { public void onHandle( IChangeHandler o ) { localThis.changeHandler(); } }; KeyboardListener keyboardListener = new KeyboardListener() { public void onKeyDown( Widget sender, char keyCode, int modifiers ) { } public void onKeyPress( Widget sender, char keyCode, int modifiers ) { } public void onKeyUp( Widget sender, char keyCode, int modifiers ) { localThis.changeHandler(); } }; ClickListener clickListener = new ClickListener() { public void onClick( Widget sender ) { localThis.changeHandler(); } }; endDatePicker.setOnChangeHandler( handler ); noEndDateRb.addClickListener( clickListener ); noEndDateRb.addKeyboardListener( keyboardListener ); endByRb.addClickListener( clickListener ); endByRb.addKeyboardListener( keyboardListener ); } } // end EndDatePanel }