Author: echatellier Date: 2015-05-29 14:13:59 +0000 (Fri, 29 May 2015) New Revision: 4239 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4239 Log: fixes #7172: Pouvoir r?\195?\169ordonner les regles Using drag and drop Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooser.jaxx trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooserHandler.java Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooser.jaxx =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooser.jaxx 2015-05-27 13:01:38 UTC (rev 4238) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooser.jaxx 2015-05-29 14:13:59 UTC (rev 4239) @@ -28,7 +28,7 @@ <RuleChooserHandler id="handler" constructorParams="this" /> <!-- Rules collection managed by current ui instance. --> - <java.util.List genericType='fr.ifremer.isisfish.rule.Rule' id="rulesList" javaBean='new java.util.ArrayList<fr.ifremer.isisfish.rule.Rule>()'/> + <java.util.List genericType='fr.ifremer.isisfish.rule.Rule' id="rulesList" javaBean='new java.util.ArrayList<>()'/> <!-- Active enabled binding property --> <Boolean id="active" javaBean="true"/> @@ -70,6 +70,7 @@ <JScrollPane enabled="{isActive()}"> <fr.ifremer.isisfish.ui.models.common.GenericListModel id="selectedRulesListModel" genericType="fr.ifremer.isisfish.rule.Rule" /> <JList id="selectedRulesList" selectionMode="{javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION}" + dragEnabled="true" dropMode="{DropMode.INSERT}" genericType="fr.ifremer.isisfish.rule.Rule" model='{selectedRulesListModel}' cellRenderer='{new fr.ifremer.isisfish.ui.models.rule.RuleListCellRenderer()}' onValueChanged='removeRuleButton.setEnabled(selectedRulesList.getSelectedIndex() != -1);clearRulesButton.setEnabled(selectedRulesList.getSelectedIndex() != -1);handler.displayRuleParameters()' /> Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooserHandler.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooserHandler.java 2015-05-27 13:01:38 UTC (rev 4238) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/RuleChooserHandler.java 2015-05-29 14:13:59 UTC (rev 4239) @@ -23,11 +23,24 @@ package fr.ifremer.isisfish.ui.simulator; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.dnd.DnDConstants; +import java.awt.dnd.DragGestureEvent; +import java.awt.dnd.DragGestureListener; +import java.awt.dnd.DragSource; +import java.awt.dnd.DragSourceAdapter; +import java.awt.dnd.DragSourceDropEvent; +import java.awt.dnd.DragSourceListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.List; +import javax.swing.JList; +import javax.swing.TransferHandler; + import fr.ifremer.isisfish.IsisFishException; import fr.ifremer.isisfish.IsisFishRuntimeException; import fr.ifremer.isisfish.datastore.RegionStorage; @@ -76,9 +89,83 @@ if (ruleChooser.isShowFactorColumn()) { SwingUtil.fixTableColumnWidth(ruleChooser.selectedRuleParameterTable, 2, 30); } + + setupSelectedListDnD(); } /** + * Setup drag and drop support on selected list. + */ + protected void setupSelectedListDnD() { + final JList<Rule> selectedRuleList = ruleChooser.getSelectedRulesList(); + + // transfert handler + selectedRuleList.setTransferHandler(new TransferHandler() { + private static final long serialVersionUID = 7821083182552085625L; + @Override + public boolean canImport(TransferHandler.TransferSupport support) { + boolean result = false; + + if (support.isDataFlavorSupported(DataFlavor.stringFlavor)) { + JList.DropLocation dl = (JList.DropLocation) support.getDropLocation(); + if (dl.getIndex() != -1) { + return true; + } + } + + return result; + } + @Override + public boolean importData(TransferHandler.TransferSupport support) { + boolean result = false; + + if (canImport(support)) { + Transferable transferable = support.getTransferable(); + try { + String indexString = (String) transferable.getTransferData(DataFlavor.stringFlavor); + + int index = Integer.parseInt(indexString); + JList.DropLocation dl = (JList.DropLocation) support.getDropLocation(); + int dropTargetIndex = dl.getIndex(); + + // perform real move + List<Rule> rules = ruleChooser.getRulesList(); + Rule rule = rules.remove(index); + rules.add(dropTargetIndex, rule); + + result = true; + } catch (Exception e) { + result = false; + } + } + + return result; + } + }); + + // drag source listener + final DragSourceListener dsl = new DragSourceAdapter() { + @Override + public void dragDropEnd(DragSourceDropEvent dsde) { + // update ui if move were successful + if (dsde.getDropSuccess()) { + ruleChooser.selectedRulesListModel.setElementList(ruleChooser.getRulesList()); + } + } + }; + + // drag gesture + final DragSource ds = new DragSource(); + ds.createDefaultDragGestureRecognizer(selectedRuleList, DnDConstants.ACTION_MOVE, new DragGestureListener() { + @Override + public void dragGestureRecognized(DragGestureEvent dge) { + StringSelection transferable = new StringSelection(Integer.toString(selectedRuleList.getSelectedIndex())); + ds.startDrag(dge, DragSource.DefaultCopyDrop, transferable, dsl); + } + }); + } + + /** * Get new instance for selected rules names and add it to {@code rulesList} list. */ protected void addSelectedRules() {