package edu.ualberta.med.biobank.gui.common.widgets; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.TimeZone; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import edu.ualberta.med.biobank.common.formatters.DateFormatter; import edu.ualberta.med.biobank.gui.common.widgets.nebula.CDT; import edu.ualberta.med.biobank.gui.common.widgets.nebula.CDateTime; public class DateTimeWidget extends BgcBaseWidget { private CDateTime dateEntry; private List<ModifyListener> modifyListeners = new ArrayList<ModifyListener>(); private Listener dataEntryModifyListener = new Listener() { @Override public void handleEvent(Event event) { if ((event.type == SWT.Modify) || (event.type == SWT.Selection)) { fireModifyListeners(); } } }; private TimeZone timeZone; private boolean zeroOutTime = false; public DateTimeWidget(Composite parent, int style, Date date, TimeZone timeZone) { super(parent, style); this.timeZone = timeZone; GridLayout layout = new GridLayout(1, false); layout.horizontalSpacing = 0; layout.marginWidth = 0; layout.marginHeight = 0; layout.verticalSpacing = 0; setLayout(layout); GridData gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = SWT.FILL; setLayoutData(gd); if ((style & SWT.DATE) != 0) { style |= CDT.DROP_DOWN | CDT.DATE_SHORT; } dateEntry = new CDateTime(this, CDT.BORDER | CDT.COMPACT | CDT.TIME_SHORT | CDT.CLOCK_24_HOUR | CDT.BORDER | style); if (((style & SWT.TIME) != 0) && ((style & SWT.DATE) != 0)) dateEntry.setPattern(DateFormatter.DATE_TIME_FORMAT); else if ((style & SWT.TIME) != 0) dateEntry.setPattern(DateFormatter.TIME_FORMAT); else { dateEntry.setPattern(DateFormatter.DATE_FORMAT); zeroOutTime = true; } dateEntry.addListener(SWT.Modify, dataEntryModifyListener); dateEntry.addListener(SWT.Selection, dataEntryModifyListener); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.widthHint = SWT.DEFAULT; gd.heightHint = SWT.DEFAULT; dateEntry.setLayoutData(gd); if (date != null) { setDate(date); } } public DateTimeWidget(Composite parent, int style, Date date) { this(parent, style, date, DateFormatter.LOCAL); } public String getText() { return getDate().toString(); } public Date getDate() { if (dateEntry.getSelection() != null) { if (zeroOutTime) { Calendar c = Calendar.getInstance(); c.setTime(dateEntry.getSelection()); c.set(Calendar.HOUR, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTime(); } return dateEntry.getSelection(); } return null; } public void setDate(Date date) { dateEntry.setSelection(date); fireModifyListeners(); } public void addModifyListener(ModifyListener modifyListener) { modifyListeners.add(modifyListener); } protected void fireModifyListeners() { Event event = new Event(); event.type = SWT.Modify; event.widget = this; ModifyEvent modifyEvent = new ModifyEvent(event); for (ModifyListener listener : modifyListeners) { listener.modifyText(modifyEvent); } } public void removeModifyListener(ModifyListener listener) { modifyListeners.remove(listener); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); if (dateEntry != null) { dateEntry.setEnabled(enabled); } } public void addSelectionListener(SelectionListener listener) { dateEntry.addSelectionListener(listener); } public String getPattern() { return dateEntry.getPattern(); } @Override public void setBackground(Color color) { super.setBackground(color); dateEntry.setBackground(color); } public TimeZone getTimeZone() { return timeZone; } }