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

Last change on this file since 8432 was 8432, checked in by mdewsnip, 19 years ago

Fixed the problem where filtering empty values causes NPEs, and now displays all the values assigned to a metadata element, not just the last.

  • Property svn:keywords set to Author Date Id Revision
File size: 5.9 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 Filter filter;
60
61 private HeaderRenderer header_renderer;
62
63 private MetaAuditFrame parent_frame;
64
65 private MetaAuditRenderer cell_renderer;
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.cell_renderer = new MetaAuditRenderer();
76 this.header_renderer = new HeaderRenderer();
77 this.parent_frame = parent_frame;
78 getTableHeader().addMouseListener(new HeaderListener(parent_frame, this));
79 setAutoResizeMode(AUTO_RESIZE_OFF);
80 }
81
82 public Filter getFilter() {
83 return filter;
84 }
85
86
87 public MetadataAuditTableModel getOriginalModel()
88 {
89 return metadata_audit_table_model;
90 }
91
92
93 public TableModelSorter getSorter() {
94 return helper.getTableModelSorter();
95 }
96
97 public boolean isFiltered(int column) {
98 if(filter == null) {
99 return false;
100 }
101 return filter.isFiltered(column);
102 }
103
104 public void newModel(FileNode records[]) {
105 if(records == null || records.length == 0) {
106 setModel(new DefaultTableModel());
107 return;
108 }
109 wait(true);
110 initial_state = true;
111 // System.err.println("Build new Model - should only be called once per click!");
112 metadata_audit_table_model = new MetadataAuditTableModel();
113 metadata_audit_table_model.rebuild(records);
114 setModel(metadata_audit_table_model);
115 filter = new Filter(metadata_audit_table_model.getColumnCount());
116 helper = new SortedTableHelper (this, filter, new DefaultTableModelSorter(), header_renderer, null);
117 helper.prepareTable();
118 // Add renderer to columns.
119 TableColumnModel column_model = getColumnModel();
120 for(int i = 0; i < column_model.getColumnCount(); i++) {
121 column_model.getColumn(i).setCellRenderer(cell_renderer);
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
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
137 // Iterate through cell values finding tallest and widest for each row and column respectively.
138 for (int j = 0; j < dataModel.getRowCount(); j++) {
139 for (int k = 0; k < dataModel.getColumnCount(); k++) {
140 Object object = dataModel.getValueAt(j, k);
141 if (object instanceof ArrayList) {
142 ArrayList data = (ArrayList) object;
143 if (heights[j] == null || data.size() > heights[j].size()) {
144 heights[j] = data;
145 }
146 String longest = "";
147 for (int i = 0; i < data.size(); i++) {
148 String temp = data.get(i).toString();
149 if (temp.length() > longest.length()) {
150 longest = temp;
151 }
152 }
153 if (widths[k] == null || longest.length() > widths_value[k]) {
154 widths_value[k] = longest.length();
155 widths[k] = data;
156 }
157 }
158 }
159 }
160
161 // Now assign the dimensions we have determined to be the largest.
162 for (int l = 0; l < heights.length; l++) {
163 if (heights[l] != null) {
164 Component component = cell_renderer.getTableCellRendererComponent(this, heights[l], false, false, 0, 0);
165 Dimension size = component.getPreferredSize();
166 setRowHeight(l, size.height);
167 }
168 }
169 for (int m = 0; m < widths.length; m++) {
170 if (widths[m] != null) {
171 Component component = cell_renderer.getTableCellRendererComponent(this, widths[m], false, false, 0, 0);
172 Dimension size = component.getPreferredSize();
173 int width = size.width + MARGIN;
174 if (width > (2 * parent_frame.getSize().width) / 3) {
175 width = (2 * parent_frame.getSize().width) / 3;
176 }
177
178 Component header = header_renderer.getTableCellRendererComponent(this, dataModel.getColumnName(m), false, false, 0, 0);
179 if (header.getPreferredSize().width + MARGIN > width) {
180 width = header.getPreferredSize().width + MARGIN;
181 }
182 columnModel.getColumn(m).setPreferredWidth(width);
183 }
184 }
185
186 wait(initial_state);
187 }
188
189
190 public void sortOrderChanged(TableModelSorterEvent event) {
191 }
192
193 private void wait(boolean waiting) {
194 if(parent_frame != null) {
195 parent_frame.wait(waiting);
196 }
197 }
198}
Note: See TracBrowser for help on using the repository browser.