package org.limewire.ui.swing.table;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import org.jdesktop.swingx.JXTreeTable;
import org.jdesktop.swingx.decorator.ColorHighlighter;
import org.jdesktop.swingx.decorator.CompoundHighlighter;
import org.jdesktop.swingx.treetable.TreeTableModel;
public class StripedJXTreeTable extends JXTreeTable {
public StripedJXTreeTable() {
super();
}
public StripedJXTreeTable(TreeTableModel treeModel) {
super(treeModel);
}
/**
* The parent paints all the real rows then the remaining space is
* calculated and appropriately painted with grid lines and background
* colors. These rows are not selectable.
*/
@Override
public void paint(Graphics g) {
super.paint(g);
paintEmptyRows(g);
}
/**
* Paints fake rows to fill the viewport.
*/
protected void paintEmptyRows(Graphics g) {
final int rowCount = getRowCount();
final Rectangle clip = g.getClipBounds();
final int height = clip.y + clip.height;
// paint rows and horizontal lines
if (rowCount * rowHeight < height) {
for (int i = rowCount; i <= height / rowHeight; ++i) {
g.setColor(getColorForRow(i));
g.fillRect(clip.x, i * rowHeight, clip.width, rowHeight);
// paint horizontal rows if they're shown
if (getShowHorizontalLines() && i > rowCount) {
g.setColor(gridColor);
g.drawLine(clip.x, i * rowHeight, clip.width, i * rowHeight);
}
}
// paint vertical lines if they're shown
if (getShowVerticalLines()) {
g.setColor(gridColor);
TableColumnModel columnModel = getColumnModel();
int x = 0;
for (int i = 0; i < columnModel.getColumnCount(); ++i) {
TableColumn column = columnModel.getColumn(i);
x += column.getWidth();
g.drawLine(x - 1, rowCount * rowHeight, x - 1, height);
}
}
}
}
/**
* Gets the background color for the row. This is assuming 1) there's no row
* highlighter or 2) there's only an alternate row highlighter. Anything
* else and the behaviour is unknown
*
* @param row row to paint
* @return Color to paint with
*/
protected Color getColorForRow(int row) {
return (row % 2 == 0) ? getHighlighterColor(0) : getHighlighterColor(1);
}
private Color getHighlighterColor(int index) {
if (getHighlighters() == null || getHighlighters().length == 0)
return getBackground();
else if (getHighlighters()[0] instanceof CompoundHighlighter) {
if (((CompoundHighlighter) getHighlighters()[0]).getHighlighters().length <= index)
return getBackground();
else
return ((ColorHighlighter) ((CompoundHighlighter) getHighlighters()[0])
.getHighlighters()[index]).getBackground();
} else if (getHighlighters()[0] instanceof ColorHighlighter) {
if (getHighlighters().length <= index)
return getBackground();
else
return ((ColorHighlighter) getHighlighters()[index]).getBackground();
}
return getBackground();
}
}