/*
Copyright 2009 Hauke Rehfeld
This file is part of QuakeInjector.
QuakeInjector is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
QuakeInjector is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QuakeInjector. If not, see <http://www.gnu.org/licenses/>.
*/
package de.haukerehfeld.quakeinjector;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.Component;
import javax.swing.UIManager;
import javax.swing.JTable;
import javax.swing.JComponent;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableRowSorter;
import de.haukerehfeld.quakeinjector.packagelist.model.PackageListModel;
/**
* @todo check if dependency on de.haukerehfeld.quakeinjector.packagelist.model.PackageListModel is necessary
*/
public class PackageTable extends JTable {
private static final int ALTERNATING = 10;
private static final Color NORMALROWCOLOR = UIManager.getColor("Table.background");
private static final Color ALTERNATINGROWCOLOR = createAlternatingColor(NORMALROWCOLOR, ALTERNATING);
private static final int CELLPADDING = 2;
private final EmptyBorder border = new EmptyBorder(0, CELLPADDING, 0, CELLPADDING);
public PackageTable(PackageListModel maplist) {
super(maplist);
final TableRowSorter<PackageListModel> sorter = new TableRowSorter<PackageListModel>(maplist);
setRowSorter(sorter);
setPreferredScrollableViewportSize(new Dimension(500, 500));
setFillsViewportHeight(true);
setColumnSelectionAllowed(false);
//setCellSelectionEnabled(false);
setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
setShowGrid(false);
setIntercellSpacing(new Dimension(0, 0));
setDefaultRenderer(Package.Rating.class, new PackageListModel.RatingRenderer());
}
/**
* Shades alternate rows in different colors.
*/
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
if (isCellSelected(row, column) == false) {
c.setBackground(colorForRow(row));
c.setForeground(UIManager.getColor("Table.foreground"));
} else {
c.setBackground(UIManager.getColor("Table.selectionBackground"));
c.setForeground(UIManager.getColor("Table.selectionForeground"));
}
//disable cell focus
if (c instanceof JComponent) {
if (!(c instanceof PackageListModel.RatingRenderer)) {
((JComponent) c).setBorder(border);
}
else {
((JComponent) c).setBorder(new EmptyBorder(0, 0, 0, 0));
}
}
return c;
}
/**
* Returns the appropriate background color for the given row.
*/
protected Color colorForRow(int row) {
return (row % 2 == 0) ? NORMALROWCOLOR : ALTERNATINGROWCOLOR;
}
@Override
@SuppressWarnings("unchecked")
public TableRowSorter<PackageListModel> getRowSorter() {
return (TableRowSorter<PackageListModel>) super.getRowSorter();
}
/**
* Calculate a darker or brighter version of a certain color
*/
public static Color createAlternatingColor(Color c, int amount) {
int r = c.getRed();
int g = c.getGreen();
int b = c.getBlue();
return new Color(r > 127 ? r - amount : r + amount,
g > 127 ? g - amount : g + amount,
b > 127 ? b - amount : b + amount);
}
}