You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TextChangeEvents.java 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package com.vaadin.tests.components.textfield;
  2. import com.vaadin.data.HasValue;
  3. import com.vaadin.data.HasValue.ValueChangeListener;
  4. import com.vaadin.server.VaadinRequest;
  5. import com.vaadin.shared.ui.ValueChangeMode;
  6. import com.vaadin.tests.components.AbstractTestUIWithLog;
  7. import com.vaadin.tests.util.TestUtils;
  8. import com.vaadin.ui.AbstractTextField;
  9. import com.vaadin.ui.TextArea;
  10. import com.vaadin.ui.TextField;
  11. public class TextChangeEvents extends AbstractTestUIWithLog {
  12. @Override
  13. protected void setup(VaadinRequest request) {
  14. TextField textField = new TextField("Default");
  15. ValueChangeListener<String> listener = event -> log(
  16. "Text change event for " + event.getComponent().getCaption()
  17. + ", text content currently:'" + event.getValue()
  18. + "' Cursor at index:"
  19. + ((AbstractTextField) event.getSource())
  20. .getCursorPosition());
  21. textField.addValueChangeListener(listener);
  22. addComponent(textField);
  23. TextField eager = new TextField("Eager");
  24. eager.addValueChangeListener(listener);
  25. eager.setValueChangeMode(ValueChangeMode.EAGER);
  26. addComponent(eager);
  27. TextField timeout = new TextField("Timeout 3s");
  28. timeout.addValueChangeListener(listener);
  29. timeout.setValueChangeMode(ValueChangeMode.EAGER);
  30. timeout.setValueChangeTimeout(3000);
  31. addComponent(timeout);
  32. TextArea textArea = new TextArea("Default text area");
  33. textArea.addValueChangeListener(listener);
  34. addComponent(textArea);
  35. TextArea textAreaTimeout = new TextArea("Timeout 3s");
  36. textAreaTimeout.addValueChangeListener(listener);
  37. textAreaTimeout.setValueChangeMode(ValueChangeMode.TIMEOUT);
  38. textAreaTimeout.setValueChangeTimeout(3000);
  39. addComponent(textAreaTimeout);
  40. VaadinDeveloperNameField vd = new VaadinDeveloperNameField();
  41. vd.addValueChangeListener(listener);
  42. addComponent(vd);
  43. }
  44. @Override
  45. protected String getTestDescription() {
  46. return "Simple TextChangeEvent test cases.";
  47. }
  48. /**
  49. * "Autosuggest"
  50. *
  51. * Known issue is timing if suggestion comes while typing more content. IMO
  52. * we will not support this kind of features in default TextField, but
  53. * hopefully make it easily extendable to perfect suggest feature. MT
  54. * 2010-10
  55. *
  56. */
  57. private class VaadinDeveloperNameField extends TextField
  58. implements HasValue.ValueChangeListener<String> {
  59. private String[] names = new String[] { "Matti Tahvonen",
  60. "Marc Englund", "Joonas Lehtinen", "Jouni Koivuviita",
  61. "Marko Grönroos", "Artur Signell" };
  62. public VaadinDeveloperNameField() {
  63. setCaption("Start typing 'old' Vaadin developers.");
  64. addValueChangeListener(this);
  65. setStyleName("nomatch");
  66. }
  67. @Override
  68. public void attach() {
  69. super.attach();
  70. TestUtils.injectCSS(getUI(), ".match { background:green ;} "
  71. + ".nomatch {background:red;}");
  72. }
  73. @Override
  74. public void valueChange(HasValue.ValueChangeEvent<String> event) {
  75. boolean atTheEndOfText = event.getValue()
  76. .length() == getCursorPosition();
  77. String match = findMatch(event.getValue());
  78. if (match != null) {
  79. setStyleName("match");
  80. String curText = event.getValue();
  81. int matchlenght = curText.length();
  82. // autocomplete if garret is at the end of the text
  83. if (atTheEndOfText) {
  84. suggest(match, matchlenght);
  85. }
  86. } else {
  87. setStyleName("nomatch");
  88. }
  89. }
  90. private void suggest(String match, int matchlenght) {
  91. setValue(match);
  92. setSelection(matchlenght, match.length() - matchlenght);
  93. }
  94. private String findMatch(String currentTextContent) {
  95. if (!currentTextContent.isEmpty()) {
  96. for (int i = 0; i < names.length; i++) {
  97. if (names[i].startsWith(currentTextContent)) {
  98. return names[i];
  99. }
  100. }
  101. }
  102. return null;
  103. }
  104. }
  105. }