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.Dimension;
026
027import javax.swing.Icon;
028import javax.swing.ImageIcon;
029import javax.swing.JLabel;
030import javax.swing.JProgressBar;
031import javax.swing.JToolBar;
032
033import csheets.core.Cell;
034import csheets.ext.test.TestExtension;
035import csheets.ext.test.TestableCell;
036import csheets.ext.test.TestableCellListener;
037import csheets.ext.test.TestableSpreadsheet;
038import csheets.ui.ctrl.SelectionEvent;
039import csheets.ui.ctrl.SelectionListener;
040
041/**
042 * A toolbar that shows information about test cases.
043 * @author Lars Magnus "Burken" Lang
044 * @author Sebastian Kekkonen
045 */
046@SuppressWarnings("serial")
047public class TestToolBar extends JToolBar implements SelectionListener,
048                TestableCellListener {
049
050        private JProgressBar cellTestednessBar;
051        private JProgressBar spreadsheetTestednessBar;
052        private JLabel lightLabelTestCases;
053        private Icon redIcon;
054        private Icon yellowIcon;
055        private Icon greenIcon;
056
057        public TestToolBar() {
058                setName(TestExtension.NAME);
059
060                // Loads icons
061                redIcon = new ImageIcon(TestExtension.class.getResource(
062                        "res/img/light_red.gif"), "Red light");
063                yellowIcon = new ImageIcon(TestExtension.class.getResource(
064                        "res/img/light_yellow.gif"), "Yellow light");
065                greenIcon = new ImageIcon(TestExtension.class.getResource(
066                        "res/img/light_green.gif"), "Green light");
067
068                // Creates icon labels
069                lightLabelTestCases = new JLabel(yellowIcon);
070
071                // Creates cell testedness progress bar
072                cellTestednessBar = new JProgressBar(JProgressBar.VERTICAL);
073                cellTestednessBar.setPreferredSize(new Dimension(20, 20));
074                cellTestednessBar.setToolTipText("Cell Testedness");
075                cellTestednessBar.setString("0 %");
076
077                // Creates spreadsheet testedness progress bar
078                spreadsheetTestednessBar = new JProgressBar(JProgressBar.VERTICAL);
079                spreadsheetTestednessBar.setPreferredSize(new Dimension(20, 20));
080                spreadsheetTestednessBar.setToolTipText("Spreadsheet Testedness");
081                spreadsheetTestednessBar.setString("0 %");
082
083                // Lays out components
084                add(new JLabel(new ImageIcon(
085                                TestExtension.class.getResource("res/img/logo.gif"))));
086                addSeparator();
087                add(lightLabelTestCases);
088                addSeparator();
089                add(cellTestednessBar);
090                addSeparator();
091                add(spreadsheetTestednessBar);
092        }
093
094        public void selectionChanged(SelectionEvent event) {
095                Cell cell = event.getCell();
096                if (cell != null) {
097                        TestableCell activeCell = (TestableCell)cell.getExtension(TestExtension.NAME);
098                        activeCell.addTestableCellListener(this);
099                        testCasesChanged(activeCell);
100                } else {
101                        setTestCaseLamp(2);
102                        setTestCaseProgressBar(0);
103                }
104
105                // Stops listening to previous active cell
106                if (event.getPreviousCell() != null)
107                        ((TestableCell)event.getPreviousCell().getExtension(TestExtension.NAME))
108                                .removeTestableCellListener(this);
109
110                // Updates spreadsheet testedness
111                if (event.getSpreadsheet() != null) {
112                        TestableSpreadsheet spreadsheet = (TestableSpreadsheet)
113                                event.getSpreadsheet().getExtension(TestExtension.NAME);
114                        setSpreadsheetTestednessBar(spreadsheet.getTestedness());
115                } else
116                        setSpreadsheetTestednessBar(0);
117        }
118
119        public void testCasesChanged(TestableCell cell) {
120                // Updates cell testedness
121                double testedness = cell.getTestedness();
122                setTestCaseProgressBar(testedness);
123                if (cell.hasTestError())
124                        setTestCaseLamp(3);
125                else if (testedness < 1.0 )
126                        setTestCaseLamp(2);
127                else
128                        setTestCaseLamp(1);
129        }
130
131        public void testCaseParametersChanged(TestableCell cell) {}
132
133        /*
134         *
135         * @param lamp 1-green, 2-yellow, 3-red
136         */
137        private void setTestCaseLamp(int lamp){
138                switch(lamp){
139                case 1: 
140                        lightLabelTestCases.setIcon(greenIcon);
141                        break;
142                case 2:
143                        lightLabelTestCases.setIcon(yellowIcon);
144                        break;
145                case 3:
146                        lightLabelTestCases.setIcon(redIcon);
147                        break;
148                default:
149                        lightLabelTestCases.setIcon(yellowIcon);
150                        break;
151                }
152        }
153
154        private void setTestCaseProgressBar(double testedness){
155                cellTestednessBar.setValue((int)(testedness*100));
156                cellTestednessBar.setString((int)(testedness*100) + "%");                               
157        }
158
159        private void setSpreadsheetTestednessBar(double testedness){
160                spreadsheetTestednessBar.setValue((int)(testedness*100));
161                spreadsheetTestednessBar.setString((int)(testedness*100) + "%");
162        }
163}