r2607 - trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean
Author: kmorin Date: 2013-03-11 10:44:14 +0100 (Mon, 11 Mar 2013) New Revision: 2607 Url: http://nuiton.org/projects/jaxx/repository/revisions/2607 Log: fixes #2580 Make a combobox whose elements can be filtered 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/BeanFilterableComboBoxHandler.java 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 2013-03-09 18:12:23 UTC (rev 2606) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanFilterableComboBox.jaxx 2013-03-11 09:44:14 UTC (rev 2607) @@ -37,7 +37,7 @@ <Class id='beanType' genericType='O' javaBean='null'/> <!-- filterable property --> - <Boolean id='filterable' javaBean='false'/> + <Boolean id='filterable' javaBean='true'/> <!-- flag to reverse the sort --> <Boolean id='reverseSort' javaBean='false'/> 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 2013-03-09 18:12:23 UTC (rev 2606) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanFilterableComboBoxHandler.java 2013-03-11 09:44:14 UTC (rev 2607) @@ -24,9 +24,6 @@ */ package jaxx.runtime.swing.editor.bean; -import java.awt.Color; -import java.awt.Component; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import jaxx.runtime.SwingUtil; import jaxx.runtime.swing.JAXXButtonGroup; @@ -34,7 +31,6 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.jdesktop.swingx.autocomplete.ObjectToStringConverter; import org.nuiton.util.decorator.DecoratorUtil; import org.nuiton.util.decorator.JXPathDecorator; import org.nuiton.util.decorator.MultiJXPathDecorator; @@ -42,7 +38,6 @@ import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JPopupMenu; -import javax.swing.text.Document; import javax.swing.text.JTextComponent; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; @@ -52,7 +47,6 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.reflect.Method; @@ -60,13 +54,7 @@ import javax.swing.ComboBoxEditor; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import javax.swing.plaf.basic.BasicComboBoxEditor; import jaxx.runtime.swing.model.JaxxFilterableComboBoxModel; -import org.jdesktop.swingx.autocomplete.AbstractAutoCompleteAdaptor; -import org.jdesktop.swingx.autocomplete.AutoCompleteDocument; -import org.jdesktop.swingx.autocomplete.ComboBoxAdaptor; /** * Le handler d'un {@link BeanFilterableComboBox}. @@ -136,7 +124,11 @@ if (comboBox.isShowing()) { comboBox.hidePopup(); } - model.setFilterText(editorComponent.getText()); + String text = editorComponent.getText(); + if (log.isDebugEnabled()) { + log.debug("updateFilter " + text); + } + model.setFilterText(text); if (comboBox.isShowing()) { comboBox.showPopup(); } @@ -178,7 +170,8 @@ this.decorator = BeanUIUtil.createDecorator(decorator); final JComboBox combobox = ui.getCombobox(); - ComboBoxEditor editor = new JAXXFilterableComboBoxEditor(ui.getCombobox().getEditor()); + final JAXXFilterableComboBoxEditor editor = + new JAXXFilterableComboBoxEditor(ui.getCombobox().getEditor()); combobox.setEditor(editor); editor.getEditorComponent().addMouseListener(new MouseAdapter() { @@ -197,6 +190,18 @@ combobox.showPopup(); } } + + @Override + public void keyReleased(KeyEvent e) { + // 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(); + if (selectedItem == null || + !BeanFilterableComboBoxHandler.this.decorator.toString(selectedItem).equals(text)) { + ui.setSelectedItem(null); + } + } }); @@ -208,9 +213,15 @@ public void itemStateChanged(ItemEvent e) { Object item = e.getItem(); - if (e.getStateChange() == ItemEvent.SELECTED - && item != null && getBeanType().isInstance(item)) { + if (e.getStateChange() == ItemEvent.SELECTED) { + if (log.isDebugEnabled()) { + log.debug("itemStateChanged selected " + item + " - " + (item != null ? item.getClass() : null)); + } ui.setSelectedItem(e.getItem()); + } else { + if (log.isDebugEnabled()) { + log.debug("itemStateChanged deselected " + item + " - " + (item != null ? item.getClass() : null)); + } } } }); @@ -315,7 +326,7 @@ public void reset() { JTextComponent editorComponent = (JTextComponent) ui.getCombobox().getEditor().getEditorComponent(); editorComponent.setText(""); -// ui.setSelectedItem(null); + ui.setSelectedItem(null); } /** @@ -544,19 +555,26 @@ @Override public void setItem(Object anObject) { + if (log.isDebugEnabled()) { + log.debug("setItem " + anObject + " - " + (anObject != null ? anObject.getClass() : null)); + } Object item = anObject; - if (anObject != null && getBeanType().isInstance(anObject)) { - item = decorator.toString(anObject); - } - oldItem = anObject; - try { - wrapped.setItem(item); - getEditorComponent().setForeground(null); + if (anObject != null) { + if (getBeanType().isInstance(anObject)) { + item = decorator.toString(anObject); + oldItem = anObject; + } + try { + wrapped.setItem(item); + getEditorComponent().setForeground(null); - } catch (IllegalStateException e) { - // fail silently and deselect the currently selected item - ui.setSelectedItem(null); - getEditorComponent().setForeground(ui.getInvalidComboEditorTextColor()); + } catch (IllegalStateException e) { + // fail silently + if (log.isDebugEnabled()) { + log.debug("setItem IllegalStateException "); + } + getEditorComponent().setForeground(ui.getInvalidComboEditorTextColor()); + } } } @@ -564,25 +582,20 @@ public Object getItem() { JTextComponent editor = getEditorComponent(); Object newValue = editor.getText(); + if (log.isDebugEnabled()) { + log.debug("getItem " + newValue + " - " + (newValue != null ? newValue.getClass() : null)); + } if (oldItem != null && getBeanType().isInstance(oldItem)) { // The original value is not a string. Should return the value in it's // original type. if (newValue.equals(decorator.toString(oldItem))) { newValue = oldItem; - - } else { - // Must take the value from the editor and get the value and cast it to the new type. - Class<?> cls = oldItem.getClass(); - try { - Method method = cls.getMethod("valueOf", new Class[]{String.class}); - newValue = method.invoke(oldItem, new Object[] { editor.getText()}); - } catch (Exception ex) { - // Fail silently and return the newValue (a String object) - } } } - wrapped.getItem(); + if (log.isDebugEnabled()) { + log.debug("getItem 2 " + newValue + " - " + (newValue != null ? newValue.getClass() : null)); + } return newValue; }
participants (1)
-
kmorin@users.nuiton.org