Author: kmorin Date: 2013-02-27 14:57:45 +0100 (Wed, 27 Feb 2013) New Revision: 2582 Url: http://nuiton.org/projects/jaxx/repository/revisions/2582 Log: fixes #2549 BeanComboBox - trigger the item selection only when the user really selects an item Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBox.jaxx trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBoxHandler.java Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBox.jaxx =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBox.jaxx 2013-02-27 10:13:52 UTC (rev 2581) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBox.jaxx 2013-02-27 13:57:45 UTC (rev 2582) @@ -132,8 +132,7 @@ <cell weightx='1'> <!-- la liste déroulante --> <JComboBox id='combobox' - onFocusGained='hidePopup()' - onItemStateChanged='setSelectedItem(combobox.getSelectedItem())'/> + onFocusGained='hidePopup()'/> </cell> <cell anchor='east' fill='both' insets='0'> <!-- le boutton pour changer le tri --> Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBoxHandler.java =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBoxHandler.java 2013-02-27 10:13:52 UTC (rev 2581) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBoxHandler.java 2013-02-27 13:57:45 UTC (rev 2582) @@ -47,6 +47,8 @@ import java.beans.PropertyChangeListener; import java.lang.reflect.Method; import java.util.List; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; /** * Le handler d'un {@link BeanComboBox}. @@ -131,11 +133,39 @@ this.decorator = BeanUIUtil.createDecorator(decorator); - JComboBox combobox = ui.getCombobox(); + final JComboBox combobox = ui.getCombobox(); // init combobox renderer base on given decorator combobox.setRenderer(new DecoratorListCellRenderer(this.decorator)); + combobox.addPopupMenuListener(new PopupMenuListener() { + private O selectedItem; + + boolean canceled = false; + + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + selectedItem = (O) combobox.getSelectedItem(); + } + + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + O newSelectedItem = (O) combobox.getSelectedItem(); + if (canceled) { + ui.setSelectedItem(null); + + } else if ((newSelectedItem == null ^ selectedItem == null) + || (newSelectedItem != null + && !selectedItem.equals(newSelectedItem))) { + ui.setSelectedItem(newSelectedItem); + } + selectedItem = null; + canceled = false; + } + + public void popupMenuCanceled(PopupMenuEvent e) { + canceled = true; + } + }); + convertor = BeanUIUtil.newDecoratedObjectToStringConverter(this.decorator); // keep a trace of original document (to make possible reverse autom-complete) @@ -155,7 +185,7 @@ this.decorator); ui.autoComplete = true; - + ui.addPropertyChangeListener(this); // set datas