Author: pmouawad
Date: Wed Mar  9 20:57:50 2016
New Revision: 1734311

URL: http://svn.apache.org/viewvc?rev=1734311&view=rev
Log:
Bug 59105 - TableEditor : Add ability to paste rows from clipboard and delete 
multiple selection
#resolve #153
https://github.com/apache/jmeter/pull/153
Bugzilla Id: 59105

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=1734311&r1=1734310&r2=1734311&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 Wed 
Mar  9 20:57:50 2016
@@ -46,6 +46,7 @@ import javax.swing.event.TableModelListe
 import org.apache.jmeter.gui.ClearGui;
 import org.apache.jmeter.testelement.property.TestElementProperty;
 import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.gui.GuiUtils;
 import org.apache.jorphan.gui.ObjectTableModel;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.jorphan.reflect.Functor;
@@ -59,7 +60,7 @@ import org.apache.log.Logger;
  * </ul>
  */
 public class TableEditor extends PropertyEditorSupport implements 
FocusListener,TestBeanPropertyEditor,TableModelListener, ClearGui {
-    private static final Logger log = LoggingManager.getLoggerForClass();
+    private static final Logger LOG = LoggingManager.getLoggerForClass();
 
     /** 
      * attribute name for class name of a table row;
@@ -80,11 +81,16 @@ public class TableEditor extends Propert
     private ObjectTableModel model;
     private Class<?> clazz;
     private PropertyDescriptor descriptor;
-    private final JButton addButton,removeButton,clearButton;
+    private final JButton addButton;
+    private final JButton clipButton;
+    private final JButton removeButton;
+    private final JButton clearButton;
 
     public TableEditor() {
         addButton = new JButton(JMeterUtils.getResString("add")); // 
$NON-NLS-1$
         addButton.addActionListener(new AddListener());
+        clipButton = new 
JButton(JMeterUtils.getResString("add_from_clipboard")); // $NON-NLS-1$
+        clipButton.addActionListener(new ClipListener());
         removeButton = new JButton(JMeterUtils.getResString("remove")); // 
$NON-NLS-1$
         removeButton.addActionListener(new RemoveListener());
         clearButton = new JButton(JMeterUtils.getResString("clear")); // 
$NON-NLS-1$
@@ -104,15 +110,16 @@ public class TableEditor extends Propert
         return pane;
     }
 
-    private JComponent makePanel()
-    {
+    private JComponent makePanel() {
         JPanel p = new JPanel(new BorderLayout());
         JScrollPane scroller = new JScrollPane(table);
+        table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
         scroller.setMinimumSize(new Dimension(100, 70));
         scroller.setPreferredSize(scroller.getMinimumSize());
         p.add(scroller,BorderLayout.CENTER);
         JPanel south = new JPanel();
         south.add(addButton);
+        south.add(clipButton);
         south.add(removeButton);
         south.add(clearButton);
         p.add(south,BorderLayout.SOUTH);
@@ -131,27 +138,20 @@ public class TableEditor extends Propert
 
     @Override
     public void setValue(Object value) {
-        if(value != null)
-        {
+        if(value != null) {
             model.setRows(convertCollection((Collection<?>)value));
-        }
-        else {
+        } else {
             model.clearData();
         }
         this.firePropertyChange();
     }
 
-    private Collection<Object> convertCollection(Collection<?> values)
-    {
+    private Collection<Object> convertCollection(Collection<?> values) {
         List<Object> l = new LinkedList<>();
-        for(Object obj : values)
-        {
-            if(obj instanceof TestElementProperty)
-            {
+        for(Object obj : values) {
+            if(obj instanceof TestElementProperty) {
                 l.add(((TestElementProperty)obj).getElement());
-            }
-            else
-            {
+            } else {
                 l.add(obj);
             }
         }
@@ -185,15 +185,12 @@ public class TableEditor extends Propert
     void initializeModel()
     {
         Object hdrs = descriptor.getValue(HEADERS);
-        if (!(hdrs instanceof String[])){
+        if (!(hdrs instanceof String[])) {
             throw new RuntimeException("attribute HEADERS must be a String 
array");            
         }
-        if(clazz == String.class)
-        {
+        if(clazz == String.class) {
             model = new ObjectTableModel((String[])hdrs,new Functor[0],new 
Functor[0],new Class[]{String.class});
-        }
-        else
-        {
+        } else {
             Object value = descriptor.getValue(OBJECT_PROPERTIES);
             if (!(value instanceof String[])) {
                 throw new RuntimeException("attribute OBJECT_PROPERTIES must 
be a String array");
@@ -203,8 +200,7 @@ public class TableEditor extends Propert
             Functor[] readers = new Functor[props.length];
             Class<?>[] editors = new Class[props.length];
             int count = 0;
-            for(String propName : props)
-            {
+            for(String propName : props) {
                 propName = propName.substring(0,1).toUpperCase(Locale.ENGLISH) 
+ propName.substring(1);
                 writers[count] = createWriter(clazz,propName);
                 readers[count] = createReader(clazz,propName);
@@ -220,30 +216,25 @@ public class TableEditor extends Propert
         table.addFocusListener(this);
     }
 
-    Functor createWriter(Class<?> c,String propName)
-    {
+    Functor createWriter(Class<?> c,String propName) {
         String setter = "set" + propName; // $NON-NLS-1$
         return new Functor(setter);
     }
 
-    Functor createReader(Class<?> c,String propName)
-    {
+    Functor createReader(Class<?> c,String propName) {
         String getter = "get" + propName; // $NON-NLS-1$
-        try
-        {
+        try {
             c.getMethod(getter,new Class[0]);
             return new Functor(getter);
+        } catch(Exception e) {
+            return new Functor("is" + propName);
         }
-        catch(Exception e) { return new Functor("is" + propName); }
     }
 
-    Class<?> getArgForWriter(Class<?> c,String propName)
-    {
+    Class<?> getArgForWriter(Class<?> c,String propName) {
         String setter = "set" + propName; // $NON-NLS-1$
-        for(Method m : c.getMethods())
-        {
-            if(m.getName().equals(setter))
-            {
+        for(Method m : c.getMethods()) {
+            if(m.getName().equals(setter)) {
                 return m.getParameterTypes()[0];
             }
         }
@@ -265,53 +256,67 @@ public class TableEditor extends Propert
         final int editingRow = table.getEditingRow();
         final int editingColumn = table.getEditingColumn();
         CellEditor ce = null;
-        if (editingRow != -1 && editingColumn != -1){
+        if (editingRow != -1 && editingColumn != -1) {
             ce = table.getCellEditor(editingRow,editingColumn);
         }
         Component editor = table.getEditorComponent();
-        if(ce != null && (editor == null || editor != 
e.getOppositeComponent()))
-        {
+        if(ce != null && (editor == null || editor != 
e.getOppositeComponent())) {
             ce.stopCellEditing();
-        }
-        else if(editor != null)
-        {
+        } else if(editor != null) {
             editor.addFocusListener(this);
         }
         this.firePropertyChange();
     }
 
-    private class AddListener implements ActionListener
-    {
+    private class AddListener implements ActionListener {
         @Override
-        public void actionPerformed(ActionEvent e)
-        {
-            try
-            {
+        public void actionPerformed(ActionEvent e) {
+            try {
                 model.addRow(clazz.newInstance());
-            }catch(Exception err)
-            {
-                log.error("The class type given to TableEditor was not 
instantiable. ",err);
+            } catch(Exception err) {
+                LOG.error("The class type given to TableEditor was not 
instantiable. ", err);
+            }
+        }
+    }
+    
+    private class ClipListener implements ActionListener {
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            try {
+                String clipboardContent = GuiUtils.getPastedText();
+                if(clipboardContent == null) {
+                    return;
+                }
+
+                String[] clipboardLines = clipboardContent.split("\n"); // 
$NON-NLS-1$
+                for (String clipboardLine : clipboardLines) {
+                    String[] columns = clipboardLine.split("\t"); // 
$NON-NLS-1$
+
+                    model.addRow(clazz.newInstance());
+                    
+                    for (int i=0; i < columns.length; i++) {
+                        model.setValueAt(columns[i], model.getRowCount() - 1, 
i);
+                    }
+                }
+            } catch (Exception err) {
+                LOG.error("The class type given to TableEditor was not 
instantiable. ", err);
             }
         }
     }
 
-    private class RemoveListener implements ActionListener
-    {
+    private class RemoveListener implements ActionListener {
         @Override
-        public void actionPerformed(ActionEvent e)
-        {
-            int row = table.getSelectedRow();
-            if (row >= 0) {
-                model.removeRow(row);
+        public void actionPerformed(ActionEvent e) {
+            int[] rows = table.getSelectedRows();
+            for(int i=0;i<rows.length;i++){
+              model.removeRow(rows[i]-i);
             }
         }
     }
 
-    private class ClearListener implements ActionListener
-    {
+    private class ClearListener implements ActionListener {
         @Override
-        public void actionPerformed(ActionEvent e)
-        {
+        public void actionPerformed(ActionEvent e) {
             model.clearData();
         }
     }

Modified: jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1734311&r1=1734310&r2=1734311&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Wed Mar  9 20:57:50 2016
@@ -257,6 +257,7 @@ Summary
 <li><bug>58715</bug>Feature request: Bundle groovy-all with JMeter</li>
 <li><bug>59095</bug>Remove UserParameterXMLParser that was deprecated 8 years 
ago. Contributed by Benoit Wiart (benoit dot wiart at gmail.com)</li>
 <li><bug>58426</bug>Use DPI scaling of interface for high resolution devices 
(HiDPI support for Windows/Linux) - <i>BETA</i> see hidpi properties in 
bin/jmeter.properties</li>
+<li><bug>59105</bug>TableEditor : Add ability to paste rows from clipboard and 
delete multiple selection. Contributed by Vincent Herilier (vherilier at 
gmail.com)</li>
 </ul>
 <ch_section>Non-functional changes</ch_section>
 <ul>
@@ -404,7 +405,6 @@ Summary
 <li>Florent Sabbe (f dot sabbe at ubik-ingenierie.com)</li>
 <li>Antonio Gomes Rodrigues (ra0077 at gmail.com)</li>
 <li>Harrison Termotto (harrison dot termotto at stonybrook.edu</li>
-<li>Vincent Herilier (vherilier at gmail.com)</li>
 <li>Denis Kirpichenkov (denis.kirpichenkov at gmail.com)</li>
 <li>Gary Gregory (ggregory at apache.org)</li>
 </ul>


Reply via email to