// $Header: /home/cvs/jakarta-jmeter/src/components/org/apache/jmeter/modifiers/gui/UserParametersGui.java,v 1.17.2.1 2004/06/12 16:44:34 mstover1 Exp $
/*
* Copyright 2002-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.jmeter.modifiers.gui;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableCellEditor;
import org.apache.jmeter.gui.util.PowerTableModel;
import org.apache.jmeter.gui.util.VerticalPanel;
import org.apache.jmeter.modifiers.UserParameters;
import org.apache.jmeter.processor.gui.AbstractPreProcessorGui;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.property.CollectionProperty;
import org.apache.jmeter.testelement.property.PropertyIterator;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
/**
* @version $Revision: 1.17.2.1 $
*/
public class UserParametersGui extends AbstractPreProcessorGui
{
private static Logger log = LoggingManager.getLoggerForClass();
private String THREAD_COLUMNS = JMeterUtils.getResString("user");
private JTable paramTable;
private PowerTableModel tableModel;
private int numUserColumns = 1;
private JButton addParameterButton,
addUserButton,
deleteRowButton,
deleteColumnButton;
private JCheckBox perIterationCheck;
public UserParametersGui()
{
super();
init();
}
public String getLabelResource()
{
return "user_parameters_title";
}
public void configure(TestElement el)
{
initTableModel();
paramTable.setModel(tableModel);
UserParameters params = (UserParameters) el;
CollectionProperty names = params.getNames();
CollectionProperty threadValues = params.getThreadLists();
tableModel.setColumnData(0, (List) names.getObjectValue());
PropertyIterator iter = threadValues.iterator();
if (iter.hasNext())
{
tableModel.setColumnData(1, (List) iter.next().getObjectValue());
}
int count = 2;
while (iter.hasNext())
{
String colName = THREAD_COLUMNS + "_" + count;
tableModel.addNewColumn(colName, String.class);
tableModel.setColumnData(
count,
(List) iter.next().getObjectValue());
count++;
}
perIterationCheck.setSelected(params.isPerIteration());
super.configure(el);
}
/**
* @see org.apache.jmeter.gui.JMeterGUIComponent#createTestElement()
*/
public TestElement createTestElement()
{
UserParameters params = new UserParameters();
modifyTestElement(params);
return params;
}
/**
* Modifies a given TestElement to mirror the data in the gui components.
* @see org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(TestElement)
*/
public void modifyTestElement(TestElement params)
{
if (paramTable.isEditing())
{
paramTable.getCellEditor().stopCellEditing();
}
((UserParameters) params).setNames(
new CollectionProperty(
UserParameters.NAMES,
tableModel.getColumnData(JMeterUtils.getResString("name"))));
CollectionProperty threadLists =
new CollectionProperty(
UserParameters.THREAD_VALUES,
new ArrayList());
log.debug("making threadlists from gui = " + threadLists);
for (int x = 1; x < tableModel.getColumnCount(); x++)
{
threadLists.addItem(
tableModel.getColumnData(THREAD_COLUMNS + "_" + x));
log.debug(
"Adding column to threadlist: "
+ tableModel.getColumnData(THREAD_COLUMNS + "_" + x));
log.debug("Threadlists now = " + threadLists);
}
log.debug("In the end, threadlists = " + threadLists);
((UserParameters) params).setThreadLists(threadLists);
((UserParameters) params).setPerIteration(
perIterationCheck.isSelected());
super.configureTestElement(params);
}
private void init()
{
setBorder(makeBorder());
setLayout(new BorderLayout());
JPanel vertPanel = new VerticalPanel();
vertPanel.add(makeTitlePanel());
perIterationCheck =
new JCheckBox(JMeterUtils.getResString("update_per_iter"), true);
Box perIterationPanel = Box.createHorizontalBox();
perIterationPanel.add(perIterationCheck);
perIterationPanel.add(Box.createHorizontalGlue());
vertPanel.add(perIterationPanel);
add(vertPanel, BorderLayout.NORTH);
add(makeParameterPanel(), BorderLayout.CENTER);
}
private JPanel makeParameterPanel()
{
JLabel tableLabel =
new JLabel(JMeterUtils.getResString("user_parameters_table"));
initTableModel();
paramTable = new JTable(tableModel);
//paramTable.setRowSelectionAllowed(true);
//paramTable.setColumnSelectionAllowed(true);
paramTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//paramTable.setCellSelectionEnabled(true);
//paramTable.setPreferredScrollableViewportSize(new Dimension(100, 70));
JPanel paramPanel = new JPanel(new BorderLayout());
paramPanel.add(tableLabel, BorderLayout.NORTH);
JScrollPane scroll = new JScrollPane(paramTable);
scroll.setPreferredSize(scroll.getMinimumSize());
paramPanel.add(scroll, BorderLayout.CENTER);
paramPanel.add(makeButtonPanel(), BorderLayout.SOUTH);
return paramPanel;
}
protected void initTableModel()
{
tableModel =
new PowerTableModel(
new String[] {
JMeterUtils.getResString("name"),
THREAD_COLUMNS + "_" + numUserColumns },
new Class[] { String.class, String.class });
}
private JPanel makeButtonPanel()
{
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(2, 2));
addParameterButton =
new JButton(JMeterUtils.getResString("add_parameter"));
addUserButton = new JButton(JMeterUtils.getResString("add_user"));
deleteRowButton =
new JButton(JMeterUtils.getResString("delete_parameter"));
deleteColumnButton =
new JButton(JMeterUtils.getResString("delete_user"));
buttonPanel.add(addParameterButton);
buttonPanel.add(deleteRowButton);
buttonPanel.add(addUserButton);
buttonPanel.add(deleteColumnButton);
addParameterButton.addActionListener(new AddParamAction());
addUserButton.addActionListener(new AddUserAction());
deleteRowButton.addActionListener(new DeleteRowAction());
deleteColumnButton.addActionListener(new DeleteColumnAction());
return buttonPanel;
}
private class AddParamAction implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (paramTable.isEditing())
{
TableCellEditor cellEditor =
paramTable.getCellEditor(
paramTable.getEditingRow(),
paramTable.getEditingColumn());
cellEditor.stopCellEditing();
}
tableModel.addNewRow();
tableModel.fireTableDataChanged();
// Enable DELETE (which may already be enabled, but it won't hurt)
deleteRowButton.setEnabled(true);
// Highlight (select) the appropriate row.
int rowToSelect = tableModel.getRowCount() - 1;
paramTable.setRowSelectionInterval(rowToSelect, rowToSelect);
}
}
private class AddUserAction implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (paramTable.isEditing())
{
TableCellEditor cellEditor =
paramTable.getCellEditor(
paramTable.getEditingRow(),
paramTable.getEditingColumn());
cellEditor.stopCellEditing();
}
tableModel.addNewColumn(
THREAD_COLUMNS + "_" + tableModel.getColumnCount(),
String.class);
tableModel.fireTableDataChanged();
// Enable DELETE (which may already be enabled, but it won't hurt)
deleteColumnButton.setEnabled(true);
// Highlight (select) the appropriate row.
int colToSelect = tableModel.getColumnCount() - 1;
paramTable.setColumnSelectionInterval(colToSelect, colToSelect);
}
}
private class DeleteRowAction implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (paramTable.isEditing())
{
TableCellEditor cellEditor =
paramTable.getCellEditor(
paramTable.getEditingRow(),
paramTable.getEditingColumn());
cellEditor.cancelCellEditing();
}
int rowSelected = paramTable.getSelectedRow();
if (rowSelected >= 0)
{
tableModel.removeRow(rowSelected);
tableModel.fireTableDataChanged();
// Disable DELETE if there are no rows in the table to delete.
if (tableModel.getRowCount() == 0)
{
deleteRowButton.setEnabled(false);
}
// Table still contains one or more rows, so highlight (select)
// the appropriate one.
else
{
int rowToSelect = rowSelected;
if (rowSelected >= tableModel.getRowCount())
{
rowToSelect = rowSelected - 1;
}
paramTable.setRowSelectionInterval(
rowToSelect,
rowToSelect);
}
}
}
}
private class DeleteColumnAction implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (paramTable.isEditing())
{
TableCellEditor cellEditor =
paramTable.getCellEditor(
paramTable.getEditingRow(),
paramTable.getEditingColumn());
cellEditor.cancelCellEditing();
}
int colSelected = paramTable.getSelectedColumn();
if (colSelected == 0 || colSelected == 1)
{
JOptionPane.showMessageDialog(
null,
JMeterUtils.getResString("column_delete_disallowed"),
"Error",
JOptionPane.ERROR_MESSAGE);
return;
}
if (colSelected >= 0)
{
tableModel.removeColumn(colSelected);
tableModel.fireTableDataChanged();
// Disable DELETE if there are no rows in the table to delete.
if (tableModel.getColumnCount() == 0)
{
deleteColumnButton.setEnabled(false);
}
// Table still contains one or more rows, so highlight (select)
// the appropriate one.
else
{
if (colSelected >= tableModel.getColumnCount())
{
colSelected = colSelected - 1;
}
paramTable.setColumnSelectionInterval(
colSelected,
colSelected);
}
}
}
}
}