All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.cuf.ui.table.SortableHeaderRenderer Maven / Gradle / Ivy

The newest version!
package net.sf.cuf.ui.table;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import java.awt.Component;
import java.util.List;

/**
 * This renderer enables to show direction of all columns which are already sorted
 * As it bases on JLable, it must first remove existing sorting icon from border
 */
public class SortableHeaderRenderer extends DefaultTableCellRenderer
{
    /** the original render */
    private final TableCellRenderer mDelegate;

    public SortableHeaderRenderer(TableCellRenderer pDelegate)
    {
        super();
        mDelegate = pDelegate;
        setVerticalAlignment(SwingConstants.TOP);
        setHorizontalAlignment(SwingConstants.CENTER);
    }

    @Override
    public Component getTableCellRendererComponent(JTable pTable, Object pValue, boolean pIsSelected, boolean pHasFocus, int pRow, int pColumn)
    {
        Component comp = mDelegate.getTableCellRendererComponent(pTable, pValue, pIsSelected, pHasFocus, pRow, pColumn);
        if (!(comp instanceof JLabel))
        {
            // if the delegate render does not return a label, we do nothing
            return comp;
        }
        JLabel label = (JLabel) comp;

        RowSorter sorter = pTable.getRowSorter();
        if (sorter == null)
        {
            // if there is no sorter, we don't need to do anything
            return comp;
        }

        // removes existing border by replacing with standard one
        // the values and border type are based on
        // com.sun.java.swing.plaf.windows.WindowsTableHeaderUI.XPDefaultRenderer
        int topMargin = 6;
        int leftMargin = 5;
        int bottomMargin = 4;
        int rightMargin = 5;
        label.setBorder(BorderFactory.createEmptyBorder(topMargin, leftMargin, bottomMargin, rightMargin));

        List sortKeys = sorter.getSortKeys();
        // check all sorters and set appropriate icon
        for (RowSorter.SortKey sortKey : sortKeys)
        {
            if (sortKey.getColumn() == pTable.convertColumnIndexToModel(pColumn))
            {
                switch (sortKey.getSortOrder())
                {
                    case ASCENDING:
                        label.setIcon(UIManager.getIcon("Table.ascendingSortIcon"));
                        break;
                    case DESCENDING:
                        label.setIcon(UIManager.getIcon("Table.descendingSortIcon"));
                        break;
                    case UNSORTED:
                        label.setIcon(null);
                        break;
                }
            }
        }
        return label;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy