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.util.HashSet;
026import java.util.Set;
027
028import javax.swing.JOptionPane;
029
030import csheets.core.Value;
031import csheets.ext.assertion.AssertableCell;
032import csheets.ext.assertion.Assertion;
033import csheets.ext.assertion.AssertionExtension;
034import csheets.ext.test.DuplicateUserTCPException;
035import csheets.ext.test.TestCaseParam;
036import csheets.ext.test.TestableCell;
037import csheets.ui.ctrl.UIController;
038
039/**
040 * A controller for updating the test case parameters of a cell.
041 * @author Einar Pehrson
042 */
043public class TestCaseParamController {
044
045        /** The user interface controller */
046        private UIController uiController;
047
048        /**
049         * Creates a new test case parameter controller.
050         * @param uiController the user interface controller
051         */
052        public TestCaseParamController(UIController uiController) {
053                this.uiController = uiController;
054        }
055
056        /**
057         * Sets the active cell's user-specified testcase parameters.
058         * @param cell the cell to add the parameter to
059         * @param content the content of the parameter to be added
060         * @param unChangedParams a set containing all parameters that were not changed
061         * @return true the parameter that was added, or null if the parameter was not added
062         */
063        public TestCaseParam setTestCaseParams(TestableCell cell, String content,
064                                Set<TestCaseParam> unChangedParams) {
065                // Checks if any parameters were removed
066                Set<TestCaseParam> oldParams = new HashSet<TestCaseParam>(cell.getTestCaseParams());
067                oldParams.removeAll(unChangedParams);
068
069                if (!oldParams.isEmpty())
070                        // Parameters were removed
071                        for (TestCaseParam removedParam : oldParams)
072                                cell.removeTestCaseParam(removedParam);
073
074                // Checks if a parameter was added
075                if(content != null) {
076                        Value value = Value.parseValue(content);
077
078                        // Asserts if possible
079                        if (value.getType() == Value.Type.NUMERIC) {
080                                AssertableCell assertableCell
081                                        = (AssertableCell)cell.getExtension(AssertionExtension.NAME);
082                                if (assertableCell != null) {
083                                        if (assertableCell.isAsserted())
084                                                if (assertableCell.assertAny(value) == Assertion.Result.FAILED)
085                                                        // Shows error, should perhaps ask for corfirmation?
086                                                        showError("The test case parameter that was entered for cell " + 
087                                                                cell + " violated the cell's assertion.");
088                                }
089                        }
090
091                        // Attempts to add the parameter
092                        try {
093                                TestCaseParam param = cell.addTestCaseParam(value);
094                                uiController.setWorkbookModified(cell.getSpreadsheet().getWorkbook());
095                                return param;
096                        } catch (DuplicateUserTCPException e) {
097                                // Informs user that the parameter could not be added
098                                showError(e.getMessage());
099                                return null;
100                        }
101                } else
102                        return null;
103        }
104
105        /**
106         * Shows an error dialog displaying the given message.
107         */
108        private void showError(Object message) {
109                JOptionPane.showMessageDialog(
110                        null,
111                        message,
112                        "Error",
113                        JOptionPane.ERROR_MESSAGE
114                );
115        }
116}