package org.korsakow.ide.ui.laf; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Rectangle; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import org.korsakow.ide.util.UIResourceManager; public class KorsakowTableHeaderUI extends MyBasicTableHeaderUI { private static final Icon arrowDownIcon = UIResourceManager.getIcon("arrow_down.png"); private static final Icon arrowUpIcon = UIResourceManager.getIcon("arrow_up.png"); public static ComponentUI createUI(JComponent h) { return new KorsakowTableHeaderUI(); } public void installUI(JComponent c) { super.installUI(c); } public void paint(Graphics g, JComponent c) { super.paint(g, c); } /** * Note that although the parameter is called viewColumnIndex, MyBasicTableHeaderUI, which is a copy/paste of * BasicTableHeaderUI actually appears to completely ignore the view/model distinction of column indices, * so in some sense its a bit unclear what's getting passed in (or at least what was intended to be passed in!). * We should go and fix that perhaps. */ protected void paintCell(Graphics g, Rectangle cellRect, int viewColumnIndex) { Graphics2D g2 = (Graphics2D)g; Integer sortedColumnDir = (Integer)header.getTable().getClientProperty("ui.sortedColumnDirection"); Integer sortedModelColumnIndex = (Integer)header.getTable().getClientProperty("ui.sortedColumn"); int modelColumnIndex = header.getTable().convertColumnIndexToModel(viewColumnIndex); boolean isSortedColumn = sortedModelColumnIndex != null && sortedModelColumnIndex == modelColumnIndex; if (isSortedColumn) { Paint paint = new GradientPaint(cellRect.x, cellRect.y, UIManager.getColor("TableHeader.sortedBackground"), cellRect.x, cellRect.y+cellRect.height, UIManager.getColor("TableHeader.sortedBackground2")); g2.setPaint(paint); g2.fill(cellRect); } super.paintCell(g, cellRect, viewColumnIndex); // expects view indices... apparently! if (isSortedColumn) { Icon arrowIcon = sortedColumnDir==null||sortedColumnDir==1?arrowDownIcon:arrowUpIcon; Component c = getHeaderRenderer(modelColumnIndex); int x = cellRect.x + cellRect.width - arrowIcon.getIconWidth(); int y = cellRect.y + (cellRect.height - arrowIcon.getIconHeight())/2; arrowIcon.paintIcon(c, g, x, y); } // DEBUG OUTPUT // String tmp=""+modelColumnIndex+";"+viewColumnIndex; // g2.setFont(new Font("Arial", 0, 12)); // g2.setBackground(Color.white); // g2.setColor(Color.red); // g2.setPaint(Color.red); // g2.drawString(tmp, cellRect.x, cellRect.y+15); } }