package name.abuchen.portfolio.ui.util; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; import org.eclipse.jface.databinding.swt.WidgetValueProperty; import org.eclipse.nebula.widgets.cdatetime.CDateTime; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.DateTime; public class SimpleDateTimeSelectionProperty extends WidgetValueProperty { public SimpleDateTimeSelectionProperty() { super(SWT.Selection); } public Object getValueType() { return LocalDate.class; } @Override protected Object doGetValue(Object source) { if (source instanceof DateTime) { DateTime dateTime = (DateTime) source; // DateTime widget has zero-based months return LocalDate.of(dateTime.getYear(), dateTime.getMonth() + 1, dateTime.getDay()); } else if (source instanceof CDateTime) { Date date = ((CDateTime) source).getSelection(); return date == null ? null : LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate(); } else { throw new UnsupportedOperationException(); } } @Override protected void doSetValue(Object source, Object value) { if (source instanceof DateTime) { LocalDate date = (LocalDate) value; DateTime dateTime = (DateTime) source; // DateTime widget has zero-based months dateTime.setDate(date.getYear(), date.getMonthValue() - 1, date.getDayOfMonth()); } else if (source instanceof CDateTime) { LocalDate date = (LocalDate) value; CDateTime dateTime = (CDateTime) source; dateTime.setSelection(Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant())); } else { throw new UnsupportedOperationException(); } } }