1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51: import ;
52:
53: import ;
54: import ;
55: import ;
56: import ;
57: import ;
58: import ;
59: import ;
60: import ;
61: import ;
62: import ;
63: import ;
64: import ;
65: import ;
66: import ;
67: import ;
68: import ;
69: import ;
70:
71:
76: public class JTableHeader extends JComponent
77: implements TableColumnModelListener, Accessible
78: {
79: protected class AccessibleJTableHeader extends AccessibleJComponent
80: {
81: protected class AccessibleJTableHeaderEntry extends AccessibleContext
82: implements Accessible, AccessibleComponent
83: {
84:
85: private int columnIndex;
86:
87: private JTableHeader parent;
88:
89: private JTable table;
90:
91: public AccessibleJTableHeaderEntry(int c, JTableHeader p, JTable t)
92: {
93: columnIndex = c;
94: parent = p;
95: table = t;
96: }
97:
98:
103: Component getColumnHeaderRenderer()
104: {
105: TableColumn tc = parent.getColumnModel().getColumn(columnIndex);
106: TableCellRenderer r = tc.getHeaderRenderer();
107: if (r == null)
108: r = parent.getDefaultRenderer();
109: return r.getTableCellRendererComponent(table, tc.headerValue,
110: false, false, -1, columnIndex);
111: }
112:
113:
119: AccessibleContext getAccessibleColumnHeaderRenderer()
120: {
121: Component c = getColumnHeaderRenderer();
122: if (c instanceof Accessible)
123: return c.getAccessibleContext();
124: return null;
125: }
126:
127:
130: public void addFocusListener(FocusListener l)
131: {
132: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
133: AccessibleComponent c = ac.getAccessibleComponent();
134: if (c != null)
135: c.addFocusListener(l);
136: }
137:
138:
141: public void addPropertyChangeListener(PropertyChangeListener l)
142: {
143:
144:
145: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
146: if (ac != null)
147: ac.addPropertyChangeListener(l);
148: }
149:
150: public boolean contains(Point p)
151: {
152: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
153: AccessibleComponent c = ac.getAccessibleComponent();
154: if (c != null)
155: return c.contains(p);
156: else
157: return false;
158: }
159:
160: public AccessibleAction getAccessibleAction()
161: {
162: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
163: if (ac instanceof AccessibleAction)
164: return (AccessibleAction) ac;
165: else
166: return null;
167: }
168:
169: public Accessible getAccessibleAt(Point p)
170: {
171: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
172: AccessibleComponent c = ac.getAccessibleComponent();
173: if (c != null)
174: return c.getAccessibleAt(p);
175: else
176: return null;
177: }
178:
179:
185: public Accessible getAccessibleChild(int i)
186: {
187: return null;
188: }
189:
190:
195: public int getAccessibleChildrenCount()
196: {
197: return 0;
198: }
199:
200:
205: public AccessibleComponent getAccessibleComponent()
206: {
207: return this;
208: }
209:
210:
215: public AccessibleContext getAccessibleContext()
216: {
217: return this;
218: }
219:
220:
227: public String getAccessibleDescription()
228: {
229: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
230: if (ac != null)
231: return ac.getAccessibleDescription();
232: return accessibleDescription;
233: }
234:
235:
240: public int getAccessibleIndexInParent()
241: {
242: return columnIndex;
243: }
244:
245:
252: public String getAccessibleName()
253: {
254: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
255: if (ac != null)
256: return ac.getAccessibleName();
257: return accessibleName;
258: }
259:
260:
265: public AccessibleRole getAccessibleRole()
266: {
267: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
268: if (ac != null)
269: return ac.getAccessibleRole();
270: else
271: return null;
272: }
273:
274: public AccessibleSelection getAccessibleSelection()
275: {
276: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
277: if (ac instanceof AccessibleValue)
278: return (AccessibleSelection) ac;
279: else
280: return null;
281: }
282:
283: public AccessibleStateSet getAccessibleStateSet()
284: {
285: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
286: if (ac != null)
287: return ac.getAccessibleStateSet();
288: else
289: return null;
290: }
291:
292: public AccessibleText getAccessibleText()
293: {
294: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
295: if (ac != null)
296: return ac.getAccessibleText();
297: else
298: return null;
299: }
300:
301: public AccessibleValue getAccessibleValue()
302: {
303: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
304: if (ac instanceof AccessibleValue)
305: return (AccessibleValue) ac;
306: else
307: return null;
308: }
309:
310: public Color getBackground()
311: {
312: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
313: AccessibleComponent c = ac.getAccessibleComponent();
314: if (c != null)
315: return c.getBackground();
316: else
317: return null;
318: }
319:
320: public Rectangle getBounds()
321: {
322: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
323: AccessibleComponent c = ac.getAccessibleComponent();
324: if (c != null)
325: return c.getBounds();
326: else
327: return null;
328: }
329:
330: public Cursor getCursor()
331: {
332: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
333: AccessibleComponent c = ac.getAccessibleComponent();
334: if (c != null)
335: return c.getCursor();
336: else
337: return null;
338: }
339:
340: public Font getFont()
341: {
342: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
343: AccessibleComponent c = ac.getAccessibleComponent();
344: if (c != null)
345: return c.getFont();
346: else
347: return null;
348: }
349:
350: public FontMetrics getFontMetrics(Font f)
351: {
352: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
353: AccessibleComponent c = ac.getAccessibleComponent();
354: if (c != null)
355: return c.getFontMetrics(f);
356: else
357: return null;
358: }
359:
360: public Color getForeground()
361: {
362: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
363: AccessibleComponent c = ac.getAccessibleComponent();
364: if (c != null)
365: return c.getForeground();
366: else
367: return null;
368: }
369:
370: public Locale getLocale()
371: {
372: Component c = getColumnHeaderRenderer();
373: if (c != null)
374: return c.getLocale();
375: return null;
376: }
377:
378: public Point getLocation()
379: {
380: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
381: AccessibleComponent c = ac.getAccessibleComponent();
382: if (c != null)
383: return c.getLocation();
384: else
385: return null;
386: }
387:
388: public Point getLocationOnScreen()
389: {
390: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
391: AccessibleComponent c = ac.getAccessibleComponent();
392: if (c != null)
393: return c.getLocationOnScreen();
394: else
395: return null;
396: }
397:
398: public Dimension getSize()
399: {
400: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
401: AccessibleComponent c = ac.getAccessibleComponent();
402: if (c != null)
403: return c.getSize();
404: else
405: return null;
406: }
407:
408: public boolean isEnabled()
409: {
410: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
411: AccessibleComponent c = ac.getAccessibleComponent();
412: if (c != null)
413: return c.isEnabled();
414: else
415: return false;
416: }
417:
418: public boolean isFocusTraversable()
419: {
420: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
421: AccessibleComponent c = ac.getAccessibleComponent();
422: if (c != null)
423: return c.isFocusTraversable();
424: else
425: return false;
426: }
427:
428: public boolean isShowing()
429: {
430: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
431: AccessibleComponent c = ac.getAccessibleComponent();
432: if (c != null)
433: return c.isShowing();
434: else
435: return false;
436: }
437:
438: public boolean isVisible()
439: {
440: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
441: AccessibleComponent c = ac.getAccessibleComponent();
442: if (c != null)
443: return c.isVisible();
444: else
445: return false;
446: }
447:
448:
451: public void removeFocusListener(FocusListener l)
452: {
453: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
454: AccessibleComponent c = ac.getAccessibleComponent();
455: if (c != null)
456: c.removeFocusListener(l);
457: }
458:
459:
462: public void removePropertyChangeListener(PropertyChangeListener l)
463: {
464: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
465: if (ac != null)
466: ac.removePropertyChangeListener(l);
467: }
468:
469:
472: public void requestFocus()
473: {
474: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
475: AccessibleComponent c = ac.getAccessibleComponent();
476: if (c != null)
477: c.requestFocus();
478: }
479:
480:
483: public void setAccessibleDescription(String s)
484: {
485: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
486: if (ac != null)
487: ac.setAccessibleDescription(s);
488: else
489: accessibleDescription = s;
490: }
491:
492:
495: public void setAccessibleName(String s)
496: {
497: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
498: if (ac != null)
499: ac.setAccessibleName(s);
500: }
501:
502: public void setBackground(Color c)
503: {
504: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
505: AccessibleComponent comp = ac.getAccessibleComponent();
506: if (comp != null)
507: comp.setBackground(c);
508: }
509:
510: public void setBounds(Rectangle r)
511: {
512: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
513: AccessibleComponent comp = ac.getAccessibleComponent();
514: if (comp != null)
515: comp.setBounds(r);
516: }
517:
518: public void setCursor(Cursor c)
519: {
520: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
521: AccessibleComponent comp = ac.getAccessibleComponent();
522: if (comp != null)
523: comp.setCursor(c);
524: }
525:
526: public void setEnabled(boolean b)
527: {
528: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
529: AccessibleComponent comp = ac.getAccessibleComponent();
530: if (comp != null)
531: comp.setEnabled(b);
532: }
533:
534: public void setFont(Font f)
535: {
536: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
537: AccessibleComponent comp = ac.getAccessibleComponent();
538: if (comp != null)
539: comp.setFont(f);
540: }
541:
542: public void setForeground(Color c)
543: {
544: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
545: AccessibleComponent comp = ac.getAccessibleComponent();
546: if (comp != null)
547: comp.setForeground(c);
548: }
549:
550: public void setLocation(Point p)
551: {
552: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
553: AccessibleComponent comp = ac.getAccessibleComponent();
554: if (comp != null)
555: comp.setLocation(p);
556: }
557:
558: public void setSize(Dimension d)
559: {
560: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
561: AccessibleComponent comp = ac.getAccessibleComponent();
562: if (comp != null)
563: comp.setSize(d);
564: }
565:
566: public void setVisible(boolean b)
567: {
568: AccessibleContext ac = getAccessibleColumnHeaderRenderer();
569: AccessibleComponent comp = ac.getAccessibleComponent();
570: if (comp != null)
571: comp.setVisible(b);
572: }
573: }
574:
575: public AccessibleRole getAccessibleRole()
576: {
577: return AccessibleRole.PANEL;
578: }
579:
580: public int getAccessibleChildrenCount()
581: {
582: return table.getColumnCount();
583: }
584:
585: public Accessible getAccessibleChild(int i)
586: {
587: return new AccessibleJTableHeaderEntry(i, JTableHeader.this, table);
588: }
589:
590: public Accessible getAccessibleAt(Point p)
591: {
592: return getAccessibleChild(columnAtPoint(p));
593: }
594: }
595:
596:
599: private static final long serialVersionUID = 5144633983372967710L;
600:
601:
604: protected TableColumnModel columnModel;
605:
606:
609: protected TableColumn draggedColumn;
610:
611:
614: protected int draggedDistance;
615:
616:
619: boolean opaque;
620:
621:
624: protected boolean reorderingAllowed;
625:
626:
629: protected boolean resizingAllowed = true;
630:
631:
634: protected TableColumn resizingColumn;
635:
636:
639: protected JTable table;
640:
641:
644: protected boolean updateTableInRealTime;
645:
646: TableCellRenderer cellRenderer;
647:
648:
651: public JTableHeader()
652: {
653: this(null);
654: }
655:
656:
663: public JTableHeader(TableColumnModel cm)
664: {
665: columnModel = cm == null ? createDefaultColumnModel() : cm;
666: initializeLocalVars();
667: updateUI();
668: }
669:
670:
675: protected TableColumnModel createDefaultColumnModel()
676: {
677: return new DefaultTableColumnModel();
678: }
679:
680:
685: public AccessibleContext getAccessibleContext()
686: {
687: return accessibleContext;
688: }
689:
690:
695: public TableColumnModel getColumnModel()
696: {
697: return columnModel;
698: }
699:
700:
706: public TableColumn getDraggedColumn()
707: {
708: return draggedColumn;
709: }
710:
711:
716: public int getDraggedDistance()
717: {
718: return draggedDistance;
719: }
720:
721:
728: public boolean getReorderingAllowed()
729: {
730: return reorderingAllowed;
731: }
732:
733:
740: public boolean getResizingAllowed()
741: {
742: return resizingAllowed;
743: }
744:
745:
751: public TableColumn getResizingColumn()
752: {
753: return resizingColumn;
754: }
755:
756:
761: public JTable getTable()
762: {
763: return table;
764: }
765:
766:
771: public boolean getUpdateTableInRealTime()
772: {
773: return updateTableInRealTime;
774: }
775:
776:
781: public boolean isOpaque()
782: {
783: return opaque;
784: }
785:
786:
791: public void setColumnModel(TableColumnModel c)
792: {
793: columnModel.removeColumnModelListener(this);
794: columnModel = c;
795: columnModel.addColumnModelListener(this);
796: }
797:
798:
805: public void setDraggedColumn(TableColumn draggingIt)
806: {
807: draggedColumn = draggingIt;
808: }
809:
810:
815: public void setDraggedDistance(int d)
816: {
817: draggedDistance = d;
818: }
819:
820:
825: public void setOpaque(boolean o)
826: {
827: opaque = o;
828: }
829:
830:
837: public void setReorderingAllowed(boolean allowed)
838: {
839: reorderingAllowed = allowed;
840: }
841:
842:
849: public void setResizingAllowed(boolean allowed)
850: {
851: resizingAllowed = allowed;
852: }
853:
854:
861: public void setResizingColumn(TableColumn resizingIt)
862: {
863: resizingColumn = resizingIt;
864: }
865:
866:
871: public void setTable(JTable t)
872: {
873: table = t;
874: }
875:
876:
881: public void setUpdateTableInRealTime(boolean u)
882: {
883: updateTableInRealTime = u;
884: }
885:
886:
891: protected TableCellRenderer createDefaultRenderer()
892: {
893: return new DefaultTableCellRenderer();
894: }
895:
896:
901: public TableCellRenderer getDefaultRenderer()
902: {
903: return cellRenderer;
904: }
905:
906:
911: public void setDefaultRenderer(TableCellRenderer cellRenderer)
912: {
913: this.cellRenderer = cellRenderer;
914: }
915:
916:
923: public Rectangle getHeaderRect(int column)
924: {
925: Rectangle r = getTable().getCellRect(-1, column, false);
926: r.height = getHeight();
927: return r;
928: }
929:
930: protected String paramString()
931: {
932: return "JTableHeader";
933: }
934:
935:
936:
937: public String getUIClassID()
938: {
939: return "TableHeaderUI";
940: }
941:
942: public TableHeaderUI getUI()
943: {
944: return (TableHeaderUI) ui;
945: }
946:
947: public void setUI(TableHeaderUI u)
948: {
949: super.setUI(u);
950: }
951:
952: public void updateUI()
953: {
954: setUI((TableHeaderUI) UIManager.getUI(this));
955: }
956:
957:
964: public int columnAtPoint(Point point)
965: {
966: if (getBounds().contains(point))
967: return columnModel.getColumnIndexAtX(point.x);
968:
969: return -1;
970: }
971:
972:
977: public void columnAdded(TableColumnModelEvent event)
978: {
979:
980: resizeAndRepaint();
981: }
982:
983:
988: public void columnMarginChanged(ChangeEvent event)
989: {
990:
991: resizeAndRepaint();
992: }
993:
994:
999: public void columnMoved(TableColumnModelEvent event)
1000: {
1001:
1002: resizeAndRepaint();
1003: }
1004:
1005:
1010: public void columnRemoved(TableColumnModelEvent event)
1011: {
1012:
1013: resizeAndRepaint();
1014: }
1015:
1016:
1021: public void columnSelectionChanged(ListSelectionEvent event)
1022: {
1023:
1024: resizeAndRepaint();
1025: }
1026:
1027:
1032: public void resizeAndRepaint()
1033: {
1034: revalidate();
1035: repaint();
1036: }
1037:
1038:
1042: protected void initializeLocalVars()
1043: {
1044: accessibleContext = new AccessibleJTableHeader();
1045: draggedColumn = null;
1046: draggedDistance = 0;
1047: opaque = true;
1048: reorderingAllowed = true;
1049: resizingAllowed = true;
1050: resizingColumn = null;
1051: table = null;
1052: updateTableInRealTime = true;
1053: cellRenderer = createDefaultRenderer();
1054: }
1055: }