de.invation.code.toval.graphic.renderer.VerticalTableHeaderCellRenderer Maven / Gradle / Ivy
package de.invation.code.toval.graphic.renderer;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.Icon;
import javax.swing.JTable;
import javax.swing.RowSorter.SortKey;
import javax.swing.SortOrder;
import javax.swing.UIManager;
import de.invation.code.toval.graphic.ui.VerticalLabelUI;
/**
* A renderer for a JTableHeader with text rotated 90 degrees counterclockwise.
*
* Extends {@link DefaultTableHeaderCellRenderer}.
*
* @see VerticalLabelUI
*/
public class VerticalTableHeaderCellRenderer extends DefaultTableHeaderCellRenderer {
private static final long serialVersionUID = 7949728965542160920L;
/**
* Constructs a VerticalTableHeaderCellRenderer.
*
* The horizontal and vertical alignments and text positions are set as appropriate to a vertical table header cell.
*/
public VerticalTableHeaderCellRenderer() {
setHorizontalAlignment(LEFT);
setHorizontalTextPosition(CENTER);
setVerticalAlignment(CENTER);
setVerticalTextPosition(TOP);
setUI(new VerticalLabelUI());
}
/**
* Overridden to return a rotated version of the sort icon.
*
* @param table
* the JTable.
* @param column
* the colummn index.
* @return the sort icon, or null if the column is unsorted.
*/
@Override
protected Icon getIcon(JTable table, int column) {
SortKey sortKey = getSortKey(table, column);
if (sortKey != null && table.convertColumnIndexToView(sortKey.getColumn()) == column) {
SortOrder sortOrder = sortKey.getSortOrder();
switch (sortOrder) {
case ASCENDING:
return VerticalSortIcon.ASCENDING;
case DESCENDING:
return VerticalSortIcon.DESCENDING;
case UNSORTED:
return VerticalSortIcon.ASCENDING;
}
}
return null;
}
/**
* An icon implementation to paint the contained icon rotated 90 degrees clockwise.
*
* This implementation assumes that the L&F provides ascending and descending sort icons of identical size.
*/
private enum VerticalSortIcon implements Icon {
ASCENDING(UIManager.getIcon("Table.ascendingSortIcon")), DESCENDING(UIManager.getIcon("Table.descendingSortIcon"));
private final Icon icon;// = ;
private VerticalSortIcon(Icon icon) {
this.icon = icon;
}
/**
* Paints an icon suitable for the header of a sorted table column, rotated by 90 degrees clockwise. This rotation is applied to compensate the rotation already applied to the passed in Graphics reference by the VerticalLabelUI.
*
* The icon is retrieved from the UIManager to obtain an icon appropriate to the L&F.
*
* @param c
* the component to which the icon is to be rendered
* @param g
* the graphics context
* @param x
* the X coordinate of the icon's top-left corner
* @param y
* the Y coordinate of the icon's top-left corner
*/
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
int maxSide = Math.max(getIconWidth(), getIconHeight());
Graphics2D g2 = (Graphics2D) g.create(x, y, maxSide, maxSide);
g2.rotate((Math.PI / 2));
g2.translate(0, -maxSide);
icon.paintIcon(c, g2, 0, 0);
g2.dispose();
}
/**
* Returns the width of the rotated icon.
*
* @return the height of the contained icon
*/
@Override
public int getIconWidth() {
return icon.getIconHeight();
}
/**
* Returns the height of the rotated icon.
*
* @return the width of the contained icon
*/
@Override
public int getIconHeight() {
return icon.getIconWidth();
}
}
}