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