View Javadoc

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