Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    RelativeDateItem Returns String in ShowValueHandler

    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).

    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;
      }
      
    }

    #2
    I can convert the displayed value to a String, assign it to a RelativeDate object and then call getValue on RelativeDate and cast it into a Date to get the Date, but I was wondering why you don't have to do that in the Changed Handler.

    Comment


      #3
      This is interesting. Setting RelativeDate object to "$now" and then calling .getValue() only returns the date without the time. Is there another way?

      Comment

      Working...
      X