001    /*
002     * Copyright (c) 2005 Peter Palotas, Fredrik Johansson, Einar Pehrson,
003     * Sebastian Kekkonen, Lars Magnus Lång, Malin Johansson and Sofia Nilsson
004     *
005     * This file is part of
006     * CleanSheets Extension for Assertions
007     *
008     * CleanSheets Extension for Assertions 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 Assertions 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 Assertions; if not, write to the
020     * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
021     * Boston, MA  02111-1307  USA
022     */
023    package csheets.ext.assertion.ui;
024    
025    import java.awt.Color;
026    
027    import javax.swing.JOptionPane;
028    
029    import csheets.ext.assertion.AssertableCell;
030    import csheets.ext.assertion.Assertion;
031    import csheets.ext.assertion.AssertionException;
032    import csheets.ext.assertion.AssertionWarning;
033    import csheets.ext.assertion.USAssertion;
034    import csheets.ui.ctrl.UIController;
035    
036    /**
037     * A controller for updating the user-specified assertion of a cell.
038     * @author Einar Pehrson
039     */
040    public class AssertionController {
041    
042            /** The user interface controller */
043            private UIController uiController;
044    
045            /**
046             * Creates a new assertion controller.
047             * @param uiController the user interface controller
048             */
049            public AssertionController(UIController uiController) {
050                    this.uiController = uiController;
051            }
052    
053            /**
054             * Attempts to create a new assertion from the given string.
055             * If successful, adds the assertion to the given cell.
056             * Otherwise, displays an error message.
057             * If the input string is empty or null, the assertion is set to null.
058             * @param cell the cell for which the assertion should be set
059             * @param assertionString the assertion, as entered by the user
060             * @return true if the cell's assertion was changed
061             */
062            public boolean setAssertion(AssertableCell cell, String assertionString) {
063                    // Clears assertion, if insufficient input
064                    if (assertionString == null || assertionString.equals("")) {
065                            cell.setUSAssertion(null);
066                            return true;
067                    }
068    
069                    // Attempts to create the assertion
070                    USAssertion assertion;
071                    try {
072                            assertion = new USAssertion(assertionString);
073                    } catch (AssertionException e) {
074                            // Informs user that the assertion syntax was erroneous
075                            showError(e);
076                            return false;
077                    }
078    
079                    // Stores the assertion
080                    cell.setUSAssertion(assertion);
081                    uiController.setWorkbookModified(cell.getSpreadsheet().getWorkbook());
082    
083                    if (!assertion.isConsistent()) {
084                            // Informs user that the assertion has warnings
085                            String message = "The assertion may be incorrect or inconsistent:\n";
086                            for (AssertionWarning warning : assertion.getWarnings())
087                                    message += "\n" + warning;
088                            showError(message);
089                    }
090    
091                    return true;
092            }
093    
094            /**
095             * Assigns a color to the given assertion result.
096             * @param result the assertion result for which a color is wanted
097             * @return the appropriate color to use in the interface
098             */     
099            public static Color getAssertionResultColor(Assertion.Result result){
100                    switch (result) {
101                            case OK:
102                                    return new Color(0f, 0.7f, 0f);
103                            case NAN:
104                                    return new Color(0.7f, 0.0f, 0f);
105                            case FAILED:
106                                    return new Color(0.7f, 0.0f, 0f);
107                            case NO_DATA:
108                                    return new Color (0.7f, 0.7f, 0f);
109                            default:
110                                    return Color.BLACK;
111                    }
112            }
113    
114            /**
115             * Shows an error dialog displaying the given message.
116             */
117            private void showError(Object message) {
118                    JOptionPane.showMessageDialog(
119                            null,
120                            message,
121                            "Error",
122                            JOptionPane.ERROR_MESSAGE
123                    );
124            }
125    }