001/* 002 * Copyright (c) 2005 Jens Schou, Staffan Gustafsson, Bjorn Lanneskog, 003 * Einar Pehrson and Sebastian Kekkonen 004 * 005 * This file is part of 006 * CleanSheets Extension for Test Cases 007 * 008 * CleanSheets Extension for Test Cases is free software; you can 009 * redistribute it and/or modify it under the terms of the GNU General Public 010 * License as published by the Free Software Foundation; either version 2 of 011 * the License, or (at your option) any later version. 012 * 013 * CleanSheets Extension for Test Cases is distributed in the hope that 014 * it will be useful, but WITHOUT ANY WARRANTY; without even the implied 015 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 016 * See the GNU General Public License for more details. 017 * 018 * You should have received a copy of the GNU General Public License 019 * along with CleanSheets Extension for Test Cases; if not, write to the 020 * Free Software Foundation, Inc., 59 Temple Place, Suite 330, 021 * Boston, MA 02111-1307 USA 022 */ 023package csheets.ext.test.ui; 024 025import java.awt.BorderLayout; 026import java.util.HashSet; 027import java.util.Set; 028import java.util.Vector; 029 030import javax.swing.JPanel; 031import javax.swing.JScrollPane; 032import javax.swing.event.TableModelEvent; 033import javax.swing.event.TableModelListener; 034import javax.swing.table.DefaultTableModel; 035 036import csheets.core.Cell; 037import csheets.ext.test.TestCaseParam; 038import csheets.ext.test.TestExtension; 039import csheets.ext.test.TestableCell; 040import csheets.ui.ctrl.SelectionEvent; 041import csheets.ui.ctrl.SelectionListener; 042import csheets.ui.ctrl.UIController; 043 044/** 045 * A panel for displaying and providing editing of test case parameters 046 * @author Bjorn Lanneskog 047 * @author Einar Pehrson 048 */ 049@SuppressWarnings("serial") 050public class TestCaseParamPanel extends JPanel implements SelectionListener { 051 052 /** Array which contains labels of columns in the table.*/ 053 private static final String[] columnNames = 054 {"Precedent", "", "", "", "", "", "", "", "", ""}; 055 056 /** The table model for this table.*/ 057 private DefaultTableModel tableModel; 058 059 /** The Visible table for entering test case params.*/ 060 private TestCaseParamTable table; 061 062 /** The test case parameter controller.*/ 063 private TestCaseParamController controller; 064 065 /** Determines whether the table arranger should respond to events. */ 066 private boolean listening = true; 067 068 /** 069 * Creates a new test case parameter panel. 070 * @param uiController the user interface controller 071 */ 072 public TestCaseParamPanel(UIController uiController) { 073 // Creates and configures table 074 controller = new TestCaseParamController(uiController); 075 tableModel = new DefaultTableModel(columnNames,0); 076 tableModel.addTableModelListener(new TestCaseParamSetter()); 077 table = new TestCaseParamTable(tableModel); 078 079 // Configures layout and adds components 080 setLayout(new BorderLayout()); 081 JScrollPane tableScrollPane = new JScrollPane(table); 082 add(tableScrollPane, BorderLayout.CENTER); 083 } 084 085 /** 086 * Updates the table of precedents when the active cell is changed. 087 * @param event the selection event that was fired 088 */ 089 public void selectionChanged(SelectionEvent event) { 090 listening = false; 091 092 // Clears the table 093 tableModel.setRowCount(0); 094 095 Cell cell = event.getCell(); 096 if (cell != null) { 097 // Resizes the table 098 Set<Cell> precedents = cell.getPrecedents(); 099 tableModel.setRowCount(precedents.size()); 100 101 // Adds the test case parameters of each precedent to the table 102 int row = 0; 103 for (Cell precedent : precedents) { 104 TestableCell testablePrecedent = (TestableCell)precedent.getExtension(TestExtension.NAME); 105 tableModel.setValueAt(testablePrecedent, row, 0); 106 int column = 1; 107 for (TestCaseParam param : testablePrecedent.getTestCaseParams()) { 108 if (tableModel.getColumnCount() - 1 == column) 109 tableModel.addColumn(""); 110 tableModel.setValueAt(param, row, column++); 111 } 112 row++; 113 } 114 table.packColumns(); 115 } 116 117 listening = true; 118 } 119 120 /** 121 * A table model listener for setting the test case parameters of a cell. 122 * @author Bjorn Lanneskog 123 * @author Einar Pehrson 124 */ 125 protected class TestCaseParamSetter implements TableModelListener { 126 127 public void tableChanged(TableModelEvent e) { 128 // If there has been an update on any column but the first 129 if(listening && e.getType() == TableModelEvent.UPDATE && e.getColumn() != 0 && listening == true) { 130 131 // Fetches the parameter and the cell 132 String param = tableModel.getValueAt(e.getFirstRow(), e.getColumn()).toString().trim(); 133 TestableCell cell = (TestableCell)tableModel.getValueAt(e.getFirstRow(), 0); 134 135 // Checks if the selected parameter was removed 136 if(param.equals("")) 137 param = null; 138 139 // Collects the unchanged parameters 140 Set<TestCaseParam> unChangedParams = new HashSet<TestCaseParam>(); 141 Vector params = (Vector)tableModel.getDataVector().elementAt(e.getFirstRow()); 142 for (Object o : params) 143 if(o instanceof TestCaseParam) 144 unChangedParams.add((TestCaseParam)o); 145 146 // Stores the parameter 147 TestCaseParam added = controller.setTestCaseParams(cell, param, unChangedParams); 148 listening = false; 149 if (added != null) { 150 tableModel.setValueAt(added, e.getFirstRow(), e.getColumn()); 151 // If the last column was filled, adds another 152 } else 153 tableModel.setValueAt("", e.getFirstRow(), e.getColumn()); 154 listening = true; 155 156 // Packs the column 157 table.packColumn(e.getColumn()); 158 } 159 } 160 } 161}