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 }