001    /*
002     * Copyright (c) 2005 Jens Schou, Staffan Gustafsson, Björn 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     */
023    package csheets.ext.test.ui;
024    
025    import java.awt.Dimension;
026    
027    import javax.swing.Icon;
028    import javax.swing.ImageIcon;
029    import javax.swing.JLabel;
030    import javax.swing.JProgressBar;
031    import javax.swing.JToolBar;
032    
033    import csheets.core.Cell;
034    import csheets.ext.test.TestExtension;
035    import csheets.ext.test.TestableCell;
036    import csheets.ext.test.TestableCellListener;
037    import csheets.ext.test.TestableSpreadsheet;
038    import csheets.ui.ctrl.SelectionEvent;
039    import csheets.ui.ctrl.SelectionListener;
040    
041    /**
042     * A toolbar that shows information about test cases.
043     * @author Lars Magnus "Burken" Lång
044     * @author Sebastian Kekkonen
045     */
046    @SuppressWarnings("serial")
047    public 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    }