001    /*
002     * Copyright (c) 2005 Einar Pehrson <einar@pehrson.nu>.
003     *
004     * This file is part of
005     * CleanSheets - a spreadsheet application for the Java platform.
006     *
007     * CleanSheets is free software; you can redistribute it and/or modify
008     * it under the terms of the GNU General Public License as published by
009     * the Free Software Foundation; either version 2 of the License, or
010     * (at your option) any later version.
011     *
012     * CleanSheets is distributed in the hope that it will be useful,
013     * but WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
015     * GNU General Public License for more details.
016     *
017     * You should have received a copy of the GNU General Public License
018     * along with CleanSheets; if not, write to the Free Software
019     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
020     */
021    package csheets.ui.grid;
022    
023    import java.awt.Component;
024    import java.util.Arrays;
025    
026    import javax.swing.JTable;
027    import javax.swing.LookAndFeel;
028    import javax.swing.UIManager;
029    import javax.swing.table.DefaultTableCellRenderer;
030    
031    import csheets.core.Address;
032    
033    /**
034     * The table cell renderer used for spreadsheet table headers.
035     * @author Einar Pehrson
036     */
037    @SuppressWarnings("serial")
038    public class HeaderRenderer extends DefaultTableCellRenderer {
039    
040            /** The axis of the header */
041            private int axis;
042    
043            /**
044             * Creates a new spreadsheet table header renderer.
045             * @param axis the axis of the header, either SwingConstants.HORIZONTAL
046             * or SwingConstants.VERTICAL
047             */
048            public HeaderRenderer(int axis) {
049                    // Checks and stores axis
050                    if (axis != HORIZONTAL && axis != VERTICAL)
051                            throw new IllegalArgumentException("Axis must be either"
052                                    + " SwingConstants.HORIZONTAL or SwingConstants.VERTICAL");
053                    this.axis = axis;
054    
055                    // Uses table header's appearance
056                    LookAndFeel.installColorsAndFont(this, "TableHeader.background",
057                                    "TableHeader.foreground", "TableHeader.font");
058                    LookAndFeel.installProperty(this, "opaque", Boolean.TRUE);
059                    setBorder(UIManager.getBorder("TableHeader.cellBorder"));
060                    setHorizontalAlignment(CENTER);
061            }
062    
063            public Component getTableCellRendererComponent(JTable table, Object value,
064                    boolean selected, boolean hasFocus, int row, int column) {
065                    // Checks column selection
066                    if (axis == HORIZONTAL)
067                            selected = Arrays.binarySearch(table.getSelectedColumns(), column)
068                                    >= 0;
069    
070                    // Selects and applies color
071                    setBackground(UIManager.getColor("TableHeader."
072                            + (selected ? "selectionBackground" : "background")));
073                    setForeground(UIManager.getColor("TableHeader."
074                            + (selected ? "selectionForeground" : "foreground")));
075    
076                    // Updates text and returns
077                    if (axis == VERTICAL)
078                            setText(Integer.toString(row + 1));
079                    else {
080                            String columnStr;
081                            int tempColumn = column;
082                            for (columnStr = ""; tempColumn >= 0; tempColumn = tempColumn
083                                            / (Address.HIGHEST_CHAR - Address.LOWEST_CHAR + 1) - 1)
084                                    columnStr = (char)((char)(tempColumn % (Address.HIGHEST_CHAR
085                                            - Address.LOWEST_CHAR + 1)) + Address.LOWEST_CHAR) + columnStr;
086                            setText(columnStr);
087                    }
088                    return this;
089            }
090    }