| 1 7 8 package javax.swing.table; 9 10 import java.util.*; 11 import java.awt.*; 12 import java.awt.event.*; 13 14 import javax.swing.*; 15 import javax.swing.event.*; 16 import javax.swing.plaf.*; 17 import javax.accessibility.*; 18 19 import java.beans.PropertyChangeListener ; 20 21 import java.io.ObjectOutputStream ; 22 import java.io.ObjectInputStream ; 23 import java.io.IOException ; 24 25 26 43 public class JTableHeader extends JComponent implements TableColumnModelListener, Accessible 44 { 45 49 private static final String uiClassID = "TableHeaderUI"; 50 51 58 protected JTable table; 59 60 63 protected TableColumnModel columnModel; 64 65 69 protected boolean reorderingAllowed; 70 71 75 protected boolean resizingAllowed; 76 77 81 85 protected boolean updateTableInRealTime; 86 87 88 transient protected TableColumn resizingColumn; 89 90 91 transient protected TableColumn draggedColumn; 92 93 94 transient protected int draggedDistance; 95 96 100 private TableCellRenderer defaultRenderer; 101 102 106 112 public JTableHeader() { 113 this(null); 114 } 115 116 125 public JTableHeader(TableColumnModel cm) { 126 super(); 127 128 setFocusable(false); 129 130 if (cm == null) 131 cm = createDefaultColumnModel(); 132 setColumnModel(cm); 133 134 initializeLocalVars(); 136 137 updateUI(); 139 } 140 141 145 152 public void setTable(JTable table) { 153 JTable old = this.table; 154 this.table = table; 155 firePropertyChange("table", old, table); 156 } 157 158 162 public JTable getTable() { 163 return table; 164 } 165 166 176 public void setReorderingAllowed(boolean reorderingAllowed) { 177 boolean old = this.reorderingAllowed; 178 this.reorderingAllowed = reorderingAllowed; 179 firePropertyChange("reorderingAllowed", old, reorderingAllowed); 180 } 181 182 190 public boolean getReorderingAllowed() { 191 return reorderingAllowed; 192 } 193 194 204 public void setResizingAllowed(boolean resizingAllowed) { 205 boolean old = this.resizingAllowed; 206 this.resizingAllowed = resizingAllowed; 207 firePropertyChange("resizingAllowed", old, resizingAllowed); 208 } 209 210 218 public boolean getResizingAllowed() { 219 return resizingAllowed; 220 } 221 222 230 public TableColumn getDraggedColumn() { 231 return draggedColumn; 232 } 233 234 244 public int getDraggedDistance() { 245 return draggedDistance; 246 } 247 248 255 public TableColumn getResizingColumn() { 256 return resizingColumn; 257 } 258 259 263 271 public void setUpdateTableInRealTime(boolean flag) { 272 updateTableInRealTime = flag; 273 } 274 275 279 288 public boolean getUpdateTableInRealTime() { 289 return updateTableInRealTime; 290 } 291 292 297 public void setDefaultRenderer(TableCellRenderer defaultRenderer) { 298 this.defaultRenderer = defaultRenderer; 299 } 300 301 306 public TableCellRenderer getDefaultRenderer() { 307 return defaultRenderer; 308 } 309 310 317 public int columnAtPoint(Point point) { 318 int x = point.x; 319 if (!getComponentOrientation().isLeftToRight()) { 320 x = getWidthInRightToLeft() - x; 321 } 322 return getColumnModel().getColumnIndexAtX(x); 323 } 324 325 333 public Rectangle getHeaderRect(int column) { 334 Rectangle r = new Rectangle(); 335 TableColumnModel cm = getColumnModel(); 336 337 r.height = getHeight(); 338 339 if (column < 0) { 340 if( !getComponentOrientation().isLeftToRight() ) { 342 r.x = getWidthInRightToLeft(); 343 } 344 } 345 else if (column >= cm.getColumnCount()) { 346 if( getComponentOrientation().isLeftToRight() ) { 347 r.x = getWidth(); 348 } 349 } 350 else { 351 for(int i = 0; i < column; i++) { 352 r.x += cm.getColumn(i).getWidth(); 353 } 354 if( !getComponentOrientation().isLeftToRight() ) { 355 r.x = getWidthInRightToLeft() - r.x - cm.getColumn(column).getWidth(); 356 } 357 358 r.width = cm.getColumn(column).getWidth(); 359 } 360 return r; 361 } 362 363 364 370 public String getToolTipText(MouseEvent event) { 371 String tip = null; 372 Point p = event.getPoint(); 373 int column; 374 375 if ((column = columnAtPoint(p)) != -1) { 377 TableColumn aColumn = columnModel.getColumn(column); 378 TableCellRenderer renderer = aColumn.getHeaderRenderer(); 379 if (renderer == null) { 380 renderer = defaultRenderer; 381 } 382 Component component = renderer.getTableCellRendererComponent( 383 getTable(), aColumn.getHeaderValue(), false, false, 384 -1, column); 385 386 if (component instanceof JComponent) { 389 MouseEvent newEvent; 391 Rectangle cellRect = getHeaderRect(column); 392 393 p.translate(-cellRect.x, -cellRect.y); 394 newEvent = new MouseEvent(component, event.getID(), 395 event.getWhen(), event.getModifiers(), 396 p.x, p.y, event.getClickCount(), 397 event.isPopupTrigger()); 398 399 tip = ((JComponent)component).getToolTipText(newEvent); 400 } 401 } 402 403 if (tip == null) 405 tip = getToolTipText(); 406 407 return tip; 408 } 409 410 414 419 public TableHeaderUI getUI() { 420 return (TableHeaderUI)ui; 421 } 422 423 429 public void setUI(TableHeaderUI ui){ 430 if (this.ui != ui) { 431 super.setUI(ui); 432 repaint(); 433 } 434 } 435 436 444 public void updateUI(){ 445 setUI((TableHeaderUI)UIManager.getUI(this)); 446 resizeAndRepaint(); 447 invalidate(); } 449 450 451 460 public String getUIClassID() { 461 return uiClassID; 462 } 463 464 465 469 470 482 public void setColumnModel(TableColumnModel columnModel) { 483 if (columnModel == null) { 484 throw new IllegalArgumentException ("Cannot set a null ColumnModel"); 485 } 486 TableColumnModel old = this.columnModel; 487 if (columnModel != old) { 488 if (old != null) { 489 old.removeColumnModelListener(this); 490 } 491 this.columnModel = columnModel; 492 columnModel.addColumnModelListener(this); 493 494 firePropertyChange("columnModel", old, columnModel); 495 resizeAndRepaint(); 496 } 497 } 498 499 506 public TableColumnModel getColumnModel() { 507 return columnModel; 508 } 509 510 514 523 public void columnAdded(TableColumnModelEvent e) { resizeAndRepaint(); } 524 525 526 535 public void columnRemoved(TableColumnModelEvent e) { resizeAndRepaint(); } 536 537 538 547 public void columnMoved(TableColumnModelEvent e) { repaint(); } 548 549 550 559 public void columnMarginChanged(ChangeEvent e) { resizeAndRepaint(); } 560 561 562 576 public void columnSelectionChanged(ListSelectionEvent e) { } 578 582 589 protected TableColumnModel createDefaultColumnModel() { 590 return new DefaultTableColumnModel (); 591 } 592 593 599 protected TableCellRenderer createDefaultRenderer() { 600 DefaultTableCellRenderer label = new UIResourceTableCellRenderer(); 601 label.setHorizontalAlignment(JLabel.CENTER); 602 return label; 603 } 604 605 private static class UIResourceTableCellRenderer extends DefaultTableCellRenderer implements UIResource { 606 public Component getTableCellRendererComponent(JTable table, Object value, 607 boolean isSelected, boolean hasFocus, int row, int column) { 608 if (table != null) { 609 JTableHeader header = table.getTableHeader(); 610 if (header != null) { 611 setForeground(header.getForeground()); 612 setBackground(header.getBackground()); 613 setFont(header.getFont()); 614 } 615 } 616 617 setText((value == null) ? "" : value.toString()); 618 setBorder(UIManager.getBorder("TableHeader.cellBorder")); 619 return this; 620 } 621 } 622 623 627 protected void initializeLocalVars() { 628 setOpaque(true); 629 table = null; 630 reorderingAllowed = true; 631 resizingAllowed = true; 632 draggedColumn = null; 633 draggedDistance = 0; 634 resizingColumn = null; 635 updateTableInRealTime = true; 636 637 ToolTipManager toolTipManager = ToolTipManager.sharedInstance(); 640 toolTipManager.registerComponent(this); 641 setDefaultRenderer(createDefaultRenderer()); 642 } 643 644 648 public void resizeAndRepaint() { 649 revalidate(); 650 repaint(); 651 } 652 653 662 public void setDraggedColumn(TableColumn aColumn) { 663 draggedColumn = aColumn; 664 } 665 666 670 public void setDraggedDistance(int distance) { 671 draggedDistance = distance; 672 } 673 674 683 public void setResizingColumn(TableColumn aColumn) { 684 resizingColumn = aColumn; 685 } 686 687 692 private void writeObject(ObjectOutputStream s) throws IOException { 693 s.defaultWriteObject(); 694 if ((ui != null) && (getUIClassID().equals(uiClassID))) { 695 ui.installUI(this); 696 } 697 } 698 699 private int getWidthInRightToLeft() { 700 if ((table != null) && 701 (table.getAutoResizeMode() != JTable.AUTO_RESIZE_OFF)) { 702 return table.getWidth(); 703 } 704 return super.getWidth(); 705 } 706 707 719 protected String paramString() { 720 String reorderingAllowedString = (reorderingAllowed ? 721 "true" : "false"); 722 String resizingAllowedString = (resizingAllowed ? 723 "true" : "false"); 724 String updateTableInRealTimeString = (updateTableInRealTime ? 725 "true" : "false"); 726 727 return super.paramString() + 728 ",draggedDistance=" + draggedDistance + 729 ",reorderingAllowed=" + reorderingAllowedString + 730 ",resizingAllowed=" + resizingAllowedString + 731 ",updateTableInRealTime=" + updateTableInRealTimeString; 732 } 733 734 738 747 public AccessibleContext getAccessibleContext() { 748 if (accessibleContext == null) { 749 accessibleContext = new AccessibleJTableHeader(); 750 } 751 return accessibleContext; 752 } 753 754 773 protected class AccessibleJTableHeader extends AccessibleJComponent { 774 775 782 public AccessibleRole getAccessibleRole() { 783 return AccessibleRole.PANEL; 784 } 785 786 795 public Accessible getAccessibleAt(Point p) { 796 int column; 797 798 if ((column = JTableHeader.this.columnAtPoint(p)) != -1) { 800 TableColumn aColumn = JTableHeader.this.columnModel.getColumn(column); 801 TableCellRenderer renderer = aColumn.getHeaderRenderer(); 802 if (renderer == null) { 803 if (defaultRenderer != null) { 804 renderer = defaultRenderer; 805 } else { 806 return null; 807 } 808 } 809 Component component = renderer.getTableCellRendererComponent( 810 JTableHeader.this.getTable(), 811 aColumn.getHeaderValue(), false, false, 812 -1, column); 813 814 return new AccessibleJTableHeaderEntry(column, JTableHeader.this, JTableHeader.this.table); 815 } else { 816 return null; 817 } 818 } 819 820 827 public int getAccessibleChildrenCount() { 828 return JTableHeader.this.columnModel.getColumnCount(); 829 } 830 831 837 public Accessible getAccessibleChild(int i) { 838 if (i < 0 || i >= getAccessibleChildrenCount()) { 839 return null; 840 } else { 841 TableColumn aColumn = JTableHeader.this.columnModel.getColumn(i) 842 ; 843 TableCellRenderer renderer = aColumn.getHeaderRenderer(); 844 if (renderer == null) { 845 if (defaultRenderer != null) { 846 renderer = defaultRenderer; 847 } else { 848 return null; 849 } 850 } 851 Component component = renderer.getTableCellRendererComponent( 852 JTableHeader.this.getTable(), 853 aColumn.getHeaderValue(), false, false, 854 -1, i); 855 856 return new AccessibleJTableHeaderEntry(i, JTableHeader.this, JTableHeader.this.table); 857 } 858 } 859 860 864 protected class AccessibleJTableHeaderEntry extends AccessibleContext 865 implements Accessible, AccessibleComponent { 866 867 private JTableHeader parent; 868 private int column; 869 private JTable table; 870 871 874 public AccessibleJTableHeaderEntry(int c, JTableHeader p, JTable t) { 875 parent = p; 876 column = c; 877 table = t; 878 this.setAccessibleParent(parent); 879 } 880 881 889 public AccessibleContext getAccessibleContext() { 890 return this; 891 } 892 893 private AccessibleContext getCurrentAccessibleContext() { 894 TableColumnModel tcm = table.getColumnModel(); 895 if (tcm != null) { 896 if (column < 0 || column >= tcm.getColumnCount()) { 899 return null; 900 } 901 TableColumn aColumn = tcm.getColumn(column); 902 TableCellRenderer renderer = aColumn.getHeaderRenderer(); 903 if (renderer == null) { 904 if (defaultRenderer != null) { 905 renderer = defaultRenderer; 906 } else { 907 return null; 908 } 909 } 910 Component c = renderer.getTableCellRendererComponent( 911 JTableHeader.this.getTable(), 912 aColumn.getHeaderValue(), false, false, 913 -1, column); 914 if (c instanceof Accessible) { 915 return ((Accessible) c).getAccessibleContext(); 916 } 917 } 918 return null; 919 } 920 921 private Component getCurrentComponent() { 922 TableColumnModel tcm = table.getColumnModel(); 923 if (tcm != null) { 924 if (column < 0 || column >= tcm.getColumnCount()) { 927 return null; 928 } 929 TableColumn aColumn = tcm.getColumn(column); 930 TableCellRenderer renderer = aColumn.getHeaderRenderer(); 931 if (renderer == null) { 932 if (defaultRenderer != null) { 933 renderer = defaultRenderer; 934 } else { 935 return null; 936 } 937 } 938 return renderer.getTableCellRendererComponent( 939 JTableHeader.this.getTable(), 940 aColumn.getHeaderValue(), false, false, 941 -1, column); 942 } else { 943 return null; 944 } 945 } 946 947 949 public String getAccessibleName() { 950 AccessibleContext ac = getCurrentAccessibleContext(); 951 if (ac != null) { 952 String name = ac.getAccessibleName(); 953 if ((name != null) && (name != "")) { 954 return ac.getAccessibleName(); 955 } 956 } 957 if ((accessibleName != null) && (accessibleName != "")) { 958 return accessibleName; 959 } else { 960 return table.getColumnName(column); 961 } 962 } 963 964 public void setAccessibleName(String s) { 965 AccessibleContext ac = getCurrentAccessibleContext(); 966 if (ac != null) { 967 ac.setAccessibleName(s); 968 } else { 969 super.setAccessibleName(s); 970 &nb
|