Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions client/src/main/java/com/vaadin/client/DateTimeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ public DateTimeService(String locale) throws LocaleNotLoadedException {
setLocale(locale);
}

/**
* Utility method to format positive int as zero-padded two-digits number
*
* @param i the value
* @return "00".."99"
*/
public static String asTwoDigits(int i) {
return (i < 10 ? "0" : "") + i;
}

public void setLocale(String locale) throws LocaleNotLoadedException {
if (!LocaleService.getAvailableLocales().contains(locale)) {
throw new LocaleNotLoadedException(locale);
Expand Down
6 changes: 2 additions & 4 deletions client/src/main/java/com/vaadin/client/ui/CalendarEntry.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@

import com.vaadin.client.DateTimeService;

import static com.vaadin.client.DateTimeService.asTwoDigits;

public class CalendarEntry {
private final String styleName;
private Date start;
Expand Down Expand Up @@ -137,8 +139,4 @@ public String getStringForDate(Date d) {
return s;
}

private static String asTwoDigits(int i) {
return (i < 10 ? "0" : "") + i;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@
import com.vaadin.client.ui.aria.AriaHelper;
import com.vaadin.shared.util.SharedUtil;

import static com.vaadin.client.DateTimeService.asTwoDigits;

/**
* Abstract calendar panel to show and select a date using a resolution. The
* class is parameterized by the date resolution enumeration type.
Expand Down Expand Up @@ -719,21 +721,23 @@ private boolean isAcceptedByRangeStart(Date date, R minResolution) {
return true;
}

Date valueDuplicate = (Date) date.clone();
Date rangeStartDuplicate = (Date) rangeStart.clone();
String dateStrResolution = dateStrResolution(date, minResolution);
return rangeStart.substring(0,dateStrResolution.length())
.compareTo(dateStrResolution) <=0;
}

if (isYear(minResolution)) {
return valueDuplicate.getYear() >= rangeStartDuplicate.getYear();
private String dateStrResolution(Date date, R minResolution) {
String dateStrResolution = (1900 + date.getYear()) + "";
while (dateStrResolution.length() < 4) {
dateStrResolution = "0" + dateStrResolution;
}
if (isMonth(minResolution)) {
valueDuplicate = clearDateBelowMonth(valueDuplicate);
rangeStartDuplicate = clearDateBelowMonth(rangeStartDuplicate);
} else {
valueDuplicate = clearDateBelowDay(valueDuplicate);
rangeStartDuplicate = clearDateBelowDay(rangeStartDuplicate);
if (!isYear(minResolution)) {
dateStrResolution += "-" + asTwoDigits(1 + date.getMonth());
if (!isMonth(minResolution)) {
dateStrResolution += "-" + asTwoDigits(date.getDate());
}
}

return !rangeStartDuplicate.after(valueDuplicate);
return dateStrResolution;
}

/**
Expand All @@ -755,22 +759,9 @@ private boolean isAcceptedByRangeEnd(Date date, R minResolution) {
return true;
}

Date valueDuplicate = (Date) date.clone();
Date rangeEndDuplicate = (Date) rangeEnd.clone();

if (isYear(minResolution)) {
return valueDuplicate.getYear() <= rangeEndDuplicate.getYear();
}
if (isMonth(minResolution)) {
valueDuplicate = clearDateBelowMonth(valueDuplicate);
rangeEndDuplicate = clearDateBelowMonth(rangeEndDuplicate);
} else {
valueDuplicate = clearDateBelowDay(valueDuplicate);
rangeEndDuplicate = clearDateBelowDay(rangeEndDuplicate);
}

return !rangeEndDuplicate.before(valueDuplicate);

String dateStrResolution = dateStrResolution(date, minResolution);
return rangeEnd.substring(0,dateStrResolution.length())
.compareTo(dateStrResolution) >= 0;
}

private static Date clearDateBelowMonth(Date date) {
Expand Down Expand Up @@ -1691,14 +1682,32 @@ public void onMouseUp(MouseUpEvent event) {
* @param date
*/
private Date adjustDateToFitInsideRange(Date date) {
if (rangeStart != null && rangeStart.after(date)) {
date = (Date) rangeStart.clone();
} else if (rangeEnd != null && rangeEnd.before(date)) {
date = (Date) rangeEnd.clone();
if(!isAcceptedByRangeStart(date,resolution)) {
date = parseRangeString(rangeStart);
} else
if(!isAcceptedByRangeEnd(date,resolution)) {
date = parseRangeString(rangeEnd);
}
return date;
}

private Date parseRangeString(String dateStr) {
if(dateStr == null || "".equals(dateStr)) return null;
int year = Integer.parseInt(dateStr.substring(0,4)) - 1900;
int month = parsePart(dateStr, 5, 2,1) - 1;
int day = parsePart(dateStr, 8, 2,1);
int hrs = parsePart(dateStr, 11, 2,0);
int min = parsePart(dateStr, 14, 2,0);
int sec = parsePart(dateStr, 17, 2,0);

return new Date(year,month,day,hrs,min,sec);
}

private int parsePart(String dateStr, int beginIndex, int length, int defValue) {
if(dateStr.length() < beginIndex + length) return defValue;
return Integer.parseInt(dateStr.substring(beginIndex, beginIndex + length));
}

/**
* Sets the data of the Panel.
*
Expand Down Expand Up @@ -1914,9 +1923,9 @@ public void onFocus(FocusEvent event) {
private static final String SUBPART_DAY = "day";
private static final String SUBPART_MONTH_YEAR_HEADER = "header";

private Date rangeStart;
private String rangeStart;

private Date rangeEnd;
private String rangeEnd;

@Override
public String getSubPartName(
Expand Down Expand Up @@ -2070,7 +2079,7 @@ private void setLabel() {
* @param newRangeStart
* - the allowed range's start date
*/
public void setRangeStart(Date newRangeStart) {
public void setRangeStart(String newRangeStart) {
if (!SharedUtil.equals(rangeStart, newRangeStart)) {
rangeStart = newRangeStart;
if (initialRenderDone) {
Expand All @@ -2088,7 +2097,7 @@ public void setRangeStart(Date newRangeStart) {
* @param newRangeEnd
* - the allowed range's end date
*/
public void setRangeEnd(Date newRangeEnd) {
public void setRangeEnd(String newRangeEnd) {
if (!SharedUtil.equals(rangeEnd, newRangeEnd)) {
rangeEnd = newRangeEnd;
if (initialRenderDone) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -599,7 +599,7 @@ public String getDescriptionForAssistiveDevices() {
* @param rangeStart
* - the allowed range's start date
*/
public void setRangeStart(Date rangeStart) {
public void setRangeStart(String rangeStart) {
calendar.setRangeStart(rangeStart);
}

Expand All @@ -610,7 +610,7 @@ public void setRangeStart(Date rangeStart) {
* @param rangeEnd
* - the allowed range's end date
*/
public void setRangeEnd(Date rangeEnd) {
public void setRangeEnd(String rangeEnd) {
calendar.setRangeEnd(rangeEnd);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,6 @@ private ListBox createListBox() {
/**
* Constructs the ListBoxes and updates their value
*
* @param redraw
* Should new instances of the listboxes be created
*/
private void buildTime() {
clear();
Expand All @@ -89,11 +87,11 @@ private void buildTime() {
if (getDateTimeService().isTwelveHourClock()) {
hours.addItem("12");
for (int i = 1; i < 12; i++) {
hours.addItem(asTwoDigits(i));
hours.addItem(DateTimeService.asTwoDigits(i));
}
} else {
for (int i = 0; i < 24; i++) {
hours.addItem(asTwoDigits(i));
hours.addItem(DateTimeService.asTwoDigits(i));
}
}

Expand All @@ -109,14 +107,14 @@ private void buildTime() {
if (getResolution().compareTo(DateTimeResolution.MINUTE) <= 0) {
mins = createListBox();
for (int i = 0; i < 60; i++) {
mins.addItem(asTwoDigits(i));
mins.addItem(DateTimeService.asTwoDigits(i));
}
mins.addChangeHandler(this);
}
if (getResolution().compareTo(DateTimeResolution.SECOND) <= 0) {
sec = createListBox();
for (int i = 0; i < 60; i++) {
sec.addItem(asTwoDigits(i));
sec.addItem(DateTimeService.asTwoDigits(i));
}
sec.addChangeHandler(this);
}
Expand All @@ -130,7 +128,7 @@ private void buildTime() {
if (getDateTimeService().isTwelveHourClock()) {
h -= h < 12 ? 0 : 12;
}
add(new VLabel(asTwoDigits(h)));
add(new VLabel(DateTimeService.asTwoDigits(h)));
} else {
add(hours);
}
Expand All @@ -139,7 +137,7 @@ private void buildTime() {
add(new VLabel(delimiter));
if (isReadonly()) {
final int m = mins.getSelectedIndex();
add(new VLabel(asTwoDigits(m)));
add(new VLabel(DateTimeService.asTwoDigits(m)));
} else {
add(mins);
}
Expand All @@ -148,7 +146,7 @@ private void buildTime() {
add(new VLabel(delimiter));
if (isReadonly()) {
final int s = sec.getSelectedIndex();
add(new VLabel(asTwoDigits(s)));
add(new VLabel(DateTimeService.asTwoDigits(s)));
} else {
add(sec);
}
Expand Down Expand Up @@ -308,10 +306,6 @@ public void onChange(ChangeEvent event) {
}
}

private static String asTwoDigits(int i) {
return (i < 10 ? "0" : "") + i;
}

/**
* Dispatches an event when the panel when time is changed.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,8 @@ public void onStateChanged(StateChangeEvent stateChangeEvent) {
super.onStateChanged(stateChangeEvent);

getWidget().setTextFieldEnabled(getState().textFieldEnabled);
getWidget().setRangeStart(nullSafeDateClone(getState().rangeStart));
getWidget().setRangeEnd(nullSafeDateClone(getState().rangeEnd));
getWidget().setRangeStart(getState().rangeStart);
getWidget().setRangeEnd(getState().rangeEnd);

getWidget().calendar.setDateStyles(getState().dateStyles);
getWidget().calendar
Expand Down
42 changes: 33 additions & 9 deletions server/src/main/java/com/vaadin/ui/AbstractDateField.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalAdjuster;
import java.util.Calendar;
import java.util.Collections;
Expand Down Expand Up @@ -77,6 +79,7 @@
public abstract class AbstractDateField<T extends Temporal & TemporalAdjuster & Serializable & Comparable<? super T>, R extends Enum<R>>
extends AbstractField<T> implements FocusNotifier, BlurNotifier {

public static final DateTimeFormatter RANGE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd[ HH:mm:ss]", Locale.ENGLISH);
private AbstractDateFieldServerRpc rpc = new AbstractDateFieldServerRpc() {

@Override
Expand Down Expand Up @@ -269,14 +272,12 @@ protected T reconstructDateFromFields(Map<String, Integer> resolutions,
* - the allowed range's start date
*/
public void setRangeStart(T startDate) {
Date date = convertToDate(startDate);
if (date != null && getState().rangeEnd != null
&& date.after(getState().rangeEnd)) {
if (afterDate(startDate,convertFromDateString(getState().rangeEnd))) {
throw new IllegalStateException(
"startDate cannot be later than endDate");
}

getState().rangeStart = date;
getState().rangeStart = convertToDateString(startDate);
}

/**
Expand Down Expand Up @@ -333,23 +334,46 @@ public void setResolution(R resolution) {
* resolution)
*/
public void setRangeEnd(T endDate) {
Date date = convertToDate(endDate);
if (date != null && getState().rangeStart != null
&& getState().rangeStart.after(date)) {
String date = convertToDateString(endDate);
if (afterDate(convertFromDateString(getState().rangeStart), endDate)) {
throw new IllegalStateException(
"endDate cannot be earlier than startDate");
}

getState().rangeEnd = date;
}


/**
* Returns the precise rangeStart used.
*
* @return the precise rangeStart used, may be {@code null}.
*/
public T getRangeStart() {
return convertFromDate(getState(false).rangeStart);
return convertFromDateString(getState(false).rangeStart);
}

protected T convertFromDateString(String temporalStr) {
if (temporalStr == null) {
return null;
}
return toType(RANGE_FORMATTER.parse(temporalStr));
}

protected abstract T toType(TemporalAccessor temporalAccessor);

protected String convertToDateString(T temporal) {
if (temporal == null) {
return null;
}
return RANGE_FORMATTER.format(temporal);
}

protected boolean afterDate(T t1, T t2) {
if (t1 == null || t2 == null) {
return false;
}
return t1.compareTo(t2) > 0;
}

/**
Expand All @@ -358,7 +382,7 @@ public T getRangeStart() {
* @return the precise rangeEnd used, may be {@code null}.
*/
public T getRangeEnd() {
return convertFromDate(getState(false).rangeEnd);
return convertFromDateString(getState(false).rangeEnd);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
Expand Down Expand Up @@ -155,4 +157,9 @@ protected String formatDate(LocalDate value) {
}
return value.format(dateTimeFormatter);
}

@Override
protected LocalDate toType(TemporalAccessor temporalAccessor) {
return temporalAccessor == null? null : LocalDate.from(temporalAccessor);
}
}
Loading