Author: kmorin Date: 2012-12-12 17:33:34 +0100 (Wed, 12 Dec 2012) New Revision: 2532 Url: http://nuiton.org/projects/jaxx/repository/revisions/2532 Log: refs #2474 Create a double list widget Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditorHandler.java trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBoxHandler.java 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/java/jaxx/runtime/swing/editor/bean/BeanUIUtil.java Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java 2012-12-12 09:22:25 UTC (rev 2531) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/NumberEditorHandler.java 2012-12-12 16:33:34 UTC (rev 2532) @@ -25,6 +25,7 @@ package jaxx.runtime.swing.editor; +import jaxx.runtime.swing.editor.bean.BeanUIUtil; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; @@ -573,29 +574,7 @@ protected Method getMutator() { if (mutator == null) { - Object bean = editor.getBean(); - if (bean == null) { - throw new NullPointerException("could not find bean in " + editor); - } - String property = editor.getProperty(); - if (property == null) { - throw new NullPointerException("could not find property in " + editor); - } - if (log.isDebugEnabled()) { - log.debug("searching mutator for property " + property + " on bean of type " + bean.getClass()); - } - if (log.isTraceEnabled()) { - PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(bean); - for (PropertyDescriptor p : descriptors) { - log.trace("property discover " + p.getName() + " writer = " + p.getWriteMethod()); - } - } - try { - PropertyDescriptor descriptor = PropertyUtils.getPropertyDescriptor(bean, property); - mutator = descriptor.getWriteMethod(); - } catch (Exception e) { - throw new RuntimeException(e); - } + mutator = BeanUIUtil.getMutator(editor.getBean(), editor.getProperty()); } return mutator; } Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditorHandler.java =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditorHandler.java 2012-12-12 09:22:25 UTC (rev 2531) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/TimeEditorHandler.java 2012-12-12 16:33:34 UTC (rev 2532) @@ -44,6 +44,7 @@ import java.util.Dictionary; import java.util.Hashtable; import java.util.Map; +import jaxx.runtime.swing.editor.bean.BeanUIUtil; /** @author tchemit <chemit@codelutin.com> */ public class TimeEditorHandler { @@ -326,21 +327,7 @@ protected Method getMutator() { if (mutator == null) { - Object bean = editor.getBean(); - if (bean == null) { - throw new NullPointerException("could not find bean in " + editor); - } - String property = editor.getProperty(); - if (property == null) { - throw new NullPointerException("could not find property in " + editor); - } - - try { - PropertyDescriptor descriptor = PropertyUtils.getPropertyDescriptor(bean, property); - mutator = descriptor.getWriteMethod(); - } catch (Exception e) { - throw new RuntimeException(e); - } + mutator = BeanUIUtil.getMutator(editor.getBean(), editor.getProperty()); } return mutator; } 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 2012-12-12 09:22:25 UTC (rev 2531) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanComboBoxHandler.java 2012-12-12 16:33:34 UTC (rev 2532) @@ -329,23 +329,7 @@ /** @return le mutateur a utiliser pour modifier le bean associé. */ protected Method getMutator() { if (mutator == null) { - Object bean = ui.getBean(); - if (bean == null) { - throw new NullPointerException("could not find bean in " + ui); - } - String property = ui.getProperty(); - if (property == null) { - throw new NullPointerException("could not find property in " + ui); - } - - try { - PropertyDescriptor descriptor = PropertyUtils.getPropertyDescriptor(bean, property); - if (descriptor != null) { - mutator = descriptor.getWriteMethod(); - } - } catch (Exception e) { - throw new RuntimeException(e); - } + mutator = BeanUIUtil.getMutator(ui.getBean(), ui.getProperty()); } return mutator; } 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-12 09:22:25 UTC (rev 2531) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleList.jaxx 2012-12-12 16:33:34 UTC (rev 2532) @@ -11,6 +11,12 @@ <!-- label --> <String id='labelText' javaBean='null'/> + <!-- bean property linked state --> + <String id='property' javaBean='""'/> + + <!-- bean property --> + <Object id='bean' javaBean='null'/> + <!-- model --> <BeanDoubleListModel id='model' genericType='O' universeModel='{universeList.getModel()}' @@ -18,22 +24,20 @@ <!-- handler --> <BeanDoubleListHandler id='handler' genericType='O' constructorParams='this'/> - - <row weightx='1' fill='both'> - <cell weightx='0.5' weighty='1' fill='both'> + + <row> + <cell weightx='1' weighty='1' fill='both' rows='2'> <JScrollPane> <!-- 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'> - <VBox> - <JButton id='addButton' text="beandoublelist.button.add"/> - <JButton id='removeButton' text="beandoublelist.button.remove"/> - </VBox> + <cell anchor='north'> + <JButton id='addButton' toolTipText="beandoublelist.button.add" + actionIcon='select'/> </cell> - <cell weightx='0.5' weighty='1' fill='both'> + <cell weightx='1' weighty='1' fill='both' rows='2'> <JScrollPane> <!-- List of the selected elements --> <JList id='selectedList' model='{new DefaultListModel()}'/> @@ -41,6 +45,12 @@ </JScrollPane> </cell> </row> + <row> + <cell anchor='north'> + <JButton id='removeButton' toolTipText="beandoublelist.button.remove" + actionIcon='unselect'/> + </cell> + </row> <script><![CDATA[ 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-12 09:22:25 UTC (rev 2531) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListHandler.java 2012-12-12 16:33:34 UTC (rev 2532) @@ -4,6 +4,7 @@ import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import javax.swing.event.ListDataEvent; import org.nuiton.util.decorator.JXPathDecorator; import org.nuiton.util.decorator.MultiJXPathDecorator; import jaxx.runtime.swing.renderer.DecoratorListCellRenderer; @@ -13,8 +14,13 @@ import javax.swing.JList; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; +import javax.swing.event.ListDataListener; +import javax.swing.plaf.basic.BasicComboBoxUI.ListDataHandler; +import org.apache.commons.beanutils.PropertyUtils; /** * The handler of a {@link BeanDoubleList}. @@ -29,6 +35,9 @@ private static final Log log = LogFactory.getLog(BeanDoubleListHandler.class); + /** the mutator method on the property of boxed bean in the ui */ + protected Method mutator; + /** ui of the handler */ protected BeanDoubleList<O> ui; @@ -100,6 +109,21 @@ } }); + selectedList.getModel().addListDataListener(new ListDataListener() { + + public void intervalAdded(ListDataEvent e) { + fireSelectionUpdate(); + } + + public void intervalRemoved(ListDataEvent e) { + fireSelectionUpdate(); + } + + public void contentsChanged(ListDataEvent e) { + fireSelectionUpdate(); + } + }); + ui.getAddButton().addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -115,7 +139,30 @@ ui.getModel().removeFromSelected(selection); } }); + } + + protected void fireSelectionUpdate() { + if (ui.getBean() == null) { + return; + } + try { + Method mut = getMutator(); + if (mut != null) { + mut.invoke(ui.getBean(), ui.getModel().getSelected()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** @return le mutateur a utiliser pour modifier le bean associé. */ + protected Method getMutator() { + if (mutator == null) { + mutator = BeanUIUtil.getMutator(ui.getBean(), ui.getProperty()); + } + return mutator; + } @Override public void propertyChange(PropertyChangeEvent evt) { 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-12 09:22:25 UTC (rev 2531) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanDoubleListModel.java 2012-12-12 16:33:34 UTC (rev 2532) @@ -4,6 +4,8 @@ import java.util.List; import javax.swing.DefaultListModel; import javax.swing.ListModel; +import javax.swing.event.ListDataEvent; +import javax.swing.event.ListDataListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -48,7 +50,7 @@ if (selected == null) { selected = new ArrayList<O>(); } - this.selected = new ArrayList<O>(selected); + this.selected = selected; ((DefaultListModel)selectedModel).clear(); for (O item : selected) { ((DefaultListModel)selectedModel).addElement(item); @@ -124,7 +126,6 @@ */ public void removeFromSelected(O item) { selected.remove(item); - log.info(selectedModel.getClass()); ((DefaultListModel)selectedModel).removeElement(item); addToUniverseList(item); } @@ -169,5 +170,4 @@ universeDefaultListModel.add(insertionIndex, item); } - } Modified: trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanUIUtil.java =================================================================== --- trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanUIUtil.java 2012-12-12 09:22:25 UTC (rev 2531) +++ trunk/jaxx-widgets/src/main/java/jaxx/runtime/swing/editor/bean/BeanUIUtil.java 2012-12-12 16:33:34 UTC (rev 2532) @@ -24,6 +24,9 @@ */ package jaxx.runtime.swing.editor.bean; +import org.apache.commons.beanutils.PropertyUtils; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Method; import org.nuiton.util.decorator.Decorator; import org.nuiton.util.decorator.DecoratorUtil; import org.nuiton.util.decorator.JXPathDecorator; @@ -273,7 +276,28 @@ separatorReplacement ); } + + public static Method getMutator(Object bean, String property) { + Method mutator = null; + if (bean == null) { + throw new NullPointerException("could not find bean"); + } + if (property == null) { + throw new NullPointerException("could not find property"); + } + try { + PropertyDescriptor descriptor = PropertyUtils.getPropertyDescriptor(bean, property); + if (descriptor != null) { + mutator = descriptor.getWriteMethod(); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + + return mutator; + } + public static abstract class PopupHandler implements Runnable { public static final Log log = LogFactory.getLog(PopupHandler.class);