r2569 - in trunk/jaxx-widgets/src/main: java/jaxx/runtime/swing/editor/bean resources/i18n resources/icons
Author: kmorin Date: 2013-02-25 15:49:04 +0100 (Mon, 25 Feb 2013) New Revision: 2569 Url: http://nuiton.org/projects/jaxx/repository/revisions/2569 Log: refs #2535 Add filter and sorted on the BeanDoubleList widget Added: trunk/jaxx-widgets/src/main/resources/icons/action-doublelist-reset.png trunk/jaxx-widgets/src/main/resources/icons/action-doublelist-sort.png Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleList.css trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleList.jaxx trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListHandler.java trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListModel.java trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_en_GB.properties trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_es_ES.properties trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_fr_FR.properties Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleList.css =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleList.css 2013-02-25 14:48:45 UTC (rev 2568) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleList.css 2013-02-25 14:49:04 UTC (rev 2569) @@ -22,6 +22,10 @@ * #L% */ +#filterPanel { + visible: {isFilterable()}; +} + #universeList { model:{model.getUniverseModel()}; } @@ -40,4 +44,57 @@ toolTipText:"beandoublelist.button.remove"; actionIcon:"bean-doublelist-unselect"; enabled:{model.isRemoveEnabled()}; +} + +#popup { + border:{new TitledBorder(_("beandoublelist.popup.title"))}; +} + +#popupSortLabel { + actionIcon:"bean-sort"; + text:"bean.sort.label"; +} + +#sortUp { + buttonGroup:"sortGroup"; + value:{false}; + actionIcon:"bean-sort-up"; + text:"bean.sort.up"; + selected:{!isReverseSort()}; +} + +#sortDown { + buttonGroup:"sortGroup"; + value:{true}; + actionIcon:"bean-sort-down"; + text:"bean.sort.down"; + selected:{isReverseSort()}; +} + +#toolbarLeft { + floatable:false; + borderPainted:false; + visible:{isShowReset()}; +} + +#resetButton { + actionIcon:"doublelist-reset"; + toolTipText:"beandoublelist.action.reset.tip"; + focusable:false; + focusPainted:false; + enabled:{isEnabled()}; +} + +#toolbarRight { + floatable:false; + borderPainted:false; + visible:{isShowDecorator()}; +} + +#changeDecorator { + actionIcon:"doublelist-sort"; + toolTipText:"beandoublelist.action.sort.tip"; + focusable:false; + focusPainted:false; + enabled:{isShowDecorator() && isEnabled()}; } \ No newline at end of file Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleList.jaxx =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleList.jaxx 2013-02-25 14:48:45 UTC (rev 2568) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleList.jaxx 2013-02-25 14:49:04 UTC (rev 2569) @@ -28,44 +28,81 @@ org.nuiton.util.decorator.JXPathDecorator javax.swing.DefaultListModel </import> - + + <!-- filterable list property --> + <Boolean id='filterable' javaBean='true'/> + + <!-- flag to reverse the sort --> + <Boolean id='reverseSort' javaBean='false'/> + + <!-- show decorator property --> + <Boolean id='showDecorator' javaBean='true'/> + + <!-- show reset property --> + <Boolean id='showReset' javaBean='true'/> + <!-- bean type --> <Class id='beanType' genericType='O' javaBean='null'/> - <!-- label --> - <String id='labelText' javaBean='null'/> - <!-- bean property linked state --> <String id='property' javaBean='""'/> <!-- bean property --> <Object id='bean' javaBean='null'/> - <!-- show reset property --> - <Boolean id='showReset' javaBean='false'/> + <String id='i18nPrefix' javaBean='"beanlist.common."'/> - <!-- show decorator property --> - <!--Boolean id='showDecorator' javaBean='true'/--> - - <!--String id='i18nPrefix' javaBean='"beanlist.common."'/--> - <!-- model --> <BeanDoubleListModel id='model' genericType='O'/> <!-- handler --> <BeanDoubleListHandler id='handler' genericType='O' constructorParams='this'/> + <!-- sort index property --> + <Integer id='index' javaBean='0'/> + + <!-- model of sorted property --> + <ButtonGroup id='indexes' + onStateChanged='setIndex((Integer)indexes.getSelectedValue())'/> + + <ButtonGroup id='sortGroup' + onStateChanged='setReverseSort((Boolean)sortGroup.getSelectedValue())'/> + + <!-- popup to change sorted property--> + <JPopupMenu id='popup' + onPopupMenuWillBecomeInvisible='getChangeDecorator().setSelected(false)' + onPopupMenuCanceled='getChangeDecorator().setSelected(false)'> + <JLabel id='popupSortLabel'/> + + <JRadioButtonMenuItem id='sortUp'/> + + <JRadioButtonMenuItem id='sortDown'/> + + <JSeparator id='popupSeparator'/> + <JLabel id='popupLabel'/> + <JSeparator/> + </JPopupMenu> + <row> + <cell columns='3' fill='both'> + <JPanel layout='{new BorderLayout()}' id='filterPanel'> + <JToolBar id='toolbarLeft' constraints='BorderLayout.WEST'> + <JButton id='resetButton' onActionPerformed='filterField.setText("")'/> + </JToolBar> + <JTextField id='filterField' constraints='BorderLayout.CENTER'/> + <JToolBar id='toolbarRight' constraints='BorderLayout.EAST'> + <JToggleButton id='changeDecorator' + onActionPerformed='getHandler().togglePopup()'/> + </JToolBar> + </JPanel> + </cell> + </row> + <row> <cell weightx='0.5' weighty='1' fill='both'> <JScrollPane onFocusGained='universeList.requestFocus()'> - <!--columnHeaderView='{universeListHeader}'--> <!-- List of all the remaining available elements --> <JList id='universeList' onMouseClicked='handler.onUniverseListClicked(event)'/> - <!--BeanListHeader id='universeListHeader' genericType='O' - list='{universeList}' i18nPrefix="{getI18nPrefix()}" - showReset="{isShowReset()}" - showDecorator="{isShowDecorator()}"/--> </JScrollPane> </cell> @@ -78,14 +115,9 @@ <cell weightx='0.5' weighty='1' fill='both'> <JScrollPane onFocusGained='selectedList.requestFocus()'> - <!--columnHeaderView='{selectedListHeader}'--> <!-- List of the selected elements --> <JList id='selectedList' onMouseClicked='handler.onSelectedListClicked(event)'/> - <!--BeanListHeader id='selectedListHeader' genericType='O' - list='{selectedList}' i18nPrefix="{getI18nPrefix()}" - showReset="{isShowReset()}" - showDecorator="{isShowDecorator()}"/--> </JScrollPane> </cell> </row> Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListHandler.java =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListHandler.java 2013-02-25 14:48:45 UTC (rev 2568) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListHandler.java 2013-02-25 14:49:04 UTC (rev 2569) @@ -24,6 +24,9 @@ * #L% */ +import com.google.common.collect.Lists; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; import jaxx.runtime.swing.renderer.DecoratorListCellRenderer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -37,9 +40,23 @@ import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; +import javax.swing.JComponent; +import javax.swing.JPopupMenu; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.Document; +import javax.swing.text.JTextComponent; +import jaxx.runtime.SwingUtil; +import jaxx.runtime.swing.JAXXButtonGroup; +import jaxx.runtime.swing.model.JaxxDefaultListModel; +import jaxx.runtime.swing.model.JaxxFilterableListModel; +import org.apache.commons.collections.CollectionUtils; +import org.nuiton.util.decorator.DecoratorUtil; /** * The handler of a {@link BeanDoubleList}. @@ -50,7 +67,7 @@ * @see BeanDoubleList * @since 2.5.8 */ -public class BeanDoubleListHandler<O> { +public class BeanDoubleListHandler<O> implements PropertyChangeListener { private static final Log log = LogFactory.getLog(BeanDoubleListHandler.class); @@ -59,7 +76,7 @@ /** ui of the handler */ protected BeanDoubleList<O> ui; - + /** the decorator of data */ protected MultiJXPathDecorator<O> decorator; @@ -67,6 +84,19 @@ this.ui = ui; } + private final BeanUIUtil.PopupHandler popupHandler = new BeanUIUtil.PopupHandler() { + + @Override + public JPopupMenu getPopup() { + return ui.getPopup(); + } + + @Override + public JComponent getInvoker() { + return ui.getChangeDecorator(); + } + }; + /** * Initializes the handler of the UI * @@ -76,7 +106,7 @@ */ public void init(JXPathDecorator<O> decorator, List<O> universe, List<O> selected) { this.decorator = BeanUIUtil.createDecorator(decorator); - + ui.getModel().setUniverse(universe); ui.getModel().setSelected(selected); @@ -118,9 +148,123 @@ fireSelectionUpdate(); } }); + + JAXXButtonGroup indexes = ui.getIndexes(); + + // build popup + popupHandler.preparePopup(null, + null, + ui.getI18nPrefix(), + null, + indexes, + ui.getPopupSeparator(), + ui.getPopupLabel(), + ui.getSortUp(), + ui.getSortDown(), + this.decorator); + + ui.addPropertyChangeListener(this); + + final JaxxFilterableListModel<O> filterModel = + (JaxxFilterableListModel) ui.getModel().getUniverseModel(); + + filterModel.setDecorator(this.decorator); + + ui.getFilterField().getDocument().addDocumentListener(new DocumentListener() { + + public void insertUpdate(DocumentEvent e) { + filterModel.setFilterText(ui.getFilterField().getText()); + } + + public void removeUpdate(DocumentEvent e) { + filterModel.setFilterText(ui.getFilterField().getText()); + } + + public void changedUpdate(DocumentEvent e) { + filterModel.setFilterText(ui.getFilterField().getText()); + } + }); + + // select sort button + indexes.setSelectedButton(ui.getIndex()); } + /** Toggle the popup visible state. */ + public void togglePopup() { + popupHandler.togglePopup(); + } + /** + * Sort data of the model. + * + * @since 2.5.10 + */ + public void sortData() { + + // just update UI should do the math of this + updateUI(ui.getIndex(), ui.isReverseSort()); + } + + /** + * Modifie l'index du décorateur + * + * @param oldValue l'ancienne valeur + * @param newValue la nouvelle valeur + */ + protected void setIndex(Integer oldValue, Integer newValue) { + if (newValue == null || newValue.equals(oldValue)) { + return; + } + if (log.isDebugEnabled()) { + log.debug("check state : <" + oldValue + " to " + newValue + ">"); + } + updateUI(newValue, ui.isReverseSort()); + } + + /** + * Modifie l'index du décorateur + * + * @param oldValue l'ancienne valeur + * @param newValue la nouvelle valeur + */ + + protected void setSortOrder(Boolean oldValue, Boolean newValue) { + + if (newValue == null || newValue.equals(oldValue)) { + return; + } + if (log.isDebugEnabled()) { + log.debug("check state : <" + oldValue + " to " + newValue + ">"); + } + + updateUI(ui.getIndex(), newValue); + } + + protected void updateUI(int index, boolean reversesort) { + + // change decorator context + decorator.setContextIndex(index); + + List<O> data = (List<O>) Arrays.asList(((JaxxDefaultListModel<O>)ui.getModel().getUniverseModel()).toArray()); + try { + // Sort data with the decorator jxpath tokens. + DecoratorUtil.sort(decorator, + data, + index, + reversesort + ); + + } catch (Exception eee) { + log.warn(eee.getMessage(), eee); + } + + // reload the model + SwingUtil.fillList(ui.getUniverseList(), data, null); + + ui.getUniverseList().requestFocus(); + } + + /** * When universe list was double clicked, move selected items to selected list. * * @param event mouse event @@ -131,10 +275,11 @@ int index = universeList.locationToIndex(event.getPoint()); O item = (O) universeList.getModel().getElementAt(index); ui.getModel().addToSelected(item); + + updateUI(ui.getIndex(), ui.isReverseSort()); } } - /** * When selected list was double clicked, move selected items to universe list. * @@ -148,6 +293,8 @@ int index = selectedList.locationToIndex(event.getPoint()); O item = (O) selectedList.getModel().getElementAt(index); ui.getModel().removeFromSelected(item); + + updateUI(ui.getIndex(), ui.isReverseSort()); } } @@ -155,12 +302,14 @@ public void select() { List<O> selection = (List<O>) Arrays.asList(ui.getUniverseList().getSelectedValues()); ui.getModel().addToSelected(selection); + updateUI(ui.getIndex(), ui.isReverseSort()); } /** When remove button was hit, move selected items (from selected list) to universe list. */ public void unselect() { List<O> selection = (List<O>) Arrays.asList(ui.getSelectedList().getSelectedValues()); ui.getModel().removeFromSelected(selection); + updateUI(ui.getIndex(), ui.isReverseSort()); } protected void fireSelectionUpdate() { @@ -179,4 +328,42 @@ } return mutator; } + + public MultiJXPathDecorator<O> getDecorator() { + return decorator; + } + + /** + * @return get the type of objects contained in the comboBox model. + * @since 2.5.9 + */ + public Class<O> getBeanType() { + Class<O> result = ui.getBeanType(); + if (result == null) { + result = decorator == null ? null : decorator.getType(); + } + return result; + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + String propertyName = evt.getPropertyName(); + + if (BeanListHeader.PROPERTY_INDEX.equals(propertyName)) { + + // decorator index has changed, force reload of data in ui + setIndex((Integer) evt.getOldValue(), + (Integer) evt.getNewValue()); + return; + } + + if (BeanDoubleList.PROPERTY_REVERSE_SORT.equals(propertyName)) { + + // sort order has changed, force reload of data in ui + setSortOrder((Boolean) evt.getOldValue(), + (Boolean) evt.getNewValue()); + return; + } + } + } Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListModel.java =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListModel.java 2013-02-25 14:48:45 UTC (rev 2568) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListModel.java 2013-02-25 14:49:04 UTC (rev 2569) @@ -33,6 +33,7 @@ import javax.swing.ListModel; import java.util.ArrayList; import java.util.List; +import jaxx.runtime.swing.model.JaxxFilterableListModel; /** * The model of the {@link BeanDoubleList} widget @@ -57,7 +58,7 @@ protected List<O> universe = new ArrayList<O>(); /** Model containing the remaining available items */ - protected JaxxDefaultListModel<O> universeModel = new JaxxDefaultListModel<O>(); + protected JaxxFilterableListModel<O> universeModel = new JaxxFilterableListModel<O>(); /** List of the selected items */ protected List<O> selected = new ArrayList<O>(); @@ -65,7 +66,6 @@ /** Model containing the selected items */ protected JaxxDefaultListModel<O> selectedModel = new JaxxDefaultListModel<O>(); - protected boolean addEnabled; protected boolean removeEnabled; Modified: trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_en_GB.properties =================================================================== --- trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_en_GB.properties 2013-02-25 14:48:45 UTC (rev 2568) +++ trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_en_GB.properties 2013-02-25 14:49:04 UTC (rev 2569) @@ -16,8 +16,11 @@ beancombobox.action.reset.tip=Reset the selected value beancombobox.action.sort.tip=Change the sorted property beancombobox.popup.title=Change the sorted property +beandoublelist.action.reset.tip=Reset the value of the filter +beandoublelist.action.sort.tip=Change the sorted property beandoublelist.button.add=Add beandoublelist.button.remove=Remove +beandoublelist.popup.title=Change the sorted property beanlist.action.reset.tip=Reset the selected selection beanlist.action.sort.tip=Change the sorted property beanlist.popup.title=Change the sorted property Modified: trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_es_ES.properties =================================================================== --- trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_es_ES.properties 2013-02-25 14:48:45 UTC (rev 2568) +++ trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_es_ES.properties 2013-02-25 14:49:04 UTC (rev 2569) @@ -16,8 +16,11 @@ beancombobox.action.reset.tip=Reiniciar el valor de la lista desplegable beancombobox.action.sort.tip=Modificar la clasificación de la lista desplegable beancombobox.popup.title=Modificar la clasificación +beandoublelist.action.reset.tip=Reiniciar el valor de la lista desplegable +beandoublelist.action.sort.tip=Modificar la clasificación de la lista beandoublelist.button.add=Add beandoublelist.button.remove=Remove +beandoublelist.popup.title=Modificar la clasificación beanlist.action.reset.tip=Eliminar la selección beanlist.action.sort.tip=Modificar la clasificación de la lista despleglable beanlist.popup.title=Modificar la clasificación Modified: trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_fr_FR.properties =================================================================== --- trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_fr_FR.properties 2013-02-25 14:48:45 UTC (rev 2568) +++ trunk/jaxx-widgets/src/main/resources/i18n/jaxx-widgets_fr_FR.properties 2013-02-25 14:49:04 UTC (rev 2569) @@ -16,8 +16,11 @@ beancombobox.action.reset.tip=Réinitialiser la valeur de la liste déroulante beancombobox.action.sort.tip=Modifier le tri de la liste déroulante beancombobox.popup.title=Modifier le tri -beandoublelist.button.add=Add -beandoublelist.button.remove=Remove +beandoublelist.action.reset.tip=Réinitialiser la valeur du filtre +beandoublelist.action.sort.tip=Modifier le tri de la liste +beandoublelist.button.add=Ajouter +beandoublelist.button.remove=Enlever +beandoublelist.popup.title=Modifier le tri beanlist.action.reset.tip=Supprimer la sélection beanlist.action.sort.tip=Modifier le tri de la liste déroulante beanlist.popup.title=Modifier le tri Copied: trunk/jaxx-widgets/src/main/resources/icons/action-doublelist-reset.png (from rev 2566, trunk/jaxx-widgets/src/main/resources/icons/action-combobox-reset.png) =================================================================== (Binary files differ) Copied: trunk/jaxx-widgets/src/main/resources/icons/action-doublelist-sort.png (from rev 2566, trunk/jaxx-widgets/src/main/resources/icons/action-combobox-sort.png) =================================================================== (Binary files differ)
participants (1)
-
kmorin@users.nuiton.org