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}