| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
package javax.swing.plaf.basic;  | 
 | 
 | 
 | 
import java.awt.*;  | 
 | 
import java.awt.event.*;  | 
 | 
import java.util.*;  | 
 | 
import javax.swing.*;  | 
 | 
import javax.swing.event.*;  | 
 | 
import javax.swing.plaf.*;  | 
 | 
import javax.swing.table.*;  | 
 | 
 | 
 | 
import sun.swing.*;  | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
public class BasicTableHeaderUI extends TableHeaderUI { | 
 | 
 | 
 | 
    private static Cursor resizeCursor = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);  | 
 | 
 | 
 | 
//  | 
 | 
// Instance Variables  | 
 | 
//  | 
 | 
 | 
 | 
      | 
 | 
    protected JTableHeader header;  | 
 | 
    protected CellRendererPane rendererPane;  | 
 | 
 | 
 | 
      | 
 | 
    protected MouseInputListener mouseInputListener;  | 
 | 
 | 
 | 
      | 
 | 
    private int rolloverColumn = -1;  | 
 | 
 | 
 | 
    // The column that should be highlighted when the table header has the focus.  | 
 | 
    private int selectedColumnIndex = 0;   | 
 | 
 | 
 | 
    private static FocusListener focusListener = new FocusListener() { | 
 | 
        public void focusGained(FocusEvent e) { | 
 | 
            repaintHeader(e.getSource());  | 
 | 
        }  | 
 | 
 | 
 | 
        public void focusLost(FocusEvent e) { | 
 | 
            repaintHeader(e.getSource());  | 
 | 
        }  | 
 | 
 | 
 | 
        private void repaintHeader(Object source) { | 
 | 
            if (source instanceof JTableHeader) { | 
 | 
                JTableHeader th = (JTableHeader)source;  | 
 | 
                BasicTableHeaderUI ui =  | 
 | 
                   (BasicTableHeaderUI)BasicLookAndFeel.  | 
 | 
                                        getUIOfType(th.getUI(),  | 
 | 
                                            BasicTableHeaderUI.class);  | 
 | 
                if (ui == null) { | 
 | 
                    return;  | 
 | 
                }  | 
 | 
 | 
 | 
                th.repaint(th.getHeaderRect(ui.getSelectedColumnIndex()));  | 
 | 
            }  | 
 | 
        }  | 
 | 
    };  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public class MouseInputHandler implements MouseInputListener { | 
 | 
 | 
 | 
        private int mouseXOffset;  | 
 | 
        private Cursor otherCursor = resizeCursor;  | 
 | 
 | 
 | 
        public void mouseClicked(MouseEvent e) { | 
 | 
            if (!header.isEnabled()) { | 
 | 
                return;  | 
 | 
            }  | 
 | 
            if (e.getClickCount() % 2 == 1 &&  | 
 | 
                    SwingUtilities.isLeftMouseButton(e)) { | 
 | 
                JTable table = header.getTable();  | 
 | 
                RowSorter sorter;  | 
 | 
                if (table != null && (sorter = table.getRowSorter()) != null) { | 
 | 
                    int columnIndex = header.columnAtPoint(e.getPoint());  | 
 | 
                    if (columnIndex != -1) { | 
 | 
                        columnIndex = table.convertColumnIndexToModel(  | 
 | 
                                columnIndex);  | 
 | 
                        sorter.toggleSortOrder(columnIndex);  | 
 | 
                    }  | 
 | 
                }  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
        private TableColumn getResizingColumn(Point p) { | 
 | 
            return getResizingColumn(p, header.columnAtPoint(p));  | 
 | 
        }  | 
 | 
 | 
 | 
        private TableColumn getResizingColumn(Point p, int column) { | 
 | 
            if (column == -1) { | 
 | 
                 return null;  | 
 | 
            }  | 
 | 
            Rectangle r = header.getHeaderRect(column);  | 
 | 
            r.grow(-3, 0);  | 
 | 
            if (r.contains(p)) { | 
 | 
                return null;  | 
 | 
            }  | 
 | 
            int midPoint = r.x + r.width/2;  | 
 | 
            int columnIndex;  | 
 | 
            if( header.getComponentOrientation().isLeftToRight() ) { | 
 | 
                columnIndex = (p.x < midPoint) ? column - 1 : column;  | 
 | 
            } else { | 
 | 
                columnIndex = (p.x < midPoint) ? column : column - 1;  | 
 | 
            }  | 
 | 
            if (columnIndex == -1) { | 
 | 
                return null;  | 
 | 
            }  | 
 | 
            return header.getColumnModel().getColumn(columnIndex);  | 
 | 
        }  | 
 | 
 | 
 | 
        public void mousePressed(MouseEvent e) { | 
 | 
            if (!header.isEnabled()) { | 
 | 
                return;  | 
 | 
            }  | 
 | 
            header.setDraggedColumn(null);  | 
 | 
            header.setResizingColumn(null);  | 
 | 
            header.setDraggedDistance(0);  | 
 | 
 | 
 | 
            Point p = e.getPoint();  | 
 | 
 | 
 | 
              | 
 | 
            TableColumnModel columnModel = header.getColumnModel();  | 
 | 
            int index = header.columnAtPoint(p);  | 
 | 
 | 
 | 
            if (index != -1) { | 
 | 
                  | 
 | 
                TableColumn resizingColumn = getResizingColumn(p, index);  | 
 | 
                if (canResize(resizingColumn, header)) { | 
 | 
                    header.setResizingColumn(resizingColumn);  | 
 | 
                    if( header.getComponentOrientation().isLeftToRight() ) { | 
 | 
                        mouseXOffset = p.x - resizingColumn.getWidth();  | 
 | 
                    } else { | 
 | 
                        mouseXOffset = p.x + resizingColumn.getWidth();  | 
 | 
                    }  | 
 | 
                }  | 
 | 
                else if (header.getReorderingAllowed()) { | 
 | 
                    TableColumn hitColumn = columnModel.getColumn(index);  | 
 | 
                    header.setDraggedColumn(hitColumn);  | 
 | 
                    mouseXOffset = p.x;  | 
 | 
                }  | 
 | 
            }  | 
 | 
 | 
 | 
            if (header.getReorderingAllowed()) { | 
 | 
                int oldRolloverColumn = rolloverColumn;  | 
 | 
                rolloverColumn = -1;  | 
 | 
                rolloverColumnUpdated(oldRolloverColumn, rolloverColumn);  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
        private void swapCursor() { | 
 | 
            Cursor tmp = header.getCursor();  | 
 | 
            header.setCursor(otherCursor);  | 
 | 
            otherCursor = tmp;  | 
 | 
        }  | 
 | 
 | 
 | 
        public void mouseMoved(MouseEvent e) { | 
 | 
            if (!header.isEnabled()) { | 
 | 
                return;  | 
 | 
            }  | 
 | 
            if (canResize(getResizingColumn(e.getPoint()), header) !=  | 
 | 
                (header.getCursor() == resizeCursor)) { | 
 | 
                swapCursor();  | 
 | 
            }  | 
 | 
            updateRolloverColumn(e);  | 
 | 
       }  | 
 | 
 | 
 | 
        public void mouseDragged(MouseEvent e) { | 
 | 
            if (!header.isEnabled()) { | 
 | 
                return;  | 
 | 
            }  | 
 | 
            int mouseX = e.getX();  | 
 | 
 | 
 | 
            TableColumn resizingColumn  = header.getResizingColumn();  | 
 | 
            TableColumn draggedColumn  = header.getDraggedColumn();  | 
 | 
 | 
 | 
            boolean headerLeftToRight = header.getComponentOrientation().isLeftToRight();  | 
 | 
 | 
 | 
            if (resizingColumn != null) { | 
 | 
                int oldWidth = resizingColumn.getWidth();  | 
 | 
                int newWidth;  | 
 | 
                if (headerLeftToRight) { | 
 | 
                    newWidth = mouseX - mouseXOffset;  | 
 | 
                } else  { | 
 | 
                    newWidth = mouseXOffset - mouseX;  | 
 | 
                }  | 
 | 
                mouseXOffset += changeColumnWidth(resizingColumn, header,  | 
 | 
                                                  oldWidth, newWidth);  | 
 | 
            }  | 
 | 
            else if (draggedColumn != null) { | 
 | 
                TableColumnModel cm = header.getColumnModel();  | 
 | 
                int draggedDistance = mouseX - mouseXOffset;  | 
 | 
                int direction = (draggedDistance < 0) ? -1 : 1;  | 
 | 
                int columnIndex = viewIndexForColumn(draggedColumn);  | 
 | 
                int newColumnIndex = columnIndex + (headerLeftToRight ? direction : -direction);  | 
 | 
                if (0 <= newColumnIndex && newColumnIndex < cm.getColumnCount()) { | 
 | 
                    int width = cm.getColumn(newColumnIndex).getWidth();  | 
 | 
                    if (Math.abs(draggedDistance) > (width / 2)) { | 
 | 
 | 
 | 
                        mouseXOffset = mouseXOffset + direction * width;  | 
 | 
                        header.setDraggedDistance(draggedDistance - direction * width);  | 
 | 
 | 
 | 
                          | 
 | 
                        int selectedIndex =  | 
 | 
                                SwingUtilities2.convertColumnIndexToModel(  | 
 | 
                                        header.getColumnModel(),  | 
 | 
                                        getSelectedColumnIndex());  | 
 | 
 | 
 | 
                          | 
 | 
                        cm.moveColumn(columnIndex, newColumnIndex);  | 
 | 
 | 
 | 
                          | 
 | 
                        selectColumn(  | 
 | 
                            SwingUtilities2.convertColumnIndexToView(  | 
 | 
                                    header.getColumnModel(), selectedIndex),  | 
 | 
                            false);  | 
 | 
 | 
 | 
                        return;  | 
 | 
                    }  | 
 | 
                }  | 
 | 
                setDraggedDistance(draggedDistance, columnIndex);  | 
 | 
            }  | 
 | 
 | 
 | 
            updateRolloverColumn(e);  | 
 | 
        }  | 
 | 
 | 
 | 
        public void mouseReleased(MouseEvent e) { | 
 | 
            if (!header.isEnabled()) { | 
 | 
                return;  | 
 | 
            }  | 
 | 
            setDraggedDistance(0, viewIndexForColumn(header.getDraggedColumn()));  | 
 | 
 | 
 | 
            header.setResizingColumn(null);  | 
 | 
            header.setDraggedColumn(null);  | 
 | 
 | 
 | 
            updateRolloverColumn(e);  | 
 | 
        }  | 
 | 
 | 
 | 
        public void mouseEntered(MouseEvent e) { | 
 | 
            if (!header.isEnabled()) { | 
 | 
                return;  | 
 | 
            }  | 
 | 
            updateRolloverColumn(e);  | 
 | 
        }  | 
 | 
 | 
 | 
        public void mouseExited(MouseEvent e) { | 
 | 
            if (!header.isEnabled()) { | 
 | 
                return;  | 
 | 
            }  | 
 | 
            int oldRolloverColumn = rolloverColumn;  | 
 | 
            rolloverColumn = -1;  | 
 | 
            rolloverColumnUpdated(oldRolloverColumn, rolloverColumn);  | 
 | 
        }  | 
 | 
//  | 
 | 
// Protected & Private Methods  | 
 | 
//  | 
 | 
 | 
 | 
        private void setDraggedDistance(int draggedDistance, int column) { | 
 | 
            header.setDraggedDistance(draggedDistance);  | 
 | 
            if (column != -1) { | 
 | 
                header.getColumnModel().moveColumn(column, column);  | 
 | 
            }  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
//  | 
 | 
//  Factory methods for the Listeners  | 
 | 
//  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    protected MouseInputListener createMouseInputListener() { | 
 | 
        return new MouseInputHandler();  | 
 | 
    }  | 
 | 
 | 
 | 
//  | 
 | 
//  The installation/uninstall procedures and support  | 
 | 
//  | 
 | 
 | 
 | 
    public static ComponentUI createUI(JComponent h) { | 
 | 
        return new BasicTableHeaderUI();  | 
 | 
    }  | 
 | 
 | 
 | 
//  Installation  | 
 | 
 | 
 | 
    public void installUI(JComponent c) { | 
 | 
        header = (JTableHeader)c;  | 
 | 
 | 
 | 
        rendererPane = new CellRendererPane();  | 
 | 
        header.add(rendererPane);  | 
 | 
 | 
 | 
        installDefaults();  | 
 | 
        installListeners();  | 
 | 
        installKeyboardActions();  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    protected void installDefaults() { | 
 | 
        LookAndFeel.installColorsAndFont(header, "TableHeader.background",  | 
 | 
                                         "TableHeader.foreground", "TableHeader.font");  | 
 | 
        LookAndFeel.installProperty(header, "opaque", Boolean.TRUE);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    protected void installListeners() { | 
 | 
        mouseInputListener = createMouseInputListener();  | 
 | 
 | 
 | 
        header.addMouseListener(mouseInputListener);  | 
 | 
        header.addMouseMotionListener(mouseInputListener);  | 
 | 
        header.addFocusListener(focusListener);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    protected void installKeyboardActions() { | 
 | 
        InputMap keyMap = (InputMap)DefaultLookup.get(header, this,  | 
 | 
                "TableHeader.ancestorInputMap");  | 
 | 
        SwingUtilities.replaceUIInputMap(header,  | 
 | 
                                JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, keyMap);  | 
 | 
        LazyActionMap.installLazyActionMap(header, BasicTableHeaderUI.class,  | 
 | 
                "TableHeader.actionMap");  | 
 | 
    }  | 
 | 
 | 
 | 
// Uninstall methods  | 
 | 
 | 
 | 
    public void uninstallUI(JComponent c) { | 
 | 
        uninstallDefaults();  | 
 | 
        uninstallListeners();  | 
 | 
        uninstallKeyboardActions();  | 
 | 
 | 
 | 
        header.remove(rendererPane);  | 
 | 
        rendererPane = null;  | 
 | 
        header = null;  | 
 | 
    }  | 
 | 
 | 
 | 
    protected void uninstallDefaults() {} | 
 | 
 | 
 | 
    protected void uninstallListeners() { | 
 | 
        header.removeMouseListener(mouseInputListener);  | 
 | 
        header.removeMouseMotionListener(mouseInputListener);  | 
 | 
 | 
 | 
        mouseInputListener = null;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    protected void uninstallKeyboardActions() { | 
 | 
        SwingUtilities.replaceUIInputMap(header, JComponent.WHEN_FOCUSED, null);  | 
 | 
        SwingUtilities.replaceUIActionMap(header, null);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    static void loadActionMap(LazyActionMap map) { | 
 | 
        map.put(new Actions(Actions.TOGGLE_SORT_ORDER));  | 
 | 
        map.put(new Actions(Actions.SELECT_COLUMN_TO_LEFT));  | 
 | 
        map.put(new Actions(Actions.SELECT_COLUMN_TO_RIGHT));  | 
 | 
        map.put(new Actions(Actions.MOVE_COLUMN_LEFT));  | 
 | 
        map.put(new Actions(Actions.MOVE_COLUMN_RIGHT));  | 
 | 
        map.put(new Actions(Actions.RESIZE_LEFT));  | 
 | 
        map.put(new Actions(Actions.RESIZE_RIGHT));  | 
 | 
        map.put(new Actions(Actions.FOCUS_TABLE));  | 
 | 
    }  | 
 | 
 | 
 | 
//  | 
 | 
// Support for mouse rollover  | 
 | 
//  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    protected int getRolloverColumn() { | 
 | 
        return rolloverColumn;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    protected void rolloverColumnUpdated(int oldColumn, int newColumn) { | 
 | 
    }  | 
 | 
 | 
 | 
    private void updateRolloverColumn(MouseEvent e) { | 
 | 
        if (header.getDraggedColumn() == null &&  | 
 | 
            header.contains(e.getPoint())) { | 
 | 
 | 
 | 
            int col = header.columnAtPoint(e.getPoint());  | 
 | 
            if (col != rolloverColumn) { | 
 | 
                int oldRolloverColumn = rolloverColumn;  | 
 | 
                rolloverColumn = col;  | 
 | 
                rolloverColumnUpdated(oldRolloverColumn, rolloverColumn);  | 
 | 
            }  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
//  | 
 | 
// Support for keyboard and mouse access  | 
 | 
 | 
 | 
    private int selectNextColumn(boolean doIt) { | 
 | 
        int newIndex = getSelectedColumnIndex();  | 
 | 
        if (newIndex < header.getColumnModel().getColumnCount() - 1) { | 
 | 
            newIndex++;  | 
 | 
            if (doIt) { | 
 | 
                selectColumn(newIndex);  | 
 | 
            }  | 
 | 
        }  | 
 | 
        return newIndex;  | 
 | 
    }  | 
 | 
 | 
 | 
    private int selectPreviousColumn(boolean doIt) { | 
 | 
        int newIndex = getSelectedColumnIndex();  | 
 | 
        if (newIndex > 0) { | 
 | 
            newIndex--;  | 
 | 
            if (doIt) { | 
 | 
                selectColumn(newIndex);  | 
 | 
            }  | 
 | 
        }  | 
 | 
        return newIndex;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    void selectColumn(int newColIndex) { | 
 | 
        selectColumn(newColIndex, true);  | 
 | 
    }  | 
 | 
 | 
 | 
    void selectColumn(int newColIndex, boolean doScroll) { | 
 | 
        Rectangle repaintRect = header.getHeaderRect(selectedColumnIndex);  | 
 | 
        header.repaint(repaintRect);  | 
 | 
        selectedColumnIndex = newColIndex;  | 
 | 
        repaintRect = header.getHeaderRect(newColIndex);  | 
 | 
        header.repaint(repaintRect);  | 
 | 
        if (doScroll) { | 
 | 
            scrollToColumn(newColIndex);  | 
 | 
        }  | 
 | 
        return;  | 
 | 
    }  | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    private void scrollToColumn(int col) { | 
 | 
        Container container;  | 
 | 
        JTable table;  | 
 | 
 | 
 | 
          | 
 | 
        if ((header.getParent() == null) ||  | 
 | 
            ((container = header.getParent().getParent()) == null) ||  | 
 | 
            !(container instanceof JScrollPane) ||  | 
 | 
            ((table = header.getTable()) == null)) { | 
 | 
            return;  | 
 | 
        }  | 
 | 
 | 
 | 
          | 
 | 
        Rectangle vis = table.getVisibleRect();  | 
 | 
        Rectangle cellBounds = table.getCellRect(0, col, true);  | 
 | 
        vis.x = cellBounds.x;  | 
 | 
        vis.width = cellBounds.width;  | 
 | 
        table.scrollRectToVisible(vis);  | 
 | 
    }  | 
 | 
 | 
 | 
    private int getSelectedColumnIndex() { | 
 | 
        int numCols = header.getColumnModel().getColumnCount();  | 
 | 
        if (selectedColumnIndex >= numCols && numCols > 0) { | 
 | 
            selectedColumnIndex = numCols - 1;  | 
 | 
        }  | 
 | 
        return selectedColumnIndex;  | 
 | 
    }  | 
 | 
 | 
 | 
    private static boolean canResize(TableColumn column,  | 
 | 
                                     JTableHeader header) { | 
 | 
        return (column != null) && header.getResizingAllowed()  | 
 | 
                                && column.getResizable();  | 
 | 
    }  | 
 | 
 | 
 | 
    private int changeColumnWidth(TableColumn resizingColumn,  | 
 | 
                                  JTableHeader th,  | 
 | 
                                  int oldWidth, int newWidth) { | 
 | 
        resizingColumn.setWidth(newWidth);  | 
 | 
 | 
 | 
        Container container;  | 
 | 
        JTable table;  | 
 | 
 | 
 | 
        if ((th.getParent() == null) ||  | 
 | 
            ((container = th.getParent().getParent()) == null) ||  | 
 | 
            !(container instanceof JScrollPane) ||  | 
 | 
            ((table = th.getTable()) == null)) { | 
 | 
            return 0;  | 
 | 
        }  | 
 | 
 | 
 | 
        if (!container.getComponentOrientation().isLeftToRight() &&  | 
 | 
                !th.getComponentOrientation().isLeftToRight()) { | 
 | 
                JViewport viewport = ((JScrollPane)container).getViewport();  | 
 | 
                int viewportWidth = viewport.getWidth();  | 
 | 
                int diff = newWidth - oldWidth;  | 
 | 
                int newHeaderWidth = table.getWidth() + diff;  | 
 | 
 | 
 | 
                  | 
 | 
                Dimension tableSize = table.getSize();  | 
 | 
                tableSize.width += diff;  | 
 | 
                table.setSize(tableSize);  | 
 | 
 | 
 | 
                  | 
 | 
 | 
 | 
 | 
 | 
                 */  | 
 | 
                if ((newHeaderWidth >= viewportWidth) &&  | 
 | 
                    (table.getAutoResizeMode() == JTable.AUTO_RESIZE_OFF)) { | 
 | 
                    Point p = viewport.getViewPosition();  | 
 | 
                    p.x = Math.max(0, Math.min(newHeaderWidth - viewportWidth,  | 
 | 
                                               p.x + diff));  | 
 | 
                    viewport.setViewPosition(p);  | 
 | 
                    return diff;  | 
 | 
            }  | 
 | 
        }  | 
 | 
        return 0;  | 
 | 
    }  | 
 | 
 | 
 | 
//  | 
 | 
// Baseline  | 
 | 
//  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public int getBaseline(JComponent c, int width, int height) { | 
 | 
        super.getBaseline(c, width, height);  | 
 | 
        int baseline = -1;  | 
 | 
        TableColumnModel columnModel = header.getColumnModel();  | 
 | 
        for(int column = 0; column < columnModel.getColumnCount();  | 
 | 
            column++) { | 
 | 
            TableColumn aColumn = columnModel.getColumn(column);  | 
 | 
            Component comp = getHeaderRenderer(column);  | 
 | 
            Dimension pref = comp.getPreferredSize();  | 
 | 
            int columnBaseline = comp.getBaseline(pref.width, height);  | 
 | 
            if (columnBaseline >= 0) { | 
 | 
                if (baseline == -1) { | 
 | 
                    baseline = columnBaseline;  | 
 | 
                }  | 
 | 
                else if (baseline != columnBaseline) { | 
 | 
                    baseline = -1;  | 
 | 
                    break;  | 
 | 
                }  | 
 | 
            }  | 
 | 
        }  | 
 | 
        return baseline;  | 
 | 
    }  | 
 | 
 | 
 | 
//  | 
 | 
// Paint Methods and support  | 
 | 
//  | 
 | 
 | 
 | 
    public void paint(Graphics g, JComponent c) { | 
 | 
        if (header.getColumnModel().getColumnCount() <= 0) { | 
 | 
            return;  | 
 | 
        }  | 
 | 
        boolean ltr = header.getComponentOrientation().isLeftToRight();  | 
 | 
 | 
 | 
        Rectangle clip = g.getClipBounds();  | 
 | 
        Point left = clip.getLocation();  | 
 | 
        Point right = new Point( clip.x + clip.width - 1, clip.y );  | 
 | 
        TableColumnModel cm = header.getColumnModel();  | 
 | 
        int cMin = header.columnAtPoint( ltr ? left : right );  | 
 | 
        int cMax = header.columnAtPoint( ltr ? right : left );  | 
 | 
          | 
 | 
        if (cMin == -1) { | 
 | 
            cMin =  0;  | 
 | 
        }  | 
 | 
        // If the table does not have enough columns to fill the view we'll get -1.  | 
 | 
          | 
 | 
        if (cMax == -1) { | 
 | 
            cMax = cm.getColumnCount()-1;  | 
 | 
        }  | 
 | 
 | 
 | 
        TableColumn draggedColumn = header.getDraggedColumn();  | 
 | 
        int columnWidth;  | 
 | 
        Rectangle cellRect = header.getHeaderRect(ltr ? cMin : cMax);  | 
 | 
        TableColumn aColumn;  | 
 | 
        if (ltr) { | 
 | 
            for(int column = cMin; column <= cMax ; column++) { | 
 | 
                aColumn = cm.getColumn(column);  | 
 | 
                columnWidth = aColumn.getWidth();  | 
 | 
                cellRect.width = columnWidth;  | 
 | 
                if (aColumn != draggedColumn) { | 
 | 
                    paintCell(g, cellRect, column);  | 
 | 
                }  | 
 | 
                cellRect.x += columnWidth;  | 
 | 
            }  | 
 | 
        } else { | 
 | 
            for(int column = cMax; column >= cMin; column--) { | 
 | 
                aColumn = cm.getColumn(column);  | 
 | 
                columnWidth = aColumn.getWidth();  | 
 | 
                cellRect.width = columnWidth;  | 
 | 
                if (aColumn != draggedColumn) { | 
 | 
                    paintCell(g, cellRect, column);  | 
 | 
                }  | 
 | 
                cellRect.x += columnWidth;  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
          | 
 | 
        if (draggedColumn != null) { | 
 | 
            int draggedColumnIndex = viewIndexForColumn(draggedColumn);  | 
 | 
            Rectangle draggedCellRect = header.getHeaderRect(draggedColumnIndex);  | 
 | 
 | 
 | 
              | 
 | 
            g.setColor(header.getParent().getBackground());  | 
 | 
            g.fillRect(draggedCellRect.x, draggedCellRect.y,  | 
 | 
                               draggedCellRect.width, draggedCellRect.height);  | 
 | 
 | 
 | 
            draggedCellRect.x += header.getDraggedDistance();  | 
 | 
 | 
 | 
              | 
 | 
            g.setColor(header.getBackground());  | 
 | 
            g.fillRect(draggedCellRect.x, draggedCellRect.y,  | 
 | 
                       draggedCellRect.width, draggedCellRect.height);  | 
 | 
 | 
 | 
            paintCell(g, draggedCellRect, draggedColumnIndex);  | 
 | 
        }  | 
 | 
 | 
 | 
          | 
 | 
        rendererPane.removeAll();  | 
 | 
    }  | 
 | 
 | 
 | 
    private Component getHeaderRenderer(int columnIndex) { | 
 | 
        TableColumn aColumn = header.getColumnModel().getColumn(columnIndex);  | 
 | 
        TableCellRenderer renderer = aColumn.getHeaderRenderer();  | 
 | 
        if (renderer == null) { | 
 | 
            renderer = header.getDefaultRenderer();  | 
 | 
        }  | 
 | 
 | 
 | 
        boolean hasFocus = !header.isPaintingForPrint()  | 
 | 
                           && (columnIndex == getSelectedColumnIndex())  | 
 | 
                           && header.hasFocus();  | 
 | 
        return renderer.getTableCellRendererComponent(header.getTable(),  | 
 | 
                                                aColumn.getHeaderValue(),  | 
 | 
                                                false, hasFocus,  | 
 | 
                                                -1, columnIndex);  | 
 | 
    }  | 
 | 
 | 
 | 
    private void paintCell(Graphics g, Rectangle cellRect, int columnIndex) { | 
 | 
        Component component = getHeaderRenderer(columnIndex);  | 
 | 
        rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y,  | 
 | 
                            cellRect.width, cellRect.height, true);  | 
 | 
    }  | 
 | 
 | 
 | 
    private int viewIndexForColumn(TableColumn aColumn) { | 
 | 
        TableColumnModel cm = header.getColumnModel();  | 
 | 
        for (int column = 0; column < cm.getColumnCount(); column++) { | 
 | 
            if (cm.getColumn(column) == aColumn) { | 
 | 
                return column;  | 
 | 
            }  | 
 | 
        }  | 
 | 
        return -1;  | 
 | 
    }  | 
 | 
 | 
 | 
//  | 
 | 
// Size Methods  | 
 | 
//  | 
 | 
 | 
 | 
    private int getHeaderHeight() { | 
 | 
        int height = 0;  | 
 | 
        boolean accomodatedDefault = false;  | 
 | 
        TableColumnModel columnModel = header.getColumnModel();  | 
 | 
        for(int column = 0; column < columnModel.getColumnCount(); column++) { | 
 | 
            TableColumn aColumn = columnModel.getColumn(column);  | 
 | 
            boolean isDefault = (aColumn.getHeaderRenderer() == null);  | 
 | 
 | 
 | 
            if (!isDefault || !accomodatedDefault) { | 
 | 
                Component comp = getHeaderRenderer(column);  | 
 | 
                int rendererHeight = comp.getPreferredSize().height;  | 
 | 
                height = Math.max(height, rendererHeight);  | 
 | 
 | 
 | 
                // Configuring the header renderer to calculate its preferred size  | 
 | 
                // is expensive. Optimise this by assuming the default renderer  | 
 | 
                // always has the same height as the first non-zero height that  | 
 | 
                  | 
 | 
                if (isDefault && rendererHeight > 0) { | 
 | 
                    Object headerValue = aColumn.getHeaderValue();  | 
 | 
                    if (headerValue != null) { | 
 | 
                        headerValue = headerValue.toString();  | 
 | 
 | 
 | 
                        if (headerValue != null && !headerValue.equals("")) { | 
 | 
                            accomodatedDefault = true;  | 
 | 
                        }  | 
 | 
                    }  | 
 | 
                }  | 
 | 
            }  | 
 | 
        }  | 
 | 
        return height;  | 
 | 
    }  | 
 | 
 | 
 | 
    private Dimension createHeaderSize(long width) { | 
 | 
          | 
 | 
        if (width > Integer.MAX_VALUE) { | 
 | 
            width = Integer.MAX_VALUE;  | 
 | 
        }  | 
 | 
        return new Dimension((int)width, getHeaderHeight());  | 
 | 
    }  | 
 | 
 | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public Dimension getMinimumSize(JComponent c) { | 
 | 
        long width = 0;  | 
 | 
        Enumeration enumeration = header.getColumnModel().getColumns();  | 
 | 
        while (enumeration.hasMoreElements()) { | 
 | 
            TableColumn aColumn = (TableColumn)enumeration.nextElement();  | 
 | 
            width = width + aColumn.getMinWidth();  | 
 | 
        }  | 
 | 
        return createHeaderSize(width);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public Dimension getPreferredSize(JComponent c) { | 
 | 
        long width = 0;  | 
 | 
        Enumeration enumeration = header.getColumnModel().getColumns();  | 
 | 
        while (enumeration.hasMoreElements()) { | 
 | 
            TableColumn aColumn = (TableColumn)enumeration.nextElement();  | 
 | 
            width = width + aColumn.getPreferredWidth();  | 
 | 
        }  | 
 | 
        return createHeaderSize(width);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public Dimension getMaximumSize(JComponent c) { | 
 | 
        long width = 0;  | 
 | 
        Enumeration enumeration = header.getColumnModel().getColumns();  | 
 | 
        while (enumeration.hasMoreElements()) { | 
 | 
            TableColumn aColumn = (TableColumn)enumeration.nextElement();  | 
 | 
            width = width + aColumn.getMaxWidth();  | 
 | 
        }  | 
 | 
        return createHeaderSize(width);  | 
 | 
    }  | 
 | 
 | 
 | 
    private static class Actions extends UIAction { | 
 | 
        public static final String TOGGLE_SORT_ORDER =  | 
 | 
            "toggleSortOrder";  | 
 | 
        public static final String SELECT_COLUMN_TO_LEFT =  | 
 | 
            "selectColumnToLeft";  | 
 | 
        public static final String SELECT_COLUMN_TO_RIGHT =  | 
 | 
            "selectColumnToRight";  | 
 | 
        public static final String MOVE_COLUMN_LEFT =  | 
 | 
            "moveColumnLeft";  | 
 | 
        public static final String MOVE_COLUMN_RIGHT =  | 
 | 
            "moveColumnRight";  | 
 | 
        public static final String RESIZE_LEFT =  | 
 | 
            "resizeLeft";  | 
 | 
        public static final String RESIZE_RIGHT =  | 
 | 
            "resizeRight";  | 
 | 
        public static final String FOCUS_TABLE =  | 
 | 
            "focusTable";  | 
 | 
 | 
 | 
        public Actions(String name) { | 
 | 
            super(name);  | 
 | 
        }  | 
 | 
 | 
 | 
        public boolean isEnabled(Object sender) { | 
 | 
            if (sender instanceof JTableHeader) { | 
 | 
                JTableHeader th = (JTableHeader)sender;  | 
 | 
                TableColumnModel cm = th.getColumnModel();  | 
 | 
                if (cm.getColumnCount() <= 0) { | 
 | 
                    return false;  | 
 | 
                }  | 
 | 
 | 
 | 
                String key = getName();  | 
 | 
                BasicTableHeaderUI ui =  | 
 | 
                    (BasicTableHeaderUI)BasicLookAndFeel.getUIOfType(th.getUI(),  | 
 | 
                                                      BasicTableHeaderUI.class);  | 
 | 
                if (ui != null) { | 
 | 
                    if (key == MOVE_COLUMN_LEFT) { | 
 | 
                        return th.getReorderingAllowed()  | 
 | 
                            && maybeMoveColumn(true, th, ui, false);  | 
 | 
                    } else if (key == MOVE_COLUMN_RIGHT) { | 
 | 
                        return th.getReorderingAllowed()  | 
 | 
                            && maybeMoveColumn(false, th, ui, false);  | 
 | 
                    } else if (key == RESIZE_LEFT ||  | 
 | 
                               key == RESIZE_RIGHT) { | 
 | 
                        return canResize(cm.getColumn(ui.getSelectedColumnIndex()), th);  | 
 | 
                    } else if (key == FOCUS_TABLE) { | 
 | 
                        return (th.getTable() != null);  | 
 | 
                    }  | 
 | 
                }  | 
 | 
            }  | 
 | 
            return true;  | 
 | 
        }  | 
 | 
 | 
 | 
        public void actionPerformed(ActionEvent e) { | 
 | 
            JTableHeader th = (JTableHeader)e.getSource();  | 
 | 
            BasicTableHeaderUI ui =  | 
 | 
                (BasicTableHeaderUI)BasicLookAndFeel.  | 
 | 
                                        getUIOfType(th.getUI(),  | 
 | 
                                            BasicTableHeaderUI.class);  | 
 | 
            if (ui == null) { | 
 | 
                return;  | 
 | 
            }  | 
 | 
 | 
 | 
            String name = getName();  | 
 | 
            if (TOGGLE_SORT_ORDER == name) { | 
 | 
                JTable table = th.getTable();  | 
 | 
                RowSorter sorter = table == null ? null : table.getRowSorter();  | 
 | 
                if (sorter != null) { | 
 | 
                    int columnIndex = ui.getSelectedColumnIndex();  | 
 | 
                    columnIndex = table.convertColumnIndexToModel(  | 
 | 
                                                      columnIndex);  | 
 | 
                    sorter.toggleSortOrder(columnIndex);  | 
 | 
                }  | 
 | 
            } else if (SELECT_COLUMN_TO_LEFT == name) { | 
 | 
                if (th.getComponentOrientation().isLeftToRight()) { | 
 | 
                    ui.selectPreviousColumn(true);  | 
 | 
                } else { | 
 | 
                    ui.selectNextColumn(true);  | 
 | 
                }  | 
 | 
            } else if (SELECT_COLUMN_TO_RIGHT == name) { | 
 | 
                if (th.getComponentOrientation().isLeftToRight()) { | 
 | 
                    ui.selectNextColumn(true);  | 
 | 
                } else { | 
 | 
                    ui.selectPreviousColumn(true);  | 
 | 
                }  | 
 | 
            } else if (MOVE_COLUMN_LEFT == name) { | 
 | 
                moveColumn(true, th, ui);  | 
 | 
            } else if (MOVE_COLUMN_RIGHT == name) { | 
 | 
                moveColumn(false, th, ui);  | 
 | 
            } else if (RESIZE_LEFT == name) { | 
 | 
                resize(true, th, ui);  | 
 | 
            } else if (RESIZE_RIGHT == name) { | 
 | 
                resize(false, th, ui);  | 
 | 
            } else if (FOCUS_TABLE == name) { | 
 | 
                JTable table = th.getTable();  | 
 | 
                if (table != null) { | 
 | 
                    table.requestFocusInWindow();  | 
 | 
                }  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
        private void moveColumn(boolean leftArrow, JTableHeader th,  | 
 | 
                                BasicTableHeaderUI ui) { | 
 | 
            maybeMoveColumn(leftArrow, th, ui, true);  | 
 | 
        }  | 
 | 
 | 
 | 
        private boolean maybeMoveColumn(boolean leftArrow, JTableHeader th,  | 
 | 
                                        BasicTableHeaderUI ui, boolean doIt) { | 
 | 
            int oldIndex = ui.getSelectedColumnIndex();  | 
 | 
            int newIndex;  | 
 | 
 | 
 | 
            if (th.getComponentOrientation().isLeftToRight()) { | 
 | 
                newIndex = leftArrow ? ui.selectPreviousColumn(doIt)  | 
 | 
                                     : ui.selectNextColumn(doIt);  | 
 | 
            } else { | 
 | 
                newIndex = leftArrow ? ui.selectNextColumn(doIt)  | 
 | 
                                     : ui.selectPreviousColumn(doIt);  | 
 | 
            }  | 
 | 
 | 
 | 
            if (newIndex != oldIndex) { | 
 | 
                if (doIt) { | 
 | 
                    th.getColumnModel().moveColumn(oldIndex, newIndex);  | 
 | 
                } else { | 
 | 
                    return true;   | 
 | 
                }  | 
 | 
            }  | 
 | 
 | 
 | 
            return false;  | 
 | 
        }  | 
 | 
 | 
 | 
        private void resize(boolean leftArrow, JTableHeader th,  | 
 | 
                            BasicTableHeaderUI ui) { | 
 | 
            int columnIndex = ui.getSelectedColumnIndex();  | 
 | 
            TableColumn resizingColumn =  | 
 | 
                th.getColumnModel().getColumn(columnIndex);  | 
 | 
 | 
 | 
            th.setResizingColumn(resizingColumn);  | 
 | 
            int oldWidth = resizingColumn.getWidth();  | 
 | 
            int newWidth = oldWidth;  | 
 | 
 | 
 | 
            if (th.getComponentOrientation().isLeftToRight()) { | 
 | 
                newWidth = newWidth + (leftArrow ? -1 : 1);  | 
 | 
            } else { | 
 | 
                newWidth = newWidth + (leftArrow ? 1 : -1);  | 
 | 
            }  | 
 | 
 | 
 | 
            ui.changeColumnWidth(resizingColumn, th, oldWidth, newWidth);  | 
 | 
        }  | 
 | 
    }  | 
 | 
}  // End of Class BasicTableHeaderUI  |