1 package org.wcb.gui.renderer.jtable;
2
3 import java.awt.Component;
4 import java.awt.Dimension;
5 import java.awt.Graphics;
6 import java.awt.Rectangle;
7 import java.util.Enumeration;
8 import java.util.Hashtable;
9 import java.util.Iterator;
10 import java.util.Vector;
11 import javax.swing.JComponent;
12 import javax.swing.plaf.basic.BasicTableHeaderUI;
13 import javax.swing.table.TableCellRenderer;
14 import javax.swing.table.TableColumn;
15 import javax.swing.table.TableColumnModel;
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public class GroupableTableHeaderUI extends BasicTableHeaderUI {
46
47
48
49
50
51 protected Vector paintedGroups = new Vector();
52
53
54
55
56
57
58 public void paint(Graphics g, JComponent c) {
59 Rectangle clipBounds = g.getClipBounds();
60 GroupableTableColumnModel cm = (GroupableTableColumnModel)header.getColumnModel();
61 if (cm == null) return;
62 ((GroupableTableHeader)header).setColumnMargin();
63 int column = 0;
64 Dimension size = header.getSize();
65 Rectangle cellRect = new Rectangle(0, 0, size.width, size.height);
66 Hashtable h = new Hashtable();
67
68 Enumeration columns = cm.getColumns();
69 while (columns.hasMoreElements()) {
70 cellRect.height = size.height;
71 cellRect.y = 0;
72 TableColumn aColumn = (TableColumn)columns.nextElement();
73 Iterator colGrpIter = cm.getColumnGroups(aColumn);
74 if (colGrpIter != null) {
75 int groupHeight = 0;
76 while (colGrpIter.hasNext()) {
77 ColumnGroup cGroup = (ColumnGroup)colGrpIter.next();
78 Rectangle groupRect = (Rectangle)h.get(cGroup);
79 if (groupRect == null) {
80 groupRect = new Rectangle(cellRect);
81 Dimension d = cGroup.getSize(header.getTable());
82 groupRect.width = d.width;
83 groupRect.height = d.height;
84 h.put(cGroup, groupRect);
85 }
86 if(!paintedGroups.contains(cGroup)) {
87 paintCell(g, groupRect, cGroup);
88 paintedGroups.add(cGroup);
89 }
90 groupHeight += groupRect.height;
91 cellRect.height = size.height - groupHeight;
92 cellRect.y = groupHeight;
93 }
94 }
95 cellRect.width = aColumn.getWidth();
96 if (cellRect.intersects(clipBounds)) {
97 paintCell(g, cellRect, column);
98 }
99 cellRect.x += cellRect.width;
100 column++;
101 }
102 paintedGroups.clear();
103 }
104
105
106
107
108
109
110
111 private void paintCell(Graphics g, Rectangle cellRect, int columnIndex) {
112 TableColumn aColumn = header.getColumnModel().getColumn(columnIndex);
113 TableCellRenderer renderer = aColumn.getHeaderRenderer();
114 if(renderer == null) {
115 renderer = header.getDefaultRenderer();
116 }
117 Component component = renderer.getTableCellRendererComponent(
118 header.getTable(), aColumn.getHeaderValue(),false, false, -1, columnIndex);
119 rendererPane.add(component);
120 rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y,
121 cellRect.width, cellRect.height, true);
122 }
123
124
125
126
127
128
129
130 private void paintCell(Graphics g, Rectangle cellRect,ColumnGroup cGroup) {
131 TableCellRenderer renderer = cGroup.getHeaderRenderer();
132 Component component = renderer.getTableCellRendererComponent(
133 header.getTable(), cGroup.getHeaderValue(),false, false, -1, -1);
134 rendererPane.add(component);
135 rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y,
136 cellRect.width, cellRect.height, true);
137 }
138
139
140
141
142
143 private int getHeaderHeight() {
144 int height = 0;
145 GroupableTableColumnModel columnModel = (GroupableTableColumnModel)header.getColumnModel();
146 for(int column = 0; column < columnModel.getColumnCount(); column++) {
147 TableColumn aColumn = columnModel.getColumn(column);
148 TableCellRenderer renderer = aColumn.getHeaderRenderer();
149 if(renderer == null) {
150 renderer = header.getDefaultRenderer();
151 }
152 Component comp = renderer.getTableCellRendererComponent(
153 header.getTable(), aColumn.getHeaderValue(), false, false,-1, column);
154 int cHeight = comp.getPreferredSize().height;
155 Iterator iter = columnModel.getColumnGroups(aColumn);
156 if (iter != null) {
157 while (iter.hasNext()) {
158 ColumnGroup cGroup = (ColumnGroup)iter.next();
159 cHeight += cGroup.getSize(header.getTable()).height;
160 }
161 }
162 height = Math.max(height, cHeight);
163 }
164 return height;
165 }
166
167
168
169
170
171
172 private Dimension createHeaderSize(long width) {
173 TableColumnModel columnModel = header.getColumnModel();
174 width += columnModel.getColumnMargin() * columnModel.getColumnCount();
175 if (width > Integer.MAX_VALUE) {
176 width = Integer.MAX_VALUE;
177 }
178 return new Dimension((int)width, getHeaderHeight());
179 }
180
181
182
183
184
185
186 public Dimension getPreferredSize(JComponent c) {
187 long width = 0;
188 Enumeration columns = header.getColumnModel().getColumns();
189 while (columns.hasMoreElements()) {
190 TableColumn aColumn = (TableColumn)columns.nextElement();
191 width = width + aColumn.getPreferredWidth();
192 }
193 return createHeaderSize(width);
194 }
195 }