| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
package javax.swing.plaf.synth;  | 
 | 
 | 
 | 
import java.awt.*;  | 
 | 
import java.beans.*;  | 
 | 
import javax.swing.*;  | 
 | 
import javax.swing.border.*;  | 
 | 
import javax.swing.plaf.*;  | 
 | 
import javax.swing.plaf.basic.*;  | 
 | 
import javax.swing.table.*;  | 
 | 
import sun.swing.table.*;  | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
public class SynthTableHeaderUI extends BasicTableHeaderUI  | 
 | 
                                implements PropertyChangeListener, SynthUI { | 
 | 
 | 
 | 
//  | 
 | 
// Instance Variables  | 
 | 
//  | 
 | 
 | 
 | 
    private TableCellRenderer prevRenderer = null;  | 
 | 
 | 
 | 
    private SynthStyle style;  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public static ComponentUI createUI(JComponent h) { | 
 | 
        return new SynthTableHeaderUI();  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    protected void installDefaults() { | 
 | 
        prevRenderer = header.getDefaultRenderer();  | 
 | 
        if (prevRenderer instanceof UIResource) { | 
 | 
            header.setDefaultRenderer(new HeaderRenderer());  | 
 | 
        }  | 
 | 
        updateStyle(header);  | 
 | 
    }  | 
 | 
 | 
 | 
    private void updateStyle(JTableHeader c) { | 
 | 
        SynthContext context = getContext(c, ENABLED);  | 
 | 
        SynthStyle oldStyle = style;  | 
 | 
        style = SynthLookAndFeel.updateStyle(context, this);  | 
 | 
        if (style != oldStyle) { | 
 | 
            if (oldStyle != null) { | 
 | 
                uninstallKeyboardActions();  | 
 | 
                installKeyboardActions();  | 
 | 
            }  | 
 | 
        }  | 
 | 
        context.dispose();  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    protected void installListeners() { | 
 | 
        super.installListeners();  | 
 | 
        header.addPropertyChangeListener(this);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    protected void uninstallDefaults() { | 
 | 
        if (header.getDefaultRenderer() instanceof HeaderRenderer) { | 
 | 
            header.setDefaultRenderer(prevRenderer);  | 
 | 
        }  | 
 | 
 | 
 | 
        SynthContext context = getContext(header, ENABLED);  | 
 | 
 | 
 | 
        style.uninstallDefaults(context);  | 
 | 
        context.dispose();  | 
 | 
        style = null;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    protected void uninstallListeners() { | 
 | 
        header.removePropertyChangeListener(this);  | 
 | 
        super.uninstallListeners();  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    public void update(Graphics g, JComponent c) { | 
 | 
        SynthContext context = getContext(c);  | 
 | 
 | 
 | 
        SynthLookAndFeel.update(context, g);  | 
 | 
        context.getPainter().paintTableHeaderBackground(context,  | 
 | 
                          g, 0, 0, c.getWidth(), c.getHeight());  | 
 | 
        paint(context, g);  | 
 | 
        context.dispose();  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    public void paint(Graphics g, JComponent c) { | 
 | 
        SynthContext context = getContext(c);  | 
 | 
 | 
 | 
        paint(context, g);  | 
 | 
        context.dispose();  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    protected void paint(SynthContext context, Graphics g) { | 
 | 
        super.paint(g, context.getComponent());  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    public void paintBorder(SynthContext context, Graphics g, int x,  | 
 | 
                            int y, int w, int h) { | 
 | 
        context.getPainter().paintTableHeaderBorder(context, g, x, y, w, h);  | 
 | 
    }  | 
 | 
//  | 
 | 
// SynthUI  | 
 | 
//  | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    public SynthContext getContext(JComponent c) { | 
 | 
        return getContext(c, SynthLookAndFeel.getComponentState(c));  | 
 | 
    }  | 
 | 
 | 
 | 
    private SynthContext getContext(JComponent c, int state) { | 
 | 
        return SynthContext.getContext(c, style, state);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    protected void rolloverColumnUpdated(int oldColumn, int newColumn) { | 
 | 
        header.repaint(header.getHeaderRect(oldColumn));  | 
 | 
        header.repaint(header.getHeaderRect(newColumn));  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    @Override  | 
 | 
    public void propertyChange(PropertyChangeEvent evt) { | 
 | 
        if (SynthLookAndFeel.shouldUpdateStyle(evt)) { | 
 | 
            updateStyle((JTableHeader)evt.getSource());  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    private class HeaderRenderer extends DefaultTableCellHeaderRenderer { | 
 | 
        HeaderRenderer() { | 
 | 
            setHorizontalAlignment(JLabel.LEADING);  | 
 | 
            setName("TableHeader.renderer"); | 
 | 
        }  | 
 | 
 | 
 | 
        @Override  | 
 | 
        public Component getTableCellRendererComponent(JTable table, Object value,  | 
 | 
                                                       boolean isSelected,  | 
 | 
                                                       boolean hasFocus,  | 
 | 
                                                       int row, int column) { | 
 | 
 | 
 | 
            boolean hasRollover = (column == getRolloverColumn());  | 
 | 
            if (isSelected || hasRollover || hasFocus) { | 
 | 
                SynthLookAndFeel.setSelectedUI((SynthLabelUI)SynthLookAndFeel.  | 
 | 
                             getUIOfType(getUI(), SynthLabelUI.class),  | 
 | 
                             isSelected, hasFocus, table.isEnabled(),  | 
 | 
                             hasRollover);  | 
 | 
            } else { | 
 | 
                SynthLookAndFeel.resetSelectedUI();  | 
 | 
            }  | 
 | 
 | 
 | 
            //stuff a variable into the client property of this renderer indicating the sort order,  | 
 | 
              | 
 | 
            RowSorter rs = table == null ? null : table.getRowSorter();  | 
 | 
            java.util.List<? extends RowSorter.SortKey> sortKeys = rs == null ? null : rs.getSortKeys();  | 
 | 
            if (sortKeys != null && sortKeys.size() > 0 && sortKeys.get(0).getColumn() ==  | 
 | 
                    table.convertColumnIndexToModel(column)) { | 
 | 
                switch(sortKeys.get(0).getSortOrder()) { | 
 | 
                    case ASCENDING:  | 
 | 
                        putClientProperty("Table.sortOrder", "ASCENDING"); | 
 | 
                        break;  | 
 | 
                    case DESCENDING:  | 
 | 
                        putClientProperty("Table.sortOrder", "DESCENDING"); | 
 | 
                        break;  | 
 | 
                    case UNSORTED:  | 
 | 
                        putClientProperty("Table.sortOrder", "UNSORTED"); | 
 | 
                        break;  | 
 | 
                    default:  | 
 | 
                        throw new AssertionError("Cannot happen"); | 
 | 
                }  | 
 | 
            } else { | 
 | 
                putClientProperty("Table.sortOrder", "UNSORTED"); | 
 | 
            }  | 
 | 
 | 
 | 
            super.getTableCellRendererComponent(table, value, isSelected,  | 
 | 
                                                hasFocus, row, column);  | 
 | 
 | 
 | 
            return this;  | 
 | 
        }  | 
 | 
 | 
 | 
        @Override  | 
 | 
        public void setBorder(Border border) { | 
 | 
            if (border instanceof SynthBorder) { | 
 | 
                super.setBorder(border);  | 
 | 
            }  | 
 | 
        }  | 
 | 
    }  | 
 | 
}  |