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;
/**
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();
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;
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;
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
*/
private VEventButton nextMonth;
- private VTime time;
-
private FlexTable days = new FlexTable();
private Resolution resolution = Resolution.YEAR;
private FocusChangeListener focusChangeListener;
- private TimeChangeListener timeChangeListener;
-
private boolean hasFocus = false;
private VDateField parent;
*/
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);
}
}
}
+ private boolean isDay(Resolution resolution) {
+ return Resolution.DAY.equals(resolution);
+ }
+
/**
* Sets the selection highlight to a given day in the current view
*
public void setResolution(Resolution resolution) {
this.resolution = resolution;
- if (time != null) {
- time.removeFromParent();
- time = null;
- }
}
private boolean isReadonly() {
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 {
}
}
- /**
- * 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.
*/
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;
}
* 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
// 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 {
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) {
}
}
- /**
- * 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(" "));
- 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.
*/
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
*
}
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;
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
/** 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";
}
}
/**
- * 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() {
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;
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()) {
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;
/**
// 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));
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);
- }
- }
- }
}
}
}
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) {
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", "");
}
*/
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;
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;
&& 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;
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);
}
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;
}
if (getWidget().getCurrentResolution()
- .getCalendarField() <= Resolution.MONTH.getCalendarField()) {
+ .compareTo(Resolution.MONTH) >= 0) {
getWidget().calendar
.setFocusChangeListener(new FocusChangeListener() {
@Override
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");
}
@Override
- public PopupDateFieldState getState() {
- return (PopupDateFieldState) super.getState();
+ public DateFieldState getState() {
+ return (DateFieldState) super.getState();
}
@Override
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;
}
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
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
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 {
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
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
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,
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 {
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)
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)
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 {
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;
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;
/**
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 {
@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>() {
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;
/**
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;
/**
--- /dev/null
+/*
+ * 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;
+ }
+}
});
----
-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
[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);
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;
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
*/
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";
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");
* @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);
}
}
if (getDateFormat() != null) {
- target.addAttribute("format", dateFormat);
+ target.addAttribute("format", getDateFormat());
}
if (!isLenient()) {
* 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
.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);
}
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");
// 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()) {
* @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;
}
/**
* - 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);
}
/**
}
@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
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
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,
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);
}
}
* 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());
}
}
@Override
- protected void doSetValue(Date value) {
+ protected void doSetValue(LocalDate value) {
// Also set the internal dateString
if (value != null) {
dateString = value.toString();
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();
}
}
*/
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.
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.
}
@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.
*/
*/
package com.vaadin.ui;
-import java.util.Date;
+import java.time.LocalDate;
/**
* A date entry component, which displays the actual date selector inline.
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.
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;
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;
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());
--- /dev/null
+/*
+ * 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);
+ }
+
+}
*/
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;
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;
}
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;
}
}
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);
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());
@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(
*/
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;
* @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;
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
@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);
}
- @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
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);
}
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
}
@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
}
@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());
}
}
--- /dev/null
+/*
+ * 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.shared.ui.datefield;
+
+import com.vaadin.shared.annotations.NoLayout;
+
+public class DateFieldState extends TextualDateFieldState {
+ public static final String DESCRIPTION_FOR_ASSISTIVE_DEVICES = "Arrow down key opens calendar element for choosing the date";
+
+ {
+ primaryStyleName = "v-datefield";
+ }
+
+ public boolean textFieldEnabled = true;
+ @NoLayout
+ public String descriptionForAssistiveDevices = DESCRIPTION_FOR_ASSISTIVE_DEVICES;
+}
+++ /dev/null
-/*
- * 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.shared.ui.datefield;
-
-import com.vaadin.shared.annotations.NoLayout;
-
-public class PopupDateFieldState extends TextualDateFieldState {
- public static final String DESCRIPTION_FOR_ASSISTIVE_DEVICES = "Arrow down key opens calendar element for choosing the date";
-
- {
- primaryStyleName = "v-datefield";
- }
-
- public boolean textFieldEnabled = true;
- @NoLayout
- public String descriptionForAssistiveDevices = DESCRIPTION_FOR_ASSISTIVE_DEVICES;
-}
* @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,
}
return resolutions;
}
+
}
package com.vaadin.tests;
+import java.time.LocalDate;
import java.util.Random;
import com.vaadin.server.ExternalResource;
// 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;
}
*/
package com.vaadin.tests.components;
-import java.util.Date;
+import java.time.LocalDate;
import com.vaadin.ui.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);
}
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;
// 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() + "'";
}
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;
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;
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;
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;
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;
import com.vaadin.ui.AbstractDateField;
public class AbstractDateFieldTest<T extends AbstractDateField>
- extends AbstractFieldTest<T, Date> {
+ extends AbstractFieldTest<T, LocalDate> {
@SuppressWarnings("unchecked")
@Override
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);
}
};
}
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);
}
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);
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;
@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);
*/
package com.vaadin.tests.components.datefield;
-import java.util.Calendar;
+import java.time.LocalDate;
import java.util.Locale;
import com.vaadin.server.VaadinRequest;
@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);
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();
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;
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();
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)");
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 {
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;
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);
.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;
}
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;
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")
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);
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
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;
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;
}
private String pattern = "dd/MM/yy";
- private SimpleDateFormat format = new SimpleDateFormat(pattern);
+ private DateTimeFormatter format = DateTimeFormatter.ofPattern(pattern);
@Override
protected void setup(VaadinRequest request) {
* @param value
* @return
*/
- protected String format(Date value) {
+ protected String format(LocalDate value) {
if (value != null) {
return format.format(value);
} else {
*/
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(
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;
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() {
+++ /dev/null
-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;
- }
-
-}
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;
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;
}
}
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;
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;
package com.vaadin.tests.components.datefield;
+import java.time.LocalDate;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
}
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);
}
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();
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;
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");
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);
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));
}
}
+++ /dev/null
-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);
- }
-
-}
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;
public class DateFieldUnparsableDate extends TestBase {
public class MyDateField extends AbstractDateField {
- Date oldDate = null;
+ LocalDate oldDate = null;
public MyDateField(String caption) {
super(caption);
}
@Override
- protected Result<Date> handleUnparsableDateString(String dateString)
- throws Converter.ConversionException {
+ protected Result<LocalDate> handleUnparsableDateString(
+ String dateString) throws Converter.ConversionException {
return Result.ok(oldDate);
}
}
}
@Override
- protected Result<Date> handleUnparsableDateString(String dateString)
- throws Converter.ConversionException {
+ protected Result<LocalDate> handleUnparsableDateString(
+ String dateString) throws Converter.ConversionException {
return Result.ok(null);
}
}
}
@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!");
}
}
}
@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!");
}
+++ /dev/null
-/*
- * 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;
- }
-
-}
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;
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());
});
}
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;
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);
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() {
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;
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"));
+++ /dev/null
-/*
- * 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;
- }
-
-}
*/
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;
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);
}
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;
/**
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);
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));
}
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;
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);
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() {
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;
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;
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>
package com.vaadin.tests.components.datefield;
-import java.util.Date;
+import java.time.LocalDate;
import java.util.Locale;
import com.vaadin.data.HasValue.ValueChange;
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;
@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"));
}
@Override
- public void accept(ValueChange<Date> event) {
+ public void accept(ValueChange<LocalDate> event) {
getMainWindow().showNotification("New value" + event.getValue());
}
+++ /dev/null
-/*
- * 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;
- }
-}
\ No newline at end of file
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 {
@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()));
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()));
@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);
VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
layout.setSpacing(true);
- layout.addComponents(df0, df1, df2, df3);
+ layout.addComponents(df1, df2, df3);
setContent(layout);
}
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];
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
private DateField makeDateField() {
DateField pdf = new DateField();
pdf.setResolution(Resolution.DAY);
- pdf.setValue(date.getTime());
+ pdf.setValue(LocalDate.of(2011, 1, 1));
return pdf;
}
}
+++ /dev/null
-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;
- }
-
-}
+++ /dev/null
-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;
- }
-
-}
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 {
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);
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;
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);
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;
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);
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;
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);
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");
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);
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;
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;
*/
package com.vaadin.tests.themes.valo;
-import java.util.Date;
+import java.time.LocalDate;
import java.util.Locale;
import com.vaadin.navigator.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);
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);
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");
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();
}
}
*/
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;
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");
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 {
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();
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() {
.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"));
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());
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() {
}
private void openDatePicker() {
- AbstractDateFieldElement dateField = $(AbstractDateFieldElement.class).first();
+ AbstractDateFieldElement dateField = $(AbstractDateFieldElement.class)
+ .first();
dateField.findElement(By.tagName("button")).click();
}
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() {
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() {
+++ /dev/null
-/*
- * 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")));
- }
-}
+++ /dev/null
-/*
- * 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"));
- }
-
-}
+++ /dev/null
-/*
- * 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");
- }
-}
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");