package au.com.vaadinutils.jasper.parameter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.joda.time.DateTime; import com.google.common.base.Preconditions; import com.vaadin.data.Property.ReadOnlyException; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.data.Validator; import com.vaadin.data.util.converter.Converter.ConversionException; import com.vaadin.shared.ui.datefield.Resolution; import com.vaadin.ui.Component; import com.vaadin.ui.DateField; import com.vaadin.ui.VerticalLayout; import au.com.vaadinutils.jasper.scheduler.entities.DateParameterType; public class ReportParameterDateTimeRange extends ReportParameter<String> { protected DateField startfield; protected DateField endfield; protected String parameterFormat = "yyyy/MM/dd HH:mm:ss"; protected String endParameterName; protected final String startParameterName; /** * * @param caption * - shown on the UI * @param parameterName * - parameter name passed to ireport * @param resolution * - Vaadin calendar control resolution * @param displayFormat * - format to display to the user * @param parameterFormat * - format of the value passed to ireport */ public ReportParameterDateTimeRange(String caption, String startParameterName, String endParameterName, Resolution resolution, String displayFormat, String parameterFormat) { super(caption, new String[] { startParameterName, endParameterName }); Preconditions.checkNotNull(startParameterName); Preconditions.checkNotNull(endParameterName); this.startParameterName = startParameterName; this.endParameterName = endParameterName; startfield = new DateField(caption, new DateTime().toDate()); startfield.setResolution(resolution); startfield.setDateFormat(displayFormat); this.parameterFormat = parameterFormat; startfield.setImmediate(true); startfield.setValidationVisible(true); endfield = new DateField("To", new DateTime().toDate()); endfield.setResolution(resolution); endfield.setDateFormat(displayFormat); this.parameterFormat = parameterFormat; endfield.setImmediate(true); endfield.setValidationVisible(true); createValidators(); } public void addValueChangeListener(ValueChangeListener listener) { startfield.addValueChangeListener(listener); endfield.addValueChangeListener(listener); } public ReportParameterDateTimeRange(String caption, String startParameterName, String endParameterName) { super(caption, new String[] { startParameterName, endParameterName }); Preconditions.checkNotNull(startParameterName); Preconditions.checkNotNull(endParameterName); this.startParameterName = startParameterName; this.endParameterName = endParameterName; startfield = new DateField(caption, new DateTime().withTimeAtStartOfDay().toDate()); startfield.setResolution(Resolution.DAY); startfield.setDateFormat("yyyy/MM/dd"); startfield.setValidationVisible(true); endfield = new DateField("To", new DateTime().withTimeAtStartOfDay().toDate()); endfield.setResolution(Resolution.DAY); endfield.setDateFormat("yyyy/MM/dd"); endfield.setValidationVisible(true); createValidators(); } void createValidators() { startfield.addValidator(new Validator() { private static final long serialVersionUID = 1L; @Override public void validate(Object value) throws InvalidValueException { if (value == null) { throw new InvalidValueException("Start date is invalid"); } if (endfield.getValue() != null && ((Date) value).after(endfield.getValue())) { throw new InvalidValueException("Start date must be before the end date"); } } }); endfield.addValidator(new Validator() { private static final long serialVersionUID = 1L; @Override public void validate(Object value) throws InvalidValueException { if (value == null) { throw new InvalidValueException("End date is invalid"); } if (startfield.getValue() != null && ((Date) value).before(startfield.getValue())) { throw new InvalidValueException("Start date must be before the end date"); } } }); } @Override public String getValue(String parameterName) { SimpleDateFormat sdf = new SimpleDateFormat(parameterFormat); return sdf.format(getDate(parameterName)); } public Date getDate(String parameterName) { Date value; if (parameterName.equalsIgnoreCase(startParameterName)) { value = startfield.getValue(); } else if (parameterName.equalsIgnoreCase(endParameterName)) { value = new DateTime(endfield.getValue()).plusDays(1).toDate(); } else { throw new RuntimeException("Attempt to retrieve invalid parameter name " + parameterName + " valid names are " + startParameterName + "," + endParameterName); } return value; } @Override public Component getComponent() { VerticalLayout layout = new VerticalLayout(); layout.addComponent(startfield); layout.addComponent(endfield); return layout; } @Override public boolean shouldExpand() { return false; } @Override public void setDefaultValue(String defaultValue) { // this.field.setValue(defaultValue); } @Override public String getExpectedParameterClassName() { return null; } @Override public String getDisplayValue(String parameterName) { return new SimpleDateFormat(startfield.getDateFormat()).format(getDate(parameterName)); } @Override public boolean validate() { boolean valid = false; try { startfield.validate(); endfield.validate(); valid = true; } catch (Exception e) { } return valid; } @Override public void setValueAsString(String value, String parameterName) throws ReadOnlyException, ConversionException, ParseException { SimpleDateFormat sdf = new SimpleDateFormat(parameterFormat); DateField field; if (parameterName.equalsIgnoreCase(startParameterName)) { field = startfield; } else { field = endfield; } field.setValue(sdf.parse(value)); } @Override public boolean isDateField() { return true; } @Override public DateParameterType getDateParameterType() { return DateParameterType.DATE; } @Override public Date getStartDate() { return getDate(startParameterName); } @Override public Date getEndDate() { return getDate(endParameterName); } @Override public void setStartDate(Date date) { startfield.setValue(date); } @Override public void setEndDate(Date date) { endfield.setValue(date); } @Override public String getLabel(String parameterName) { if (parameterName.equalsIgnoreCase(endParameterName)) { return "To"; } return "From"; } }