source: trunk/gli/src/org/greenstone/gatherer/gui/metaaudit/MetaAuditTable.java@ 7154

Last change on this file since 7154 was 5589, checked in by mdewsnip, 21 years ago

Nearly finished adding tooltips (and thank goodness for that).

  • Property svn:keywords set to Author Date Id Revision
File size: 6.4 KB
Line 
1/**
2 *#########################################################################
3 *
4 * A component of the Gatherer application, part of the Greenstone digital
5 * library suite from the New Zealand Digital Library Project at the
6 * University of Waikato, New Zealand.
7 *
8 * <BR><BR>
9 *
10 * Author: John Thompson, Greenstone Digital Library, University of Waikato
11 *
12 * <BR><BR>
13 *
14 * Copyright (C) 1999 New Zealand Digital Library Project
15 *
16 * <BR><BR>
17 *
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License as published by
20 * the Free Software Foundation; either version 2 of the License, or
21 * (at your option) any later version.
22 *
23 * <BR><BR>
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
29 *
30 * <BR><BR>
31 *
32 * You should have received a copy of the GNU General Public License
33 * along with this program; if not, write to the Free Software
34 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
35 *########################################################################
36 */
37package org.greenstone.gatherer.gui.metaaudit;
38
39import de.qfs.lib.gui.*;
40import java.awt.*;
41import java.util.ArrayList;
42import javax.swing.JTable;
43import javax.swing.event.TableModelEvent;
44import javax.swing.table.*;
45import org.greenstone.gatherer.Gatherer;
46import org.greenstone.gatherer.file.FileNode;
47import org.greenstone.gatherer.gui.metaaudit.Filter;
48import org.greenstone.gatherer.gui.metaaudit.HeaderListener;
49import org.greenstone.gatherer.gui.metaaudit.HeaderRenderer;
50import org.greenstone.gatherer.gui.metaaudit.MetaAuditFrame;
51import org.greenstone.gatherer.gui.metaaudit.MetaAuditModel;
52import org.greenstone.gatherer.gui.metaaudit.MetaAuditRenderer;
53/**
54 * @author John Thompson, Greenstone Digital Library, University of Waikato
55 * @version 2.3
56 */
57public class MetaAuditTable
58 extends JTable
59 implements TableModelSorterListener {
60
61 private boolean initial_state;
62
63 private boolean ready;
64
65 private Filter filter;
66
67 private HeaderRenderer header_renderer;
68
69 private MetaAuditFrame parent_frame;
70
71 private MetaAuditModel model;
72
73 private SortedTableHelper helper;
74
75 static final private int MARGIN = 10;
76
77 public MetaAuditTable(MetaAuditFrame parent_frame) {
78 super();
79 this.header_renderer = new HeaderRenderer();
80 this.parent_frame = parent_frame;
81 getTableHeader().addMouseListener(new HeaderListener(parent_frame, this));
82 setAutoResizeMode(AUTO_RESIZE_OFF);
83 setDefaultRenderer(ArrayList.class, new MetaAuditRenderer());
84 ready = true;
85 }
86
87 public Filter getFilter() {
88 return filter;
89 }
90
91 public MetaAuditModel getOriginalModel() {
92 return model;
93 }
94
95 public TableModelSorter getSorter() {
96 return helper.getTableModelSorter();
97 }
98
99 public boolean isFiltered(int column) {
100 if(filter == null) {
101 return false;
102 }
103 return filter.isFiltered(column);
104 }
105
106 public void newModel(FileNode records[]) {
107 if(records == null || records.length == 0) {
108 setModel(new DefaultTableModel());
109 return;
110 }
111 wait(true);
112 initial_state = true;
113 ///ystem.err.println("Build new Model - should only be called once per click!");
114 model = new MetaAuditModel(records);
115 setModel(model);
116 filter = new Filter(model.getColumnCount());
117 helper = new SortedTableHelper (this, filter, new DefaultTableModelSorter(), header_renderer, null);
118 helper.prepareTable();
119 // Add renderer to columns.
120 TableColumnModel column_model = getColumnModel();
121 for(int i = 0; i < column_model.getColumnCount(); i++) {
122 column_model.getColumn(i).setHeaderRenderer(header_renderer);
123 }
124 wait(false);
125 initial_state = false;
126 }
127
128 public void tableChanged(TableModelEvent e) {
129 wait(true);
130 super.tableChanged(e);
131 if(ready) {
132 // Create storage area
133 ArrayList heights[] = new ArrayList[dataModel.getRowCount()];
134 int widths_value[] = new int[dataModel.getColumnCount()];
135 ArrayList widths[] = new ArrayList[dataModel.getColumnCount()];
136 // Iterate through cell values finding tallest and widest for each row and column respectively.
137 for(int j = 0; j < dataModel.getRowCount(); j++) {
138 for(int k = 0; k < dataModel.getColumnCount(); k++) {
139 Object object = dataModel.getValueAt(j, k);
140 if(object instanceof ArrayList) {
141 ArrayList data = (ArrayList) object;
142 if(heights[j] == null || data.size() > heights[j].size()) {
143 heights[j] = data;
144 }
145 String longest = "";
146 for(int i = 0; i < data.size(); i++) {
147 String temp = data.get(i).toString();
148 if(temp.length() > longest.length()) {
149 longest = temp;
150 }
151 temp = null;
152 }
153 if(widths[k] == null || longest.length() > widths_value[k]) {
154 widths_value[k] = longest.length();
155 widths[k] = data;
156 }
157 longest = null;
158 data = null;
159 }
160 }
161 }
162 // Now assign the dimensions we have determined to be the largest.
163 TableCellRenderer renderer = getDefaultRenderer(ArrayList.class);
164 for(int l = 0; l < heights.length; l++) {
165 if(heights[l] != null) {
166 Component component = renderer.getTableCellRendererComponent(this, heights[l], false, false, 0, 0);
167 Dimension size = component.getPreferredSize();
168 setRowHeight(l, size.height);
169 size = null;
170 component = null;
171 }
172 }
173 heights = null;
174 for(int m = 0; m < widths.length; m++) {
175 if(widths[m] != null) {
176 Component component = renderer.getTableCellRendererComponent(this, widths[m], false, false, 0, 0);
177 Dimension size = component.getPreferredSize();
178 int width = size.width + MARGIN;
179 if(width > (2 * parent_frame.getSize().width) / 3) {
180 width = (2 * parent_frame.getSize().width) / 3;
181 }
182 Component header = header_renderer.getTableCellRendererComponent(this, dataModel.getColumnName(m), false, false, 0, 0);
183 if(header.getPreferredSize().width + MARGIN > width) {
184 width = header.getPreferredSize().width + MARGIN;
185 }
186 columnModel.getColumn(m).setPreferredWidth(width);
187 size = null;
188 component = null;
189 }
190 }
191 widths = null;
192 renderer = null;
193 }
194 wait(initial_state);
195 }
196
197 public void sortOrderChanged(TableModelSorterEvent event) {
198 }
199
200 private void wait(boolean waiting) {
201 if(parent_frame != null) {
202 parent_frame.wait(waiting);
203 }
204 }
205}
Note: See TracBrowser for help on using the repository browser.