public DateRangeEditor(Date date) {

    super(MSGS.rangeOfRecurrence());
    this.addStyleName(SCHEDULE_EDITOR_CAPTION_PANEL);
    uniqueInstanceNumber += 1;

    HorizontalPanel outerHP = new HorizontalPanel();
    add(outerHP);

    HorizontalPanel hp = new HorizontalPanel();
    Label l = new Label(MSGS.startLabel());
    l.setStyleName("startLabel"); // $NON-NLS-1$
    hp.add(l);
    DefaultFormat format = new DefaultFormat(DateTimeFormat.getShortDateFormat());
    startDatePicker = new DatePickerEx(format);
    startDatePicker.getDatePicker().setStyleName(START_DATE_PICKER);
    hp.add(startDatePicker.getDatePicker());
    startLabel = new ErrorLabel(hp);
    outerHP.add(startLabel);

    endDatePanel = new EndDatePanel(date);
    outerHP.add(endDatePanel);

    reset(date);
    configureOnChangeHandler();
  }
    private void configureOnChangeHandler() {
      final EndDatePanel localThis = this;

      ICallback<IChangeHandler> handler =
          new ICallback<IChangeHandler>() {
            public void onHandle(IChangeHandler o) {
              localThis.changeHandler();
            }
          };
      KeyboardListener keyboardListener =
          new KeyboardListener() {
            public void onKeyDown(Widget sender, char keyCode, int modifiers) {}

            public void onKeyPress(Widget sender, char keyCode, int modifiers) {}

            public void onKeyUp(Widget sender, char keyCode, int modifiers) {
              localThis.changeHandler();
            }
          };

      ClickListener clickListener =
          new ClickListener() {
            public void onClick(Widget sender) {
              localThis.changeHandler();
            }
          };

      endDatePicker.setOnChangeHandler(handler);
      noEndDateRb.addClickListener(clickListener);
      noEndDateRb.addKeyboardListener(keyboardListener);
      endByRb.addClickListener(clickListener);
      endByRb.addKeyboardListener(keyboardListener);
    }
    public EndDatePanel(Date date) {
      final EndDatePanel localThis = this;

      noEndDateRb =
          new RadioButton(END_DATE_RB_GROUP + uniqueInstanceNumber, MSGS.noEndDateLabel());
      noEndDateRb.setStyleName("recurrenceRadioButton"); // $NON-NLS-1$
      noEndDateRb.setValue(true);
      add(noEndDateRb);
      HorizontalPanel hp = new HorizontalPanel();
      add(hp);

      HorizontalPanel endByPanel = new HorizontalPanel();
      endByRb = new RadioButton(END_DATE_RB_GROUP + uniqueInstanceNumber, MSGS.endByLabel());
      endByRb.setStyleName("recurrenceRadioButton"); // $NON-NLS-1$
      endByPanel.add(endByRb);
      DefaultFormat format = new DefaultFormat(DateTimeFormat.getShortDateFormat());
      endDatePicker = new DatePickerEx(format);
      endDatePicker.getDatePicker().setStyleName(END_DATE_PICKER);
      endDatePicker.getDatePicker().setEnabled(false);
      endByPanel.add(endDatePicker.getDatePicker());
      endByLabel = new ErrorLabel(endByPanel);
      hp.add(endByLabel);

      noEndDateRb.addClickListener(
          new ClickListener() {
            public void onClick(Widget sender) {
              localThis.endDatePicker.getDatePicker().setEnabled(false);
            }
          });

      endByRb.addClickListener(
          new ClickListener() {
            public void onClick(Widget sender) {
              localThis.endDatePicker.getDatePicker().setEnabled(true);
            }
          });
      reset(date);
      configureOnChangeHandler();
    }
  private void configureOnChangeHandler() {
    final DateRangeEditor localThis = this;

    ICallback<IChangeHandler> handler =
        new ICallback<IChangeHandler>() {
          public void onHandle(IChangeHandler o) {
            localThis.changeHandler();
          }
        };

    startDatePicker.setOnChangeHandler(handler);
    endDatePanel.setOnChangeHandler(handler);
  }
 public void setStartDate(Date d) {
   startDatePicker.getDatePicker().setValue(d);
 }
 public Date getStartDate() {
   return startDatePicker.getSelectedDate();
 }
 public void setDate(Date d) {
   endDatePicker.getDatePicker().setValue(d);
 }
 public Date getDate() {
   return isEndBy() ? endDatePicker.getSelectedDate() : null;
 }
 public void setEndBy() {
   noEndDateRb.setValue(false);
   endByRb.setValue(true);
   endDatePicker.getDatePicker().setEnabled(true);
 }
 public void reset(Date d) {
   setNoEndDate();
   endDatePicker.getDatePicker().setValue(d);
 }
 public void reset(Date d) {
   startDatePicker.getDatePicker().setValue(d);
   endDatePanel.reset(d);
 }