package edu.ualberta.med.biobank.widgets.report; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collection; import java.util.Date; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import edu.ualberta.med.biobank.gui.common.widgets.DateTimeWidget; import edu.ualberta.med.biobank.model.ReportFilterValue; public class DateTimeFilterValueWidget implements FilterValueWidget { private static final SimpleDateFormat SQL_DATETIME_FORMAT = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); //$NON-NLS-1$ private static final SimpleDateFormat DISPLAY_DATE_FORMAT = new SimpleDateFormat( "yyyy-MM-dd"); //$NON-NLS-1$ private static final SimpleDateFormat DISPLAY_TIME_FORMAT = new SimpleDateFormat( "HH:mm:ss"); //$NON-NLS-1$ private final DateTimeWidget dateTime; private final boolean isDate; private final boolean isTime; public DateTimeFilterValueWidget(Composite parent) { this(parent, SWT.DATE | SWT.TIME); } public DateTimeFilterValueWidget(Composite parent, int style) { dateTime = new DateTimeWidget(parent, style, null); isDate = (style & SWT.DATE) != 0; isTime = (style & SWT.TIME) != 0; } @Override public Collection<ReportFilterValue> getValues() { if (!dateTime.isDisposed() && dateTime.getDate() != null) { Date date = getDate(); String dateString = SQL_DATETIME_FORMAT.format(date); if (!dateString.isEmpty()) { ReportFilterValue value = new ReportFilterValue(); value.setPosition(0); value.setValue(dateString); return Arrays.asList(value); } } return new ArrayList<ReportFilterValue>(); } @Override public void setValues(Collection<ReportFilterValue> values) { if (!dateTime.isDisposed()) { setDate(null); for (ReportFilterValue value : values) { if (value != null && value.getValue() != null) { try { Date date = SQL_DATETIME_FORMAT.parse(value.getValue()); setDate(date); } catch (ParseException e) { // } } break; } } } @Override public void addChangeListener( final ChangeListener<ChangeEvent> changeListener) { dateTime.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { changeListener.handleEvent(null); } }); } @Override public Control getControl() { return dateTime; } @Override public boolean isValid(ReportFilterValue value) { return value.getValue() != null && !value.getValue().isEmpty() && value.getSecondValue() == null; } @Override public String toString(ReportFilterValue value) { String string = value.getValue(); Date date = null; try { date = SQL_DATETIME_FORMAT.parse(value.getValue()); } catch (ParseException e) { // } if (date != null) { string = ""; //$NON-NLS-1$ if (isDate) { string = DISPLAY_DATE_FORMAT.format(date); } if (isTime) { if (!string.isEmpty()) { string += " "; //$NON-NLS-1$ } string += DISPLAY_TIME_FORMAT.format(date); } } return string; } private Date getDate() { Date date = dateTime.getDate(); Date cleanedDate = cleanDate(date); return cleanedDate; } private void setDate(Date date) { Date cleanedDate = cleanDate(date); dateTime.setDate(cleanedDate); } private Date cleanDate(Date date) { if (date == null) { return null; } Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.SECOND, 0); if (!isTime) { calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); } return calendar.getTime(); } }