Author: pmouawad
Date: Mon Mar 14 20:29:36 2016
New Revision: 1734993

URL: http://svn.apache.org/viewvc?rev=1734993&view=rev
Log:
Bug 59108 - TableEditor: Allow rows to be moved up and down 
#resolve #163
https://github.com/apache/jmeter/pull/163/
Bugzilla Id: 59108

Modified:
    jmeter/trunk/src/core/org/apache/jmeter/testbeans/gui/TableEditor.java
    jmeter/trunk/xdocs/changes.xml

Modified: jmeter/trunk/src/core/org/apache/jmeter/testbeans/gui/TableEditor.java
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/testbeans/gui/TableEditor.java?rev=1734993&r1=1734992&r2=1734993&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/testbeans/gui/TableEditor.java 
(original)
+++ jmeter/trunk/src/core/org/apache/jmeter/testbeans/gui/TableEditor.java Mon 
Mar 14 20:29:36 2016
@@ -42,6 +42,7 @@ import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
 import javax.swing.event.TableModelEvent;
 import javax.swing.event.TableModelListener;
+import javax.swing.table.TableCellEditor;
 
 import org.apache.jmeter.gui.ClearGui;
 import org.apache.jmeter.testelement.property.TestElementProperty;
@@ -85,6 +86,8 @@ public class TableEditor extends Propert
     private final JButton clipButton;
     private final JButton removeButton;
     private final JButton clearButton;
+    private final JButton upButton;
+    private final JButton downButton;
 
     public TableEditor() {
         addButton = new JButton(JMeterUtils.getResString("add")); // 
$NON-NLS-1$
@@ -95,6 +98,10 @@ public class TableEditor extends Propert
         removeButton.addActionListener(new RemoveListener());
         clearButton = new JButton(JMeterUtils.getResString("clear")); // 
$NON-NLS-1$
         clearButton.addActionListener(new ClearListener());
+        upButton = new JButton(JMeterUtils.getResString("up")); // $NON-NLS-1$
+        upButton.addActionListener(new UpListener());
+        downButton = new JButton(JMeterUtils.getResString("down")); // 
$NON-NLS-1$
+        downButton.addActionListener(new DownListener());
     }
 
     @Override
@@ -120,8 +127,14 @@ public class TableEditor extends Propert
         JPanel south = new JPanel();
         south.add(addButton);
         south.add(clipButton);
+        removeButton.setEnabled(false);
         south.add(removeButton);
+        clearButton.setEnabled(false);
         south.add(clearButton);
+        upButton.setEnabled(false);
+        south.add(upButton);
+        downButton.setEnabled(false);
+        south.add(downButton);
         p.add(south,BorderLayout.SOUTH);
         return p;
     }
@@ -143,6 +156,23 @@ public class TableEditor extends Propert
         } else {
             model.clearData();
         }
+        
+        if(model.getRowCount()>0) {
+            removeButton.setEnabled(true);
+            clearButton.setEnabled(true);
+        } else {
+            removeButton.setEnabled(false);
+            clearButton.setEnabled(false);
+        }
+        
+        if(model.getRowCount()>1) {
+            upButton.setEnabled(true);
+            downButton.setEnabled(true);
+        } else {
+            upButton.setEnabled(false);
+            downButton.setEnabled(false);
+        }
+        
         this.firePropertyChange();
     }
 
@@ -273,6 +303,9 @@ public class TableEditor extends Propert
         public void actionPerformed(ActionEvent e) {
             try {
                 model.addRow(clazz.newInstance());
+                
+                removeButton.setEnabled(true);
+                clearButton.setEnabled(true);
             } catch(Exception err) {
                 LOG.error("The class type given to TableEditor was not 
instantiable. ", err);
             }
@@ -298,6 +331,14 @@ public class TableEditor extends Propert
                         model.setValueAt(columns[i], model.getRowCount() - 1, 
i);
                     }
                 }
+
+                if(model.getRowCount()>1) {
+                    upButton.setEnabled(true);
+                    downButton.setEnabled(true);
+                } else {
+                    upButton.setEnabled(false);
+                    downButton.setEnabled(false);
+                }
             } catch (Exception err) {
                 LOG.error("The class type given to TableEditor was not 
instantiable. ", err);
             }
@@ -308,9 +349,17 @@ public class TableEditor extends Propert
         @Override
         public void actionPerformed(ActionEvent e) {
             int[] rows = table.getSelectedRows();
-            for(int i=0;i<rows.length;i++){
+            for(int i=0; i<rows.length; i++){
               model.removeRow(rows[i]-i);
             }
+            
+            if(model.getRowCount()>1) {
+                upButton.setEnabled(true);
+                downButton.setEnabled(true);
+            } else {
+                upButton.setEnabled(false);
+                downButton.setEnabled(false);
+            }
         }
     }
 
@@ -318,6 +367,46 @@ public class TableEditor extends Propert
         @Override
         public void actionPerformed(ActionEvent e) {
             model.clearData();
+            
+            upButton.setEnabled(false);
+            downButton.setEnabled(false);
+        }
+    }
+    
+    private class UpListener implements ActionListener {
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            cancelEditing();
+
+            int[] rowsSelected = table.getSelectedRows();
+            if (rowsSelected.length > 0 && rowsSelected[0] > 0) {
+                table.clearSelection();
+                for (int rowSelected : rowsSelected) {
+                    model.moveRow(rowSelected, rowSelected + 1, rowSelected - 
1);
+                }
+                for (int rowSelected : rowsSelected) {
+                    table.addRowSelectionInterval(rowSelected - 1, rowSelected 
- 1);
+                }
+            }            
+        }
+    }
+    
+    private class DownListener implements ActionListener {
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            cancelEditing();
+            
+            int[] rowsSelected = table.getSelectedRows();
+            if (rowsSelected.length > 0 && rowsSelected[rowsSelected.length - 
1] < table.getRowCount() - 1) {
+                table.clearSelection();
+                for (int i = rowsSelected.length - 1; i >= 0; i--) {
+                    int rowSelected = rowsSelected[i];
+                    model.moveRow(rowSelected, rowSelected + 1, rowSelected + 
1);
+                }
+                for (int rowSelected : rowsSelected) {
+                    table.addRowSelectionInterval(rowSelected + 1, rowSelected 
+ 1);
+                }
+            }
         }
     }
 
@@ -325,5 +414,17 @@ public class TableEditor extends Propert
     public void clearGui() {
         this.model.clearData();
     }
+    
+    /**
+     * Cancel cell editing if it is being edited
+     */
+    private void cancelEditing() {
+        // If a table cell is being edited, we must cancel the editing before
+        // deleting the row
+        if (table.isEditing()) {
+            TableCellEditor cellEditor = 
table.getCellEditor(table.getEditingRow(), table.getEditingColumn());
+            cellEditor.cancelCellEditing();
+        }
+    }
 
 }

Modified: jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1734993&r1=1734992&r2=1734993&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Mon Mar 14 20:29:36 2016
@@ -208,6 +208,7 @@ Summary
   <li><bug>58773</bug>TestCacheManager : Add tests for CacheManager that use 
HttpClient 4</li>
   <li><bug>58742</bug>CompareAssertion : Reset data in TableEditor when 
switching between different CompareAssertions in gui.
       Based on a patch by Vincent Herilier (vherilier at gmail.com)</li>
+  <li><bug>59108</bug>TableEditor: Allow rows to be moved up and down. 
Contributed by Vincent Herilier (vherilier at gmail.com)</li>
   <li><bug>58848</bug>Argument Panel : when adding an argument (add button or 
from clipboard) scroll the table to the new line. Contributed by Benoit Wiart 
(benoit dot wiart at gmail.com)</li>
   <li><bug>58865</bug>Allow empty default value in the Regular Expression 
Extractor. Contributed by Benoit Wiart (benoit dot wiart at gmail.com)</li>
   <li><bug>59156</bug>XMLAssertion : drop jdom dependency by using 
XMLReader</li>


Reply via email to