package org.activityinfo.ui.client.component.form.field;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Widget;
import org.activityinfo.ui.client.widget.DateBox;
import org.activityinfo.model.type.FieldType;
import org.activityinfo.model.type.time.LocalDate;
import org.activityinfo.model.type.time.LocalDateInterval;
import org.activityinfo.promise.Promise;
import java.util.Date;
public class DateIntervalFieldWidget implements FormFieldWidget<LocalDateInterval> {
interface DateIntervalFieldWidgetUiBinder extends UiBinder<HTMLPanel, DateIntervalFieldWidget> {
}
private static DateIntervalFieldWidgetUiBinder ourUiBinder = GWT.create(DateIntervalFieldWidgetUiBinder.class);
private final HTMLPanel rootElement;
@UiField
DateBox startDateBox;
@UiField
DateBox endDateBox;
private ValueUpdater<LocalDateInterval> valueUpdater;
public DateIntervalFieldWidget(final ValueUpdater<LocalDateInterval> valueUpdater) {
this.valueUpdater = valueUpdater;
rootElement = ourUiBinder.createAndBindUi(this);
}
@UiHandler("startDateBox")
public void onStartDateChanged(ValueChangeEvent<Date> event) {
valueUpdater.update(getValue());
}
@UiHandler("endDateBox")
public void onEndDateChanged(ValueChangeEvent<Date> event) {
}
private LocalDateInterval getValue() {
Date startDate = startDateBox.getValue();
Date endDate = endDateBox.getValue();
if(startDate != null && endDate != null &&
(startDate.equals(endDate) || startDate.before(endDate))) {
return new LocalDateInterval(new LocalDate(startDate), new LocalDate(endDate));
} else {
// TODO: how do we signal the container that the value is invalid?
return null;
}
}
@Override
public void setReadOnly(boolean readOnly) {
startDateBox.setReadOnly(readOnly);
endDateBox.setReadOnly(readOnly);
}
@Override
public Promise<Void> setValue(LocalDateInterval value) {
startDateBox.setValue(value.getStartDate().atMidnightInMyTimezone());
endDateBox.setValue(value.getEndDate().atMidnightInMyTimezone());
return Promise.done();
}
@Override
public void setType(FieldType type) {
}
@Override
public void clearValue() {
startDateBox.setValue(null);
endDateBox.setValue(null);
}
@Override
public Widget asWidget() {
return rootElement;
}
}