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

Last change on this file since 8313 was 8313, checked in by mdewsnip, 20 years ago

Finally committing the (many) changes to the GLI to use the new metadata code... I hope this doesn't have too many bugs in it and committing it now doesn't stuff anyone up! (Katherine said I could commit it, so blame her if anything goes wrong).

  • Property svn:keywords set to Author Date Id Revision
File size: 6.2 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.file.FileNode;
46import org.greenstone.gatherer.metadata.MetadataAuditTableModel;
47
48
49/**
50 * @author John Thompson, Greenstone Digital Library, University of Waikato
51 * @version 2.3
52 */
53public class MetaAuditTable
54 extends JTable
55 implements TableModelSorterListener {
56
57 private boolean initial_state;
58
59 private boolean ready;
60
61 private Filter filter;
62
63 private HeaderRenderer header_renderer;
64
65 private MetaAuditFrame parent_frame;
66
67 private MetadataAuditTableModel metadata_audit_table_model;
68
69 private SortedTableHelper helper;
70
71 static final private int MARGIN = 10;
72
73 public MetaAuditTable(MetaAuditFrame parent_frame) {
74 super();
75 this.header_renderer = new HeaderRenderer();
76 this.parent_frame = parent_frame;
77 getTableHeader().addMouseListener(new HeaderListener(parent_frame, this));
78 setAutoResizeMode(AUTO_RESIZE_OFF);
79 setDefaultRenderer(ArrayList.class, new MetaAuditRenderer());
80 ready = true;
81 }
82
83 public Filter getFilter() {
84 return filter;
85 }
86
87
88 public MetadataAuditTableModel getOriginalModel()
89 {
90 return metadata_audit_table_model;
91 }
92
93
94 public TableModelSorter getSorter() {
95 return helper.getTableModelSorter();
96 }
97
98 public boolean isFiltered(int column) {
99 if(filter == null) {
100 return false;
101 }
102 return filter.isFiltered(column);
103 }
104
105 public void newModel(FileNode records[]) {
106 if(records == null || records.length == 0) {
107 setModel(new DefaultTableModel());
108 return;
109 }
110 wait(true);
111 initial_state = true;
112 // System.err.println("Build new Model - should only be called once per click!");
113 metadata_audit_table_model = new MetadataAuditTableModel();
114 metadata_audit_table_model.rebuild(records);
115 setModel(metadata_audit_table_model);
116 filter = new Filter(metadata_audit_table_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.