Author: tchemit Date: 2014-02-12 15:36:08 +0100 (Wed, 12 Feb 2014) New Revision: 2792 Url: http://nuiton.org/projects/jaxx/repository/revisions/2792 Log: fixes #3075: Add option to select in a FilterableComboBox with enter key whene there is a unique resultSet Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableComboBoxModel.java trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanFilterableComboBox.jaxx trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanFilterableComboBoxHandler.java Modified: trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableComboBoxModel.java =================================================================== --- trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableComboBoxModel.java 2014-02-11 11:23:41 UTC (rev 2791) +++ trunk/jaxx-runtime/src/main/java/jaxx/runtime/swing/model/JaxxFilterableComboBoxModel.java 2014-02-12 14:36:08 UTC (rev 2792) @@ -31,6 +31,8 @@ import java.util.List; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.JXPathDecorator; /** @@ -43,8 +45,11 @@ private static final long serialVersionUID = 1L; - protected ArrayList<E> filteredItems = Lists.newArrayList(); + /** Logger. */ + private static final Log log = LogFactory.getLog(JaxxFilterableComboBoxModel.class); + protected List<E> filteredItems = Lists.newArrayList(); + protected String filterText; /** the decorator of data */ @@ -175,14 +180,12 @@ filteredItems.addAll(delegate); } else { - int itemNumber = delegate.size(); Pattern pattern = null; if (!StringUtils.isBlank(filterText)) { String patternText = Pattern.quote(filterText).replace("*", "\\E.*\\Q") + ".*"; pattern = Pattern.compile(patternText, Pattern.CASE_INSENSITIVE); } - for (int i = 0 ; i < itemNumber ; i++) { - E element = delegate.get(i); + for (E element : delegate) { boolean addElement = true; for (Predicate<E> filter : filters) { addElement &= filter.apply(element); @@ -194,13 +197,17 @@ decoratedElement = String.valueOf(element); } boolean matches = pattern == null - || pattern.matcher(decoratedElement).matches(); + || pattern.matcher(decoratedElement).matches(); if (matches && addElement) { filteredItems.add(element); } } } + if (log.isInfoEnabled()) { + log.info("After refilter, nb items: "+getSize()); + } + fireContentsChanged(this, 0, getSize()); } } Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanFilterableComboBox.jaxx =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanFilterableComboBox.jaxx 2014-02-11 11:23:41 UTC (rev 2791) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanFilterableComboBox.jaxx 2014-02-12 14:36:08 UTC (rev 2792) @@ -54,6 +54,9 @@ <!-- sortable combo property --> <Boolean id='sortable' javaBean='true'/> + <!-- to select using enter key when there is only one selection --> + <Boolean id='enterToSelectUniqueUniverse' javaBean='true'/> + <!-- bean property linked state --> <String id='property' javaBean='""'/> Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanFilterableComboBoxHandler.java =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanFilterableComboBoxHandler.java 2014-02-11 11:23:41 UTC (rev 2791) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanFilterableComboBoxHandler.java 2014-02-12 14:36:08 UTC (rev 2792) @@ -24,7 +24,6 @@ */ package jaxx.runtime.swing.editor.bean; -import com.google.common.base.Predicate; import jaxx.runtime.JAXXUtil; import jaxx.runtime.SwingUtil; import jaxx.runtime.swing.JAXXButtonGroup; @@ -193,18 +192,65 @@ @Override public void keyPressed(KeyEvent e) { - if (ui.isEnabled() && !combobox.isPopupVisible()) { - combobox.showPopup(); + if (!ui.isEnabled()) { + e.consume(); + return; } + if (log.isDebugEnabled()) { + log.debug("keyPressed: " + e.getKeyCode()); + } + if (combobox.isPopupVisible() && ui.isEnterToSelectUniqueUniverse()) { + if (KeyEvent.VK_ENTER == e.getKeyCode() && combobox.getItemCount() == 1) { + // we don't want any other action for this one + if (log.isDebugEnabled()) { + log.debug("ENTER + only one selected item, consume"); + } + combobox.hidePopup(); + e.consume(); + return; + } + } } @Override public void keyReleased(KeyEvent e) { + if (log.isDebugEnabled()) { + log.debug("keyReleased: " + e.getKeyCode()); + } + if (combobox.isPopupVisible() && KeyEvent.VK_ESCAPE == e.getKeyCode()) { + if (log.isDebugEnabled()) { + log.debug("ESC , hide popup"); + } + e.consume(); + combobox.hidePopup(); + return; + } + if (!combobox.isPopupVisible() && KeyEvent.VK_ESCAPE != e.getKeyCode() && KeyEvent.VK_ENTER != e.getKeyCode()) { + if (log.isDebugEnabled()) { + log.debug("Will show popup, keycode: " + e.getKeyCode()); + } + combobox.showPopup(); + } // if the typed text does not match the selected item, // set the selected item to null Object selectedItem = ui.getSelectedItem(); String text = editor.getEditorComponent().getText(); - String selectedItemString; + if (log.isDebugEnabled()) { + log.debug("keycode: " + e.getKeyCode() + ", editorText: " + text); + } + if (KeyEvent.VK_ENTER == e.getKeyCode() && ui.isEnterToSelectUniqueUniverse() && combobox.getItemCount() == 1) { + + // auto-select the + if (log.isDebugEnabled()) { + log.debug("Auto-select unique result with *ENTER* key"); + } + combobox.setSelectedIndex(0); + e.consume(); + // edition is done + combobox.hidePopup(); + return; + } + final String selectedItemString; if (getBeanType().isInstance(selectedItem)) { selectedItemString = BeanFilterableComboBoxHandler.this.decorator.toString(selectedItem); } else { @@ -477,7 +523,7 @@ List<O> data = ui.getData(); - if (ui.isSortable()) { + if (ui.isSortable() && CollectionUtils.isNotEmpty(data)) { try { // Sort data with the decorator jxpath tokens. DecoratorUtil.sort(decorator, @@ -679,20 +725,4 @@ wrapped.removeActionListener(l); } } - - public void addFilter(Predicate<O> filter) { - ((JaxxFilterableComboBoxModel) ui.getCombobox().getModel()).addFilter(filter); - } - - public void removeFilter(Predicate<O> filter) { - ((JaxxFilterableComboBoxModel) ui.getCombobox().getModel()).removeFilter(filter); - } - - public void clearFilters() { - ((JaxxFilterableComboBoxModel) ui.getCombobox().getModel()).clearFilters(); - } - - public void refreshFilteredElements() { - ((JaxxFilterableComboBoxModel) ui.getCombobox().getModel()).refreshFilteredElements(); - } }