/** * Copyright (c) 2009 - 2011 AppWork UG(haftungsbeschränkt) <e-mail@appwork.org> * * This file is part of org.appwork.utils.swing.table * * This software is licensed under the Artistic License 2.0, * see the LICENSE file or http://www.opensource.org/licenses/artistic-license-2.0.php * for details */ package org.appwork.utils.swing.table; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.RenderingHints; import javax.swing.BorderFactory; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.JTableHeader; import org.appwork.utils.logging.Log; import sun.swing.DefaultLookup; /** * @author thomas * */ public class ExtTableHeaderRenderer extends DefaultTableCellRenderer implements javax.swing.plaf.UIResource { /** * */ private static final long serialVersionUID = 1L; private final ExtColumn<?> column; private boolean paintIcon; private boolean order; private Color focusForeground; private Color focusBackground; private final Color foregroundC; private final Color backgroundC; private Border focusBorder; private Border cellBorder; /** * @param extColumn * @param jTableHeader */ public ExtTableHeaderRenderer(final ExtColumn<?> extColumn, final JTableHeader header) { this.column = extColumn; // this.setHorizontalTextPosition(10); try { try { this.focusForeground = DefaultLookup.getColor(this, this.ui, "TableHeader.focusCellForeground"); this.focusBackground = DefaultLookup.getColor(this, this.ui, "TableHeader.focusCellBackground"); } catch (final NoSuchMethodError e) { // DefaultLookup is sun.swing, any may not be // available // e.gh. in 1.6.0_01-b06 this.focusForeground = (Color) UIManager.get("TableHeader.focusCellForeground", this.getLocale()); this.focusBackground = (Color) UIManager.get("TableHeader.focusCellBackground", this.getLocale()); } } catch (final Throwable e) { Log.exception(e); } if (this.focusForeground == null) { this.focusForeground = header.getForeground(); } if (this.focusBackground == null) { this.focusBackground = header.getBackground(); } this.foregroundC = header.getForeground(); this.backgroundC = header.getBackground(); try { try { this.focusBorder = DefaultLookup.getBorder(this, this.ui, "TableHeader.focusCellBorder"); this.cellBorder = DefaultLookup.getBorder(this, this.ui, "TableHeader.cellBorder"); } catch (final NoSuchMethodError e) { // DefaultLookup is sun.swing, any may not be available // e.gh. in 1.6.0_01-b06 this.focusBorder = (Border) UIManager.get("TableHeader.focusCellBorder", this.getLocale()); this.cellBorder = (Border) UIManager.get("TableHeader.focusCellBackground", this.getLocale()); } } catch (final Throwable e) { Log.exception(e); // avoid that the block above kills edt } if (this.focusBorder == null) { this.focusBorder = BorderFactory.createEmptyBorder(0, 10, 0, 10); } if (this.cellBorder == null) { this.cellBorder = BorderFactory.createEmptyBorder(0, 10, 0, 10); } this.setFont(header.getFont()); } @Override public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int column) { this.setForeground(hasFocus ? this.focusForeground : this.foregroundC); this.setBackground(hasFocus ? this.focusBackground : this.backgroundC); // sort column is no current column if (this.column.getModel().getSortColumn() != this.column) { this.paintIcon = false; } else { this.paintIcon = true; } this.order = this.column.getModel().isSortOrderToggle(); this.setText(value == null ? "" : value.toString()); this.setBorder(hasFocus ? this.focusBorder : this.cellBorder); return this; } @Override public void paintComponent(final Graphics g) { super.paintComponent(g); if (this.paintIcon) { if (this.order) { final Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setStroke(new BasicStroke(1)); g2.setColor(Color.black); final Polygon poly = new Polygon(); poly.addPoint(this.getSize().width / 2, 2); poly.addPoint(this.getSize().width / 2 + 4, 4); poly.addPoint(this.getSize().width / 2 - 4, 4); g2.fill(poly); } else { final Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setStroke(new BasicStroke(1)); g2.setColor(Color.black); final Polygon poly = new Polygon(); poly.addPoint(this.getSize().width / 2, this.getSize().height - 2); poly.addPoint(this.getSize().width / 2 + 4, this.getSize().height - 4); poly.addPoint(this.getSize().width / 2 - 4, this.getSize().height - 4); g2.fill(poly); } } } }