Is it correct for RelativeDateItem to return a String and not a Date on the call to .getValue in the ShowValueHandler()?
If I make the same call to getValue in the ChangedHandler, the value is interpreted as a Date and not a String (when the user uses the Calendar Date Control or changes the text in the text entry field).
If I make the same call to getValue in the ChangedHandler, the value is interpreted as a Date and not a String (when the user uses the Calendar Date Control or changes the text in the text entry field).
Code:
package com.corp.smartgwt.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.i18n.client.DateTimeFormat; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.util.DateUtil; import com.smartgwt.client.widgets.form.fields.RadioGroupItem; import com.smartgwt.client.widgets.form.fields.RelativeDateItem; import com.smartgwt.client.util.DateDisplayFormatter; import com.smartgwt.client.util.DateParser; import com.smartgwt.client.util.SC; import com.smartgwt.client.data.RelativeDate; import com.smartgwt.client.types.Overflow; import com.smartgwt.client.types.TimeUnit; import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; import com.smartgwt.client.widgets.form.fields.events.ShowValueEvent; import com.smartgwt.client.widgets.form.fields.events.ShowValueHandler; import com.smartgwt.client.widgets.form.validator.DateRangeValidator; import java.util.Date; import java.util.LinkedHashMap; public class SmartGwt implements EntryPoint { private RelativeDateItem theStartDateItem; private RelativeDateItem theEndDateItem; private static String DATE_FORMAT = "dd.MMM.yyyy HH:mm z"; private static String RADIOGROUP_NAME = "radiogroup1"; private RadioGroupItem theFilterRadioGroup; private static final String RB1_LABEL_TEXT = "Disable"; private static final String RB2_LABEL_TEXT = "Enable 1"; private static final String RB3_LABEL_TEXT = "Enable 2"; private final static LinkedHashMap<String, String> theDatePresets = new LinkedHashMap<String, String>(); static { theDatePresets.put("$now", "Now"); theDatePresets.put("$today", "Today"); theDatePresets.put("$yesterday", "Yesterday"); theDatePresets.put("$tomorrow", "Tomorrow"); theDatePresets.put("-1w", "Current day of last week"); theDatePresets.put("+1w", "Current day of next week"); theDatePresets.put("+1m", "Current day of next month"); theDatePresets.put("-1m", "Current day of last month"); } @Override public void onModuleLoad() { HLayout layout = new HLayout(); DynamicForm form = new DynamicForm(); form.setFields(getFilterRadioGroup(), getStartDateItem(), getEndDateItem()); layout.addMember(form); layout.draw(); } /** * This method returns a RadioGroupItem consisting of None, * Image Date, and Load Date. It uses lazy initialization. * @return RadioGroupItem */ private RadioGroupItem getFilterRadioGroup() { if (theFilterRadioGroup == null) { theFilterRadioGroup = new RadioGroupItem(RADIOGROUP_NAME); theFilterRadioGroup.setValueMap(RB1_LABEL_TEXT, RB2_LABEL_TEXT, RB3_LABEL_TEXT); theFilterRadioGroup.setShowTitle(false); theFilterRadioGroup.setDefaultValue(RB1_LABEL_TEXT); theFilterRadioGroup.setGlobalTabIndex(21); getStartDateItem().setDisabled(true); getEndDateItem().setDisabled(true); theFilterRadioGroup.addChangedHandler(new ChangedHandler() { /* * This method should fire anytime a user changes the radio button selection. */ @Override public void onChanged(ChangedEvent event) { if (theFilterRadioGroup.getValueAsString().equals(RB1_LABEL_TEXT)) { getStartDateItem().setDisabled(true); getEndDateItem().setDisabled(true); } else if (theFilterRadioGroup.getValueAsString().equals(RB2_LABEL_TEXT)) { getStartDateItem().enable(); getEndDateItem().enable(); getStartDateItem().setValue("$now"); } else { getStartDateItem().enable(); getEndDateItem().enable(); } } }); } return theFilterRadioGroup; } private void changeDateFormat() { DateUtil.setDefaultDisplayTimezone("-04:00"); DateUtil.setShortDatetimeDisplayFormatter(new DateDisplayFormatter() { public String format(Date date) { if(date == null) { return null; } else { final DateTimeFormat dateFormatter = DateTimeFormat.getFormat(DATE_FORMAT); return dateFormatter.format(date); } } }); // It is a requirement that we implement a custom date parser or the onChanged event // will not fire. DateUtil.setDateParser(new DateParser() { public Date parse(String dateString) { final DateTimeFormat format = DateTimeFormat.getFormat(DATE_FORMAT); return format.parse(dateString); } }); } private RelativeDateItem getStartDateItem() { if (theStartDateItem == null) { changeDateFormat(); theStartDateItem = new RelativeDateItem("start_date"); theStartDateItem.setTitle("Start"); theStartDateItem.setShowFutureOptions(false); theStartDateItem.setShowPastOptions(true); // By setting this to essentially a blank LinkedHashMap, it will clear out the preset // options we do not want. // theStartDateItem.setPresetOptions(new LinkedHashMap()); theStartDateItem.setTimeUnitOptions(getTimeOptions()); theStartDateItem.setDefaultQuantity(1); theStartDateItem.setValue(new RelativeDate("-1d")); theStartDateItem.setPresetOptions(theDatePresets); theStartDateItem.setOverflow(Overflow.VISIBLE); theStartDateItem.addShowValueHandler(new ShowValueHandler() { public void onShowValue(ShowValueEvent event) { String value = (String) event.getDisplayValue(); SC.logWarn(value); Date aValue = (Date) theStartDateItem.getValue(); SC.logWarn(aValue.toString()); } }); // theStartDateItem.addChangedHandler(new ChangedHandler() // { // @Override // public void onChanged(ChangedEvent event) // { // // Test if this is a relative date selection so we can save it that way // RelativeDate relDate = theStartDateItem.getRelativeDate(); // // Date startDate = (Date)theStartDateItem.getValue(); // Date endDate = (Date)getEndDateItem().getValue(); // // // // Per the JavaDoc, compareTo returns less than 0 if the date is before the compared // // date. So in this case, if the endDate is before the startDate, then we show // // the error. No changes will be made to the model until the error is cleared. // if (endDate.compareTo(startDate) < 0) // { // getEndDateItem().getForm() // .setFieldErrors("end_date", "invalid date", true); // } // else // { // getEndDateItem().getForm() // .clearFieldErrors("end_date", true); // // } // } // }); } return theStartDateItem; } /** * This will return an array of SmartGWT TimeUnit options that we want to add to our drop-down * for the Start and End date RelativeDateItem's * * @return array of TimeUnit's */ private TimeUnit[] getTimeOptions() { TimeUnit[] units = new TimeUnit[5]; units[0] = TimeUnit.HOUR; units[1] = TimeUnit.DAY; units[2] = TimeUnit.WEEK; units[3] = TimeUnit.MONTH; units[4] = TimeUnit.YEAR; return units; } /** * This will initialize and construct the end RelativeDateItem * @return Ending RelativeDateItem */ private RelativeDateItem getEndDateItem() { if (theEndDateItem == null) { changeDateFormat(); theEndDateItem = new RelativeDateItem("end_date"); theEndDateItem.setTitle("End:"); // By setting this to essentially a blank LinkedHashMap, it will clear out the preset // options we do not want. // theEndDateItem.setPresetOptions(new LinkedHashMap()); theEndDateItem.setOverflow(Overflow.VISIBLE); theEndDateItem.setShowFutureOptions(false); theEndDateItem.setShowPastOptions(true); theEndDateItem.setTimeUnitOptions(getTimeOptions()); theEndDateItem.setDefaultQuantity(1); theEndDateItem.setPresetOptions(theDatePresets); // theEndDateItem.addChangedHandler(new ChangedHandler() // { // @Override // public void onChanged(ChangedEvent event) // { // // Test if this is a relative date selection so we can save it that way // RelativeDate relDate = theEndDateItem.getRelativeDate(); // // Date startDate = (Date)getStartDateItem().getValue(); // Date endDate = (Date)theEndDateItem.getValue(); // // // Per the JavaDoc, compareTo returns less than 0 if the date is before the compared // // date. So in this case, if the endDate is before the startDate, then we show // // the error. // if (endDate.compareTo(startDate) < 0) // { // theEndDateItem.getForm() // .setFieldErrors("end_date", "invalid date", true); // } // else // { // // Clear any errors on the field and save the changes to the model // theEndDateItem.getForm() // .clearFieldErrors("end_date", true); // // } // } // }); } return theEndDateItem; } }
Comment