private void refreshEditor() {
    String key = factType + "." + field.getFieldName();
    String flType = sce.getFieldType(key);
    panel.clear();
    if (flType != null && flType.equals(SuggestionCompletionEngine.TYPE_NUMERIC)) {
      final TextBox box = editableTextBox(callback, field.getFieldName(), field.getExpected());
      box.addKeyPressHandler(new NumbericFilterKeyPressHandler(box));
      panel.add(box);
    } else if (flType != null && flType.equals(SuggestionCompletionEngine.TYPE_BOOLEAN)) {
      String[] c = new String[] {"true", "false"};
      panel.add(
          new EnumDropDown(
              field.getExpected(),
              new DropDownValueChanged() {
                public void valueChanged(String newText, String newValue) {
                  callback.valueChanged(newValue);
                }
              },
              DropDownData.create(c)));
    } else if (flType != null && flType.equals(SuggestionCompletionEngine.TYPE_DATE)) {
      final DatePickerTextBox datePicker = new DatePickerTextBox(field.getExpected());
      String m = ((Constants) GWT.create(Constants.class)).ValueFor0(field.getFieldName());
      datePicker.setTitle(m);
      datePicker.addValueChanged(
          new ValueChanged() {
            public void valueChanged(String newValue) {
              field.setExpected(newValue);
            }
          });

      panel.add(datePicker);
    } else {
      String[] enums = sce.getDataEnumList(key);
      if (enums != null) {
        // GUVNOR-1324: Java enums are of type TYPE_COMPARABLE whereas Guvnor enums are not.
        // The distinction here controls whether the EXPECTED value is handled as a true
        // Java enum or a literal with a selection list (i.e. Guvnor enum)
        String dataType = sce.getFieldType(key);
        if (dataType.equals(SuggestionCompletionEngine.TYPE_COMPARABLE)) {
          field.setNature(FieldData.TYPE_ENUM);
        } else {
          field.setNature(FieldData.TYPE_LITERAL);
        }

        panel.add(
            new EnumDropDown(
                field.getExpected(),
                new DropDownValueChanged() {
                  public void valueChanged(String newText, String newValue) {
                    callback.valueChanged(newValue);
                  }
                },
                DropDownData.create(enums)));

      } else {
        if (field.getExpected() != null
            && field.getExpected().length() > 0
            && field.getNature() == FieldData.TYPE_UNDEFINED) {
          if (field.getExpected().charAt(0) == '=') {
            field.setNature(FieldData.TYPE_VARIABLE);
          } else {
            field.setNature(FieldData.TYPE_LITERAL);
          }
        }
        if (field.getNature() == FieldData.TYPE_UNDEFINED && isThereABoundVariableToSet() == true) {
          Image clickme = new Image(images.edit());
          clickme.addClickHandler(
              new ClickHandler() {

                public void onClick(ClickEvent event) {
                  showTypeChoice((Widget) event.getSource(), field);
                }
              });
          panel.add(clickme);
        } else if (field.getNature() == FieldData.TYPE_VARIABLE) {
          panel.add(variableEditor());
        } else {
          panel.add(editableTextBox(callback, field.getFieldName(), field.getExpected()));
        }
      }
    }
  }