--- src/components/org/apache/jmeter/assertions/gui/AssertionGui.java (revision 1754657) +++ src/components/org/apache/jmeter/assertions/gui/AssertionGui.java (working copy) @@ -20,21 +20,26 @@ import java.awt.BorderLayout; import java.awt.Dimension; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.IOException; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JCheckBox; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTable; -import javax.swing.table.TableCellEditor; +import javax.swing.ListSelectionModel; import org.apache.jmeter.assertions.ResponseAssertion; +import org.apache.jmeter.gui.GuiPackage; import org.apache.jmeter.gui.util.HeaderAsPropertyRenderer; import org.apache.jmeter.gui.util.PowerTableModel; import org.apache.jmeter.gui.util.TextAreaCellRenderer; @@ -365,6 +370,9 @@ tableModel = new PowerTableModel(new String[] { COL_RESOURCE_NAME }, new Class[] { String.class }); stringTable = new JTable(tableModel); stringTable.getTableHeader().setDefaultRenderer(new HeaderAsPropertyRenderer()); + stringTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + JMeterUtils.applyHiDPI(stringTable); + TextAreaCellRenderer renderer = new TextAreaCellRenderer(); stringTable.setRowHeight(renderer.getPreferredHeight()); @@ -390,6 +398,9 @@ private JPanel createButtonPanel() { JButton addPattern = new JButton(JMeterUtils.getResString("add")); //$NON-NLS-1$ addPattern.addActionListener(new AddPatternListener()); + + JButton addFromClipboardPattern = new JButton(JMeterUtils.getResString("add_from_clipboard")); //$NON-NLS-1$ + addFromClipboardPattern.addActionListener(new AddFromClipboardListener()); deletePattern = new JButton(JMeterUtils.getResString("delete")); //$NON-NLS-1$ deletePattern.addActionListener(new ClearPatternsListener()); @@ -397,6 +408,7 @@ JPanel buttonPanel = new JPanel(); buttonPanel.add(addPattern); + buttonPanel.add(addFromClipboardPattern); buttonPanel.add(deletePattern); return buttonPanel; } @@ -427,14 +439,62 @@ /** * An ActionListener for adding a pattern. - * */ private class AddPatternListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { + GuiUtils.stopTableEditing(stringTable); tableModel.addNewRow(); + checkButtonsStatus(); + tableModel.fireTableDataChanged(); + } + } + + /** + * An ActionListener for pasting from clipboard + */ + private class AddFromClipboardListener implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { deletePattern.setEnabled(true); + GuiUtils.stopTableEditing(stringTable); + int rowCount = stringTable.getRowCount(); + try { + String clipboardContent = GuiUtils.getPastedText(); + if(clipboardContent == null) { + return; + } + String[] clipboardLines = clipboardContent.split("\n"); + for (String clipboardLine : clipboardLines) { + tableModel.addRow(new Object[] { clipboardLine.trim() }); + } + if (stringTable.getRowCount() > rowCount) { + checkButtonsStatus(); + + // Highlight (select) and scroll to the appropriate rows. + int rowToSelect = tableModel.getRowCount() - 1; + stringTable.setRowSelectionInterval(rowCount, rowToSelect); + stringTable.scrollRectToVisible(stringTable.getCellRect(rowCount, 0, true)); + } + } catch (IOException ioe) { + JOptionPane.showMessageDialog(GuiPackage.getInstance().getMainFrame(), + "Could not add data from clipboard:\n" + ioe.getLocalizedMessage(), "Error", + JOptionPane.ERROR_MESSAGE); + } catch (UnsupportedFlavorException ufe) { + JOptionPane.showMessageDialog(GuiPackage.getInstance().getMainFrame(), + "Could not add retrieve " + DataFlavor.stringFlavor.getHumanPresentableName() + + " from clipboard" + ufe.getLocalizedMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } tableModel.fireTableDataChanged(); } } + + protected void checkButtonsStatus() { + // Disable DELETE if there are no rows in the table to delete. + if (tableModel.getRowCount() == 0) { + deletePattern.setEnabled(false); + } else { + deletePattern.setEnabled(true); + } + } }