Новый вариант преобразования регистра в TextInput

Jmix v1.5.5

Подскажите, пожалуйста, как правильнее всего будет реализовать поддержку нового типа преобразования регистра (CaseConversion) для содержимого TextField. Сейчас поддерживаются только:

  • UPPER - верхний регистр.
  • LOWER - нижний регистр.
  • NONE - без преобразования

Я бы хотел добавить варианты с Camal Case и Первой заглавной.

Попробовал сделать через добавление слушателя события TextChangeEvent:

      textField.setTrimming(false);
      textField.setTextChangeEventMode(TextInputField.TextChangeEventMode.LAZY);
      textField.addTextChangeListener(event -> {
          String trasformedText = transformText(event.getText());
          log.info("Transform text '" + event.getText()  + "' to '" + trasformedText+"'");
          event.getSource().setValue(trasformedText);
      });

Получилось, что обработчик события выполняется (в логах вижу сообщение “Transform text…”), но содержимое текстового поля не изменяется.
При этом, если для поля задан trim=“true”, у содержимого обрезаются пробелы.
Непонятно.

Здравствуй, Павел!

Попробуй использовать для преобразования событие ValueChangeEvent. Вот пример реализации на странице с примерами Jmix Classic(в примере удаляются лишние пробелы).
https://demo.jmix.io/sampler/#main/4/sample?id=textfield-trim

Спасибо за ответ. Вариант с ValueChangeEvent сработал.
Раньше его тоже пробовал, но не работало, видимо из-за того что я не выставлял

textField.setTextChangeEventMode(TextInputField.TextChangeEventMode.EAGER);

также сработал и вариант с Formatter, после указания TextChangeEventMode.EAGER:

 textField.setTextChangeEventMode(TextInputField.TextChangeEventMode.EAGER);
 textField.setFormatter((Formatter<String>) s -> transformText(s));

единственно заметил, что в доке описано:

Чтобы добавить форматтер программно, используйте метод компонента addFormatter()

а на самом деле метод называется setFormatter

Павел, рады, что всё получилось! Спасибо большое за замечание. Поправим документацию.

Вообще, конечно, не очевидно.
Зачем нужны 2 вида событий TextChangeEvent и ValueChangeEvent для TextField, нет ли тут дублирования?
Про TextChangeEventMode в документации сказано только в контексте TextChangeEvent, но оказывается он влияет и на ValueChangeEvent и на Formatter.
Про то что из обработчика TextChangeEvent нельзя менять содержимое TextField в документации тоже ничего не сказано.