1. /*
  2. * @(#)WindowsTableHeaderUI.java 1.13 03/12/19
  3. *
  4. * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package com.sun.java.swing.plaf.windows;
  8. import java.awt.*;
  9. import java.awt.event.*;
  10. import javax.swing.plaf.basic.*;
  11. import javax.swing.plaf.*;
  12. import javax.swing.table.*;
  13. import javax.swing.border.*;
  14. import javax.swing.*;
  15. import javax.swing.event.*;
  16. public class WindowsTableHeaderUI extends BasicTableHeaderUI {
  17. private TableCellRenderer originalHeaderRenderer;
  18. private int rolloverColumn = -1;
  19. public static ComponentUI createUI(JComponent h) {
  20. return new WindowsTableHeaderUI();
  21. }
  22. public void installUI(JComponent c) {
  23. super.installUI(c);
  24. if (XPStyle.getXP() != null) {
  25. originalHeaderRenderer = header.getDefaultRenderer();
  26. if (originalHeaderRenderer instanceof UIResource) {
  27. header.setDefaultRenderer(new XPDefaultRenderer());
  28. }
  29. }
  30. }
  31. private void updateRolloverColumn(MouseEvent e) {
  32. if (header.getDraggedColumn() == null &&
  33. header.contains(e.getPoint())) {
  34. int col = header.columnAtPoint(e.getPoint());
  35. if (col != rolloverColumn) {
  36. rolloverColumn = col;
  37. header.repaint();
  38. }
  39. }
  40. }
  41. protected MouseInputListener createMouseInputListener() {
  42. if (XPStyle.getXP() != null) {
  43. return new MouseInputHandler() {
  44. public void mouseMoved(MouseEvent e) {
  45. super.mouseMoved(e);
  46. updateRolloverColumn(e);
  47. }
  48. public void mouseEntered(MouseEvent e) {
  49. super.mouseEntered(e);
  50. updateRolloverColumn(e);
  51. }
  52. public void mouseExited(MouseEvent e) {
  53. super.mouseExited(e);
  54. rolloverColumn = -1;
  55. header.repaint();
  56. }
  57. public void mousePressed(MouseEvent e) {
  58. super.mousePressed(e);
  59. if (header.getReorderingAllowed()) {
  60. rolloverColumn = -1;
  61. header.repaint();
  62. }
  63. }
  64. public void mouseDragged(MouseEvent e) {
  65. super.mouseDragged(e);
  66. updateRolloverColumn(e);
  67. }
  68. public void mouseReleased(MouseEvent e) {
  69. super.mouseReleased(e);
  70. updateRolloverColumn(e);
  71. }
  72. };
  73. } else {
  74. return super.createMouseInputListener();
  75. }
  76. }
  77. public void uninstallUI(JComponent c) {
  78. if (header.getDefaultRenderer() instanceof XPDefaultRenderer) {
  79. header.setDefaultRenderer(originalHeaderRenderer);
  80. }
  81. super.uninstallUI(c);
  82. }
  83. private class XPDefaultRenderer extends DefaultTableCellRenderer implements UIResource {
  84. XPStyle.Skin skin = XPStyle.getXP().getSkin("header.headeritem");
  85. boolean isSelected, hasFocus, hasRollover;
  86. int column;
  87. public Component getTableCellRendererComponent(JTable table, Object value,
  88. boolean isSelected, boolean hasFocus,
  89. int row, int column) {
  90. if (table != null) {
  91. JTableHeader header = table.getTableHeader();
  92. if (header != null) {
  93. setFont(header.getFont());
  94. }
  95. }
  96. this.isSelected = isSelected;
  97. this.hasFocus = hasFocus;
  98. this.column = column;
  99. this.hasRollover = (column == rolloverColumn);
  100. setText((value == null) ? "" : value.toString());
  101. setBorder(new EmptyBorder(skin.getContentMargin()));
  102. return this;
  103. }
  104. private int viewIndexForColumn(TableColumn aColumn) {
  105. TableColumnModel cm = header.getColumnModel();
  106. for (int column = 0; column < cm.getColumnCount(); column++) {
  107. if (cm.getColumn(column) == aColumn) {
  108. return column;
  109. }
  110. }
  111. return -1;
  112. }
  113. public void paint(Graphics g) {
  114. Dimension size = getSize();
  115. int index = 0;
  116. if (column == viewIndexForColumn(header.getDraggedColumn())) {
  117. index = 2;
  118. } else if (isSelected || hasFocus || hasRollover) {
  119. index = 1;
  120. }
  121. skin.paintSkin(g, 0, 0, size.width-1, size.height-1, index);
  122. super.paint(g);
  123. }
  124. }
  125. }