001: package org.gui4j.core.swing;
002:
003: // File: GroupableTableHeaderUI.java
004: //
005: /*
006: * (swing1.1beta3)
007: *
008: */
009:
010: import java.awt.Component;
011: import java.awt.Dimension;
012: import java.awt.Graphics;
013: import java.awt.Rectangle;
014: import java.util.Enumeration;
015: import java.util.Hashtable;
016:
017: import javax.swing.JComponent;
018: import javax.swing.plaf.basic.BasicTableHeaderUI;
019: import javax.swing.table.TableCellRenderer;
020: import javax.swing.table.TableColumn;
021: import javax.swing.table.TableColumnModel;
022:
023: public class GroupableTableHeaderUI extends BasicTableHeaderUI {
024:
025: public void paint(Graphics g, JComponent c) {
026: Rectangle clipBounds = g.getClipBounds();
027: if (header.getColumnModel() == null)
028: return;
029: ((GroupableTableHeader) header).setColumnMargin();
030: int column = 0;
031: Dimension size = header.getSize();
032: Rectangle cellRect = new Rectangle(0, 0, size.width,
033: size.height);
034: Hashtable h = new Hashtable();
035:
036: Enumeration enumeration = header.getColumnModel().getColumns();
037:
038: while (enumeration.hasMoreElements()) {
039: cellRect.height = size.height;
040: cellRect.y = 0;
041: TableColumn aColumn = (TableColumn) enumeration
042: .nextElement();
043: Enumeration cGroups = ((GroupableTableHeader) header)
044: .getColumnGroups(aColumn);
045: if (cGroups != null) {
046: int groupHeight = 0;
047: int counter = 2;
048: while (cGroups.hasMoreElements()) {
049: ColumnGroup cGroup = (ColumnGroup) cGroups
050: .nextElement();
051: Rectangle groupRect = (Rectangle) h.get(cGroup);
052: if (groupRect == null) {
053: groupRect = new Rectangle(cellRect);
054: Dimension d = cGroup.getSize(header.getTable());
055: groupRect.width = d.width;
056: counter += 2;
057: groupRect.height = d.height;
058: h.put(cGroup, groupRect);
059: }
060: paintCell(g, groupRect, cGroup);
061: groupHeight += groupRect.height;
062: cellRect.height = size.height - groupHeight;
063: cellRect.y = groupHeight;
064: }
065: }
066: cellRect.width = aColumn.getWidth();
067:
068: if (cellRect.intersects(clipBounds)) {
069: paintCell(g, cellRect, column);
070: }
071: cellRect.x += cellRect.width;
072: column++;
073: }
074: }
075:
076: private void paintCell(Graphics g, Rectangle cellRect,
077: int columnIndex) {
078: TableColumn aColumn = header.getColumnModel().getColumn(
079: columnIndex);
080: TableCellRenderer renderer = aColumn.getHeaderRenderer();
081: Component component = renderer.getTableCellRendererComponent(
082: header.getTable(), aColumn.getHeaderValue(), false,
083: false, -1, columnIndex);
084: rendererPane.add(component);
085: rendererPane.paintComponent(g, component, header, cellRect.x,
086: cellRect.y, cellRect.width, cellRect.height, true);
087: }
088:
089: private void paintCell(Graphics g, Rectangle cellRect,
090: ColumnGroup cGroup) {
091: TableCellRenderer renderer = cGroup.getHeaderRenderer();
092: Component component = renderer.getTableCellRendererComponent(
093: header.getTable(), cGroup.getHeaderValue(), false,
094: false, -1, -1);
095: rendererPane.add(component);
096: rendererPane.paintComponent(g, component, header, cellRect.x,
097: cellRect.y, cellRect.width, cellRect.height, true);
098: }
099:
100: private int getHeaderHeight() {
101: int height = 0;
102: TableColumnModel columnModel = header.getColumnModel();
103: for (int column = 0; column < columnModel.getColumnCount(); column++) {
104: TableColumn aColumn = columnModel.getColumn(column);
105: TableCellRenderer renderer = aColumn.getHeaderRenderer();
106: if (renderer == null) {
107: aColumn.setHeaderRenderer(header.getDefaultRenderer());
108: renderer = aColumn.getHeaderRenderer();
109: }
110:
111: Component comp = renderer.getTableCellRendererComponent(
112: header.getTable(), aColumn.getHeaderValue(), false,
113: false, -1, column);
114: int cHeight = comp.getPreferredSize().height;
115: Enumeration en = ((GroupableTableHeader) header)
116: .getColumnGroups(aColumn);
117: if (en != null) {
118: while (en.hasMoreElements()) {
119: ColumnGroup cGroup = (ColumnGroup) en.nextElement();
120: cHeight += cGroup.getSize(header.getTable()).height;
121: }
122: }
123: height = Math.max(height, cHeight);
124: }
125: return height;
126: }
127:
128: private Dimension createHeaderSize(long width) {
129: TableColumnModel columnModel = header.getColumnModel();
130: width += columnModel.getColumnMargin()
131: * columnModel.getColumnCount();
132: if (width > Integer.MAX_VALUE) {
133: width = Integer.MAX_VALUE;
134: }
135: return new Dimension((int) width, getHeaderHeight());
136: }
137:
138: public Dimension getPreferredSize(JComponent c) {
139: long width = 0;
140: Enumeration enumeration = header.getColumnModel().getColumns();
141: while (enumeration.hasMoreElements()) {
142: TableColumn aColumn = (TableColumn) enumeration
143: .nextElement();
144: width = width + aColumn.getPreferredWidth();
145: }
146: return createHeaderSize(width);
147: }
148: }
|