r2529 - trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean
Author: kmorin Date: 2012-12-11 17:51:04 +0100 (Tue, 11 Dec 2012) New Revision: 2529 Url: http://nuiton.org/projects/jaxx/repository/revisions/2529 Log: refs #2474 Create a double list widget 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/BeanDoubleListHandler.java trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListModel.java 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 2012-12-10 17:58:51 UTC (rev 2528) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleList.jaxx 2012-12-11 16:51:04 UTC (rev 2529) @@ -11,16 +11,20 @@ <!-- label --> <String id='labelText' javaBean='null'/> + <!-- model --> <BeanDoubleListModel id='model' genericType='O' universeModel='{universeList.getModel()}' selectedModel='{selectedList.getModel()}'/> - + + <!-- handler --> <BeanDoubleListHandler id='handler' genericType='O' constructorParams='this'/> <row weightx='1' fill='both'> <cell weightx='0.5' weighty='1' fill='both'> - <JScrollPane> + <JScrollPane columnHeaderView="{universeListHeader}"> + <!-- List of all the remaining available elements --> <JList id='universeList' model='{new DefaultListModel()}'/> +<!-- <BeanListHeader id='universeListHeader' genericType='O' list='{universeList}'/>--> </JScrollPane> </cell> <cell weighty='1'> @@ -30,25 +34,20 @@ </VBox> </cell> <cell weightx='0.5' weighty='1' fill='both'> - <JScrollPane> + <JScrollPane columnHeaderView="{selectedListHeader}"> + <!-- List of the selected elements --> <JList id='selectedList' model='{new DefaultListModel()}'/> +<!-- <BeanListHeader id='selectedListHeader' genericType='O' list='{selectedList}'/>--> </JScrollPane> </cell> </row> - -<!-- <BeanListHeader id='doubleListHeader' genericType='O' list='{firstList}'/>--> - <script><![CDATA[ -public void init(JXPathDecorator<O> decorator, List<O> data) { - handler.init(decorator, data); +public void init(JXPathDecorator<O> decorator, List<O> universe, List<O> selected) { + handler.init(decorator, universe, selected); } -public O getSelectedValue() { - return handler.getSelectedValue(); -} - ]]></script> </Table> \ No newline at end of file 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 2012-12-10 17:58:51 UTC (rev 2528) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListHandler.java 2012-12-11 16:51:04 UTC (rev 2529) @@ -4,8 +4,6 @@ import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import javax.swing.event.ListSelectionEvent; import org.nuiton.util.decorator.JXPathDecorator; import org.nuiton.util.decorator.MultiJXPathDecorator; import jaxx.runtime.swing.renderer.DecoratorListCellRenderer; @@ -15,86 +13,71 @@ import javax.swing.JList; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import javax.swing.DefaultListModel; -import javax.swing.ListModel; -import javax.swing.event.ListSelectionListener; -import jaxx.runtime.SwingUtil; /** - * Le handler d'un {@link BeanDoubleList}. + * The handler of a {@link BeanDoubleList}. * <p/> * * @author kmorin <morin@codelutin.com> - * @param <O> le type des objet contenus dans le modèle du composant. + * @param <O> the type of the objects contained in the list. * @see BeanDoubleList * @since 2.5.8 */ public class BeanDoubleListHandler<O> implements PropertyChangeListener { - public static final Log log = LogFactory.getLog(BeanDoubleListHandler.class); + private static final Log log = LogFactory.getLog(BeanDoubleListHandler.class); - /** ui if the handler */ + /** ui of the handler */ protected BeanDoubleList<O> ui; /** the decorator of data */ protected MultiJXPathDecorator<O> decorator; - /** flag to mark when handler was init (it can be init only once). */ - protected boolean init; - public BeanDoubleListHandler(BeanDoubleList<O> ui) { this.ui = ui; } /** - * Initialise le handler de l'ui - * - * @param decorator le decorateur a utiliser - * @param data la liste des données a gérer + * Initializes the handler of the UI + * @param decorator the decorator to use to display the data nicely + * @param universe the list of all the available items + * @param selected the list of selected items */ - public void init(JXPathDecorator<O> decorator, List<O> data) { - if (init) { - throw new IllegalStateException("can not init the handler twice"); - } - init = true; - - ui.getModel().setUniverse(data); - -// // set datas -// ui.getDoubleListHeader().setBeanType(ui.getBeanType()); -// ui.getDoubleListHeader().setLabelText(ui.getLabelText()); -// ui.getDoubleListHeader().init(decorator, data); - -// // list could have changed and the complex binding is not registred... -// ui.removeDataBinding(BeanDoubleListHandler.BINDING_RESET_SELECTION_ENABLED); -// ui.applyDataBinding(BeanDoubleListHandler.BINDING_RESET_SELECTION_ENABLED); - + public void init(JXPathDecorator<O> decorator, List<O> universe, List<O> selected) { this.decorator = BeanUIUtil.createDecorator(decorator); -// - // init combobox renderer base on given decorator + + initModel(universe, selected); + final JList universeList = ui.getUniverseList(); universeList.setCellRenderer(new DecoratorListCellRenderer(this.decorator)); - SwingUtil.fillList(universeList, data, null); - final JList selectedList = ui.getSelectedList(); selectedList.setCellRenderer(new DecoratorListCellRenderer(this.decorator)); -// // build popup -// popupHandler.preparePopup(ui.getSelectedToolTipText(), -// ui.getNotSelectedToolTipText(), -// ui.getI18nPrefix(), -// ui.getPopupTitleText(), -// indexes, -// ui.getPopupSeparator(), -// ui.getPopupLabel(), -// ui.getSortUp(), -// ui.getSortDown(), -// this.decorator); -// + initListeners(); + ui.addPropertyChangeListener(this); + + } + + /** + * Initialize the model of the {@link BeanDoubleList} + * @param universe the list of all the available items + * @param selected the selected items + */ + protected void initModel(List<O> universe, List<O> selected) { + ui.getModel().setUniverse(universe); + ui.getModel().setSelected(selected); + } + + /** + * Initializes the listeners. + */ + protected void initListeners() { + final JList universeList = ui.getUniverseList(); + final JList selectedList = ui.getSelectedList(); + universeList.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent event) { @@ -132,26 +115,10 @@ ui.getModel().removeFromSelected(selection); } }); - - ui.addPropertyChangeListener(this); - } - - protected void switchElement(MouseEvent event, JList container, JList receiver) { - int index = container.locationToIndex(event.getPoint()); - DefaultListModel containerModel = (DefaultListModel)container.getModel(); - Object item = containerModel.remove(index); - DefaultListModel receiverModel = (DefaultListModel)receiver.getModel(); - receiverModel.addElement(item); - } - @Override public void propertyChange(PropertyChangeEvent evt) { } - public O getSelectedValue() { - JList list = ui.getUniverseList(); - return list == null ? null : (O) list.getSelectedValue(); - } } 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 2012-12-10 17:58:51 UTC (rev 2528) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListModel.java 2012-12-11 16:51:04 UTC (rev 2529) @@ -4,36 +4,80 @@ import java.util.List; import javax.swing.DefaultListModel; import javax.swing.ListModel; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** - * The model of the BeanDoubleList widget + * The model of the {@link BeanDoubleList} widget + * @param <O> the type of the object in the list * @author kmorin <morin@codelutin.com> - * @since 2.5.8 + * @see BeanDoubleList + * @since 2.5.8 */ public class BeanDoubleListModel<O> { + private static final Log log = LogFactory.getLog(BeanDoubleListModel.class); + + /** List of all the available items */ protected List<O> universe = new ArrayList<O>(); + /** Model containing the remaining available items */ protected ListModel universeModel = new DefaultListModel(); + /** List of the selected items */ protected List<O> selected = new ArrayList<O>(); + /** Model containing the selected items */ protected ListModel selectedModel = new DefaultListModel(); - + + /** + * To get the selected items. + * @return a list of O + */ public List<O> getSelected() { return selected; } + /** + * Sets the list of selected items. + * It fills the model of the list of the selected items with these items + * and removes them from the model of list of the universe. + * @param selected a list of O + */ public void setSelected(List<O> selected) { - this.selected = selected; + if (selected == null) { + selected = new ArrayList<O>(); + } + this.selected = new ArrayList<O>(selected); + ((DefaultListModel)selectedModel).clear(); + for (O item : selected) { + ((DefaultListModel)selectedModel).addElement(item); + ((DefaultListModel)universeModel).removeElement(item); + } } + /** + * To get all the available items. + * @return a list of O + */ public List<O> getUniverse() { return universe; } + /** + * Sets the list of the available items. + * It fills the model of the universe list with these items. + * @param universe a list of O + */ public void setUniverse(List<O> universe) { - this.universe = universe; + if (universe == null) { + universe = new ArrayList<O>(); + } + this.universe = new ArrayList<O>(universe); + ((DefaultListModel)universeModel).clear(); + for (O item : universe) { + ((DefaultListModel)universeModel).addElement(item); + } } public ListModel getSelectedModel() { @@ -52,12 +96,20 @@ this.universeModel = universeModel; } + /** + * Adds an item to the selected items. + * @param item the item to select + */ public void addToSelected(O item) { selected.add(item); ((DefaultListModel)selectedModel).addElement(item); ((DefaultListModel)universeModel).removeElement(item); } + /** + * Adds a list of items to the selected items. + * @param items the list of the items to select + */ public void addToSelected(List<O> items) { selected.addAll(items); for (O item : items) { @@ -66,18 +118,56 @@ } } + /** + * Removes an item from the selected items. + * @param item the item to unselect + */ public void removeFromSelected(O item) { selected.remove(item); + log.info(selectedModel.getClass()); ((DefaultListModel)selectedModel).removeElement(item); - ((DefaultListModel)universeModel).addElement(item); + addToUniverseList(item); } - public void removeFromSelected(List<O> items){ + /** + * Removes a list of items from the list of selected items. + * @param items the list of the items to unselect + */ + public void removeFromSelected(List<O> items) { selected.removeAll(items); for (O item : items) { ((DefaultListModel)selectedModel).removeElement(item); - ((DefaultListModel)universeModel).addElement(item); + addToUniverseList(item); } } + /** + * Adds an item to the available items list at the right index + * to keep always the same order. + * @param item the item to add to the universe list + */ + protected void addToUniverseList(O item) { + DefaultListModel universeDefaultListModel = (DefaultListModel)universeModel; + // the maximum index where we should insert the item is its index + // in the list of all the available items + int index = universe.indexOf(item); + // if the index is upper than the size of the list of the remaining available items, + // get the size of this list + int insertionIndex = Math.min(index, universeDefaultListModel.getSize()); + + // we decrease the index to insert until we meet an item whose index + // in the list of all the available index is lower than the one of the item + // we want to insert + while (insertionIndex > 0) { + O o = (O)universeDefaultListModel.get(--insertionIndex); + int oIndex = universe.indexOf(o); + if (oIndex < index) { + insertionIndex++; + break; + } + }; + + universeDefaultListModel.add(insertionIndex, item); + } + }
participants (1)
-
kmorin@users.nuiton.org