1 /*
2 * UnBBayes
3 * Copyright (C) 2002, 2008 Universidade de Brasilia - http://www.unb.br
4 *
5 * This file is part of UnBBayes.
6 *
7 * UnBBayes is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * UnBBayes is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with UnBBayes. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21 package unbbayes.gui.table;
22
23 import java.awt.Component;
24 import java.awt.Dimension;
25 import java.util.Iterator;
26 import java.util.Vector;
27
28 import javax.swing.JLabel;
29 import javax.swing.JTable;
30 import javax.swing.UIManager;
31 import javax.swing.table.DefaultTableCellRenderer;
32 import javax.swing.table.JTableHeader;
33 import javax.swing.table.TableCellRenderer;
34 import javax.swing.table.TableColumn;
35
36
37 public class ColumnGroup {
38 /**
39 * Cell renderer for group header.
40 */
41 protected TableCellRenderer renderer;
42 /**
43 * Holds the TableColumn or ColumnGroup objects contained
44 * within this ColumnGroup instance.
45 */
46 protected Vector v;
47 /**
48 * The ColumnGroup instance name.
49 */
50 protected String text;
51 /**
52 * The margin to use for renderering.
53 */
54 protected int margin=0;
55
56 /**
57 * Standard ColumnGroup constructor.
58 * @param text Name of the ColumnGroup which will be displayed
59 * when the ColumnGroup is renderered.
60 */
61 public ColumnGroup(String text) {
62 this(null,text);
63 }
64
65 /**
66 * Standard ColumnGroup constructor.
67 * @param renderer a TableCellRenderer for the group.
68 * @param text Name of the ColumnGroup which will be displayed
69 * when the ColumnGroup is renderered.
70 */
71 public ColumnGroup(TableCellRenderer renderer,String text) {
72 if (renderer == null) {
73 this.renderer = new DefaultTableCellRenderer() {
74 public Component getTableCellRendererComponent(JTable table, Object value,
75 boolean isSelected, boolean hasFocus, int row, int column) {
76 JTableHeader header = table.getTableHeader();
77 if (header != null) {
78 setForeground(header.getForeground());
79 setBackground(header.getBackground());
80 setFont(header.getFont());
81 }
82 setHorizontalAlignment(JLabel.CENTER);
83 setText((value == null) ? "" : value.toString());
84 setBorder(UIManager.getBorder("TableHeader.cellBorder"));
85 return this;
86 }
87 };
88 } else {
89 this.renderer = renderer;
90 }
91 this.text = text;
92 v = new Vector();
93 }
94
95
96 /**
97 * Add a TableColumn or ColumnGroup object to the
98 * ColumnGroup instance.
99 * @param obj TableColumn or ColumnGroup
100 */
101 public void add(Object obj) {
102 if (obj == null) { return; }
103 v.addElement(obj);
104 }
105
106
107 /**
108 * Get the ColumnGroup list containing the required table
109 * column.
110 * @param g vector to populate with the ColumnGroup/s
111 * @param c TableColumn
112 * @return Vector containing the ColumnGroup/s
113 */
114 public Vector getColumnGroups(TableColumn c, Vector g) {
115 g.addElement(this);
116 if (v.contains(c)) return g;
117 Iterator iter = v.iterator();
118 while (iter.hasNext()) {
119 Object obj = iter.next();
120 if (obj instanceof ColumnGroup) {
121 Vector groups =
122 (Vector)((ColumnGroup)obj).getColumnGroups(c,(Vector)g.clone());
123 if (groups != null) return groups;
124 }
125 }
126 return null;
127 }
128
129 /**
130 * Returns the TableCellRenderer for the ColumnGroup.
131 * @return the TableCellRenderer
132 */
133 public TableCellRenderer getHeaderRenderer() {
134 return renderer;
135 }
136
137 /**
138 * Set the TableCellRenderer for this ColumnGroup.
139 * @param renderer the renderer to use
140 */
141 public void setHeaderRenderer(TableCellRenderer renderer) {
142 if (renderer != null) {
143 this.renderer = renderer;
144 }
145 }
146
147 /**
148 * Get the ColumnGroup header value.
149 * @return the value.
150 */
151 public Object getHeaderValue() {
152 return text;
153 }
154
155 /**
156 * Get the dimension of this ColumnGroup.
157 * @param table the table the header is being rendered in
158 * @return the dimension of the ColumnGroup
159 */
160 public Dimension getSize(JTable table) {
161 Component comp = renderer.getTableCellRendererComponent(
162 table, getHeaderValue(), false, false,-1, -1);
163 int height = comp.getPreferredSize().height;
164 int width = 0;
165 Iterator iter = v.iterator();
166 while (iter.hasNext()) {
167 Object obj = iter.next();
168 if (obj instanceof TableColumn) {
169 TableColumn aColumn = (TableColumn)obj;
170 width += aColumn.getWidth();
171 } else {
172 width += ((ColumnGroup)obj).getSize(table).width;
173 }
174 }
175 return new Dimension(width, height);
176 }
177
178 /**
179 * Sets the margin that ColumnGroup instance will use and all
180 * held TableColumns and/or ColumnGroups.
181 * @param margin the margin
182 */
183 public void setColumnMargin(int margin) {
184 this.margin = margin;
185 Iterator iter = v.iterator();
186 while (iter.hasNext()) {
187 Object obj = iter.next();
188 if (obj instanceof ColumnGroup) {
189 ((ColumnGroup)obj).setColumnMargin(margin);
190 }
191 }
192 }
193 }
194