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.Color;
026    import java.awt.Font;
027    import java.awt.Graphics;
028    import java.awt.Graphics2D;
029    
030    import javax.swing.JComponent;
031    
032    import csheets.core.Cell;
033    import csheets.ext.test.TestExtension;
034    import csheets.ext.test.TestableCell;
035    import csheets.ui.ext.CellDecorator;
036    
037    /**
038     * A decorator for testable cells.
039     * @author Einar Pehrson
040     */
041    public class TestableCellDecorator extends CellDecorator {
042    
043            /** The font used to render the 'A' */
044            private static final Font font = new Font("Dialog", Font.PLAIN, 10);
045    
046            /** The color used to indicate a warning */
047            private static final Color warningColor = new Color(0.7f, 0.7f, 0f);
048    
049            /**
050             * Creates a new cell decorator.
051             */
052            public TestableCellDecorator() {}
053    
054            /**
055             * Decorates the given graphics context if the cell being rendered
056             * has a test error.
057             * @param component the cell renderer component
058             * @param g the graphics context on which drawing should be done
059             * @param cell the cell being rendered
060             * @param selected whether the cell is selected
061             * @param hasFocus whether the cell has focus
062             */
063            public void decorate(JComponent component, Graphics g, Cell cell,
064                            boolean selected, boolean hasFocus) {
065                    if (enabled) {
066                            // Checks for error
067                            TestableCell testableCell = (TestableCell)cell.getExtension(TestExtension.NAME);
068                            boolean hasError = testableCell.hasTestError();
069                            boolean hasWarning = testableCell.hasTestCases()
070                                    && testableCell.getTestedness() < 1.0;
071                            if (hasError || hasWarning) {
072                                    // Stores current graphics context properties
073                                    Graphics2D g2 = (Graphics2D)g;
074                                    Color oldPaint = g2.getColor();
075                                    Font oldFont = g2.getFont();
076    
077                                    // Selects color
078                                    if (hasError)
079                                            g2.setColor(Color.red);
080                                    else if (hasWarning)
081                                            g2.setColor(warningColor);
082            
083                                    // Prints 'T' using own font, then restores the old font
084                                    g2.setFont(font);
085                                    g2.drawString("T", 12, 12);
086            
087                                    // Restores graphics context properties
088                                    g2.setColor(oldPaint);
089                                    g2.setFont(oldFont);
090                            }
091                    }
092            }
093    }