Author: ivaynberg Date: Sat Mar 26 05:50:56 2011 New Revision: 1085651 URL: http://svn.apache.org/viewvc?rev=1085651&view=rev Log: 3510
Modified: wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.html wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.java wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/TimeField.java wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatePickerTest.java wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage2.html wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage2.java Modified: wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.html URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.html?rev=1085651&r1=1085650&r2=1085651&view=diff ============================================================================== --- wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.html (original) +++ wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.html Sat Mar 26 05:50:56 2011 @@ -18,7 +18,8 @@ <wicket:panel> <span style="white-space: nowrap;"> <input type="text" wicket:id="date" size="12" /> - <input type="text" wicket:id="hours" size="2" /> : + <input type="text" wicket:id="hours" size="2" /> + <span wicket:id="hoursSeparator"> :</span> <input type="text" wicket:id="minutes" size="2" /> <select wicket:id="amOrPmChoice"></select> </span> Modified: wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.java?rev=1085651&r1=1085650&r2=1085651&view=diff ============================================================================== --- wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.java (original) +++ wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/DateTimeField.java Sat Mar 26 05:50:56 2011 @@ -26,6 +26,7 @@ import java.util.TimeZone; import org.apache.wicket.Session; import org.apache.wicket.datetime.markup.html.form.DateTextField; import org.apache.wicket.markup.html.IHeaderResponse; +import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.FormComponentPanel; import org.apache.wicket.markup.html.form.TextField; @@ -173,6 +174,16 @@ public class DateTimeField extends FormC // Create and add the "AM/PM" Listbox add(amOrPmChoice = new DropDownChoice<AM_PM>(AM_OR_PM_CHOICE, new PropertyModel<AM_PM>( this, AM_OR_PM), Arrays.asList(AM_PM.values()))); + + add(new WebMarkupContainer("hoursSeparator"){ + private static final long serialVersionUID = 1L; + + @Override + public boolean isVisible() + { + return minutesField.determineVisibility(); + } + }); } /** @@ -402,15 +413,15 @@ public class DateTimeField extends FormC } else { - MutableDateTime mDate = new MutableDateTime(modelObject); - // convert date to the client's time zone if we have that info TimeZone zone = getClientTimeZone(); if (zone != null) { - mDate.setZone(DateTimeZone.forTimeZone(zone)); + modelObject = changeTimeZone(modelObject, zone); } + MutableDateTime mDate = new MutableDateTime(modelObject); + date = mDate.toDate(); if (use12HourFormat) @@ -431,6 +442,32 @@ public class DateTimeField extends FormC } /** + * Change a date in another timezone + * + * @param date + * The input date. + * @param zone + * The target timezone. + * @return A new converted date. + */ + public static Date changeTimeZone(Date date, TimeZone zone) + { + Calendar first = Calendar.getInstance(zone); + first.setTimeInMillis(date.getTime()); + + Calendar output = Calendar.getInstance(); + output.set(Calendar.YEAR, first.get(Calendar.YEAR)); + output.set(Calendar.MONTH, first.get(Calendar.MONTH)); + output.set(Calendar.DAY_OF_MONTH, first.get(Calendar.DAY_OF_MONTH)); + output.set(Calendar.HOUR_OF_DAY, first.get(Calendar.HOUR_OF_DAY)); + output.set(Calendar.MINUTE, first.get(Calendar.MINUTE)); + output.set(Calendar.SECOND, first.get(Calendar.SECOND)); + output.set(Calendar.MILLISECOND, first.get(Calendar.MILLISECOND)); + + return output.getTime(); + } + + /** * Checks whether the current {@link Locale} uses the 12h or 24h time format. This method can be * overridden to e.g. always use 24h format. * Modified: wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/TimeField.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/TimeField.java?rev=1085651&r1=1085650&r2=1085651&view=diff ============================================================================== --- wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/TimeField.java (original) +++ wicket/trunk/wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/TimeField.java Sat Mar 26 05:50:56 2011 @@ -60,7 +60,8 @@ public class TimeField extends DateTimeF @Override protected void convertInput() { - getDateTextField().setConvertedInput(new Date()); + Date modelObject = (Date)getDefaultModelObject(); + getDateTextField().setConvertedInput(modelObject != null ? modelObject : new Date()); super.convertInput(); } Modified: wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatePickerTest.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatePickerTest.java?rev=1085651&r1=1085650&r2=1085651&view=diff ============================================================================== --- wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatePickerTest.java (original) +++ wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatePickerTest.java Sat Mar 26 05:50:56 2011 @@ -72,11 +72,13 @@ public class DatePickerTest extends Wick } /** + * Tests conversion of input for DateTimeField and DateField. + * * @throws Exception */ - public void test2() throws Exception + public void testDateFieldInput() throws Exception { - log.debug("=========== test2() ================="); + log.debug("=========== testDateFieldInput() ================="); Class<? extends Page> pageClass = DatesPage2.class; Date date = new GregorianCalendar(2010, 10, 6, 0, 0).getTime(); tester.getSession().setLocale(Locale.GERMAN); @@ -98,12 +100,14 @@ public class DatePickerTest extends Wick } /** - * + * Tests conversion of input for DateTimeField and DateField when the client and server are in + * different time zones. + * * @throws Exception */ - public void test3() throws Exception + public void testDateFieldInputTimezone() throws Exception { - log.debug("=========== test3() ================="); + log.debug("=========== testDateFieldInputTimezone() ================="); TimeZone tzClient = TimeZone.getTimeZone("America/Los_Angeles"); TimeZone tzServer = TimeZone.getTimeZone("Europe/Berlin"); @@ -175,9 +179,9 @@ public class DatePickerTest extends Wick } /** - * Test date conversion with the server having a different current date than the client time - * zone. - * + * Test date conversion with the server's time zone having a different current date than the + * client time zone. + * * @throws ParseException */ public void testDifferentDateTimeZoneConversion() throws ParseException @@ -185,12 +189,11 @@ public class DatePickerTest extends Wick log.debug("=========== testDifferentDateTimeZoneConversion() ================="); TimeZone origJvmDef = TimeZone.getDefault(); DateTimeZone origJodaDef = DateTimeZone.getDefault(); - TimeZone tzClient = TimeZone.getTimeZone("Australia/South"); - TimeZone tzServer = TimeZone.getTimeZone("Europe/Berlin"); + TimeZone tzClient = TimeZone.getTimeZone("GMT+14"); + TimeZone tzServer = TimeZone.getTimeZone("GMT-12"); TimeZone.setDefault(tzServer); DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); - // Locale.setDefault(Locale.GERMAN); Class<? extends Page> pageClass = DatesPage2.class; MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); @@ -222,16 +225,112 @@ public class DatePickerTest extends Wick DateTimeZone.setDefault(origJodaDef); } + /** + * Test date conversion with the server's time zone having a different current date than the + * client time zone using a Locale with am/pm style time. + */ + public void testDifferentDateTimeZoneConversionAMPM() + { + TimeZone origJvmDef = TimeZone.getDefault(); + DateTimeZone origJodaDef = DateTimeZone.getDefault(); + TimeZone tzClient = TimeZone.getTimeZone("GMT+14"); + TimeZone tzServer = TimeZone.getTimeZone("GMT-12"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + + Class<? extends Page> pageClass = DatesPage2.class; + MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); + dt.setDateTime(2010, 11, 6, 22, 0, 0, 0); + Date date = new Date(dt.getMillis()); + + WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); + clientInfo.getProperties().setTimeZone(tzClient); + + tester.getSession().setLocale(Locale.US); + tester.startPage(pageClass); + tester.assertRenderedPage(pageClass); + FormTester formTester = tester.newFormTester("form"); + formTester.setValue("dateTimeField:date", "11/06/2010"); + formTester.setValue("dateTimeField:hours", "10"); + formTester.setValue("dateTimeField:minutes", "00"); + formTester.setValue("dateTimeField:amOrPmChoice", "1"); + formTester.submit(); + + DatesPage2 page = (DatesPage2)tester.getLastRenderedPage(); + + log.debug("orig: " + date.getTime() + "; dateTime: " + page.dateTime.getTime()); + log.debug("orig: " + date + "; dateTime: " + page.dateTime); + assertEquals(0, date.compareTo(page.dateTime)); + + TimeZone.setDefault(origJvmDef); + DateTimeZone.setDefault(origJodaDef); + } + + /** + * Test time conversion for TimeField. The day, month, year of the TimeField model should not be + * changed. The hours and minutes should be converted to the server's time zone based on the + * day, month and year of the Date model. + */ + public void testTimeFieldDST() + { + TimeZone origJvmDef = TimeZone.getDefault(); + DateTimeZone origJodaDef = DateTimeZone.getDefault(); + TimeZone tzClient = TimeZone.getTimeZone("Canada/Eastern"); + TimeZone tzServer = TimeZone.getTimeZone("GMT"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); + clientInfo.getProperties().setTimeZone(tzClient); + tester.getSession().setLocale(Locale.GERMAN); + + // Test with standard time (in client time zone) + MutableDateTime dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); + dt.setDateTime(2010, 1, 15, 0, 0, 0, 0); + Date date = new Date(dt.getMillis()); + DatesPage2 testPage = new DatesPage2(); + testPage.time = date; + tester.startPage(testPage); + FormTester formTester = tester.newFormTester("form"); + formTester.setValue("timeField:hours", "00"); + formTester.setValue("timeField:minutes", "00"); + formTester.submit(); + assertEquals(date, testPage.time); + + // Test with daylight savings time (in client time zone) + dt = new MutableDateTime(DateTimeZone.forTimeZone(tzClient)); + dt.setDateTime(2010, 7, 15, 0, 0, 0, 0); + date = new Date(dt.getMillis()); + testPage = new DatesPage2(); + testPage.time = date; + tester.startPage(testPage); + formTester = tester.newFormTester("form"); + formTester.setValue("timeField:hours", "00"); + formTester.setValue("timeField:minutes", "00"); + formTester.submit(); + assertEquals(date, testPage.time); + + TimeZone.setDefault(origJvmDef); + DateTimeZone.setDefault(origJodaDef); + } + + /** + * Test StyleDateConverter with the server's time zone having a different current date than the + * client time zone. + * + * @throws ParseException + */ public void testStyleDateConverterTimeZoneDifference() throws ParseException { TimeZone origJvmDef = TimeZone.getDefault(); DateTimeZone origJodaDef = DateTimeZone.getDefault(); - TimeZone tzClient = TimeZone.getTimeZone("Etc/GMT-14"); - TimeZone tzServer = TimeZone.getTimeZone("Etc/GMT+12"); + + TimeZone tzClient = TimeZone.getTimeZone("GMT+14"); + TimeZone tzServer = TimeZone.getTimeZone("GMT-12"); TimeZone.setDefault(tzServer); DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); - Locale.setDefault(Locale.GERMANY); WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); clientInfo.getProperties().setTimeZone(tzClient); @@ -242,19 +341,83 @@ public class DatePickerTest extends Wick cal.set(2011, 10, 5, 0, 0, 0); cal.set(Calendar.MILLISECOND, 0); - Locale.setDefault(Locale.US); - Date dateRef = cal.getTime(); Date date = converter.convertToObject("05.11.2011", Locale.GERMANY); log.debug("ref: " + dateRef.getTime() + "; converted: " + date.getTime()); log.debug("ref: " + dateRef + "; date: " + date); - assertEquals(0, dateRef.compareTo(date)); + assertEquals(dateRef, date); TimeZone.setDefault(origJvmDef); DateTimeZone.setDefault(origJodaDef); } + /** - * + * Validates the "value" tags of the <input> fields for DateTimeField, DateField and + * TimeField when they are given Date models containing Date instances. + */ + public void testDateFieldsWithDateModels() + { + TimeZone origJvmDef = TimeZone.getDefault(); + DateTimeZone origJodaDef = DateTimeZone.getDefault(); + + TimeZone tzClient = TimeZone.getTimeZone("GMT-12"); + TimeZone tzServer = TimeZone.getTimeZone("GMT+14"); + + TimeZone.setDefault(tzServer); + DateTimeZone.setDefault(DateTimeZone.forTimeZone(tzServer)); + WebClientInfo clientInfo = (WebClientInfo)tester.getSession().getClientInfo(); + clientInfo.getProperties().setTimeZone(tzClient); + + Calendar cal = Calendar.getInstance(tzServer); + cal.set(2011, 5, 15, 10, 30, 0); + cal.set(Calendar.MILLISECOND, 0); + Date date = cal.getTime(); + + DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMAN); + format.setTimeZone(tzClient); + String dateRefString = format.format(date); + cal.setTimeZone(tzClient); + String hoursRefString = Integer.toString(cal.get(Calendar.HOUR_OF_DAY)); + String minutesRefString = Integer.toString(cal.get(Calendar.MINUTE)); + + DatesPage2 testPage = new DatesPage2(); + testPage.dateTime = date; + testPage.date = date; + testPage.time = date; + tester.getSession().setLocale(Locale.GERMAN); + tester.startPage(testPage); + + String dateTimeFieldDateValue = tester.getTagByWicketId("dateTimeField") + .getChild("wicket:id", "date") + .getAttribute("value"); + assertEquals(dateRefString, dateTimeFieldDateValue); + String dateTimeFieldHoursValue = tester.getTagByWicketId("dateTimeField") + .getChild("wicket:id", "hours") + .getAttribute("value"); + assertEquals(hoursRefString, dateTimeFieldHoursValue); + String dateTimeFieldMinutesValue = tester.getTagByWicketId("dateTimeField") + .getChild("wicket:id", "minutes") + .getAttribute("value"); + assertEquals(minutesRefString, dateTimeFieldMinutesValue); + String dateFieldValue = tester.getTagByWicketId("dateField") + .getChild("wicket:id", "date") + .getAttribute("value"); + assertEquals(dateRefString, dateFieldValue); + String timeFieldHoursValue = tester.getTagByWicketId("timeField") + .getChild("wicket:id", "hours") + .getAttribute("value"); + assertEquals(hoursRefString, timeFieldHoursValue); + String timeFieldMinutesValue = tester.getTagByWicketId("timeField") + .getChild("wicket:id", "minutes") + .getAttribute("value"); + assertEquals(minutesRefString, timeFieldMinutesValue); + + TimeZone.setDefault(origJvmDef); + DateTimeZone.setDefault(origJodaDef); + } + + /** + * * @throws ParseException */ public void testDates1() throws ParseException @@ -285,7 +448,7 @@ public class DatePickerTest extends Wick } /** - * + * * @throws ParseException */ public void testDates2() throws ParseException @@ -316,7 +479,7 @@ public class DatePickerTest extends Wick } /** - * + * * @throws ParseException */ public void testDates3() throws ParseException @@ -348,7 +511,7 @@ public class DatePickerTest extends Wick /** * Simulate what DateTimeField does - * + * * @param dateStr * @param hours * @param minutes @@ -427,7 +590,7 @@ public class DatePickerTest extends Wick /** * Simulate what DateTimeField does - * + * * @param dateStr * @param hours * @param minutes Modified: wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage2.html URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage2.html?rev=1085651&r1=1085650&r2=1085651&view=diff ============================================================================== --- wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage2.html (original) +++ wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage2.html Sat Mar 26 05:50:56 2011 @@ -2,8 +2,9 @@ <html> <body> <form wicket:id="form"> - <input type="text" wicket:id="dateTimeField" /> - <input type="text" wicket:id="dateField" /> + <span wicket:id="dateTimeField">[dateTime field]</span> + <span wicket:id="dateField">[date field]</span> + <span wicket:id="timeField">[time field]</span> <input type="submit" value="submit" /> </form> </body> Modified: wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage2.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage2.java?rev=1085651&r1=1085650&r2=1085651&view=diff ============================================================================== --- wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage2.java (original) +++ wicket/trunk/wicket-datetime/src/test/java/org/apache/wicket/extensions/yui/calendar/DatesPage2.java Sat Mar 26 05:50:56 2011 @@ -27,12 +27,17 @@ import org.apache.wicket.model.PropertyM */ public class DatesPage2 extends WebPage { + private static final long serialVersionUID = 1L; + /** */ public Date dateTime; /** */ public Date date; + /** */ + public Date time; + /** * Constructor */ @@ -43,5 +48,6 @@ public class DatesPage2 extends WebPage form.add(new DateTimeField("dateTimeField", new PropertyModel<Date>(this, "dateTime"))); form.add(new DateField("dateField", new PropertyModel<Date>(this, "date"))); + form.add(new TimeField("timeField", new PropertyModel<Date>(this, "time"))); } } \ No newline at end of file