Browse Source

Make AbstractDateField based on LocalDate (#125).

Change-Id: I33a4a4f0f3437a8d1733031a131afbe844c12afb
tags/8.0.0.alpha4
Denis Anisimov 7 years ago
parent
commit
d36d63fefa
92 changed files with 543 additions and 2068 deletions
  1. 1
    7
      client/src/main/java/com/vaadin/client/DateTimeService.java
  2. 13
    385
      client/src/main/java/com/vaadin/client/ui/VCalendarPanel.java
  3. 12
    45
      client/src/main/java/com/vaadin/client/ui/VDateField.java
  4. 2
    31
      client/src/main/java/com/vaadin/client/ui/VDateFieldCalendar.java
  5. 4
    24
      client/src/main/java/com/vaadin/client/ui/VPopupCalendar.java
  6. 4
    51
      client/src/main/java/com/vaadin/client/ui/VTextualDate.java
  7. 7
    21
      client/src/main/java/com/vaadin/client/ui/datefield/AbstractDateFieldConnector.java
  8. 4
    35
      client/src/main/java/com/vaadin/client/ui/datefield/DateFieldConnector.java
  9. 1
    30
      client/src/main/java/com/vaadin/client/ui/datefield/InlineDateFieldConnector.java
  10. 1
    1
      compatibility-client/src/main/java/com/vaadin/v7/client/ui/VCalendarPanel.java
  11. 1
    1
      compatibility-client/src/main/java/com/vaadin/v7/client/ui/VDateField.java
  12. 1
    1
      compatibility-client/src/main/java/com/vaadin/v7/client/ui/VDateFieldCalendar.java
  13. 1
    1
      compatibility-client/src/main/java/com/vaadin/v7/client/ui/VPopupCalendar.java
  14. 1
    1
      compatibility-client/src/main/java/com/vaadin/v7/client/ui/VTextualDate.java
  15. 1
    1
      compatibility-client/src/main/java/com/vaadin/v7/client/ui/datefield/AbstractDateFieldConnector.java
  16. 1
    1
      compatibility-client/src/main/java/com/vaadin/v7/client/ui/datefield/DateFieldConnector.java
  17. 1
    1
      compatibility-client/src/main/java/com/vaadin/v7/client/ui/datefield/InlineDateFieldConnector.java
  18. 1
    1
      compatibility-client/src/main/java/com/vaadin/v7/client/ui/datefield/TextualDateConnector.java
  19. 1
    1
      compatibility-server/src/main/java/com/vaadin/v7/ui/DateField.java
  20. 2
    2
      compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/datefield/DateFieldConverterTest.java
  21. 1
    1
      compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/datefield/LegacyDateFieldDeclarativeTest.java
  22. 1
    1
      compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/datefield/PopupDateFieldDeclarativeTest.java
  23. 84
    0
      compatibility-shared/src/main/java/com/vaadin/v7/shared/ui/datefield/Resolution.java
  24. 1
    1
      documentation/datamodel/datamodel-fields.asciidoc
  25. 4
    4
      documentation/datamodel/datamodel-forms.asciidoc
  26. 87
    227
      server/src/main/java/com/vaadin/ui/AbstractDateField.java
  27. 12
    12
      server/src/main/java/com/vaadin/ui/DateField.java
  28. 6
    6
      server/src/main/java/com/vaadin/ui/InlineDateField.java
  29. 3
    0
      server/src/main/java/com/vaadin/ui/declarative/DesignFormatter.java
  30. 60
    0
      server/src/main/java/com/vaadin/ui/declarative/converters/DesignLocalDateConverter.java
  31. 21
    27
      server/src/test/java/com/vaadin/data/BinderBookOfVaadinTest.java
  32. 5
    8
      server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java
  33. 6
    9
      server/src/test/java/com/vaadin/tests/server/component/datefield/InlineDateFieldDeclarativeTest.java
  34. 0
    23
      server/src/test/java/com/vaadin/tests/server/component/datefield/ResolutionTest.java
  35. 22
    13
      server/src/test/java/com/vaadin/ui/DateFieldTestCase.java
  36. 1
    1
      shared/src/main/java/com/vaadin/shared/ui/datefield/DateFieldState.java
  37. 2
    19
      shared/src/main/java/com/vaadin/shared/ui/datefield/Resolution.java
  38. 3
    2
      uitest/src/main/java/com/vaadin/tests/RandomLayoutStress.java
  39. 3
    3
      uitest/src/main/java/com/vaadin/tests/components/TestDateField.java
  40. 9
    9
      uitest/src/main/java/com/vaadin/tests/components/abstractfield/AbstractFieldTest.java
  41. 1
    1
      uitest/src/main/java/com/vaadin/tests/components/calendar/BeanItemContainerTestUI.java
  42. 1
    1
      uitest/src/main/java/com/vaadin/tests/components/calendar/CalendarTest.java
  43. 7
    19
      uitest/src/main/java/com/vaadin/tests/components/datefield/AbstractDateFieldTest.java
  44. 3
    7
      uitest/src/main/java/com/vaadin/tests/components/datefield/CustomDateFormat.java
  45. 2
    5
      uitest/src/main/java/com/vaadin/tests/components/datefield/CustomDateFormatEEE.java
  46. 6
    8
      uitest/src/main/java/com/vaadin/tests/components/datefield/CustomDateFormats.java
  47. 2
    2
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldChangeResolution.java
  48. 13
    22
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldDayResolutionOffset.java
  49. 1
    1
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldEmptyValid.java
  50. 9
    20
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldExtendedRange.java
  51. 4
    4
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldIsValid.java
  52. 3
    7
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldKeyboardInput.java
  53. 2
    2
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldLocale.java
  54. 0
    58
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldMinResolution.java
  55. 2
    4
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.java
  56. 0
    2
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldRangeValidation.java
  57. 4
    6
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldRanges.java
  58. 2
    8
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldReadOnly.java
  59. 1
    9
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldTest.java
  60. 0
    103
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldTimezone.java
  61. 11
    11
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldUnparsableDate.java
  62. 0
    101
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldValueChangeEvents.java
  63. 7
    7
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldWhenChangingValueAndEnablingParent.java
  64. 4
    16
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateFields.java
  65. 2
    4
      uitest/src/main/java/com/vaadin/tests/components/datefield/DatePopupStyleName.java
  66. 0
    57
      uitest/src/main/java/com/vaadin/tests/components/datefield/DateRangeWithSqlDate.java
  67. 4
    11
      uitest/src/main/java/com/vaadin/tests/components/datefield/DisabledInlineDateField.java
  68. 7
    14
      uitest/src/main/java/com/vaadin/tests/components/datefield/DynamicallyChangeDateRange.java
  69. 3
    14
      uitest/src/main/java/com/vaadin/tests/components/datefield/InlineDateFields.java
  70. 1
    1
      uitest/src/main/java/com/vaadin/tests/components/datefield/LegacyDateFieldRanges.java
  71. 1
    1
      uitest/src/main/java/com/vaadin/tests/components/datefield/LegacyDateFieldTest.java
  72. 5
    5
      uitest/src/main/java/com/vaadin/tests/components/datefield/LenientMode.java
  73. 0
    83
      uitest/src/main/java/com/vaadin/tests/components/datefield/LocaleChange.java
  74. 5
    3
      uitest/src/main/java/com/vaadin/tests/components/datefield/LowResolution.java
  75. 1
    5
      uitest/src/main/java/com/vaadin/tests/components/datefield/PopupClosingWithEsc.java
  76. 5
    17
      uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldExtendedRange.java
  77. 0
    46
      uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldLocaleTest.java
  78. 0
    41
      uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldPopup.java
  79. 3
    12
      uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldStates.java
  80. 2
    2
      uitest/src/main/java/com/vaadin/tests/components/datefield/TestDatefieldYear.java
  81. 2
    4
      uitest/src/main/java/com/vaadin/tests/components/datefield/WidthRecalculationOnEnableStateChange.java
  82. 5
    6
      uitest/src/main/java/com/vaadin/tests/components/uitest/components/DatesCssTest.java
  83. 1
    1
      uitest/src/main/java/com/vaadin/tests/themes/valo/CalendarTest.java
  84. 7
    35
      uitest/src/main/java/com/vaadin/tests/themes/valo/DateFields.java
  85. 2
    2
      uitest/src/main/java/com/vaadin/tests/themes/valo/Forms.java
  86. 3
    22
      uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldChangeResolutionTest.java
  87. 3
    2
      uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldDayResolutionOffsetTest.java
  88. 5
    5
      uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldReadOnlyTest.java
  89. 0
    92
      uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldValueChangeEventsTest.java
  90. 0
    52
      uitest/src/test/java/com/vaadin/tests/components/datefield/DateRangeWithSqlDateTest.java
  91. 0
    84
      uitest/src/test/java/com/vaadin/tests/components/datefield/LocaleChangeTest.java
  92. 0
    16
      uitest/src/test/java/com/vaadin/tests/components/datefield/PopupClosingWithEscTest.java

+ 1
- 7
client/src/main/java/com/vaadin/client/DateTimeService.java View File

@@ -20,8 +20,8 @@ import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.i18n.shared.DateTimeFormat;
import com.vaadin.shared.ui.datefield.Resolution;

/**
@@ -235,15 +235,9 @@ public class DateTimeService {
start += s.getHours() * 10000l;
end += e.getHours() * 10000l;
target += date.getHours() * 10000l;
if (resolution == Resolution.HOUR) {
return (start <= target && end >= target);
}
start += s.getMinutes() * 100l;
end += e.getMinutes() * 100l;
target += date.getMinutes() * 100l;
if (resolution == Resolution.MINUTE) {
return (start <= target && end >= target);
}
start += s.getSeconds();
end += e.getSeconds();
target += date.getSeconds();

+ 13
- 385
client/src/main/java/com/vaadin/client/ui/VCalendarPanel.java View File

@@ -23,11 +23,8 @@ import com.google.gwt.aria.client.Roles;
import com.google.gwt.aria.client.SelectedValue;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.Node;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.DomEvent;
@@ -48,9 +45,7 @@ import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.InlineHTML;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Widget;
import com.vaadin.client.BrowserInfo;
import com.vaadin.client.DateTimeService;
@@ -96,14 +91,6 @@ public class VCalendarPanel extends FocusableFlexTable implements
void focusChanged(Date focusedDate);
}

/**
* Dispatches an event when the panel when time is changed
*/
public interface TimeChangeListener {

void changed(int hour, int min, int sec, int msec);
}

/**
* Represents a Date button in the calendar
*/
@@ -169,8 +156,6 @@ public class VCalendarPanel extends FocusableFlexTable implements

private VEventButton nextMonth;

private VTime time;

private FlexTable days = new FlexTable();

private Resolution resolution = Resolution.YEAR;
@@ -197,8 +182,6 @@ public class VCalendarPanel extends FocusableFlexTable implements

private FocusChangeListener focusChangeListener;

private TimeChangeListener timeChangeListener;

private boolean hasFocus = false;

private VDateField parent;
@@ -238,8 +221,7 @@ public class VCalendarPanel extends FocusableFlexTable implements
*/
private void focusDay(Date date) {
// Only used when calender body is present
if (resolution.getCalendarField() > Resolution.MONTH
.getCalendarField()) {
if (isDay(getResolution())) {
if (focusedDay != null) {
focusedDay.removeStyleDependentName(CN_FOCUSED);
}
@@ -265,6 +247,10 @@ public class VCalendarPanel extends FocusableFlexTable implements
}
}

private boolean isDay(Resolution resolution) {
return Resolution.DAY.equals(resolution);
}

/**
* Sets the selection highlight to a given day in the current view
*
@@ -344,10 +330,6 @@ public class VCalendarPanel extends FocusableFlexTable implements

public void setResolution(Resolution resolution) {
this.resolution = resolution;
if (time != null) {
time.removeFromParent();
time = null;
}
}

private boolean isReadonly() {
@@ -685,8 +667,7 @@ public class VCalendarPanel extends FocusableFlexTable implements
if (day > 6) {
day = 0;
}
if (getResolution().getCalendarField() > Resolution.MONTH
.getCalendarField()) {
if (isDay(getResolution())) {
days.setHTML(headerRow, firstWeekdayColumn + i, "<strong>"
+ getDateTimeService().getShortDay(day) + "</strong>");
} else {
@@ -771,16 +752,6 @@ public class VCalendarPanel extends FocusableFlexTable implements
}
}

/**
* Do we need the time selector
*
* @return True if it is required
*/
private boolean isTimeSelectorNeeded() {
return getResolution().getCalendarField() > Resolution.DAY
.getCalendarField();
}

/**
* Updates the calendar and text field with the selected dates.
*/
@@ -812,31 +783,19 @@ public class VCalendarPanel extends FocusableFlexTable implements
displayedMonth = new FocusedDate(now.getYear(), now.getMonth(), 1);
}

if (updateDate && getResolution().getCalendarField() <= Resolution.MONTH
.getCalendarField() && focusChangeListener != null) {
if (updateDate && !isDay(getResolution())
&& focusChangeListener != null) {
focusChangeListener.focusChanged(new Date(focusedDate.getTime()));
}

final boolean needsMonth = getResolution()
.getCalendarField() > Resolution.YEAR.getCalendarField();
boolean needsBody = getResolution().getCalendarField() >= Resolution.DAY
.getCalendarField();
final boolean needsMonth = !getResolution().equals(Resolution.YEAR);
boolean needsBody = isDay(getResolution());
buildCalendarHeader(needsMonth);
clearCalendarBody(!needsBody);
if (needsBody) {
buildCalendarBody();
}

if (isTimeSelectorNeeded()) {
time = new VTime();
setWidget(2, 0, time);
getFlexCellFormatter().setColSpan(2, 0, 5);
getFlexCellFormatter().setStyleName(2, 0,
parent.getStylePrimaryName() + "-calendarpanel-time");
} else if (time != null) {
remove(time);
}

initialRenderDone = true;
}

@@ -1105,23 +1064,6 @@ public class VCalendarPanel extends FocusableFlexTable implements
* The keydown/keypress event
*/
private void handleKeyPress(DomEvent<?> event) {
// Special handling for events from time ListBoxes.
if (time != null && time.getElement().isOrHasChild(
(Node) event.getNativeEvent().getEventTarget().cast())) {
int nativeKeyCode = event.getNativeEvent().getKeyCode();
if (nativeKeyCode == getSelectKey()) {
onSubmit(); // submit if enter key hit down on listboxes
event.preventDefault();
event.stopPropagation();
}
if (nativeKeyCode == getCloseKey()) {
onCancel(); // cancel if ESC key hit down on listboxes
event.preventDefault();
event.stopPropagation();
}
return;
}

// Check tabs
int keycode = event.getNativeEvent().getKeyCode();
if (keycode == KeyCodes.KEY_TAB
@@ -1610,8 +1552,7 @@ public class VCalendarPanel extends FocusableFlexTable implements
// confusion, but this is only needed (and allowed) when we have
// a day
// resolution
if (getResolution().getCalendarField() >= Resolution.DAY
.getCalendarField()) {
if (isDay(getResolution())) {
value = null;
}
} else {
@@ -1624,19 +1565,14 @@ public class VCalendarPanel extends FocusableFlexTable implements
1);
}

// Re-render calendar if the displayed month is changed,
// or if a time selector is needed but does not exist.
if ((isTimeSelectorNeeded() && time == null)
|| oldDisplayedMonth == null || value == null
// Re-render calendar if the displayed month is changed.
if (oldDisplayedMonth == null || value == null
|| oldDisplayedMonth.getYear() != value.getYear()
|| oldDisplayedMonth.getMonth() != value.getMonth()) {
renderCalendar();
} else {
focusDay(focusedDate);
selectFocused();
if (isTimeSelectorNeeded()) {
time.updateTimes();
}
}

if (!hasFocus) {
@@ -1644,282 +1580,6 @@ public class VCalendarPanel extends FocusableFlexTable implements
}
}

/**
* TimeSelector is a widget consisting of list boxes that modifie the Date
* object that is given for.
*
*/
public class VTime extends FlowPanel implements ChangeHandler {

private ListBox hours;

private ListBox mins;

private ListBox sec;

private ListBox ampm;

/**
* Constructor
*/
public VTime() {
super();
setStyleName(VDateField.CLASSNAME + "-time");
buildTime();
}

private ListBox createListBox() {
ListBox lb = new ListBox();
lb.setStyleName("v-select");
lb.addChangeHandler(this);
lb.addBlurHandler(VCalendarPanel.this);
lb.addFocusHandler(VCalendarPanel.this);
return lb;
}

/**
* Constructs the ListBoxes and updates their value
*
* @param redraw
* Should new instances of the listboxes be created
*/
private void buildTime() {
clear();

hours = createListBox();
if (getDateTimeService().isTwelveHourClock()) {
hours.addItem("12");
for (int i = 1; i < 12; i++) {
hours.addItem((i < 10) ? "0" + i : "" + i);
}
} else {
for (int i = 0; i < 24; i++) {
hours.addItem((i < 10) ? "0" + i : "" + i);
}
}

hours.addChangeHandler(this);
if (getDateTimeService().isTwelveHourClock()) {
ampm = createListBox();
final String[] ampmText = getDateTimeService().getAmPmStrings();
ampm.addItem(ampmText[0]);
ampm.addItem(ampmText[1]);
ampm.addChangeHandler(this);
}

if (getResolution().getCalendarField() >= Resolution.MINUTE
.getCalendarField()) {
mins = createListBox();
for (int i = 0; i < 60; i++) {
mins.addItem((i < 10) ? "0" + i : "" + i);
}
mins.addChangeHandler(this);
}
if (getResolution().getCalendarField() >= Resolution.SECOND
.getCalendarField()) {
sec = createListBox();
for (int i = 0; i < 60; i++) {
sec.addItem((i < 10) ? "0" + i : "" + i);
}
sec.addChangeHandler(this);
}

final String delimiter = getDateTimeService().getClockDelimeter();
if (isReadonly()) {
int h = 0;
if (value != null) {
h = value.getHours();
}
if (getDateTimeService().isTwelveHourClock()) {
h -= h < 12 ? 0 : 12;
}
add(new VLabel(h < 10 ? "0" + h : "" + h));
} else {
add(hours);
}

if (getResolution().getCalendarField() >= Resolution.MINUTE
.getCalendarField()) {
add(new VLabel(delimiter));
if (isReadonly()) {
final int m = mins.getSelectedIndex();
add(new VLabel(m < 10 ? "0" + m : "" + m));
} else {
add(mins);
}
}
if (getResolution().getCalendarField() >= Resolution.SECOND
.getCalendarField()) {
add(new VLabel(delimiter));
if (isReadonly()) {
final int s = sec.getSelectedIndex();
add(new VLabel(s < 10 ? "0" + s : "" + s));
} else {
add(sec);
}
}
if (getResolution() == Resolution.HOUR) {
add(new VLabel(delimiter + "00")); // o'clock
}
if (getDateTimeService().isTwelveHourClock()) {
add(new VLabel("&nbsp;"));
if (isReadonly()) {
int i = 0;
if (value != null) {
i = (value.getHours() < 12) ? 0 : 1;
}
add(new VLabel(ampm.getItemText(i)));
} else {
add(ampm);
}
}

if (isReadonly()) {
return;
}

// Update times
updateTimes();

ListBox lastDropDown = getLastDropDown();
lastDropDown.addKeyDownHandler(new KeyDownHandler() {
@Override
public void onKeyDown(KeyDownEvent event) {
boolean shiftKey = event.getNativeEvent().getShiftKey();
if (shiftKey) {
return;
} else {
int nativeKeyCode = event.getNativeKeyCode();
if (nativeKeyCode == KeyCodes.KEY_TAB) {
onTabOut(event);
}
}
}
});

}

private ListBox getLastDropDown() {
int i = getWidgetCount() - 1;
while (i >= 0) {
Widget widget = getWidget(i);
if (widget instanceof ListBox) {
return (ListBox) widget;
}
i--;
}
return null;
}

/**
* Updates the valus to correspond to the values in value
*/
public void updateTimes() {
if (value == null) {
value = new Date();
}
if (getDateTimeService().isTwelveHourClock()) {
int h = value.getHours();
ampm.setSelectedIndex(h < 12 ? 0 : 1);
h -= ampm.getSelectedIndex() * 12;
hours.setSelectedIndex(h);
} else {
hours.setSelectedIndex(value.getHours());
}
if (getResolution().getCalendarField() >= Resolution.MINUTE
.getCalendarField()) {
mins.setSelectedIndex(value.getMinutes());
}
if (getResolution().getCalendarField() >= Resolution.SECOND
.getCalendarField()) {
sec.setSelectedIndex(value.getSeconds());
}
if (getDateTimeService().isTwelveHourClock()) {
ampm.setSelectedIndex(value.getHours() < 12 ? 0 : 1);
}

hours.setEnabled(isEnabled());
if (mins != null) {
mins.setEnabled(isEnabled());
}
if (sec != null) {
sec.setEnabled(isEnabled());
}
if (ampm != null) {
ampm.setEnabled(isEnabled());
}

}

private DateTimeService getDateTimeService() {
if (dateTimeService == null) {
dateTimeService = new DateTimeService();
}
return dateTimeService;
}

/*
* (non-Javadoc) VT
*
* @see
* com.google.gwt.event.dom.client.ChangeHandler#onChange(com.google.gwt
* .event.dom.client.ChangeEvent)
*/
@Override
public void onChange(ChangeEvent event) {
/*
* Value from dropdowns gets always set for the value. Like year and
* month when resolution is month or year.
*/
if (event.getSource() == hours) {
int h = hours.getSelectedIndex();
if (getDateTimeService().isTwelveHourClock()) {
h = h + ampm.getSelectedIndex() * 12;
}
value.setHours(h);
if (timeChangeListener != null) {
timeChangeListener.changed(h, value.getMinutes(),
value.getSeconds(),
DateTimeService.getMilliseconds(value));
}
event.preventDefault();
event.stopPropagation();
} else if (event.getSource() == mins) {
final int m = mins.getSelectedIndex();
value.setMinutes(m);
if (timeChangeListener != null) {
timeChangeListener.changed(value.getHours(), m,
value.getSeconds(),
DateTimeService.getMilliseconds(value));
}
event.preventDefault();
event.stopPropagation();
} else if (event.getSource() == sec) {
final int s = sec.getSelectedIndex();
value.setSeconds(s);
if (timeChangeListener != null) {
timeChangeListener.changed(value.getHours(),
value.getMinutes(), s,
DateTimeService.getMilliseconds(value));
}
event.preventDefault();
event.stopPropagation();
} else if (event.getSource() == ampm) {
final int h = hours.getSelectedIndex()
+ (ampm.getSelectedIndex() * 12);
value.setHours(h);
if (timeChangeListener != null) {
timeChangeListener.changed(h, value.getMinutes(),
value.getSeconds(),
DateTimeService.getMilliseconds(value));
}
event.preventDefault();
event.stopPropagation();
}
}

}

/**
* A widget representing a single day in the calendar panel.
*/
@@ -1988,15 +1648,6 @@ public class VCalendarPanel extends FocusableFlexTable implements
focusChangeListener = listener;
}

/**
* The time change listener is triggered when the user changes the time.
*
* @param listener
*/
public void setTimeChangeListener(TimeChangeListener listener) {
timeChangeListener = listener;
}

/**
* Returns the submit listener that listens to selection made from the panel
*
@@ -2083,17 +1734,6 @@ public class VCalendarPanel extends FocusableFlexTable implements
}
return SUBPART_DAY + id;
}
} else if (time != null) {
if (contains(time.hours, subElement)) {
return SUBPART_HOUR_SELECT;
} else if (contains(time.mins, subElement)) {
return SUBPART_MINUTE_SELECT;
} else if (contains(time.sec, subElement)) {
return SUBPART_SECS_SELECT;
} else if (contains(time.ampm, subElement)) {
return SUBPART_AMPM_SELECT;

}
} else if (getCellFormatter().getElement(0, 2)
.isOrHasChild(subElement)) {
return SUBPART_MONTH_YEAR_HEADER;
@@ -2132,18 +1772,6 @@ public class VCalendarPanel extends FocusableFlexTable implements
if (SUBPART_PREV_YEAR.equals(subPart)) {
return prevYear.getElement();
}
if (SUBPART_HOUR_SELECT.equals(subPart)) {
return time.hours.getElement();
}
if (SUBPART_MINUTE_SELECT.equals(subPart)) {
return time.mins.getElement();
}
if (SUBPART_SECS_SELECT.equals(subPart)) {
return time.sec.getElement();
}
if (SUBPART_AMPM_SELECT.equals(subPart)) {
return time.ampm.getElement();
}
if (subPart.startsWith(SUBPART_DAY)) {
// Zero or negative ids map to days in the preceding month,
// past-the-end-of-month ids to days in the following month

+ 12
- 45
client/src/main/java/com/vaadin/client/ui/VDateField.java View File

@@ -37,24 +37,8 @@ public class VDateField extends FlowPanel implements Field, HasEnabled {
/** For internal use only. May be removed or replaced in the future. */
public boolean immediate;

@Deprecated
public static final Resolution RESOLUTION_YEAR = Resolution.YEAR;
@Deprecated
public static final Resolution RESOLUTION_MONTH = Resolution.MONTH;
@Deprecated
public static final Resolution RESOLUTION_DAY = Resolution.DAY;
@Deprecated
public static final Resolution RESOLUTION_HOUR = Resolution.HOUR;
@Deprecated
public static final Resolution RESOLUTION_MIN = Resolution.MINUTE;
@Deprecated
public static final Resolution RESOLUTION_SEC = Resolution.SECOND;

/** For internal use only. May be removed or replaced in the future. */
public static String resolutionToString(Resolution res) {
if (res.getCalendarField() > Resolution.DAY.getCalendarField()) {
return "full";
}
if (res == Resolution.DAY) {
return "day";
}
@@ -89,37 +73,20 @@ public class VDateField extends FlowPanel implements Field, HasEnabled {
}

/**
* We need this redundant native function because Java's Date object doesn't
* have a setMilliseconds method.
* <p>
* For internal use only. May be removed or replaced in the future.
*/
public static native double getTime(int y, int m, int d, int h, int mi,
int s, int ms)
/*-{
try {
var date = new Date(2000,1,1,1); // don't use current date here
if(y && y >= 0) date.setFullYear(y);
if(m && m >= 1) date.setMonth(m-1);
if(d && d >= 0) date.setDate(d);
if(h >= 0) date.setHours(h);
if(mi >= 0) date.setMinutes(mi);
if(s >= 0) date.setSeconds(s);
if(ms >= 0) date.setMilliseconds(ms);
return date.getTime();
} catch (e) {
// TODO print some error message on the console
//console.log(e);
return (new Date()).getTime();
}
}-*/;

public int getMilliseconds() {
return DateTimeService.getMilliseconds(date);
}

public void setMilliseconds(int ms) {
DateTimeService.setMilliseconds(date, ms);
public static Date getTime(int year, int month, int day) {
Date date = new Date(2000 - 1900, 0, 1);
if (year >= 0) {
date.setYear(year - 1900);
}
if (month >= 0) {
date.setMonth(month - 1);
}
if (day >= 0) {
date.setDate(day);
}
return date;
}

public Resolution getCurrentResolution() {

+ 2
- 31
client/src/main/java/com/vaadin/client/ui/VDateFieldCalendar.java View File

@@ -19,7 +19,6 @@ package com.vaadin.client.ui;
import java.util.Date;

import com.google.gwt.event.dom.client.DomEvent;
import com.vaadin.client.DateTimeService;
import com.vaadin.client.ui.VCalendarPanel.FocusOutListener;
import com.vaadin.client.ui.VCalendarPanel.SubmitListener;
import com.vaadin.shared.ui.datefield.Resolution;
@@ -79,40 +78,12 @@ public class VDateFieldCalendar extends VDateField {
setCurrentDate((Date) date2.clone());
getClient().updateVariable(getId(), "year", date2.getYear() + 1900,
false);
if (getCurrentResolution().getCalendarField() > Resolution.YEAR
.getCalendarField()) {
if (getCurrentResolution().compareTo(Resolution.YEAR) < 0) {
getClient().updateVariable(getId(), "month",
date2.getMonth() + 1, false);
if (getCurrentResolution().getCalendarField() > Resolution.MONTH
.getCalendarField()) {
if (getCurrentResolution().compareTo(Resolution.MONTH) < 0) {
getClient().updateVariable(getId(), "day", date2.getDate(),
false);
if (getCurrentResolution()
.getCalendarField() > Resolution.DAY
.getCalendarField()) {
getClient().updateVariable(getId(), "hour",
date2.getHours(), false);
if (getCurrentResolution()
.getCalendarField() > Resolution.HOUR
.getCalendarField()) {
getClient().updateVariable(getId(), "min",
date2.getMinutes(), false);
if (getCurrentResolution()
.getCalendarField() > Resolution.MINUTE
.getCalendarField()) {
getClient().updateVariable(getId(), "sec",
date2.getSeconds(), false);
if (getCurrentResolution()
.getCalendarField() > Resolution.SECOND
.getCalendarField()) {
getClient().updateVariable(getId(),
"msec", DateTimeService
.getMilliseconds(date2),
false);
}
}
}
}
}
}
if (isImmediate()) {

+ 4
- 24
client/src/main/java/com/vaadin/client/ui/VPopupCalendar.java View File

@@ -51,7 +51,7 @@ import com.vaadin.client.VConsole;
import com.vaadin.client.ui.VCalendarPanel.FocusOutListener;
import com.vaadin.client.ui.VCalendarPanel.SubmitListener;
import com.vaadin.client.ui.aria.AriaHelper;
import com.vaadin.shared.ui.datefield.PopupDateFieldState;
import com.vaadin.shared.ui.datefield.DateFieldState;
import com.vaadin.shared.ui.datefield.Resolution;

/**
@@ -130,7 +130,7 @@ public class VPopupCalendar extends VTextualDate
// Description of the usage of the widget for assisitve device users
descriptionForAssisitveDevicesElement = DOM.createDiv();
descriptionForAssisitveDevicesElement.setInnerText(
PopupDateFieldState.DESCRIPTION_FOR_ASSISTIVE_DEVICES);
DateFieldState.DESCRIPTION_FOR_ASSISTIVE_DEVICES);
AriaHelper.ensureHasId(descriptionForAssisitveDevicesElement);
Roles.getTextboxRole().setAriaDescribedbyProperty(text.getElement(),
Id.of(descriptionForAssisitveDevicesElement));
@@ -222,32 +222,12 @@ public class VPopupCalendar extends VTextualDate
setCurrentDate((Date) newDate.clone());
getClient().updateVariable(getId(), "year",
newDate.getYear() + 1900, false);
if (getCurrentResolution().getCalendarField() > Resolution.YEAR
.getCalendarField()) {
if (getCurrentResolution().compareTo(Resolution.YEAR) < 0) {
getClient().updateVariable(getId(), "month",
newDate.getMonth() + 1, false);
if (getCurrentResolution().getCalendarField() > Resolution.MONTH
.getCalendarField()) {
if (getCurrentResolution().compareTo(Resolution.MONTH) < 0) {
getClient().updateVariable(getId(), "day",
newDate.getDate(), false);
if (getCurrentResolution()
.getCalendarField() > Resolution.DAY
.getCalendarField()) {
getClient().updateVariable(getId(), "hour",
newDate.getHours(), false);
if (getCurrentResolution()
.getCalendarField() > Resolution.HOUR
.getCalendarField()) {
getClient().updateVariable(getId(), "min",
newDate.getMinutes(), false);
if (getCurrentResolution()
.getCalendarField() > Resolution.MINUTE
.getCalendarField()) {
getClient().updateVariable(getId(), "sec",
newDate.getSeconds(), false);
}
}
}
}
}
}

+ 4
- 51
client/src/main/java/com/vaadin/client/ui/VTextualDate.java View File

@@ -132,30 +132,6 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler,
String frmString = LocaleService
.getDateFormat(currentLocale);
frmString = cleanFormat(frmString);
// String delim = LocaleService
// .getClockDelimiter(currentLocale);
if (currentResolution.getCalendarField() >= Resolution.HOUR
.getCalendarField()) {
if (dts.isTwelveHourClock()) {
frmString += " hh";
} else {
frmString += " HH";
}
if (currentResolution
.getCalendarField() >= Resolution.MINUTE
.getCalendarField()) {
frmString += ":mm";
if (currentResolution
.getCalendarField() >= Resolution.SECOND
.getCalendarField()) {
frmString += ":ss";
}
}
if (dts.isTwelveHourClock()) {
frmString += " aaa";
}

}

formatStr = frmString;
} catch (LocaleNotLoadedException e) {
@@ -283,47 +259,24 @@ public class VTextualDate extends VDateField implements Field, ChangeHandler,
getClient().updateVariable(getId(), "year",
currentDate != null ? currentDate.getYear() + 1900 : -1,
currentResolution == Resolution.YEAR && immediate);
if (currentResolution.getCalendarField() >= Resolution.MONTH
.getCalendarField()) {
if (currentResolution.compareTo(Resolution.MONTH) <= 0) {
getClient().updateVariable(getId(), "month",
currentDate != null ? currentDate.getMonth() + 1 : -1,
currentResolution == Resolution.MONTH && immediate);
}
if (currentResolution.getCalendarField() >= Resolution.DAY
.getCalendarField()) {
if (currentResolution.compareTo(Resolution.DAY) <= 0) {
getClient().updateVariable(getId(), "day",
currentDate != null ? currentDate.getDate() : -1,
currentResolution == Resolution.DAY && immediate);
}
if (currentResolution.getCalendarField() >= Resolution.HOUR
.getCalendarField()) {
getClient().updateVariable(getId(), "hour",
currentDate != null ? currentDate.getHours() : -1,
currentResolution == Resolution.HOUR && immediate);
}
if (currentResolution.getCalendarField() >= Resolution.MINUTE
.getCalendarField()) {
getClient().updateVariable(getId(), "min",
currentDate != null ? currentDate.getMinutes() : -1,
currentResolution == Resolution.MINUTE && immediate);
}
if (currentResolution.getCalendarField() >= Resolution.SECOND
.getCalendarField()) {
getClient().updateVariable(getId(), "sec",
currentDate != null ? currentDate.getSeconds() : -1,
currentResolution == Resolution.SECOND && immediate);
}

}

private String cleanFormat(String format) {
// Remove unnecessary d & M if resolution is too low
if (currentResolution.getCalendarField() < Resolution.DAY
.getCalendarField()) {
if (currentResolution.compareTo(Resolution.DAY) > 0) {
format = format.replaceAll("d", "");
}
if (currentResolution.getCalendarField() < Resolution.MONTH
.getCalendarField()) {
if (currentResolution.compareTo(Resolution.MONTH) > 0) {
format = format.replaceAll("M", "");
}


+ 7
- 21
client/src/main/java/com/vaadin/client/ui/datefield/AbstractDateFieldConnector.java View File

@@ -15,8 +15,6 @@
*/
package com.vaadin.client.ui.datefield;

import java.util.Date;

import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.LocaleNotLoadedException;
import com.vaadin.client.Paintable;
@@ -24,6 +22,7 @@ import com.vaadin.client.UIDL;
import com.vaadin.client.VConsole;
import com.vaadin.client.ui.AbstractFieldConnector;
import com.vaadin.client.ui.VDateField;
import com.vaadin.client.ui.VTextualDate;
import com.vaadin.shared.ui.datefield.DateFieldConstants;
import com.vaadin.shared.ui.datefield.Resolution;

@@ -65,13 +64,7 @@ public class AbstractDateFieldConnector extends AbstractFieldConnector
&& getWidget().dts.getFirstDayOfWeek() == 1);

Resolution newResolution;
if (uidl.hasVariable("sec")) {
newResolution = Resolution.SECOND;
} else if (uidl.hasVariable("min")) {
newResolution = Resolution.MINUTE;
} else if (uidl.hasVariable("hour")) {
newResolution = Resolution.HOUR;
} else if (uidl.hasVariable("day")) {
if (uidl.hasVariable("day")) {
newResolution = Resolution.DAY;
} else if (uidl.hasVariable("month")) {
newResolution = Resolution.MONTH;
@@ -95,21 +88,14 @@ public class AbstractDateFieldConnector extends AbstractFieldConnector

final Resolution resolution = getWidget().getCurrentResolution();
final int year = uidl.getIntVariable("year");
final int month = (resolution.getCalendarField() >= Resolution.MONTH
.getCalendarField()) ? uidl.getIntVariable("month") : -1;
final int day = (resolution.getCalendarField() >= Resolution.DAY
.getCalendarField()) ? uidl.getIntVariable("day") : -1;
final int hour = (resolution.getCalendarField() >= Resolution.HOUR
.getCalendarField()) ? uidl.getIntVariable("hour") : 0;
final int min = (resolution.getCalendarField() >= Resolution.MINUTE
.getCalendarField()) ? uidl.getIntVariable("min") : 0;
final int sec = (resolution.getCalendarField() >= Resolution.SECOND
.getCalendarField()) ? uidl.getIntVariable("sec") : 0;
final int month = resolution.compareTo(Resolution.MONTH) <= 0
? uidl.getIntVariable("month") : -1;
final int day = resolution.compareTo(Resolution.DAY) <= 0
? uidl.getIntVariable("day") : -1;

// Construct new date for this datefield (only if not null)
if (year > -1) {
getWidget().setCurrentDate(new Date((long) getWidget().getTime(year,
month, day, hour, min, sec, 0)));
getWidget().setCurrentDate(VTextualDate.getTime(year, month, day));
} else {
getWidget().setCurrentDate(null);
}

+ 4
- 35
client/src/main/java/com/vaadin/client/ui/datefield/DateFieldConnector.java View File

@@ -22,14 +22,12 @@ import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.user.client.ui.PopupPanel;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.DateTimeService;
import com.vaadin.client.UIDL;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.VCalendarPanel.FocusChangeListener;
import com.vaadin.client.ui.VCalendarPanel.TimeChangeListener;
import com.vaadin.client.ui.VPopupCalendar;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.datefield.PopupDateFieldState;
import com.vaadin.shared.ui.datefield.DateFieldState;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.ui.AbstractDateField;

@@ -106,7 +104,7 @@ public class DateFieldConnector extends TextualDateConnector {
}

if (getWidget().getCurrentResolution()
.getCalendarField() <= Resolution.MONTH.getCalendarField()) {
.compareTo(Resolution.MONTH) >= 0) {
getWidget().calendar
.setFocusChangeListener(new FocusChangeListener() {
@Override
@@ -123,35 +121,6 @@ public class DateFieldConnector extends TextualDateConnector {
getWidget().calendar.setFocusChangeListener(null);
}

if (getWidget().getCurrentResolution()
.getCalendarField() > Resolution.DAY.getCalendarField()) {
getWidget().calendar
.setTimeChangeListener(new TimeChangeListener() {
@Override
public void changed(int hour, int min, int sec,
int msec) {
Date d = getWidget().getDate();
if (d == null) {
// date currently null, use the value from
// calendarPanel
// (~ client time at the init of the widget)
d = (Date) getWidget().calendar.getDate()
.clone();
}
d.setHours(hour);
d.setMinutes(min);
d.setSeconds(sec);
DateTimeService.setMilliseconds(d, msec);

// Always update time changes to the server
getWidget().updateValue(d);

// Update text field
getWidget().buildDate();
}
});
}

if (getWidget().isReadonly()) {
getWidget().calendarToggle.addStyleName(
VPopupCalendar.CLASSNAME + "-button-readonly");
@@ -172,8 +141,8 @@ public class DateFieldConnector extends TextualDateConnector {
}

@Override
public PopupDateFieldState getState() {
return (PopupDateFieldState) super.getState();
public DateFieldState getState() {
return (DateFieldState) super.getState();
}

@Override

+ 1
- 30
client/src/main/java/com/vaadin/client/ui/datefield/InlineDateFieldConnector.java View File

@@ -18,11 +18,9 @@ package com.vaadin.client.ui.datefield;
import java.util.Date;

import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.DateTimeService;
import com.vaadin.client.UIDL;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.ui.VCalendarPanel.FocusChangeListener;
import com.vaadin.client.ui.VCalendarPanel.TimeChangeListener;
import com.vaadin.client.ui.VDateFieldCalendar;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.datefield.InlineDateFieldState;
@@ -54,34 +52,7 @@ public class InlineDateFieldConnector extends AbstractDateFieldConnector {
}

if (getWidget().getCurrentResolution()
.getCalendarField() > Resolution.DAY.getCalendarField()) {
getWidget().calendarPanel
.setTimeChangeListener(new TimeChangeListener() {
@Override
public void changed(int hour, int min, int sec,
int msec) {
Date d = getWidget().getDate();
if (d == null) {
// date currently null, use the value from
// calendarPanel
// (~ client time at the init of the widget)
d = (Date) getWidget().calendarPanel.getDate()
.clone();
}
d.setHours(hour);
d.setMinutes(min);
d.setSeconds(sec);
DateTimeService.setMilliseconds(d, msec);

// Always update time changes to the server
getWidget().calendarPanel.setDate(d);
getWidget().updateValueFromPanel();
}
});
}

if (getWidget().getCurrentResolution()
.getCalendarField() <= Resolution.MONTH.getCalendarField()) {
.compareTo(Resolution.MONTH) >= 0) {
getWidget().calendarPanel
.setFocusChangeListener(new FocusChangeListener() {
@Override

+ 1
- 1
compatibility-client/src/main/java/com/vaadin/v7/client/ui/VCalendarPanel.java View File

@@ -58,8 +58,8 @@ import com.vaadin.client.VConsole;
import com.vaadin.client.WidgetUtil;
import com.vaadin.client.ui.FocusableFlexTable;
import com.vaadin.client.ui.SubPartAware;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.shared.util.SharedUtil;
import com.vaadin.v7.shared.ui.datefield.Resolution;

@SuppressWarnings("deprecation")
public class VCalendarPanel extends FocusableFlexTable implements

+ 1
- 1
compatibility-client/src/main/java/com/vaadin/v7/client/ui/VDateField.java View File

@@ -23,7 +23,7 @@ import com.google.gwt.user.client.ui.HasEnabled;
import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.DateTimeService;
import com.vaadin.client.ui.Field;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.v7.shared.ui.datefield.Resolution;

public class VDateField extends FlowPanel implements Field, HasEnabled {


+ 1
- 1
compatibility-client/src/main/java/com/vaadin/v7/client/ui/VDateFieldCalendar.java View File

@@ -20,9 +20,9 @@ import java.util.Date;

import com.google.gwt.event.dom.client.DomEvent;
import com.vaadin.client.DateTimeService;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.v7.client.ui.VCalendarPanel.FocusOutListener;
import com.vaadin.v7.client.ui.VCalendarPanel.SubmitListener;
import com.vaadin.v7.shared.ui.datefield.Resolution;

/**
* A client side implementation for InlineDateField

+ 1
- 1
compatibility-client/src/main/java/com/vaadin/v7/client/ui/VPopupCalendar.java View File

@@ -52,10 +52,10 @@ import com.vaadin.client.ui.Field;
import com.vaadin.client.ui.SubPartAware;
import com.vaadin.client.ui.VOverlay;
import com.vaadin.client.ui.aria.AriaHelper;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.v7.client.ui.VCalendarPanel.FocusOutListener;
import com.vaadin.v7.client.ui.VCalendarPanel.SubmitListener;
import com.vaadin.v7.shared.ui.datefield.PopupDateFieldState;
import com.vaadin.v7.shared.ui.datefield.Resolution;

/**
* Represents a date selection component with a text field and a popup date

+ 1
- 1
compatibility-client/src/main/java/com/vaadin/v7/client/ui/VTextualDate.java View File

@@ -41,7 +41,7 @@ import com.vaadin.client.ui.aria.HandlesAriaCaption;
import com.vaadin.client.ui.aria.HandlesAriaInvalid;
import com.vaadin.client.ui.aria.HandlesAriaRequired;
import com.vaadin.shared.EventId;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.v7.shared.ui.datefield.Resolution;

public class VTextualDate extends VDateField implements Field, ChangeHandler,
Focusable, SubPartAware, HandlesAriaCaption, HandlesAriaInvalid,

+ 1
- 1
compatibility-client/src/main/java/com/vaadin/v7/client/ui/datefield/AbstractDateFieldConnector.java View File

@@ -22,10 +22,10 @@ import com.vaadin.client.LocaleNotLoadedException;
import com.vaadin.client.Paintable;
import com.vaadin.client.UIDL;
import com.vaadin.client.VConsole;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.v7.client.ui.AbstractFieldConnector;
import com.vaadin.v7.client.ui.VDateField;
import com.vaadin.v7.shared.ui.datefield.DateFieldConstants;
import com.vaadin.v7.shared.ui.datefield.Resolution;

public class AbstractDateFieldConnector extends AbstractFieldConnector
implements Paintable {

+ 1
- 1
compatibility-client/src/main/java/com/vaadin/v7/client/ui/datefield/DateFieldConnector.java View File

@@ -26,11 +26,11 @@ import com.vaadin.client.DateTimeService;
import com.vaadin.client.UIDL;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.v7.client.ui.VCalendarPanel.FocusChangeListener;
import com.vaadin.v7.client.ui.VCalendarPanel.TimeChangeListener;
import com.vaadin.v7.client.ui.VPopupCalendar;
import com.vaadin.v7.shared.ui.datefield.PopupDateFieldState;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.ui.DateField;

@Connect(DateField.class)

+ 1
- 1
compatibility-client/src/main/java/com/vaadin/v7/client/ui/datefield/InlineDateFieldConnector.java View File

@@ -22,11 +22,11 @@ import com.vaadin.client.DateTimeService;
import com.vaadin.client.UIDL;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.shared.ui.Connect;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.v7.client.ui.VCalendarPanel.FocusChangeListener;
import com.vaadin.v7.client.ui.VCalendarPanel.TimeChangeListener;
import com.vaadin.v7.client.ui.VDateFieldCalendar;
import com.vaadin.v7.shared.ui.datefield.InlineDateFieldState;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.ui.InlineDateField;

@Connect(InlineDateField.class)

+ 1
- 1
compatibility-client/src/main/java/com/vaadin/v7/client/ui/datefield/TextualDateConnector.java View File

@@ -18,8 +18,8 @@ package com.vaadin.v7.client.ui.datefield;

import com.vaadin.client.ApplicationConnection;
import com.vaadin.client.UIDL;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.v7.client.ui.VTextualDate;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.shared.ui.datefield.TextualDateFieldState;

public class TextualDateConnector extends AbstractDateFieldConnector {

+ 1
- 1
compatibility-server/src/main/java/com/vaadin/v7/ui/DateField.java View File

@@ -34,7 +34,6 @@ import com.vaadin.event.FieldEvents.FocusEvent;
import com.vaadin.event.FieldEvents.FocusListener;
import com.vaadin.server.PaintException;
import com.vaadin.server.PaintTarget;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.ui.Component;
import com.vaadin.ui.LegacyComponent;
import com.vaadin.ui.declarative.DesignAttributeHandler;
@@ -46,6 +45,7 @@ import com.vaadin.v7.data.util.converter.Converter;
import com.vaadin.v7.data.validator.DateRangeValidator;
import com.vaadin.v7.event.FieldEvents;
import com.vaadin.v7.shared.ui.datefield.DateFieldConstants;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.shared.ui.datefield.TextualDateFieldState;

/**

+ 2
- 2
compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/datefield/DateFieldConverterTest.java View File

@@ -22,10 +22,10 @@ import java.util.Locale;
import org.junit.Before;
import org.junit.Test;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.v7.data.Property;
import com.vaadin.v7.data.util.ObjectProperty;
import com.vaadin.v7.data.util.converter.Converter;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.ui.DateField;

public class DateFieldConverterTest {
@@ -35,7 +35,7 @@ public class DateFieldConverterTest {

@Before
public void setUp() {
date = new ObjectProperty<Long>(0L);
date = new ObjectProperty<>(0L);
datefield = new DateField();
datefield.setBuffered(false);
datefield.setConverter(new Converter<Date, Long>() {

+ 1
- 1
compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/datefield/LegacyDateFieldDeclarativeTest.java View File

@@ -21,8 +21,8 @@ import java.util.TimeZone;

import org.junit.Test;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.design.DeclarativeTestBase;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.ui.DateField;

/**

+ 1
- 1
compatibility-server/src/test/java/com/vaadin/v7/tests/server/component/datefield/PopupDateFieldDeclarativeTest.java View File

@@ -19,8 +19,8 @@ import java.util.Date;

import org.junit.Test;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.design.DeclarativeTestBase;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.ui.PopupDateField;

/**

+ 84
- 0
compatibility-shared/src/main/java/com/vaadin/v7/shared/ui/datefield/Resolution.java View File

@@ -0,0 +1,84 @@
/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.v7.shared.ui.datefield;

import java.util.ArrayList;
import java.util.List;

/**
* Resolutions for DateFields
*
* @author Vaadin Ltd.
* @since 7.0
*/
public enum Resolution {
// Values from Calendar.SECOND etc. Set as ints to avoid Calendar dependency
// (does not exist on the client side)
SECOND(13), MINUTE(12), HOUR(11), DAY(5), MONTH(2), YEAR(1);

private int calendarField;

private Resolution(int calendarField) {
this.calendarField = calendarField;
}

/**
* Returns the field in java.util.Calendar that corresponds to this
* resolution.
*
* @return one of the field numbers used by Calendar
*/
public int getCalendarField() {
return calendarField;
}

/**
* Returns the resolutions that are higher or equal to the given resolution,
* starting from the given resolution. In other words passing DAY to this
* methods returns DAY,MONTH,YEAR
*
* @param r
* The resolution to start from
* @return An iterable for the resolutions higher or equal to r
*/
public static Iterable<Resolution> getResolutionsHigherOrEqualTo(
Resolution r) {
List<Resolution> resolutions = new ArrayList<>();
Resolution[] values = Resolution.values();
for (int i = r.ordinal(); i < values.length; i++) {
resolutions.add(values[i]);
}
return resolutions;
}

/**
* Returns the resolutions that are lower than the given resolution,
* starting from the given resolution. In other words passing DAY to this
* methods returns HOUR,MINUTE,SECOND.
*
* @param r
* The resolution to start from
* @return An iterable for the resolutions lower than r
*/
public static List<Resolution> getResolutionsLowerThan(Resolution r) {
List<Resolution> resolutions = new ArrayList<>();
Resolution[] values = Resolution.values();
for (int i = r.ordinal() - 1; i >= 0; i--) {
resolutions.add(values[i]);
}
return resolutions;
}
}

+ 1
- 1
documentation/datamodel/datamodel-fields.asciidoc View File

@@ -25,7 +25,7 @@ Button sayHelloButton = new Button("Say hello", clickEvent -> {
});
----

Each field implementation has its own specific value type – the type of a [classname]#TextField# is [classname]#String#, the type of a [classname]#Slider# is [classname]#Double#, the type of a [classname]#PopupDateField# is [classname]#LocalDate#, and so on.
Each field implementation has its own specific value type – the type of a [classname]#TextField# is [classname]#String#, the type of a [classname]#Slider# is [classname]#Double#, the type of a [classname]#DateField# is [classname]#LocalDate#, and so on.

== Reacting to Value Changes


+ 4
- 4
documentation/datamodel/datamodel-forms.asciidoc View File

@@ -200,12 +200,12 @@ We can save the binding to a local variable and trigger a revalidation when anot

[source, java]
----
PopupDateField departing = new PopupDateField("Departing");
PopupDateField returning = new PopupDateField("Returning");
DateField departing = new DateField("Departing");
DateField returning = new DateField("Returning");

// Store return date binding so we can revalidate it later
Binding<Trip, Date, Date> returnBinding = binder.forField(returning)
.withValidator(returnDate -> !returnDate.before(departing.getValue()),
Binding<Trip, LocalDate, LocalDate> returnBinding = binder.forField(returning)
.withValidator(returnDate -> !returnDate.isBefore(departing.getValue()),
"Cannot return before departing");
returnBinding.bind(Trip::getReturnDate, Trip::setReturnDate);


+ 87
- 227
server/src/main/java/com/vaadin/ui/AbstractDateField.java View File

@@ -16,20 +16,21 @@
package com.vaadin.ui;

import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.EventObject;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import java.util.logging.Logger;

import org.jsoup.nodes.Element;

import com.vaadin.data.Result;
import com.vaadin.data.validator.RangeValidator;
import com.vaadin.data.validator.DateRangeValidator;
import com.vaadin.event.FieldEvents.BlurEvent;
import com.vaadin.event.FieldEvents.BlurListener;
import com.vaadin.event.FieldEvents.BlurNotifier;
@@ -47,31 +48,26 @@ import com.vaadin.ui.declarative.DesignAttributeHandler;
import com.vaadin.ui.declarative.DesignContext;

/**
* A date editor component with <code>java.util.Date</code> as an input value.
* A date editor component with {@link LocalDate} as an input value.
*
* @author Vaadin Ltd
*
* @since 8.0
*
*/
public abstract class AbstractDateField extends AbstractField<Date>
public abstract class AbstractDateField extends AbstractField<LocalDate>
implements LegacyComponent, FocusNotifier, BlurNotifier {

/**
* Value of the field.
*/
private Date value;
private LocalDate value;

/**
* Specified smallest modifiable unit for the date field.
*/
private Resolution resolution = Resolution.DAY;

/**
* The internal calendar to be used in java.utl.Date conversions.
*/
private transient Calendar calendar;

/**
* Overridden format string
*/
@@ -96,8 +92,6 @@ public abstract class AbstractDateField extends AbstractField<Date>

private String defaultParseErrorMessage = "Date format not recognized";

private TimeZone timeZone = null;

private static Map<Resolution, String> variableNameForResolution = new HashMap<>();

private String dateOutOfRangeMessage = "Date is out of allowed range";
@@ -110,9 +104,6 @@ public abstract class AbstractDateField extends AbstractField<Date>
private boolean preventValueChangeEvent;

static {
variableNameForResolution.put(Resolution.SECOND, "sec");
variableNameForResolution.put(Resolution.MINUTE, "min");
variableNameForResolution.put(Resolution.HOUR, "hour");
variableNameForResolution.put(Resolution.DAY, "day");
variableNameForResolution.put(Resolution.MONTH, "month");
variableNameForResolution.put(Resolution.YEAR, "year");
@@ -143,9 +134,9 @@ public abstract class AbstractDateField extends AbstractField<Date>
* @param caption
* the caption <code>String</code> for the editor.
* @param value
* the Date value.
* the LocalDate value.
*/
public AbstractDateField(String caption, Date value) {
public AbstractDateField(String caption, LocalDate value) {
setValue(value);
setCaption(caption);
}
@@ -166,7 +157,7 @@ public abstract class AbstractDateField extends AbstractField<Date>
}

if (getDateFormat() != null) {
target.addAttribute("format", dateFormat);
target.addAttribute("format", getDateFormat());
}

if (!isLenient()) {
@@ -181,9 +172,7 @@ public abstract class AbstractDateField extends AbstractField<Date>
* app or refresh.
*/

// Gets the calendar
final Calendar calendar = getCalendar();
final Date currentDate = getValue();
final LocalDate currentDate = getValue();

// Only paint variables for the resolution and up, e.g. Resolution DAY
// paints DAY,MONTH,YEAR
@@ -191,11 +180,7 @@ public abstract class AbstractDateField extends AbstractField<Date>
.getResolutionsHigherOrEqualTo(resolution)) {
int value = -1;
if (currentDate != null) {
value = calendar.get(res.getCalendarField());
if (res == Resolution.MONTH) {
// Calendar month is zero based
value++;
}
value = getDateValue(currentDate, res);
}
target.addVariable(this, variableNameForResolution.get(res), value);
}
@@ -211,14 +196,12 @@ public abstract class AbstractDateField extends AbstractField<Date>

if (!isReadOnly() && (variables.containsKey("year")
|| variables.containsKey("month")
|| variables.containsKey("day") || variables.containsKey("hour")
|| variables.containsKey("min") || variables.containsKey("sec")
|| variables.containsKey("msec")
|| variables.containsKey("day")
|| variables.containsKey("dateString"))) {

// Old and new dates
final Date oldDate = getValue();
Date newDate = null;
final LocalDate oldDate = getValue();
LocalDate newDate = null;

// this enables analyzing invalid input on the server
final String newDateString = (String) variables.get("dateString");
@@ -226,55 +209,37 @@ public abstract class AbstractDateField extends AbstractField<Date>

// Gets the new date in parts
boolean hasChanges = false;
Map<Resolution, Integer> calendarFieldChanges = new HashMap<>();
Map<Resolution, Integer> calendarFields = new HashMap<>();

for (Resolution r : Resolution
.getResolutionsHigherOrEqualTo(resolution)) {
for (Resolution resolution : Resolution
.getResolutionsHigherOrEqualTo(getResolution())) {
// Only handle what the client is allowed to send. The same
// resolutions that are painted
String variableName = variableNameForResolution.get(r);
String variableName = variableNameForResolution.get(resolution);

Integer value = getDateValue(oldDate, resolution);
if (variables.containsKey(variableName)) {
Integer value = (Integer) variables.get(variableName);
if (r == Resolution.MONTH) {
// Calendar MONTH is zero based
value--;
}
if (value >= 0) {
Integer newValue = (Integer) variables.get(variableName);
if (newValue >= 0) {
hasChanges = true;
calendarFieldChanges.put(r, value);
value = newValue;
}
}
calendarFields.put(resolution, value);
}

// If no new variable values were received, use the previous value
if (!hasChanges) {
newDate = null;
} else {
// Clone the calendar for date operation
final Calendar cal = getCalendar();

// Update the value based on the received info
// Must set in this order to avoid invalid dates (or wrong
// dates if lenient is true) in calendar
for (int r = Resolution.YEAR.ordinal(); r >= 0; r--) {
Resolution res = Resolution.values()[r];
if (calendarFieldChanges.containsKey(res)) {

// Field resolution should be included. Others are
// skipped so that client can not make unexpected
// changes (e.g. day change even though resolution is
// year).
Integer newValue = calendarFieldChanges.get(res);
cal.set(res.getCalendarField(), newValue);
}
}
newDate = cal.getTime();
newDate = LocalDate.of(calendarFields.get(Resolution.YEAR),
calendarFields.getOrDefault(Resolution.MONTH, 1),
calendarFields.getOrDefault(Resolution.DAY, 1));
}

if (newDate == null && dateString != null
&& !dateString.isEmpty()) {
Result<Date> parsedDate = handleUnparsableDateString(
Result<LocalDate> parsedDate = handleUnparsableDateString(
dateString);
if (parsedDate.isError()) {

@@ -365,17 +330,15 @@ public abstract class AbstractDateField extends AbstractField<Date>
* @param startDate
* - the allowed range's start date
*/
public void setRangeStart(Date startDate) {
if (startDate != null && getState().rangeEnd != null
&& startDate.after(getState().rangeEnd)) {
public void setRangeStart(LocalDate startDate) {
Date date = convertLocalDate(startDate);
if (date != null && getState().rangeEnd != null
&& date.after(getState().rangeEnd)) {
throw new IllegalStateException(
"startDate cannot be later than endDate");
}

// Create a defensive copy against issues when using java.sql.Date (and
// also against mutable Date).
getState().rangeStart = startDate != null
? new Date(startDate.getTime()) : null;
getState().rangeStart = date;
}

/**
@@ -431,35 +394,33 @@ public abstract class AbstractDateField extends AbstractField<Date>
* - the allowed range's end date (inclusive, based on the
* current resolution)
*/
public void setRangeEnd(Date endDate) {
if (endDate != null && getState().rangeStart != null
&& getState().rangeStart.after(endDate)) {
public void setRangeEnd(LocalDate endDate) {
Date date = convertLocalDate(endDate);
if (date != null && getState().rangeStart != null
&& getState().rangeStart.after(date)) {
throw new IllegalStateException(
"endDate cannot be earlier than startDate");
}

// Create a defensive copy against issues when using java.sql.Date (and
// also against mutable Date).
getState().rangeEnd = endDate != null ? new Date(endDate.getTime())
: null;
getState().rangeEnd = date;
}

/**
* Returns the precise rangeStart used.
*
* @return the precise rangeStart used
* @return the precise rangeStart used, may be null.
*/
public Date getRangeStart() {
return getState(false).rangeStart;
public LocalDate getRangeStart() {
return convertDate(getState(false).rangeStart);
}

/**
* Returns the precise rangeEnd used.
*
* @return the precise rangeEnd used
* @return the precise rangeEnd used, may be null.
*/
public Date getRangeEnd() {
return getState(false).rangeEnd;
public LocalDate getRangeEnd() {
return convertDate(getState(false).rangeEnd);
}

/**
@@ -519,12 +480,12 @@ public abstract class AbstractDateField extends AbstractField<Date>
}

@Override
public Date getValue() {
public LocalDate getValue() {
return value;
}

@Override
public void setValue(Date value) {
public void setValue(LocalDate value) {
/*
* First handle special case when the client side component have a date
* string but value is null (e.g. unparsable date string typed in by the
@@ -566,64 +527,6 @@ public abstract class AbstractDateField extends AbstractField<Date>
markAsDirty();
}

/**
* Returns new instance calendar used in Date conversions.
*
* Returns new clone of the calendar object initialized using the the
* current date (if available)
*
* If this is no calendar is assigned the <code>Calendar.getInstance</code>
* is used.
*
* @return the Calendar.
* @see #setCalendar(Calendar)
*/
private Calendar getCalendar() {

// Makes sure we have an calendar instance
if (calendar == null) {
calendar = Calendar.getInstance();
// Start by a zeroed calendar to avoid having values for lower
// resolution variables e.g. time when resolution is day
int min, field;
for (Resolution r : Resolution
.getResolutionsLowerThan(resolution)) {
field = r.getCalendarField();
min = calendar.getActualMinimum(field);
calendar.set(field, min);
}
calendar.set(Calendar.MILLISECOND, 0);
}

// Clone the instance
final Calendar newCal = (Calendar) calendar.clone();

final TimeZone currentTimeZone = getTimeZone();
if (currentTimeZone != null) {
newCal.setTimeZone(currentTimeZone);
}

final Date currentDate = getValue();
if (currentDate != null) {
newCal.setTime(currentDate);
}
return newCal;
}

/**
* Gets the time zone used by this field. The time zone is used to convert
* the absolute time in a Date object to a logical time displayed in the
* selector and to convert the select time back to a Date object.
*
* If {@code null} is returned, the current default time zone returned by
* {@code TimeZone.getDefault()} is used.
*
* @return the current time zone
*/
public TimeZone getTimeZone() {
return timeZone;
}

/**
* Return the error message that is shown if the user inputted value can't
* be parsed into a Date object. If
@@ -655,23 +558,6 @@ public abstract class AbstractDateField extends AbstractField<Date>
defaultParseErrorMessage = parsingErrorMessage;
}

/**
* Sets the time zone used by this date field. The time zone is used to
* convert the absolute time in a Date object to a logical time displayed in
* the selector and to convert the select time back to a Date object.
*
* If no time zone has been set, the current default time zone returned by
* {@code TimeZone.getDefault()} is used.
*
* @see #getTimeZone()
* @param timeZone
* the time zone to use for time calculations.
*/
public void setTimeZone(TimeZone timeZone) {
this.timeZone = timeZone;
markAsDirty();
}

@Override
public Registration addFocusListener(FocusListener listener) {
addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener,
@@ -704,14 +590,14 @@ public abstract class AbstractDateField extends AbstractField<Date>
public void readDesign(Element design, DesignContext designContext) {
super.readDesign(design, designContext);
if (design.hasAttr("value") && !design.attr("value").isEmpty()) {
Date date = DesignAttributeHandler.getFormatter()
.parse(design.attr("value"), Date.class);
LocalDate date = DesignAttributeHandler.getFormatter()
.parse(design.attr("value"), LocalDate.class);
// formatting will return null if it cannot parse the string
if (date == null) {
Logger.getLogger(AbstractDateField.class.getName()).info(
"cannot parse " + design.attr("value") + " as date");
}
setValue(date);
doSetValue(date);
}
}

@@ -750,7 +636,7 @@ public abstract class AbstractDateField extends AbstractField<Date>
* date string to handle
* @return result that contains parsed Date as a value or an error
*/
protected Result<Date> handleUnparsableDateString(String dateString) {
protected Result<LocalDate> handleUnparsableDateString(String dateString) {
return Result.error(getParseErrorMessage());
}

@@ -765,7 +651,7 @@ public abstract class AbstractDateField extends AbstractField<Date>
}

@Override
protected void doSetValue(Date value) {
protected void doSetValue(LocalDate value) {
// Also set the internal dateString
if (value != null) {
dateString = value.toString();
@@ -780,87 +666,61 @@ public abstract class AbstractDateField extends AbstractField<Date>
uiHasValidDateString = true;
setComponentError(new UserError(currentParseErrorMessage));
} else {
RangeValidator<Date> validator = new RangeValidator<>(
getDateOutOfRangeMessage(), Comparator.naturalOrder(),
getRangeStart(getResolution()),
getRangeEnd(getResolution()));
Result<Date> result = validator.apply(value);
DateRangeValidator validator = new DateRangeValidator(
getDateOutOfRangeMessage(),
getDate(getRangeStart(), getResolution()),
getDate(getRangeEnd(), getResolution()));
Result<LocalDate> result = validator.apply(value);
if (result.isError()) {
setComponentError(new UserError(getDateOutOfRangeMessage()));
}
}
}

/**
* Gets the start range for a certain resolution. The range is inclusive, so
* if <code>rangeStart</code> is set to one millisecond before year n and
* resolution is set to YEAR, any date in year n - 1 will be accepted.
* Lowest supported resolution is DAY.
*
* @param forResolution
* - the range conforms to the resolution
* @return
*/
private Date getRangeStart(Resolution forResolution) {
if (getState(false).rangeStart == null) {
private LocalDate getDate(LocalDate date, Resolution forResolution) {
if (date == null) {
return null;
}
Calendar startCal = Calendar.getInstance();
startCal.setTime(getState(false).rangeStart);

if (forResolution == Resolution.YEAR) {
startCal.set(startCal.get(Calendar.YEAR), 0, 1, 0, 0, 0);
return date.withDayOfYear(1);
} else if (forResolution == Resolution.MONTH) {
startCal.set(startCal.get(Calendar.YEAR),
startCal.get(Calendar.MONTH), 1, 0, 0, 0);
return date.withDayOfMonth(1);
} else {
startCal.set(startCal.get(Calendar.YEAR),
startCal.get(Calendar.MONTH), startCal.get(Calendar.DATE),
0, 0, 0);
return date;
}

startCal.set(Calendar.MILLISECOND, 0);
return startCal.getTime();
}

/**
* Gets the end range for a certain resolution. The range is inclusive, so
* if rangeEnd is set to zero milliseconds past year n and resolution is set
* to YEAR, any date in year n will be accepted. Resolutions lower than DAY
* will be interpreted on a DAY level. That is, everything below DATE is
* cleared
*
* @param forResolution
* - the range conforms to the resolution
* @return
*/
private Date getRangeEnd(Resolution forResolution) {
// We need to set the correct resolution for the dates,
// otherwise the range validator will complain
private int getDateValue(LocalDate date, Resolution resolution) {
LocalDate value = date;
if (value == null) {
value = LocalDate.of(1, 1, 1);
}
switch (resolution) {
case DAY:
return value.getDayOfMonth();
case MONTH:
return value.getMonthValue();
case YEAR:
return value.getYear();
default:
assert false : "Unexpected resolution argument " + resolution;
return -1;
}
}

Date rangeEnd = getState(false).rangeEnd;
if (rangeEnd == null) {
private Date convertLocalDate(LocalDate date) {
if (date == null) {
return null;
}
return Date.from(date.atStartOfDay(ZoneOffset.UTC).toInstant());
}

Calendar endCal = Calendar.getInstance();
endCal.setTime(rangeEnd);

if (forResolution == Resolution.YEAR) {
// Adding one year (minresolution) and clearing the rest.
endCal.set(endCal.get(Calendar.YEAR) + 1, 0, 1, 0, 0, 0);
} else if (forResolution == Resolution.MONTH) {
// Adding one month (minresolution) and clearing the rest.
endCal.set(endCal.get(Calendar.YEAR),
endCal.get(Calendar.MONTH) + 1, 1, 0, 0, 0);
} else {
endCal.set(endCal.get(Calendar.YEAR), endCal.get(Calendar.MONTH),
endCal.get(Calendar.DATE) + 1, 0, 0, 0);
private LocalDate convertDate(Date date) {
if (date == null) {
return null;
}
// removing one millisecond will now get the endDate to return to
// current resolution's set time span (year or month)
endCal.set(Calendar.MILLISECOND, -1);
return endCal.getTime();
return Instant.ofEpochMilli(date.getTime()).atZone(ZoneOffset.UTC)
.toLocalDate();
}

}

+ 12
- 12
server/src/main/java/com/vaadin/ui/DateField.java View File

@@ -15,11 +15,11 @@
*/
package com.vaadin.ui;

import java.util.Date;
import java.time.LocalDate;

import com.vaadin.server.PaintException;
import com.vaadin.server.PaintTarget;
import com.vaadin.shared.ui.datefield.PopupDateFieldState;
import com.vaadin.shared.ui.datefield.DateFieldState;

/**
* A date entry component, which displays the actual date selector as a popup.
@@ -34,27 +34,27 @@ public class DateField extends AbstractDateField {
private String inputPrompt = null;

/**
* Constructs an empty <code>PopupDateField</code> with no caption.
* Constructs an empty <code>DateField</code> with no caption.
*/
public DateField() {
super();
}

/**
* Constructs a new <code>PopupDateField</code> with the given caption and
* Constructs a new <code>DateField</code> with the given caption and
* initial text contents.
*
* @param caption
* the caption <code>String</code> for the editor.
* @param value
* the Date value.
* the LocalDate value.
*/
public DateField(String caption, Date value) {
public DateField(String caption, LocalDate value) {
super(caption, value);
}

/**
* Constructs an empty <code>PopupDateField</code> with caption.
* Constructs an empty <code>DateField</code> with caption.
*
* @param caption
* the caption of the datefield.
@@ -94,19 +94,19 @@ public class DateField extends AbstractDateField {
}

@Override
protected PopupDateFieldState getState() {
return (PopupDateFieldState) super.getState();
protected DateFieldState getState() {
return (DateFieldState) super.getState();
}

@Override
protected PopupDateFieldState getState(boolean markAsDirty) {
return (PopupDateFieldState) super.getState(markAsDirty);
protected DateFieldState getState(boolean markAsDirty) {
return (DateFieldState) super.getState(markAsDirty);
}

/**
* Checks whether the text field is enabled (default) or not.
*
* @see PopupDateField#setTextFieldEnabled(boolean);
* @see #setTextFieldEnabled(boolean)
*
* @return <b>true</b> if the text field is enabled, <b>false</b> otherwise.
*/

+ 6
- 6
server/src/main/java/com/vaadin/ui/InlineDateField.java View File

@@ -15,7 +15,7 @@
*/
package com.vaadin.ui;

import java.util.Date;
import java.time.LocalDate;

/**
* A date entry component, which displays the actual date selector inline.
@@ -28,27 +28,27 @@ import java.util.Date;
public class InlineDateField extends AbstractDateField {

/**
* Constructs an empty <code>DateField</code> with no caption.
* Constructs an empty <code>InlineDateField</code> with no caption.
*/
public InlineDateField() {
super();
}

/**
* Constructs a new <code>DateField</code> with the given caption and
* Constructs a new <code>InlineDateField</code> with the given caption and
* initial text contents.
*
* @param caption
* the caption <code>String</code> for the editor.
* @param value
* the Date value.
* the LocalDate value.
*/
public InlineDateField(String caption, Date value) {
public InlineDateField(String caption, LocalDate value) {
super(caption, value);
}

/**
* Constructs an empty <code>DateField</code> with caption.
* Constructs an empty <code>InlineDateField</code> with caption.
*
* @param caption
* the caption of the datefield.

+ 3
- 0
server/src/main/java/com/vaadin/ui/declarative/DesignFormatter.java View File

@@ -20,6 +20,7 @@ import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.time.LocalDate;
import java.util.Collections;
import java.util.Date;
import java.util.Locale;
@@ -39,6 +40,7 @@ import com.vaadin.event.ShortcutAction;
import com.vaadin.server.Resource;
import com.vaadin.ui.declarative.converters.DesignDateConverter;
import com.vaadin.ui.declarative.converters.DesignEnumConverter;
import com.vaadin.ui.declarative.converters.DesignLocalDateConverter;
import com.vaadin.ui.declarative.converters.DesignObjectConverter;
import com.vaadin.ui.declarative.converters.DesignResourceConverter;
import com.vaadin.ui.declarative.converters.DesignShortcutActionConverter;
@@ -170,6 +172,7 @@ public class DesignFormatter implements Serializable {
converterMap.put(char.class, charConverter);

converterMap.put(Date.class, new DesignDateConverter());
converterMap.put(LocalDate.class, new DesignLocalDateConverter());
converterMap.put(ShortcutAction.class,
new DesignShortcutActionConverter());
converterMap.put(Resource.class, new DesignResourceConverter());

+ 60
- 0
server/src/main/java/com/vaadin/ui/declarative/converters/DesignLocalDateConverter.java View File

@@ -0,0 +1,60 @@
/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.ui.declarative.converters;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Locale;

import com.vaadin.data.Result;
import com.vaadin.data.util.converter.Converter;
import com.vaadin.ui.declarative.DesignAttributeHandler;

/**
* A {@link LocalDate} converter to be used by {@link DesignAttributeHandler}.
* Provides ISO-compliant way of storing date and time.
*
* @since 8.0
* @author Vaadin Ltd
*/
public class DesignLocalDateConverter implements Converter<String, LocalDate> {

@Override
public Result<LocalDate> convertToModel(String value, Locale locale) {
for (String pattern : new String[] { "yyyy-MM-dd", "yyyy-MM",
"yyyy" }) {
try {
Locale effectiveLocale = locale == null ? Locale.ENGLISH
: locale;
LocalDate date = DateTimeFormatter
.ofPattern(pattern, effectiveLocale)
.parse(value, LocalDate::from);
return Result.ok(date);
} catch (DateTimeParseException e) {
// not parseable, ignore and try another format
}
}
return Result.error("Could not parse date value: " + value);
}

@Override
public String convertToPresentation(LocalDate value, Locale locale) {
return DateTimeFormatter.ofPattern("yyyy-MM-dd",
locale == null ? Locale.ENGLISH : locale).format(value);
}

}

+ 21
- 27
server/src/test/java/com/vaadin/data/BinderBookOfVaadinTest.java View File

@@ -15,8 +15,7 @@
*/
package com.vaadin.data;

import java.util.Calendar;
import java.util.Date;
import java.time.LocalDate;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicReference;
@@ -33,9 +32,9 @@ import com.vaadin.data.util.converter.StringToIntegerConverter;
import com.vaadin.data.validator.EmailValidator;
import com.vaadin.server.AbstractErrorMessage;
import com.vaadin.ui.Button;
import com.vaadin.ui.DateField;
import com.vaadin.ui.Label;
import com.vaadin.ui.Notification;
import com.vaadin.ui.DateField;
import com.vaadin.ui.Slider;
import com.vaadin.ui.TextField;

@@ -116,13 +115,13 @@ public class BinderBookOfVaadinTest {
}

public static class Trip {
private Date returnDate;
private LocalDate returnDate;

public Date getReturnDate() {
public LocalDate getReturnDate() {
return returnDate;
}

public void setReturnDate(Date returnDate) {
public void setReturnDate(LocalDate returnDate) {
this.returnDate = returnDate;
}
}
@@ -304,20 +303,18 @@ public class BinderBookOfVaadinTest {
DateField departing = new DateField("Departing");
DateField returning = new DateField("Returning");

Binding<Trip, Date, Date> returnBinding = binder.forField(returning)
.withValidator(
returnDate -> !returnDate.before(departing.getValue()),
Binding<Trip, LocalDate, LocalDate> returnBinding = binder
.forField(returning).withValidator(
returnDate -> !returnDate
.isBefore(departing.getValue()),
"Cannot return before departing");

returnBinding.bind(Trip::getReturnDate, Trip::setReturnDate);
departing.addValueChangeListener(event -> returnBinding.validate());

Calendar calendar = Calendar.getInstance();
Date past = calendar.getTime();
calendar.add(1, Calendar.DAY_OF_YEAR);
Date before = calendar.getTime();
calendar.add(1, Calendar.DAY_OF_YEAR);
Date after = calendar.getTime();
LocalDate past = LocalDate.now();
LocalDate before = past.plusDays(1);
LocalDate after = before.plusDays(1);

departing.setValue(before);
returning.setValue(after);
@@ -359,25 +356,23 @@ public class BinderBookOfVaadinTest {
DateField departing = new DateField("Departing");
DateField returning = new DateField("Returning");

Binding<Trip, Date, Date> returnBinding = binder.forField(returning)
.withValidator(
returnDate -> !returnDate.before(departing.getValue()),
Binding<Trip, LocalDate, LocalDate> returnBinding = binder
.forField(returning).withValidator(
returnDate -> !returnDate
.isBefore(departing.getValue()),
"Cannot return before departing");

returnBinding.bind(Trip::getReturnDate, Trip::setReturnDate);
departing.addValueChangeListener(event -> returnBinding.validate());

Calendar calendar = Calendar.getInstance();
Date past = calendar.getTime();
calendar.add(1, Calendar.DAY_OF_YEAR);
Date before = calendar.getTime();
calendar.add(1, Calendar.DAY_OF_YEAR);
Date after = calendar.getTime();
LocalDate past = LocalDate.now();
LocalDate before = past.plusDays(1);
LocalDate after = before.plusDays(1);

departing.setValue(before);
returning.setValue(after);

ValidationStatus<Date> result = returnBinding.validate();
ValidationStatus<LocalDate> result = returnBinding.validate();
Assert.assertFalse(result.isError());
Assert.assertNull(departing.getComponentError());

@@ -465,8 +460,7 @@ public class BinderBookOfVaadinTest {

@Test
public void binder_saveIfValid() {
BeanBinder<BookPerson> binder = new BeanBinder<BookPerson>(
BookPerson.class);
BeanBinder<BookPerson> binder = new BeanBinder<>(BookPerson.class);

// Phone or email has to be specified for the bean
Validator<BookPerson> phoneOrEmail = Validator.from(

+ 5
- 8
server/src/test/java/com/vaadin/tests/server/component/datefield/DateFieldDeclarativeTest.java View File

@@ -15,11 +15,10 @@
*/
package com.vaadin.tests.server.component.datefield;

import java.util.Date;
import java.time.LocalDate;

import org.junit.Test;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.design.DeclarativeTestBase;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.DateField;
@@ -31,20 +30,18 @@ import com.vaadin.ui.DateField;
* @since 7.4
* @author Vaadin Ltd
*/
public class DateFieldDeclarativeTest
extends DeclarativeTestBase<DateField> {
public class DateFieldDeclarativeTest extends DeclarativeTestBase<DateField> {

private String getBasicDesign() {
return "<vaadin-date-field assistive-text='at' text-field-enabled='false' show-iso-week-numbers resolution=\"MINUTE\" range-end=\"2019-01-15\" input-prompt=\"Pick a day\" value=\"2003-02-27 07:15\"></vaadin-date-field>";
return "<vaadin-date-field assistive-text='at' text-field-enabled='false' show-iso-week-numbers range-end=\"2019-01-15\" input-prompt=\"Pick a day\" value=\"2003-02-27\"></vaadin-date-field>";
}

private DateField getBasicExpected() {
DateField pdf = new DateField();
pdf.setShowISOWeekNumbers(true);
pdf.setResolution(Resolution.MINUTE);
pdf.setRangeEnd(new Date(2019 - 1900, 1 - 1, 15));
pdf.setRangeEnd(LocalDate.of(2019, 01, 15));
pdf.setInputPrompt("Pick a day");
pdf.setValue(new Date(2003 - 1900, 2 - 1, 27, 7, 15));
pdf.setValue(LocalDate.of(2003, 2, 27));
pdf.setTextFieldEnabled(false);
pdf.setAssistiveText("at");
return pdf;

+ 6
- 9
server/src/test/java/com/vaadin/tests/server/component/datefield/InlineDateFieldDeclarativeTest.java View File

@@ -17,18 +17,18 @@ package com.vaadin.tests.server.component.datefield;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.text.SimpleDateFormat;
import java.time.LocalDate;

import org.junit.Test;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.design.DeclarativeTestBase;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.InlineDateField;
import com.vaadin.ui.declarative.Design;

/**
* Tests the declarative support for implementations of {@link AbstractDateField}.
* Tests the declarative support for implementations of
* {@link AbstractDateField}.
*
* @since 7.4
* @author Vaadin Ltd
@@ -39,13 +39,10 @@ public class InlineDateFieldDeclarativeTest
@Test
public void testInlineDateFieldToFromDesign() throws Exception {
InlineDateField field = new InlineDateField("Day is",
new SimpleDateFormat("yyyy-MM-dd").parse("2003-02-27"));
field.setResolution(Resolution.DAY);
LocalDate.of(2003, 2, 27));
field.setShowISOWeekNumbers(true);
field.setRangeStart(
new SimpleDateFormat("yyyy-MM-dd").parse("2001-02-27"));
field.setRangeEnd(
new SimpleDateFormat("yyyy-MM-dd").parse("2011-02-27"));
field.setRangeStart(LocalDate.of(2001, 2, 27));
field.setRangeEnd(LocalDate.of(20011, 2, 27));

ByteArrayOutputStream bos = new ByteArrayOutputStream();
Design.write(field, bos);

+ 0
- 23
server/src/test/java/com/vaadin/tests/server/component/datefield/ResolutionTest.java View File

@@ -30,26 +30,6 @@ public class ResolutionTest {

}

@Test
public void testResolutionLowerThanDay() {
Iterable<Resolution> higherOrEqual = Resolution
.getResolutionsLowerThan(Resolution.DAY);
ArrayList<Resolution> expected = new ArrayList<>();
expected.add(Resolution.HOUR);
expected.add(Resolution.MINUTE);
expected.add(Resolution.SECOND);
TestUtil.assertIterableEquals(expected, higherOrEqual);

}

@Test
public void testResolutionLowerThanSecond() {
Iterable<Resolution> higherOrEqual = Resolution
.getResolutionsLowerThan(Resolution.SECOND);
ArrayList<Resolution> expected = new ArrayList<>();
TestUtil.assertIterableEquals(expected, higherOrEqual);
}

@Test
public void testResolutionLowerThanYear() {
Iterable<Resolution> higherOrEqual = Resolution
@@ -57,9 +37,6 @@ public class ResolutionTest {
ArrayList<Resolution> expected = new ArrayList<>();
expected.add(Resolution.MONTH);
expected.add(Resolution.DAY);
expected.add(Resolution.HOUR);
expected.add(Resolution.MINUTE);
expected.add(Resolution.SECOND);
TestUtil.assertIterableEquals(expected, higherOrEqual);

}

+ 22
- 13
server/src/test/java/com/vaadin/ui/DateFieldTestCase.java View File

@@ -4,21 +4,22 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsNull.nullValue;

import java.util.Date;
import java.time.LocalDate;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class DateFieldTestCase {

private AbstractDateField dateField;
private Date date;
private LocalDate date;

@Before
public void setup() {
dateField = new AbstractDateField() {
};
date = new Date();
date = LocalDate.now();
}

@Test
@@ -29,13 +30,17 @@ public class DateFieldTestCase {
}

@Test
public void rangeStartIsImmutable() {
long expectedTime = date.getTime();

public void rangeStartIsAcceptedAsValue() {
dateField.setRangeStart(date);
date.setTime(expectedTime + 1);
dateField.setValue(date);
Assert.assertNull(dateField.getComponentError());
}

assertThat(dateField.getRangeStart().getTime(), is(expectedTime));
@Test
public void belowRangeStartIsNotAcceptedAsValue() {
dateField.setRangeStart(date);
dateField.setValue(date.minusDays(1));
Assert.assertNotNull(dateField.getComponentError());
}

@Test
@@ -46,12 +51,16 @@ public class DateFieldTestCase {
}

@Test
public void rangeEndIsImmutable() {
long expectedTime = date.getTime();

public void rangeEndIsAcceptedAsValue() {
dateField.setRangeEnd(date);
date.setTime(expectedTime + 1);
dateField.setValue(date);
Assert.assertNull(dateField.getComponentError());
}

assertThat(dateField.getRangeEnd().getTime(), is(expectedTime));
@Test
public void aboveRangeEndIsNotAcceptedAsValue() {
dateField.setRangeEnd(date);
dateField.setValue(date.plusDays(1));
Assert.assertNotNull(dateField.getComponentError());
}
}

shared/src/main/java/com/vaadin/shared/ui/datefield/PopupDateFieldState.java → shared/src/main/java/com/vaadin/shared/ui/datefield/DateFieldState.java View File

@@ -17,7 +17,7 @@ package com.vaadin.shared.ui.datefield;

import com.vaadin.shared.annotations.NoLayout;

public class PopupDateFieldState extends TextualDateFieldState {
public class DateFieldState extends TextualDateFieldState {
public static final String DESCRIPTION_FOR_ASSISTIVE_DEVICES = "Arrow down key opens calendar element for choosing the date";

{

+ 2
- 19
shared/src/main/java/com/vaadin/shared/ui/datefield/Resolution.java View File

@@ -25,25 +25,7 @@ import java.util.List;
* @since 7.0
*/
public enum Resolution {
// Values from Calendar.SECOND etc. Set as ints to avoid Calendar dependency
// (does not exist on the client side)
SECOND(13), MINUTE(12), HOUR(11), DAY(5), MONTH(2), YEAR(1);

private int calendarField;

private Resolution(int calendarField) {
this.calendarField = calendarField;
}

/**
* Returns the field in java.util.Calendar that corresponds to this
* resolution.
*
* @return one of the field numbers used by Calendar
*/
public int getCalendarField() {
return calendarField;
}
DAY, MONTH, YEAR;

/**
* Returns the resolutions that are higher or equal to the given resolution,
@@ -81,4 +63,5 @@ public enum Resolution {
}
return resolutions;
}

}

+ 3
- 2
uitest/src/main/java/com/vaadin/tests/RandomLayoutStress.java View File

@@ -16,6 +16,7 @@

package com.vaadin.tests;

import java.time.LocalDate;
import java.util.Random;

import com.vaadin.server.ExternalResource;
@@ -184,13 +185,13 @@ public class RandomLayoutStress extends com.vaadin.server.LegacyApplication {
// Datefield
result = new TestDateField();
((AbstractDateField) result).setStyleName("calendar");
((AbstractDateField) result).setValue(new java.util.Date());
((AbstractDateField) result).setValue(LocalDate.now());
result.setCaption("Calendar component " + caption);
break;
case 7:
// Datefield
result = new TestDateField();
((AbstractDateField) result).setValue(new java.util.Date());
((AbstractDateField) result).setValue(LocalDate.now());
result.setCaption("Calendar component " + caption);
break;
}

+ 3
- 3
uitest/src/main/java/com/vaadin/tests/components/TestDateField.java View File

@@ -15,7 +15,7 @@
*/
package com.vaadin.tests.components;

import java.util.Date;
import java.time.LocalDate;

import com.vaadin.ui.AbstractDateField;

@@ -48,9 +48,9 @@ public class TestDateField extends AbstractDateField {
* @param caption
* the caption <code>String</code> for the editor.
* @param value
* the Date value.
* the {@link LocalDate} value.
*/
public TestDateField(String caption, Date value) {
public TestDateField(String caption, LocalDate value) {
setValue(value);
setCaption(caption);
}

+ 9
- 9
uitest/src/main/java/com/vaadin/tests/components/abstractfield/AbstractFieldTest.java View File

@@ -1,10 +1,10 @@
package com.vaadin.tests.components.abstractfield;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Locale;

import com.vaadin.data.HasValue.ValueChange;
@@ -137,13 +137,13 @@ public abstract class AbstractFieldTest<T extends AbstractField<V>, V>
// Distinguish between null and 'null'
String value = "null";
if (o != null) {
if (o instanceof Date) {
Date d = (Date) o;
// Dec 31, 2068 23:09:26.531
String pattern = "MMM d, yyyy HH:mm:ss.SSS";
SimpleDateFormat format = new SimpleDateFormat(pattern,
new Locale("en", "US"));
value = format.format(d);
if (o instanceof LocalDate) {
LocalDate date = (LocalDate) o;
// Dec 31, 2068
String pattern = "MMM d, yyyy";
DateTimeFormatter format = DateTimeFormatter.ofPattern(pattern,
Locale.ENGLISH);
value = format.format(date);
} else {
value = "'" + o.toString() + "'";
}

+ 1
- 1
uitest/src/main/java/com/vaadin/tests/components/calendar/BeanItemContainerTestUI.java View File

@@ -21,7 +21,6 @@ import java.util.GregorianCalendar;

import com.vaadin.event.Action;
import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalSplitPanel;
@@ -31,6 +30,7 @@ import com.vaadin.v7.data.fieldgroup.FieldGroup;
import com.vaadin.v7.data.fieldgroup.FieldGroup.CommitException;
import com.vaadin.v7.data.util.BeanItem;
import com.vaadin.v7.data.util.BeanItemContainer;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.ui.Calendar;
import com.vaadin.v7.ui.DateField;
import com.vaadin.v7.ui.Table;

+ 1
- 1
uitest/src/main/java/com/vaadin/tests/components/calendar/CalendarTest.java View File

@@ -27,7 +27,6 @@ import com.vaadin.data.Binder;
import com.vaadin.data.ValidationException;
import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
@@ -48,6 +47,7 @@ import com.vaadin.v7.data.fieldgroup.FieldGroup;
import com.vaadin.v7.data.fieldgroup.FieldGroup.CommitException;
import com.vaadin.v7.data.util.BeanItem;
import com.vaadin.v7.shared.ui.combobox.FilteringMode;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.ui.Calendar;
import com.vaadin.v7.ui.Calendar.TimeFormat;
import com.vaadin.v7.ui.ComboBox;

+ 7
- 19
uitest/src/main/java/com/vaadin/tests/components/datefield/AbstractDateFieldTest.java View File

@@ -2,8 +2,7 @@ package com.vaadin.tests.components.datefield;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.time.LocalDate;
import java.util.LinkedHashMap;
import java.util.Locale;

@@ -13,7 +12,7 @@ import com.vaadin.tests.components.abstractfield.AbstractFieldTest;
import com.vaadin.ui.AbstractDateField;

public class AbstractDateFieldTest<T extends AbstractDateField>
extends AbstractFieldTest<T, Date> {
extends AbstractFieldTest<T, LocalDate> {

@SuppressWarnings("unchecked")
@Override
@@ -21,10 +20,10 @@ public class AbstractDateFieldTest<T extends AbstractDateField>
return (Class<T>) TestDateField.class;
}

private Command<T, Date> setValue = new Command<T, Date>() {
private Command<T, LocalDate> setValue = new Command<T, LocalDate>() {

@Override
public void execute(T c, Date value, Object data) {
public void execute(T c, LocalDate value, Object data) {
c.setValue(value);
}
};
@@ -43,18 +42,10 @@ public class AbstractDateFieldTest<T extends AbstractDateField>
}

private void createSetValueAction(String category) {
LinkedHashMap<String, Date> options = new LinkedHashMap<>();
LinkedHashMap<String, LocalDate> options = new LinkedHashMap<>();
options.put("(null)", null);
options.put("(current time)", new Date());
Calendar c = Calendar.getInstance(new Locale("fi", "FI"));
c.clear();
c.set(2010, 12 - 1, 12, 12, 0, 0);
c.set(Calendar.MILLISECOND, 0);
options.put("2010-12-12 12:00:00.000", c.getTime());
c.clear();
c.set(2000, 1 - 1, 2, 3, 4, 5);
c.set(Calendar.MILLISECOND, 6);
options.put("2000-01-02 03:04:05.006", c.getTime());
options.put("(current time)", LocalDate.now());
options.put("2010-12-12", LocalDate.of(2010, 12, 12));
createMultiClickAction("Set value", category, options, setValue, null);
}

@@ -103,9 +94,6 @@ public class AbstractDateFieldTest<T extends AbstractDateField>
options.put("Year", Resolution.YEAR);
options.put("Month", Resolution.MONTH);
options.put("Day", Resolution.DAY);
options.put("Hour", Resolution.HOUR);
options.put("Min", Resolution.MINUTE);
options.put("Sec", Resolution.SECOND);

createSelectAction("Resolution", category, options, "Year",
resolutionCommand);

+ 3
- 7
uitest/src/main/java/com/vaadin/tests/components/datefield/CustomDateFormat.java View File

@@ -1,6 +1,6 @@
package com.vaadin.tests.components.datefield;

import java.util.Calendar;
import java.time.LocalDate;
import java.util.Locale;

import com.vaadin.shared.ui.datefield.Resolution;
@@ -12,20 +12,16 @@ public class CustomDateFormat extends TestBase {

@Override
protected void setup() {

Locale locale = new Locale("fi", "FI");
Calendar cal = Calendar.getInstance();
cal.set(2010, 0, 1);

AbstractDateField df = new TestDateField();
df.setResolution(Resolution.DAY);
df.setLocale(locale);
df.setWidth("300px");

String pattern = "d. MMMM'ta 'yyyy 'klo 'H.mm.ss";
String pattern = "d. MMMM'ta 'yyyy 'klo";
df.setDateFormat(pattern);

df.setValue(cal.getTime());
df.setValue(LocalDate.of(2010, 1, 1));

addComponent(df);


+ 2
- 5
uitest/src/main/java/com/vaadin/tests/components/datefield/CustomDateFormatEEE.java View File

@@ -15,7 +15,7 @@
*/
package com.vaadin.tests.components.datefield;

import java.util.Calendar;
import java.time.LocalDate;
import java.util.Locale;

import com.vaadin.server.VaadinRequest;
@@ -29,9 +29,6 @@ public class CustomDateFormatEEE extends AbstractTestUI {

@Override
protected void setup(VaadinRequest request) {
Calendar cal = Calendar.getInstance();
cal.set(2014, 2, 14); // Friday

AbstractDateField df = new TestDateField(
"Should display 14/03/2014 Fri");
df.setResolution(Resolution.DAY);
@@ -39,7 +36,7 @@ public class CustomDateFormatEEE extends AbstractTestUI {

String pattern = "dd/MM/yyyy EEE";
df.setDateFormat(pattern);
df.setValue(cal.getTime());
df.setValue(LocalDate.of(2014, 3, 14)); // Friday
df.setWidth("200px");

VerticalLayout layout = new VerticalLayout();

+ 6
- 8
uitest/src/main/java/com/vaadin/tests/components/datefield/CustomDateFormats.java View File

@@ -2,7 +2,8 @@ package com.vaadin.tests.components.datefield;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
@@ -137,9 +138,6 @@ public class CustomDateFormats extends TestBase {

private void addDateField(GridLayout gridLayout, String pattern,
Locale locale, String expectedDateFormat) {
Calendar cal = Calendar.getInstance();
cal.set(2010, 1, 1);

Label serversideValueLabel = new Label();

AbstractDateField df = new TestDateField();
@@ -158,16 +156,16 @@ public class CustomDateFormats extends TestBase {
usedDebugIds.add(debugId);

df.setData(new Data(serversideValueLabel, pattern));
df.setValue(cal.getTime());
df.setValue(LocalDate.of(2010, 2, 1));
df.addValueChangeListener(event -> updateServerSideLabel(
(AbstractDateField) event.getConnector()));

Label patternLabel = new Label(pattern);
patternLabel.setWidth(null);
SimpleDateFormat expDateFormat = new SimpleDateFormat(
expectedDateFormat, locale);
DateTimeFormatter expDateFormat = DateTimeFormatter
.ofPattern(expectedDateFormat, locale);

Label expectedLabel = new Label(expDateFormat.format(cal.getTime()));
Label expectedLabel = new Label(expDateFormat.format(df.getValue()));
if (!pattern.equals(expectedDateFormat)) {
expectedLabel
.setValue(expectedLabel.getValue() + " (differs from JDK)");

+ 2
- 2
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldChangeResolution.java View File

@@ -18,13 +18,13 @@ package com.vaadin.tests.components.datefield;
import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.DateField;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.DateField;

public class DateFieldChangeResolution extends AbstractTestUI {


+ 13
- 22
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldDayResolutionOffset.java View File

@@ -1,9 +1,7 @@
package com.vaadin.tests.components.datefield;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.datefield.Resolution;
@@ -14,16 +12,15 @@ import com.vaadin.ui.Label;

public class DateFieldDayResolutionOffset extends AbstractTestUI {

private final String initialDateString = "09/01/2014 00:00:00";
private final String initialDateString = "09/01/2014";

@Override
protected void setup(VaadinRequest request) {
final Label dateValue = new Label(initialDateString);
dateValue.setId("dateValue");

final TimeZone timezone = TimeZone.getTimeZone("GMT");
final SimpleDateFormat dateformat = getDateFormat(timezone);
final AbstractDateField dateField = getDateField(timezone, dateformat);
final DateTimeFormatter dateformat = getDateFormat();
final AbstractDateField dateField = getDateField(dateformat);

addComponent(dateValue);
addComponent(dateField);
@@ -32,24 +29,18 @@ public class DateFieldDayResolutionOffset extends AbstractTestUI {
.setValue(dateformat.format(dateField.getValue())));
}

private AbstractDateField getDateField(TimeZone timezone,
SimpleDateFormat dateformat) {
private AbstractDateField getDateField(DateTimeFormatter dateformat) {
final AbstractDateField dateField = new TestDateField();
try {
Date initialDate = dateformat.parse(initialDateString);
dateField.setResolution(Resolution.DAY);
dateField.setTimeZone(timezone);
dateField.setValue(initialDate);
} catch (ParseException e) {
e.printStackTrace();
}
LocalDate initialDate = dateformat.parse(initialDateString,
LocalDate::from);
dateField.setResolution(Resolution.DAY);
dateField.setValue(initialDate);
return dateField;
}

private SimpleDateFormat getDateFormat(TimeZone timezone) {
final SimpleDateFormat dateformat = new SimpleDateFormat(
"MM/dd/yyyy HH:mm:ss");
dateformat.setTimeZone(timezone);
private DateTimeFormatter getDateFormat() {
final DateTimeFormatter dateformat = DateTimeFormatter
.ofPattern("MM/dd/yyyy");
return dateformat;
}


+ 1
- 1
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldEmptyValid.java View File

@@ -4,7 +4,6 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.shared.ui.label.ContentMode;
import com.vaadin.tests.components.TestBase;
import com.vaadin.tests.util.Log;
@@ -15,6 +14,7 @@ import com.vaadin.ui.Label;
import com.vaadin.v7.data.Property.ValueChangeEvent;
import com.vaadin.v7.data.Property.ValueChangeListener;
import com.vaadin.v7.data.util.ObjectProperty;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.ui.PopupDateField;

@SuppressWarnings("serial")

+ 9
- 20
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldExtendedRange.java View File

@@ -1,27 +1,22 @@
package com.vaadin.tests.components.datefield;

import java.util.Calendar;
import java.time.LocalDate;
import java.util.Locale;
import java.util.stream.Stream;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.TestBase;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.Button;
import com.vaadin.ui.DateField;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.InlineDateField;
import com.vaadin.ui.DateField;

@SuppressWarnings("serial")
public class DateFieldExtendedRange extends TestBase {

private Calendar date = Calendar.getInstance();

@Override
protected void setup() {
date.set(2011, 0, 1);

GridLayout layout = new GridLayout(2, 3);
layout.setWidth("600px");
layout.setSpacing(true);
@@ -49,15 +44,8 @@ public class DateFieldExtendedRange extends TestBase {

addComponent(layout);

addComponent(new Button("Change date", new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
date.set(2010, 1, 16);
for (AbstractDateField f : fields) {
f.setValue(date.getTime());
}
}
}));
addComponent(new Button("Change date", event -> Stream.of(fields)
.forEach(field -> field.setValue(LocalDate.of(2010, 2, 16)))));
}

@Override
@@ -72,9 +60,10 @@ public class DateFieldExtendedRange extends TestBase {

private AbstractDateField makeDateField(boolean isPopup, Locale locale,
String caption) {
AbstractDateField df = isPopup ? new DateField() : new InlineDateField();
AbstractDateField df = isPopup ? new DateField()
: new InlineDateField();
df.setResolution(Resolution.DAY);
df.setValue(date.getTime());
df.setValue(LocalDate.of(2011, 1, 1));
df.setLocale(locale);
df.setCaption(caption);
return df;

+ 4
- 4
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldIsValid.java View File

@@ -1,7 +1,7 @@
package com.vaadin.tests.components.datefield;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUIWithLog;
@@ -22,7 +22,7 @@ public class DateFieldIsValid extends AbstractTestUIWithLog {
}

private String pattern = "dd/MM/yy";
private SimpleDateFormat format = new SimpleDateFormat(pattern);
private DateTimeFormatter format = DateTimeFormatter.ofPattern(pattern);

@Override
protected void setup(VaadinRequest request) {
@@ -45,7 +45,7 @@ public class DateFieldIsValid extends AbstractTestUIWithLog {
* @param value
* @return
*/
protected String format(Date value) {
protected String format(LocalDate value) {
if (value != null) {
return format.format(value);
} else {

+ 3
- 7
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldKeyboardInput.java View File

@@ -15,23 +15,19 @@
*/
package com.vaadin.tests.components.datefield;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.time.LocalDate;

import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Label;
import com.vaadin.ui.DateField;
import com.vaadin.ui.Label;

public class DateFieldKeyboardInput extends AbstractTestUI {

@Override
protected void setup(VaadinRequest request) {
Calendar c = new GregorianCalendar(Locale.ENGLISH);
c.set(2014, 0, 15);
final DateField dateField = new DateField("Select date",
c.getTime());
LocalDate.of(2014, 1, 15));
dateField.setDateFormat("dd.MM.yyyy");
addComponent(dateField);
dateField.addValueChangeListener(

+ 2
- 2
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldLocale.java View File

@@ -1,6 +1,6 @@
package com.vaadin.tests.components.datefield;

import java.util.Date;
import java.time.LocalDate;
import java.util.Locale;

import com.vaadin.shared.ui.datefield.Resolution;
@@ -18,7 +18,7 @@ public class DateFieldLocale extends TestBase {
final AbstractDateField dateField = new TestDateField("DateField");
dateField.setLocale(new Locale("fi", "FI"));
dateField.setCaption(dateField.getLocale().toString());
dateField.setValue(new Date(2013 - 1900, 7 - 1, 27));
dateField.setValue(LocalDate.of(2013, 7, 27));
dateField.setResolution(Resolution.DAY);

addComponent(new Button("Change locale", new ClickListener() {

+ 0
- 58
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldMinResolution.java View File

@@ -1,58 +0,0 @@
package com.vaadin.tests.components.datefield;

import java.text.SimpleDateFormat;
import java.util.Calendar;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.TestBase;
import com.vaadin.tests.components.TestDateField;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.InlineDateField;
import com.vaadin.ui.Label;

public class DateFieldMinResolution extends TestBase {

@Override
protected void setup() {

final SimpleDateFormat dformat = new SimpleDateFormat(
"dd/MM/yyyy HH:mm");

Calendar cal = Calendar.getInstance();
cal.set(2019, 1, 1, 1, 1);

AbstractDateField df = new TestDateField("foo");
df.setResolution(Resolution.MINUTE);
df.setDateFormat(dformat.toPattern());
df.setValue(cal.getTime());
df.setImmediate(true);

addComponent(df);

final Label lbl = new Label(dformat.format(cal.getTime()));
lbl.setCaption("Selected date");

InlineDateField idf = new InlineDateField("bar");
idf.setResolution(Resolution.MINUTE);
idf.setDateFormat(dformat.toPattern());
idf.setValue(cal.getTime());
idf.setImmediate(true);

idf.addValueChangeListener(
event -> lbl.setValue(dformat.format(event.getValue())));

addComponent(idf);
addComponent(lbl);
}

@Override
protected String getDescription() {
return "When the time controls are visible the time should be directed directly to the textfield";
}

@Override
protected Integer getTicketNumber() {
return 5387;
}

}

+ 2
- 4
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldPopupOffScreen.java View File

@@ -1,9 +1,8 @@
package com.vaadin.tests.components.datefield;

import java.util.Date;
import java.time.LocalDate;
import java.util.Locale;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.AbstractTestCase;
import com.vaadin.tests.components.TestDateField;
import com.vaadin.ui.AbstractDateField;
@@ -59,10 +58,9 @@ public class DateFieldPopupOffScreen extends AbstractTestCase {
private AbstractDateField createDateField() {
AbstractDateField df = new TestDateField();
df.setLocale(new Locale("fi"));
df.setResolution(Resolution.SECOND);
df.setDescription(
"This is a long, multiline tooltip.<br/>It should always be on screen so it can be read.");
df.setValue(new Date(1000000L));
df.setValue(LocalDate.of(2000, 1, 1));
return df;
}
}

+ 0
- 2
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldRangeValidation.java View File

@@ -4,7 +4,6 @@ import java.util.Date;
import java.util.Locale;

import com.vaadin.data.HasValue;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.TestBase;
import com.vaadin.tests.util.CheckBoxWithPropertyDataSource;
import com.vaadin.ui.CheckBox;
@@ -119,7 +118,6 @@ public class DateFieldRangeValidation extends TestBase {
private PopupDateField createDateField() {
PopupDateField df = new PopupDateField();
df.setLocale(new Locale("en", "US"));
df.setResolution(Resolution.DAY);
df.setBuffered(false);
df.setImmediate(true);
return df;

+ 4
- 6
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldRanges.java View File

@@ -1,5 +1,6 @@
package com.vaadin.tests.components.datefield;

import java.time.LocalDate;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
@@ -54,9 +55,6 @@ public class DateFieldRanges extends AbstractTestUI {
}

private void initializeControlFields() {
resoSelect.addItem(Resolution.MINUTE);
resoSelect.addItem(Resolution.SECOND);
resoSelect.addItem(Resolution.HOUR);
resoSelect.addItem(Resolution.DAY);
resoSelect.addItem(Resolution.MONTH);
resoSelect.addItem(Resolution.YEAR);
@@ -225,9 +223,9 @@ public class DateFieldRanges extends AbstractTestUI {
}

private void updateValuesForDateField(AbstractDateField df) {
Date fromVal = fromRange.getValue();
Date toVal = toRange.getValue();
Date value = valueDF.getValue();
LocalDate fromVal = fromRange.getValue();
LocalDate toVal = toRange.getValue();
LocalDate value = valueDF.getValue();
Resolution r = (Resolution) resoSelect.getValue();
boolean immediate = immediateCB.getValue();


+ 2
- 8
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldReadOnly.java View File

@@ -1,10 +1,9 @@
package com.vaadin.tests.components.datefield;

import java.util.Calendar;
import java.time.LocalDate;
import java.util.Locale;

import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.tests.components.TestDateField;
import com.vaadin.ui.AbstractDateField;
@@ -28,8 +27,6 @@ public class DateFieldReadOnly extends AbstractTestUI {
protected void setup(VaadinRequest request) {
final AbstractDateField timeField = new TestDateField(
"A read-only datefield");
timeField.setResolution(Resolution.SECOND);
timeField.setDateFormat("HH:mm:ss");
timeField.setCaption(null);
timeField.setIcon(null);
timeField.setWidth("8em");
@@ -37,10 +34,7 @@ public class DateFieldReadOnly extends AbstractTestUI {
timeField.setLocale(new Locale("fi"));

// Set date so that testing always has same time
Calendar c = Calendar.getInstance(Locale.ENGLISH);
c.set(2009, 05, 12, 0, 0, 0);

timeField.setValue(c.getTime());
timeField.setValue(LocalDate.of(2009, 6, 12));
timeField.setReadOnly(true);

addComponent(timeField);

+ 1
- 9
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldTest.java View File

@@ -39,14 +39,6 @@ public class DateFieldTest extends AbstractDateFieldTest<DateField> {

private void createTextEnabledAction(String category) {
this.createBooleanAction("Text field enabled", category, true,
new Command<DateField, Boolean>() {

@Override
public void execute(DateField c, Boolean value,
Object data) {
c.setTextFieldEnabled(value);
}

});
(field, value, data) -> field.setTextFieldEnabled(value));
}
}

+ 0
- 103
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldTimezone.java View File

@@ -1,103 +0,0 @@
package com.vaadin.tests.components.datefield;

import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.TestBase;
import com.vaadin.tests.components.TestDateField;
import com.vaadin.tests.util.Log;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.v7.data.Property;
import com.vaadin.v7.data.Property.ValueChangeEvent;
import com.vaadin.v7.shared.ui.combobox.FilteringMode;
import com.vaadin.v7.ui.ComboBox;

public class DateFieldTimezone extends TestBase {

private static final TimeZone UTC = TimeZone.getTimeZone("UTC");
private static final Locale EN = Locale.ENGLISH;
private final Log log = new Log(5);
private final AbstractDateField dateField = new TestDateField();
private static final String nullValue = "";

@Override
protected void setup() {
dateField.setResolution(Resolution.SECOND);

ArrayList<String> timeZoneCodes = new ArrayList<>();
timeZoneCodes.add(nullValue);
timeZoneCodes.addAll(Arrays.asList(TimeZone.getAvailableIDs()));
ComboBox timezoneSelector = new ComboBox("Select time zone",
timeZoneCodes) {
@Override
public String getItemCaption(Object itemId) {
if (itemId == nullValue || itemId == null) {
TimeZone timeZone = TimeZone.getDefault();
return "Default time zone (" + timeZone.getDisplayName()
+ ")";
} else {
TimeZone timeZone = TimeZone.getTimeZone((String) itemId);
return itemId + " (" + timeZone.getDisplayName() + ")";
}
}
};
timezoneSelector.setValue("UTC");
timezoneSelector.setImmediate(true);
timezoneSelector.setNullSelectionAllowed(true);
timezoneSelector.setNullSelectionItemId(nullValue);
timezoneSelector.setFilteringMode(FilteringMode.CONTAINS);
timezoneSelector.addListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
Object value = event.getProperty().getValue();
TimeZone timeZone;
if (value == nullValue || value == null) {
timeZone = null;
log.log("Change to default time zone "
+ TimeZone.getDefault().getID());
} else {
timeZone = TimeZone.getTimeZone((String) value);
log.log("Changed to time zone " + timeZone.getID());
}
dateField.setTimeZone(timeZone);
}
});

Calendar cal = Calendar.getInstance(UTC);
cal.set(2010, 0, 1, 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);

dateField.setValue(cal.getTime());
dateField.setImmediate(true);
dateField.setTimeZone(cal.getTimeZone());
dateField.setLocale(EN);
dateField.addValueChangeListener(event -> {
Date date = dateField.getValue();
DateFormat format = DateFormat.getDateTimeInstance(DateFormat.SHORT,
DateFormat.LONG, EN);
format.setTimeZone(UTC);
log.log("Date changed to " + format.format(date));
});

addComponent(timezoneSelector);
addComponent(log);
addComponent(dateField);
}

@Override
protected String getDescription() {
return "Tests the operation of the date field with different time zones";
}

@Override
protected Integer getTicketNumber() {
return Integer.valueOf(6066);
}

}

+ 11
- 11
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldUnparsableDate.java View File

@@ -1,6 +1,6 @@
package com.vaadin.tests.components.datefield;

import java.util.Date;
import java.time.LocalDate;

import com.vaadin.data.Result;
import com.vaadin.tests.components.TestBase;
@@ -10,7 +10,7 @@ import com.vaadin.v7.data.util.converter.Converter;
public class DateFieldUnparsableDate extends TestBase {

public class MyDateField extends AbstractDateField {
Date oldDate = null;
LocalDate oldDate = null;

public MyDateField(String caption) {
super(caption);
@@ -18,8 +18,8 @@ public class DateFieldUnparsableDate extends TestBase {
}

@Override
protected Result<Date> handleUnparsableDateString(String dateString)
throws Converter.ConversionException {
protected Result<LocalDate> handleUnparsableDateString(
String dateString) throws Converter.ConversionException {
return Result.ok(oldDate);
}
}
@@ -30,8 +30,8 @@ public class DateFieldUnparsableDate extends TestBase {
}

@Override
protected Result<Date> handleUnparsableDateString(String dateString)
throws Converter.ConversionException {
protected Result<LocalDate> handleUnparsableDateString(
String dateString) throws Converter.ConversionException {
return Result.ok(null);
}
}
@@ -42,8 +42,8 @@ public class DateFieldUnparsableDate extends TestBase {
}

@Override
protected Result<Date> handleUnparsableDateString(String dateString)
throws Converter.ConversionException {
protected Result<LocalDate> handleUnparsableDateString(
String dateString) throws Converter.ConversionException {
return Result.error("You should not enter invalid dates!");
}
}
@@ -54,10 +54,10 @@ public class DateFieldUnparsableDate extends TestBase {
}

@Override
protected Result<Date> handleUnparsableDateString(String dateString)
throws Converter.ConversionException {
protected Result<LocalDate> handleUnparsableDateString(
String dateString) throws Converter.ConversionException {
if (dateString != null && dateString.equals("today")) {
return Result.ok(new Date());
return Result.ok(LocalDate.now());
}
return Result.error("You should not enter invalid dates!");
}

+ 0
- 101
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldValueChangeEvents.java View File

@@ -1,101 +0,0 @@
/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/

/**
*
*/
package com.vaadin.tests.components.datefield;

import java.util.Arrays;
import java.util.Calendar;

import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.tests.components.TestDateField;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.v7.data.Property.ValueChangeEvent;
import com.vaadin.v7.data.Property.ValueChangeListener;
import com.vaadin.v7.ui.NativeSelect;

/**
*
* @since
* @author Vaadin Ltd
*/
public class DateFieldValueChangeEvents extends AbstractTestUIWithLog {

private int count = 0;

/*
* (non-Javadoc)
*
* @see com.vaadin.tests.components.AbstractTestUI#setup(com.vaadin.server.
* VaadinRequest)
*/
@Override
protected void setup(VaadinRequest request) {

HorizontalLayout hl = new HorizontalLayout();
addComponent(hl);

Calendar calendar = Calendar.getInstance();
calendar.set(2010, 1, 1, 18, 19, 20);

final AbstractDateField df = new TestDateField(null,
calendar.getTime());
df.setResolution(Resolution.SECOND);
df.setImmediate(true);
hl.addComponent(df);

NativeSelect resolution = new NativeSelect(null,
Arrays.asList(Resolution.values()));
resolution.setImmediate(true);
resolution.setValue(df.getResolution());
hl.addComponent(resolution);
resolution.addValueChangeListener(new ValueChangeListener() {

@Override
public void valueChange(ValueChangeEvent event) {
df.setResolution((Resolution) event.getProperty().getValue());
}
});

df.addValueChangeListener(event -> log("Value changes: " + (++count)));
}

/*
* (non-Javadoc)
*
* @see com.vaadin.tests.components.AbstractTestUI#getTestDescription()
*/
@Override
protected String getTestDescription() {
return "DateField Time resolution fields should only send events when focus is removed";
}

/*
* (non-Javadoc)
*
* @see com.vaadin.tests.components.AbstractTestUI#getTicketNumber()
*/
@Override
protected Integer getTicketNumber() {
return 6252;
}

}

+ 7
- 7
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFieldWhenChangingValueAndEnablingParent.java View File

@@ -1,6 +1,6 @@
package com.vaadin.tests.components.datefield;

import java.util.Date;
import java.time.LocalDate;

import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
@@ -40,12 +40,12 @@ public class DateFieldWhenChangingValueAndEnablingParent
main.addComponent(sub);

chk.addValueChangeListener(event -> {
df1.setValue(new Date());
df2.setValue(new Date());
pdf1.setValue(new Date());
pdf2.setValue(new Date());
pdf3.setValue(new Date());
pdf4.setValue(new Date());
df1.setValue(LocalDate.now());
df2.setValue(LocalDate.now());
pdf1.setValue(LocalDate.now());
pdf2.setValue(LocalDate.now());
pdf3.setValue(LocalDate.now());
pdf4.setValue(LocalDate.now());
sub.setEnabled(chk.getValue());
});
}

+ 4
- 16
uitest/src/main/java/com/vaadin/tests/components/datefield/DateFields.java View File

@@ -1,6 +1,6 @@
package com.vaadin.tests.components.datefield;

import java.sql.Date;
import java.time.LocalDate;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
@@ -42,10 +42,9 @@ public class DateFields extends ComponentTestCase<DateField> {

private DateField createPopupDateField(String caption, String width,
Locale locale) {
DateField pd = new DateField(
caption + "(" + locale.toString() + ")");
DateField pd = new DateField(caption + "(" + locale.toString() + ")");
pd.setWidth(width);
pd.setValue(new Date(12312312313L));
pd.setValue(LocalDate.of(1970, 05, 23));
pd.setLocale(locale);
pd.setResolution(Resolution.YEAR);

@@ -70,19 +69,8 @@ public class DateFields extends ComponentTestCase<DateField> {
options.put("Year", Resolution.YEAR);
options.put("Month", Resolution.MONTH);
options.put("Day", Resolution.DAY);
options.put("Hour", Resolution.HOUR);
options.put("Min", Resolution.MINUTE);
options.put("Sec", Resolution.SECOND);
return createSelectAction("Resolution", options, "Year",
new Command<DateField, Resolution>() {

@Override
public void execute(DateField c, Resolution value,
Object data) {
c.setResolution(value);

}
});
(field, value, data) -> field.setResolution(value));
}

private Component createInputPromptSelectAction() {

+ 2
- 4
uitest/src/main/java/com/vaadin/tests/components/datefield/DatePopupStyleName.java View File

@@ -1,9 +1,8 @@
package com.vaadin.tests.components.datefield;

import java.util.Date;
import java.time.LocalDate;

import com.vaadin.server.UserError;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.TestBase;
import com.vaadin.tests.components.TestDateField;
import com.vaadin.ui.AbstractDateField;
@@ -14,8 +13,7 @@ public class DatePopupStyleName extends TestBase {
setTheme("reindeer-tests");

final AbstractDateField df = new TestDateField();
df.setValue(new Date(1203910239L));
df.setResolution(Resolution.SECOND);
df.setValue(LocalDate.of(1970, 1, 15));
df.setWidth("200px");
df.setRequired(true);
df.setComponentError(new UserError("abc"));

+ 0
- 57
uitest/src/main/java/com/vaadin/tests/components/datefield/DateRangeWithSqlDate.java View File

@@ -1,57 +0,0 @@
/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.components.datefield;

import java.util.Locale;

import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.InlineDateField;

public class DateRangeWithSqlDate extends AbstractTestUI {

// 2014-12-01
private static final java.sql.Date startDate = new java.sql.Date(
1417467822699L);

// 2014-12-02
private static final java.sql.Date endDate = new java.sql.Date(
1417554763317L);

@Override
protected void setup(VaadinRequest request) {
AbstractDateField df = new InlineDateField();
df.setLocale(Locale.US);
df.setRangeStart(startDate);
df.setRangeEnd(endDate);

df.setValue(startDate);

addComponent(df);
}

@Override
protected String getTestDescription() {
return "Test that java.sql.Date can be given to specify date range start and end dates.";
}

@Override
protected Integer getTicketNumber() {
return 15342;
}

}

+ 4
- 11
uitest/src/main/java/com/vaadin/tests/components/datefield/DisabledInlineDateField.java View File

@@ -15,8 +15,7 @@
*/
package com.vaadin.tests.components.datefield;

import java.util.Calendar;
import java.util.Date;
import java.time.LocalDate;

import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
@@ -25,22 +24,16 @@ import com.vaadin.ui.InlineDateField;

public class DisabledInlineDateField extends AbstractTestUI {

private static final Date testDate;
static {
Calendar cal = Calendar.getInstance();
cal.set(2014, 5, 5);
testDate = cal.getTime();
}

@Override
protected void setup(VaadinRequest request) {
AbstractDateField df = new InlineDateField("Disabled");
df.setValue(testDate);
LocalDate date = LocalDate.of(2014, 6, 5);
df.setValue(date);
df.setEnabled(false);
addComponent(df);

df = new InlineDateField("Read-only");
df.setValue(testDate);
df.setValue(date);
df.setReadOnly(true);
addComponent(df);
}

+ 7
- 14
uitest/src/main/java/com/vaadin/tests/components/datefield/DynamicallyChangeDateRange.java View File

@@ -1,15 +1,15 @@
package com.vaadin.tests.components.datefield;

import java.util.Date;
import java.time.LocalDate;
import java.util.Locale;

import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.InlineDateField;
import com.vaadin.ui.DateField;
import com.vaadin.ui.InlineDateField;
import com.vaadin.ui.VerticalLayout;

/**
@@ -26,12 +26,12 @@ public class DynamicallyChangeDateRange extends AbstractTestUI {
setContent(layout);

final DateField df = new DateField();
df.setValue(new Date(2012 - 1900, 5 - 1, 12));
df.setValue(LocalDate.of(2012, 5, 12));
setRange(df, 5);
layout.addComponent(df);

final InlineDateField df2 = new InlineDateField();
df2.setValue(new Date(2012 - 1900, 11 - 1, 16));
df2.setValue(LocalDate.of(2012, 11, 16));

setRange(df2, 5);
// layout.addComponent(df2);
@@ -57,16 +57,9 @@ public class DynamicallyChangeDateRange extends AbstractTestUI {
layout.addComponent(button2);
}

/**
* @since
* @param df
* @param i
*/
private void setRange(AbstractDateField df, int days) {
df.setRangeStart(
new Date(df.getValue().getTime() - days * 24 * 60 * 60 * 1000));
df.setRangeEnd(
new Date(df.getValue().getTime() + days * 24 * 60 * 60 * 1000));
df.setRangeStart(df.getValue().minusDays(days));
df.setRangeEnd(df.getValue().plusDays(days));

}


+ 3
- 14
uitest/src/main/java/com/vaadin/tests/components/datefield/InlineDateFields.java View File

@@ -1,6 +1,6 @@
package com.vaadin.tests.components.datefield;

import java.sql.Date;
import java.time.LocalDate;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
@@ -49,7 +49,7 @@ public class InlineDateFields extends ComponentTestCase<InlineDateField> {
InlineDateField pd = new InlineDateField(
caption + "(" + locale.toString() + ")");
pd.setWidth(width);
pd.setValue(new Date(12312312313L));
pd.setValue(LocalDate.of(1970, 05, 23));
pd.setLocale(locale);
pd.setResolution(Resolution.YEAR);

@@ -74,19 +74,8 @@ public class InlineDateFields extends ComponentTestCase<InlineDateField> {
options.put("Year", Resolution.YEAR);
options.put("Month", Resolution.MONTH);
options.put("Day", Resolution.DAY);
options.put("Hour", Resolution.HOUR);
options.put("Min", Resolution.MINUTE);
options.put("Sec", Resolution.SECOND);
return createSelectAction("Resolution", options, "Year",
new Command<InlineDateField, Resolution>() {

@Override
public void execute(InlineDateField c, Resolution value,
Object data) {
c.setResolution(value);

}
});
(field, value, data) -> field.setResolution(value));
}

private Component createLocaleSelectAction() {

+ 1
- 1
uitest/src/main/java/com/vaadin/tests/components/datefield/LegacyDateFieldRanges.java View File

@@ -6,7 +6,6 @@ import java.util.Locale;

import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
@@ -17,6 +16,7 @@ import com.vaadin.ui.Label;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.v7.data.Property.ValueChangeEvent;
import com.vaadin.v7.data.Property.ValueChangeListener;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.ui.DateField;
import com.vaadin.v7.ui.InlineDateField;
import com.vaadin.v7.ui.NativeSelect;

+ 1
- 1
uitest/src/main/java/com/vaadin/tests/components/datefield/LegacyDateFieldTest.java View File

@@ -7,8 +7,8 @@ import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Locale;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.abstractfield.LegacyAbstractFieldTest;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.ui.DateField;

public class LegacyDateFieldTest<T extends DateField>

+ 5
- 5
uitest/src/main/java/com/vaadin/tests/components/datefield/LenientMode.java View File

@@ -1,6 +1,6 @@
package com.vaadin.tests.components.datefield;

import java.util.Date;
import java.time.LocalDate;
import java.util.Locale;

import com.vaadin.data.HasValue.ValueChange;
@@ -11,7 +11,8 @@ import com.vaadin.tests.components.TestDateField;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.Button;

public class LenientMode extends TestBase implements ValueChangeListener<Date> {
public class LenientMode extends TestBase
implements ValueChangeListener<LocalDate> {

private static final long serialVersionUID = -9064553409580072387L;

@@ -28,8 +29,7 @@ public class LenientMode extends TestBase implements ValueChangeListener<Date> {
@Override
protected void setup() {

@SuppressWarnings("deprecation")
Date d = new Date(2009 - 1900, 12 - 1, 31, 23, 59, 59);
LocalDate d = LocalDate.of(2009, 12, 31);

AbstractDateField df = new TestDateField("Lenient ");
df.setLocale(new Locale("fi"));
@@ -76,7 +76,7 @@ public class LenientMode extends TestBase implements ValueChangeListener<Date> {
}

@Override
public void accept(ValueChange<Date> event) {
public void accept(ValueChange<LocalDate> event) {
getMainWindow().showNotification("New value" + event.getValue());
}


+ 0
- 83
uitest/src/main/java/com/vaadin/tests/components/datefield/LocaleChange.java View File

@@ -1,83 +0,0 @@
/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.components.datefield;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.tests.components.TestDateField;
import com.vaadin.ui.AbstractDateField;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;

public class LocaleChange extends AbstractTestUI {

private final Locale locale12hClock = Locale.US;
private final Locale locale24hClock = Locale.FRANCE;

private final String caption = "Switch to %s hour clock";
private static final Date dateValue;
static {
try {
dateValue = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
.parse("2014-05-22 20:00:00");
} catch (ParseException e) {
throw new ExceptionInInitializerError("Should never happen.");
}
}

@Override
protected void setup(VaadinRequest request) {
final AbstractDateField df = new TestDateField();
df.setLocale(locale24hClock);
df.setResolution(Resolution.SECOND);
df.setValue(dateValue);

Button button = new Button(String.format(caption, "12"));
button.addClickListener(new ClickListener() {

@Override
public void buttonClick(ClickEvent event) {
if (locale12hClock.equals(df.getLocale())) {
df.setLocale(locale24hClock);
event.getButton().setCaption(String.format(caption, "12"));
} else {
df.setLocale(locale12hClock);
event.getButton().setCaption(String.format(caption, "24"));
}
}
});

addComponent(df);
addComponent(button);
}

@Override
protected String getTestDescription() {
return "Testing locale change from one with 24h clock to a 12h clock locale.";
}

@Override
protected Integer getTicketNumber() {
return 13722;
}
}

+ 5
- 3
uitest/src/main/java/com/vaadin/tests/components/datefield/LowResolution.java View File

@@ -1,11 +1,13 @@
package com.vaadin.tests.components.datefield;

import java.time.LocalDate;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.TestBase;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.InlineDateField;
import com.vaadin.ui.DateField;
import com.vaadin.ui.InlineDateField;

@SuppressWarnings("serial")
public class LowResolution extends TestBase {
@@ -13,7 +15,7 @@ public class LowResolution extends TestBase {
@Override
protected void setup() {
final DateField dateField = new DateField();
dateField.setValue(new java.util.Date());
dateField.setValue(LocalDate.now());
dateField.setResolution(Resolution.MONTH);
dateField.addValueChangeListener(event -> getMainWindow()
.showNotification("Date now" + event.getValue()));
@@ -29,7 +31,7 @@ public class LowResolution extends TestBase {
getLayout().addComponent(dateField3);

final InlineDateField dateField2 = new InlineDateField();
dateField2.setValue(new java.util.Date());
dateField2.setValue(LocalDate.now());
dateField2.setResolution(Resolution.MONTH);
dateField2.addValueChangeListener(event -> getMainWindow()
.showNotification("Date now" + event.getValue()));

+ 1
- 5
uitest/src/main/java/com/vaadin/tests/components/datefield/PopupClosingWithEsc.java View File

@@ -26,10 +26,6 @@ public class PopupClosingWithEsc extends AbstractTestUI {

@Override
protected void setup(VaadinRequest request) {
AbstractDateField df0 = new TestDateField("Minute");
df0.setId("minute");
df0.setResolution(Resolution.MINUTE);

AbstractDateField df1 = new TestDateField("Day");
df1.setId("day");
df1.setResolution(Resolution.DAY);
@@ -45,7 +41,7 @@ public class PopupClosingWithEsc extends AbstractTestUI {
VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
layout.setSpacing(true);
layout.addComponents(df0, df1, df2, df3);
layout.addComponents(df1, df2, df3);
setContent(layout);
}


+ 5
- 17
uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldExtendedRange.java View File

@@ -1,25 +1,20 @@
package com.vaadin.tests.components.datefield;

import java.util.Calendar;
import java.time.LocalDate;
import java.util.Locale;
import java.util.stream.Stream;

import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.DateField;

@SuppressWarnings("serial")
public class PopupDateFieldExtendedRange extends AbstractTestUI {

private Calendar date = Calendar.getInstance();

@Override
protected void setup(VaadinRequest request) {
date.set(2011, 0, 1);

getLayout().setSpacing(true);

final DateField[] fields = new DateField[3];
@@ -41,15 +36,8 @@ public class PopupDateFieldExtendedRange extends AbstractTestUI {
addComponent(f);
}

addComponent(new Button("Change date", new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
date.set(2010, 1, 16);
for (DateField f : fields) {
f.setValue(date.getTime());
}
}
}));
addComponent(new Button("Change date", event -> Stream.of(fields)
.forEach(field -> field.setValue(LocalDate.of(2010, 2, 16)))));
}

@Override
@@ -65,7 +53,7 @@ public class PopupDateFieldExtendedRange extends AbstractTestUI {
private DateField makeDateField() {
DateField pdf = new DateField();
pdf.setResolution(Resolution.DAY);
pdf.setValue(date.getTime());
pdf.setValue(LocalDate.of(2011, 1, 1));
return pdf;
}
}

+ 0
- 46
uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldLocaleTest.java View File

@@ -1,46 +0,0 @@
package com.vaadin.tests.components.datefield;

import java.util.Calendar;
import java.util.Locale;

import com.vaadin.server.VaadinRequest;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.DateField;

public class PopupDateFieldLocaleTest extends AbstractTestUI {

@Override
protected void setup(VaadinRequest request) {
// Set a specific time for the PopupDateField
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2000);
cal.set(Calendar.DAY_OF_YEAR, 1);
cal.set(Calendar.HOUR_OF_DAY, 1);
cal.set(Calendar.MINUTE, 1);
cal.set(Calendar.SECOND, 1);
cal.set(Calendar.MILLISECOND, 1);

final DateField pdf = new DateField();
pdf.setLocale(Locale.ENGLISH);
pdf.setValue(cal.getTime());
pdf.setImmediate(true);
pdf.setResolution(Resolution.SECOND);
addComponent(pdf);

pdf.addValueChangeListener(event -> pdf.setLocale(Locale.FRENCH));
}

@Override
protected String getTestDescription() {
return "Changing the locale while the popupdatefield is visible can "
+ "result in the locale remaining at the previous value; the locale "
+ "is only changed once the current month is changed.";
}

@Override
protected Integer getTicketNumber() {
return 12135;
}

}

+ 0
- 41
uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldPopup.java View File

@@ -1,41 +0,0 @@
package com.vaadin.tests.components.datefield;

import java.util.Calendar;
import java.util.Locale;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.TestBase;
import com.vaadin.ui.DateField;

public class PopupDateFieldPopup extends TestBase {

@Override
protected void setup() {
// Set a specific time for the PopupDateField
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2000);
cal.set(Calendar.DAY_OF_YEAR, 1);
cal.set(Calendar.HOUR_OF_DAY, 1);
cal.set(Calendar.MINUTE, 1);
cal.set(Calendar.SECOND, 1);
cal.set(Calendar.MILLISECOND, 1);

DateField pdf = new DateField();
pdf.setLocale(Locale.US);
pdf.setValue(cal.getTime());
pdf.setImmediate(true);
pdf.setResolution(Resolution.SECOND);
addComponent(pdf);
}

@Override
protected String getDescription() {
return "Changing the minute, second and millisecond parts should also result in an update of the PopupDateField popup contents.";
}

@Override
protected Integer getTicketNumber() {
return 8391;
}

}

+ 3
- 12
uitest/src/main/java/com/vaadin/tests/components/datefield/PopupDateFieldStates.java View File

@@ -1,13 +1,11 @@
package com.vaadin.tests.components.datefield;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.time.LocalDate;

import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.DateField;
import com.vaadin.ui.GridLayout;

@SuppressWarnings("serial")
public class PopupDateFieldStates extends AbstractTestUI {
@@ -39,14 +37,7 @@ public class PopupDateFieldStates extends AbstractTestUI {
final boolean textFieldEnabled) {
final DateField popupDatefield = new DateField();

Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DATE, 3);
cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
cal.set(Calendar.YEAR, 2014);
cal.set(Calendar.HOUR_OF_DAY, 8);
final Date currentDate = cal.getTime();

popupDatefield.setValue(currentDate);
popupDatefield.setValue(LocalDate.of(2014, 9, 3));
popupDatefield.setCaption("Enabled: " + enabled
+ ", Text field enabled: " + textFieldEnabled);
popupDatefield.setEnabled(enabled);

+ 2
- 2
uitest/src/main/java/com/vaadin/tests/components/datefield/TestDatefieldYear.java View File

@@ -1,6 +1,6 @@
package com.vaadin.tests.components.datefield;

import java.util.Date;
import java.time.LocalDate;
import java.util.Locale;

import com.vaadin.shared.ui.datefield.Resolution;
@@ -24,7 +24,7 @@ public class TestDatefieldYear extends TestBase {
protected void setup() {
@SuppressWarnings("deprecation")
AbstractDateField df = new TestDateField("Year",
new Date(2009 - 1900, 4 - 1, 1));
LocalDate.of(2009, 4, 1));
df.setLocale(new Locale("en", "US"));
df.setResolution(Resolution.YEAR);
df.setResolution(Resolution.MONTH);

+ 2
- 4
uitest/src/main/java/com/vaadin/tests/components/datefield/WidthRecalculationOnEnableStateChange.java View File

@@ -1,8 +1,7 @@
package com.vaadin.tests.components.datefield;

import java.util.Date;
import java.time.LocalDate;

import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.TestBase;
import com.vaadin.tests.components.TestDateField;
import com.vaadin.ui.AbstractDateField;
@@ -15,8 +14,7 @@ public class WidthRecalculationOnEnableStateChange extends TestBase {
setTheme("reindeer-tests");

final AbstractDateField df = new TestDateField();
df.setValue(new Date(1203910239L));
df.setResolution(Resolution.SECOND);
df.setValue(LocalDate.of(1970, 1, 15));
df.setWidth("200px");
df.addStyleName("enabled-readonly-styled");
addComponent(df);

+ 5
- 6
uitest/src/main/java/com/vaadin/tests/components/uitest/components/DatesCssTest.java View File

@@ -1,7 +1,6 @@
package com.vaadin.tests.components.uitest.components;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.time.LocalDate;

import com.vaadin.tests.components.TestDateField;
import com.vaadin.tests.components.uitest.TestSampler;
@@ -17,7 +16,7 @@ public class DatesCssTest extends GridLayout {
private TestSampler parent;
private int debugIdCounter = 0;

private Calendar cal = new GregorianCalendar(2012, 8, 11, 18, 00, 00);
private LocalDate date = LocalDate.of(2012, 9, 11);

public DatesCssTest(TestSampler parent) {
super(5, 2);
@@ -31,12 +30,12 @@ public class DatesCssTest extends GridLayout {

AbstractDateField df = new DateField("Popup date field");
df.setId("datefield" + debugIdCounter++);
df.setValue(cal.getTime());
df.setValue(date);
addComponent(df);

df = new InlineDateField("Inline date field");
df.setId("datefield" + debugIdCounter++);
df.setValue(cal.getTime());
df.setValue(date);
addComponent(df);

createDateFieldWith(null, null, "130px");
@@ -50,7 +49,7 @@ public class DatesCssTest extends GridLayout {
String width) {
AbstractDateField df = new TestDateField("Date field");
df.setId("datefield" + debugIdCounter++);
df.setValue(cal.getTime());
df.setValue(date);

if (caption != null) {
df.setCaption(caption);

+ 1
- 1
uitest/src/main/java/com/vaadin/tests/themes/valo/CalendarTest.java View File

@@ -11,7 +11,6 @@ import com.vaadin.data.Binder;
import com.vaadin.data.ValidationException;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
import com.vaadin.shared.ui.datefield.Resolution;
import com.vaadin.tests.components.calendar.CalendarTestEvent;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
@@ -34,6 +33,7 @@ import com.vaadin.v7.data.fieldgroup.FieldGroup;
import com.vaadin.v7.data.fieldgroup.FieldGroup.CommitException;
import com.vaadin.v7.data.util.BeanItem;
import com.vaadin.v7.shared.ui.combobox.FilteringMode;
import com.vaadin.v7.shared.ui.datefield.Resolution;
import com.vaadin.v7.ui.Calendar;
import com.vaadin.v7.ui.Calendar.TimeFormat;
import com.vaadin.v7.ui.ComboBox;

+ 7
- 35
uitest/src/main/java/com/vaadin/tests/themes/valo/DateFields.java View File

@@ -15,7 +15,7 @@
*/
package com.vaadin.tests.themes.valo;

import java.util.Date;
import java.time.LocalDate;
import java.util.Locale;

import com.vaadin.navigator.View;
@@ -77,7 +77,7 @@ public class DateFields extends VerticalLayout implements View {
Button today = new Button("Today", new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
date2.setValue(new Date());
date2.setValue(LocalDate.now());
}
});
group.addComponent(today);
@@ -88,27 +88,6 @@ public class DateFields extends VerticalLayout implements View {
date.setWidth("260px");
date.setHeight("60px");

date = new TestDateField("Second resolution");
setDate(date);
date.setResolution(Resolution.SECOND);
row.addComponent(date);

date = new TestDateField("Minute resolution");
setDate(date);
date.setResolution(Resolution.MINUTE);
row.addComponent(date);

date = new TestDateField("Hour resolution");
setDate(date);
date.setResolution(Resolution.HOUR);
row.addComponent(date);

date = new TestDateField("Disabled");
setDate(date);
date.setResolution(Resolution.HOUR);
date.setEnabled(false);
row.addComponent(date);

date = new TestDateField("Day resolution");
setDate(date);
date.setResolution(Resolution.DAY);
@@ -167,12 +146,6 @@ public class DateFields extends VerticalLayout implements View {
date.setShowISOWeekNumbers(true);
row.addComponent(date);

date = new TestDateField("US locale");
setDate(date);
date.setResolution(Resolution.SECOND);
date.setLocale(new Locale("en", "US"));
row.addComponent(date);

date = new TestDateField("Custom format");
setDate(date);
date.setDateFormat("E dd/MM/yyyy");
@@ -218,20 +191,19 @@ public class DateFields extends VerticalLayout implements View {
private void setDateRange(AbstractDateField date) {
date.setRangeStart(getDefaultDate());

Date endDate = getDefaultDate();
endDate.setMonth(endDate.getMonth() + 1);
date.setRangeEnd(endDate);
LocalDate endDate = getDefaultDate();
date.setRangeEnd(endDate.plusMonths(1));
}

private void setDate(AbstractDateField date) {
date.setValue(getDefaultDate());
}

private Date getDefaultDate() {
private LocalDate getDefaultDate() {
if (ValoThemeUI.isTestMode()) {
return new Date(2014 - 1900, 5, 7);
return LocalDate.of(2014, 6, 7);
} else {
return new Date();
return LocalDate.now();
}
}


+ 2
- 2
uitest/src/main/java/com/vaadin/tests/themes/valo/Forms.java View File

@@ -15,7 +15,7 @@
*/
package com.vaadin.tests.themes.valo;

import java.util.Date;
import java.time.LocalDate;

import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
@@ -71,7 +71,7 @@ public class Forms extends VerticalLayout implements View {
form.addComponent(name);

AbstractDateField birthday = new TestDateField("Birthday");
birthday.setValue(new Date(80, 0, 31));
birthday.setValue(LocalDate.of(1980, 1, 31));
form.addComponent(birthday);

TextField username = new TextField("Username");

+ 3
- 22
uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldChangeResolutionTest.java View File

@@ -31,8 +31,7 @@ import com.vaadin.tests.tb3.MultiBrowserTest;
public class DateFieldChangeResolutionTest extends MultiBrowserTest {

private WebElement dateFieldButton, textField;
private WebElement resolutionSecond, resolutionMinute, resolutionHour,
resolutionDay, resolutionMonth, resolutionYear;
private WebElement resolutionDay, resolutionMonth, resolutionYear;

@Test
public void changeResolutionBetweenYearAndMonth() throws Exception {
@@ -43,15 +42,6 @@ public class DateFieldChangeResolutionTest extends MultiBrowserTest {
checkHeaderAndBody(Resolution.YEAR, true);
}

@Test
public void changeResolutionBetweenYearAndSecond() throws Exception {
initialize();
click(resolutionSecond);
checkHeaderAndBody(Resolution.SECOND, true);
click(resolutionYear);
checkHeaderAndBody(Resolution.YEAR, true);
}

@Test
public void changeResolutionToDayThenMonth() throws Exception {
initialize();
@@ -75,12 +65,8 @@ public class DateFieldChangeResolutionTest extends MultiBrowserTest {
textField.getAttribute("value").isEmpty());
// Change resolutions and check that the selected date is not lost and
// that the calendar has the correct resolution.
click(resolutionHour);
checkHeaderAndBody(Resolution.HOUR, false);
click(resolutionYear);
checkHeaderAndBody(Resolution.YEAR, false);
click(resolutionMinute);
checkHeaderAndBody(Resolution.MINUTE, false);
}

private void initialize() {
@@ -90,9 +76,6 @@ public class DateFieldChangeResolutionTest extends MultiBrowserTest {
.findElement(By.className("v-datefield-button"));
textField = dateField
.findElement(By.className("v-datefield-textfield"));
resolutionSecond = driver.findElement(By.id(BUTTON_BASE_ID + "second"));
resolutionMinute = driver.findElement(By.id(BUTTON_BASE_ID + "minute"));
resolutionHour = driver.findElement(By.id(BUTTON_BASE_ID + "hour"));
resolutionDay = driver.findElement(By.id(BUTTON_BASE_ID + "day"));
resolutionMonth = driver.findElement(By.id(BUTTON_BASE_ID + "month"));
resolutionYear = driver.findElement(By.id(BUTTON_BASE_ID + "year"));
@@ -105,14 +88,12 @@ public class DateFieldChangeResolutionTest extends MultiBrowserTest {
sleep(100);
// Open the popup calendar, perform checks and close the popup.
openPopupDateField();
if (resolution.getCalendarField() >= Resolution.MONTH
.getCalendarField()) {
if (resolution.compareTo(Resolution.MONTH) <= 0) {
checkMonthHeader();
} else {
checkYearHeader();
}
if (resolution.getCalendarField() >= Resolution.DAY
.getCalendarField()) {
if (resolution.compareTo(Resolution.DAY) <= 0) {
assertTrue(
"A calendar with the chosen resolution should have a body",
calendarHasBody());

+ 3
- 2
uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldDayResolutionOffsetTest.java View File

@@ -21,7 +21,7 @@ public class DateFieldDayResolutionOffsetTest extends MultiBrowserTest {
select2ndOfSeptember();

LabelElement dateValue = $(LabelElement.class).id("dateValue");
assertThat(dateValue.getText(), is("09/02/2014 00:00:00"));
assertThat(dateValue.getText(), is("09/02/2014"));
}

private void select2ndOfSeptember() {
@@ -35,7 +35,8 @@ public class DateFieldDayResolutionOffsetTest extends MultiBrowserTest {
}

private void openDatePicker() {
AbstractDateFieldElement dateField = $(AbstractDateFieldElement.class).first();
AbstractDateFieldElement dateField = $(AbstractDateFieldElement.class)
.first();

dateField.findElement(By.tagName("button")).click();
}

+ 5
- 5
uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldReadOnlyTest.java View File

@@ -17,15 +17,15 @@ public class DateFieldReadOnlyTest extends MultiBrowserTest {
throws IOException, InterruptedException {
openTestURL();

compareScreen("initial");
compareScreen("initial-date");
toggleReadOnly();

openPopup();
compareScreen("readwrite-popup");
compareScreen("readwrite-popup-date");

closePopup();
toggleReadOnly();
compareScreen("readonly");
compareScreen("readonly-date");
}

private void closePopup() {
@@ -36,8 +36,8 @@ public class DateFieldReadOnlyTest extends MultiBrowserTest {
private void openPopup() {
// waiting for openPopup() in TB4 beta1:
// http://dev.vaadin.com/ticket/13766
$(AbstractDateFieldElement.class).first().findElement(By.tagName("button"))
.click();
$(AbstractDateFieldElement.class).first()
.findElement(By.tagName("button")).click();
}

private void toggleReadOnly() {

+ 0
- 92
uitest/src/test/java/com/vaadin/tests/components/datefield/DateFieldValueChangeEventsTest.java View File

@@ -1,92 +0,0 @@
/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.components.datefield;

import org.junit.Assert;
import org.junit.Test;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.Select;

import com.vaadin.testbench.By;
import com.vaadin.testbench.customelements.AbstractDateFieldElement;
import com.vaadin.testbench.elements.LabelElement;
import com.vaadin.testbench.elements.NativeSelectElement;
import com.vaadin.tests.tb3.MultiBrowserTest;

public class DateFieldValueChangeEventsTest extends MultiBrowserTest {

@Test
public void tb2test() throws Exception {
openTestURL();
getPopUpButton().click();
getCalendarDayElement(2, 1).click();
Assert.assertEquals("1. Value changes: 1", getLogRow(0));
getPopUpButton().click();
new Select(getHoursSelect()).selectByValue("01");
new Select(getMinutesSelect()).selectByValue("02");
new Select(getSecondsSelect()).selectByValue("03");
new Actions(driver).sendKeys(getSecondsSelect(), Keys.ENTER).perform();
$(LabelElement.class).first().click();
Assert.assertEquals("2. Value changes: 2", getLogRow(0));
getResolutionSelect().selectByText("Month");
getPopUpButton().click();
getNextMonthButton().click();
getNextYearButton().click();
getNextMonthButton().click();
getNextMonthButton().sendKeys(Keys.ENTER);
Assert.assertEquals("3. Value changes: 3", getLogRow(0));
}

public WebElement getPopUpButton() {
AbstractDateFieldElement datefield = $(AbstractDateFieldElement.class).first();
return datefield.findElement((By.className("v-datefield-button")));
}

public WebElement getCalendarDayElement(int row, int col) {
return findElement(By
.xpath("//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[2]/td/table/tbody/tr["
+ (row + 2) + "]/td[" + (col + 2) + "]/span"));
}

public WebElement getHoursSelect() {
return findElement(By.xpath(
"//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[3]/td/div/select"));
}

public WebElement getMinutesSelect() {
return findElement(By.xpath(
"//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[3]/td/div/select[2]"));
}

public WebElement getSecondsSelect() {
return findElement(By.xpath(
"//table[@id='PID_VAADIN_POPUPCAL']/tbody/tr[3]/td/div/select[3]"));
}

public NativeSelectElement getResolutionSelect() {
return $(NativeSelectElement.class).first();
}

public WebElement getNextMonthButton() {
return findElement((By.className("v-button-nextmonth")));
}

public WebElement getNextYearButton() {
return findElement((By.className("v-button-nextyear")));
}
}

+ 0
- 52
uitest/src/test/java/com/vaadin/tests/components/datefield/DateRangeWithSqlDateTest.java View File

@@ -1,52 +0,0 @@
/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.components.datefield;

import static org.junit.Assert.assertEquals;

import java.util.List;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

import com.vaadin.tests.tb3.MultiBrowserTest;

public class DateRangeWithSqlDateTest extends MultiBrowserTest {

@Test
public void testDateRange() {
openTestURL();

// Get all cells of the inline datefield.
List<WebElement> cells = driver.findElements(
By.className("v-inline-datefield-calendarpanel-day"));

// Verify the range is rendered correctly.
assertCell(cells.get(0), "30", true);
assertCell(cells.get(1), "1", false);
assertCell(cells.get(2), "2", false);
assertCell(cells.get(3), "3", true);
}

private void assertCell(WebElement cell, String text,
boolean outsideRange) {
assertEquals(text, cell.getText());
assertEquals(outsideRange,
cell.getAttribute("class").contains("outside-range"));
}

}

+ 0
- 84
uitest/src/test/java/com/vaadin/tests/components/datefield/LocaleChangeTest.java View File

@@ -1,84 +0,0 @@
/*
* Copyright 2000-2016 Vaadin Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.vaadin.tests.components.datefield;

import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.openqa.selenium.By;

import com.vaadin.testbench.parallel.BrowserUtil;
import com.vaadin.tests.tb3.MultiBrowserTest;

public class LocaleChangeTest extends MultiBrowserTest {

@Test
public void testLocaleChange() {
openTestURL();

// Check the initial value and that popup can be opened.
assertEquals("22/05/14 20:00:00", getDateValue());
toggleDatePopup();
assertPopupOpen(true);

// Close the popup and change the locale.
toggleDatePopupWorkaroundClosePopupIE();
assertPopupOpen(false);
driver.findElement(By.className("v-button")).click(); // Locale change.

// Check that the value has changed and the popup can still be opened
// without problems.
assertEquals("5/22/14 08:00:00 PM", getDateValue());
toggleDatePopup();
assertPopupOpen(true);
}

private void assertPopupOpen(boolean open) {
assertEquals("Date popup was not " + (open ? "open" : "closed") + ".",
(open ? 1 : 0),
driver.findElements(By.className("v-datefield-popup")).size());
}

private void toggleDatePopup() {
driver.findElement(By.className("v-datefield-button")).click();
}

/*
* Work around bug reported in ticket #14086. Delete this method once fixed
* andd use toggleDatePopup() instead.
*/
private void toggleDatePopupWorkaroundClosePopupIE() {
if (!BrowserUtil.isIE(getDesiredCapabilities())) {
driver.findElement(By.className("v-datefield-button")).click();
} else {
boolean popupOpen = driver
.findElements(By.className("v-datefield-popup"))
.size() == 1;
if (popupOpen) {
driver.findElement(
By.className("v-datefield-calendarpanel-day-selected"))
.click();
} else {
driver.findElement(By.className("v-datefield-button")).click();
}
}
}

private String getDateValue() {
return driver.findElement(By.className("v-datefield-textfield"))
.getAttribute("value");
}
}

+ 0
- 16
uitest/src/test/java/com/vaadin/tests/components/datefield/PopupClosingWithEscTest.java View File

@@ -21,27 +21,11 @@ import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;

import com.vaadin.tests.tb3.MultiBrowserTest;

public class PopupClosingWithEscTest extends MultiBrowserTest {

@Test
public void testPopupClosingFromTimeSelect() {
openTestURL();

openPopup("minute");
assertTrue(isPopupVisible());

// Send ESC to the select element to simulate user being
// focused on the select while hitting the ESC key.
WebElement select = driver.findElement(
By.cssSelector(".v-datefield-popup select:first-child"));
select.sendKeys(Keys.ESCAPE);
assertFalse(isPopupVisible());
}

@Test
public void testPopupClosingDayResolution() {
testPopupClosing("day");

Loading…
Cancel
Save