source: trunk/gli/src/org/greenstone/gatherer/cdm/MetadataSetView.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: 12.8 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 * Author: John Thompson, Greenstone Digital Library, University of Waikato
9 *
10 * Copyright (C) 1999 New Zealand Digital Library Project
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 *########################################################################
26 */
27package org.greenstone.gatherer.cdm;
28
29import java.awt.*;
30import java.awt.event.*;
31import java.io.File;
32import java.util.*;
33import javax.swing.*;
34import javax.swing.event.*;
35import javax.swing.filechooser.*;
36import org.greenstone.gatherer.Configuration;
37import org.greenstone.gatherer.DebugStream;
38import org.greenstone.gatherer.Dictionary;
39import org.greenstone.gatherer.Gatherer;
40import org.greenstone.gatherer.gui.GLIButton;
41import org.greenstone.gatherer.gui.MetadataElementListCellRenderer;
42import org.greenstone.gatherer.metadata.MetadataElement;
43import org.greenstone.gatherer.metadata.MetadataSet;
44import org.greenstone.gatherer.metadata.MetadataSetManager;
45import org.greenstone.gatherer.metadata.MetadataTools;
46import org.greenstone.gatherer.metadata.MetadataXMLFileManager;
47import org.greenstone.gatherer.util.Utility;
48
49
50/** This class only knows how to produce a simple visual representation of the currently imported metadata sets. It is also read-only, so should be fairly straight forward.
51 * @author John Thompson, Greenstone Digital Library, University of Waikato
52 * @version 2.3d
53 */
54public class MetadataSetView
55 extends DynamicListModel {
56
57 /** The visual contols used to review the metadata sets. */
58 private Control controls = null;
59 /** A reference to ourselves so our inner classes can refer to us. */
60 private DynamicListModel model = null;
61
62
63 public MetadataSetView()
64 {
65 model = this;
66
67 // Initialise the model
68 refreshModel();
69
70 // Build the controls
71 controls = new MetadataSetViewControls();
72 }
73
74
75 public void destroy()
76 {
77 controls.destroy();
78 controls = null;
79 model = null;
80 }
81
82
83 /** A method for retrieve the controls for this manager.
84 */
85 public Control getControls() {
86 return controls;
87 }
88
89
90 public void refreshModel()
91 {
92 // Remove any metadata sets from the model that are no longer loaded
93 ArrayList loaded_metadata_sets = MetadataSetManager.getMetadataSets();
94 for (int i = size() - 1; i >= 0; i--) {
95 MetadataSet metadata_set = (MetadataSet) get(i);
96 if (loaded_metadata_sets.contains(metadata_set) == false) {
97 // System.err.println("Metadata set in list no longer loaded...removing.");
98 remove(i);
99 }
100 }
101
102 // Add any metadata sets that are loaded but not in the model
103 for (int i = 0; i < loaded_metadata_sets.size(); i++) {
104 MetadataSet loaded_metadata_set = (MetadataSet) loaded_metadata_sets.get(i);
105 boolean in_model = false;
106 for (int j = 0; j < size(); j++) {
107 MetadataSet metadata_set = (MetadataSet) get(j);
108 if (metadata_set.equals(loaded_metadata_set)) {
109 in_model = true;
110 break;
111 }
112 }
113
114 if (in_model == false) {
115 // System.err.println("Metadata set loaded but not in list...adding.");
116 addElement(loaded_metadata_set);
117 }
118 }
119 }
120
121
122 /** This class creates and lays-out the various controls for reviewing the metadata sets, and their commands as they would appear in the collection configuration file. */
123 private class MetadataSetViewControls
124 extends JPanel
125 implements Control {
126 /** Opens the MEM and systematically performs as if the add set button were clicked. */
127 private JButton add_button;
128 /** Opens the MEM and systematically performs as if the remove set button were clicked. */
129 private JButton remove_button;
130 /** The label denoting the element list. */
131 private JLabel element_label = null;
132 /** The label denoting the set list. */
133 private JLabel set_label = null;
134 /** The title of these controls. */
135 private JLabel title = null;
136 /** The list of elements for the choosen set. */
137 private JList element_list = null;
138 /** The list of sets in this collection. */
139 private JList set_list = null;
140 /** The panel onto which all other panels will be placed. */
141 private JPanel central_pane = null;
142 /** The panel onto which the element list will be placed. */
143 private JPanel element_pane = null;
144 /** The panel containing the title and instructions. */
145 private JPanel header_pane = null;
146 /** The panel containing the set list. */
147 private JPanel set_pane = null;
148
149 private JScrollPane element_list_scroll_pane;
150 /** The text area of inline instructions. */
151 private JTextArea instructions = null;
152
153 private MetadataElementListCellRenderer element_list_cell_renderer;
154 private MetadataSetListSelectionListener list_listener;
155
156 /* Constructor.
157 * @see org.greenstone.gatherer.Coloring;
158 * @see org.greenstone.gatherer.Dictionary
159 * @see org.greenstone.gatherer.cdm.MetadataSetView.ListListener
160 */
161 public MetadataSetViewControls()
162 {
163 // Create visual components
164 central_pane = new JPanel();
165 element_label = new JLabel();
166 element_label.setHorizontalAlignment(JLabel.CENTER);
167 element_label.setOpaque(true);
168 Dictionary.registerText(element_label, "CDM.MetadataSetManager.Elements");
169 element_list = new JList();
170 element_list_scroll_pane = new JScrollPane();
171 element_list_scroll_pane.setViewportView(element_list);
172 element_list_cell_renderer = new MetadataElementListCellRenderer();
173 element_list.setCellRenderer(element_list_cell_renderer);
174 element_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
175 element_pane = new JPanel();
176 header_pane = new JPanel();
177 instructions = new JTextArea();
178 instructions.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
179 instructions.setEditable(false);
180 instructions.setLineWrap(true);
181 instructions.setRows(6);
182 instructions.setWrapStyleWord(true);
183 Dictionary.registerText(instructions, "CDM.MetadataSetManager.Instructions");
184 set_label = new JLabel();
185 set_label.setHorizontalAlignment(JLabel.CENTER);
186 set_label.setOpaque(true);
187 Dictionary.registerText(set_label, "CDM.MetadataSetManager.Sets");
188 set_list = new JList(model);
189 set_list.setCellRenderer(new MetadataSetListCellRenderer());
190 set_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
191
192 set_pane = new JPanel();
193 title = new JLabel();
194 title.setHorizontalAlignment(JLabel.CENTER);
195 title.setOpaque(true);
196 Dictionary.registerText(title, "CDM.MetadataSetManager.Title");
197
198 JPanel button_pane = new JPanel();
199 add_button = new GLIButton();
200 add_button.setEnabled(true);
201 add_button.setMnemonic(KeyEvent.VK_A);
202 Dictionary.registerBoth(add_button, "CDM.MetadataSetManager.Add", "CDM.MetadataSetManager.Add_Tooltip");
203 remove_button = new GLIButton();
204 remove_button.setEnabled(false);
205 remove_button.setMnemonic(KeyEvent.VK_R);
206 Dictionary.registerBoth(remove_button, "CDM.MetadataSetManager.Remove", "CDM.MetadataSetManager.Remove_Tooltip");
207 list_listener = new MetadataSetListSelectionListener();
208
209 // Add listeners
210 add_button.addActionListener(new AddButtonListener());
211 remove_button.addActionListener(new RemoveButtonListener());
212 set_list.addListSelectionListener(list_listener);
213 // Layout
214 instructions.setBorder(BorderFactory.createEmptyBorder(2,5,2,5));
215
216 header_pane.setLayout(new BorderLayout());
217 header_pane.add(title, BorderLayout.NORTH);
218 header_pane.add(new JScrollPane(instructions), BorderLayout.CENTER);
219
220 set_pane.setLayout(new BorderLayout());
221 set_pane.add(set_label, BorderLayout.NORTH);
222 set_pane.add(new JScrollPane(set_list), BorderLayout.CENTER);
223
224 element_pane.setLayout(new BorderLayout());
225 element_pane.add(element_label, BorderLayout.NORTH);
226 element_pane.add(element_list_scroll_pane, BorderLayout.CENTER);
227
228 central_pane.setLayout(new GridLayout(2,1));
229 central_pane.add(set_pane);
230 central_pane.add(element_pane);
231
232 button_pane.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
233 button_pane.setLayout(new GridLayout(1,3,0,0));
234 button_pane.add(add_button);
235 button_pane.add(remove_button);
236
237 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
238 setLayout(new BorderLayout());
239 add(header_pane, BorderLayout.NORTH);
240 add(central_pane, BorderLayout.CENTER);
241 add(button_pane, BorderLayout.SOUTH);
242 }
243
244
245 public void destroy() { }
246
247
248 public void gainFocus()
249 {
250 // Ensure the instructions area is scrolled to the top
251 if (instructions != null) {
252 instructions.setCaretPosition(0);
253 }
254
255 // If no current selection, select first available set
256 if (set_list.isSelectionEmpty() && set_list.getModel().getSize() > 0) {
257 set_list.setSelectedIndex(0);
258 list_listener.valueChanged(new ListSelectionEvent(set_list, 0, 0, true));
259 }
260 }
261
262
263 public void loseFocus() { }
264
265
266 /** Listens for clicks on the add button. */
267 private class AddButtonListener
268 implements ActionListener {
269
270 /** Called when the add button is clicked.
271 * @param event an ActionEvent containing information about the mouse click
272 */
273 public void actionPerformed(ActionEvent event)
274 {
275 JFileChooser chooser = new JFileChooser(new File(Utility.METADATA_DIR));
276 chooser.setFileFilter(new MetadataSet.MetadataSetFileFilter());
277 int return_val = chooser.showDialog(Gatherer.g_man, Dictionary.get("MSMPrompt.File_Import"));
278 if (return_val == JFileChooser.APPROVE_OPTION) {
279 Gatherer.c_man.importMetadataSet(new MetadataSet(chooser.getSelectedFile()));
280 refreshModel();
281
282 // The metadata.xml files may possibly contain metadata for this newly added metadata set
283 // Re-read all the metadata.xml files to account for this case
284 MetadataXMLFileManager.clearMetadataXMLFiles();
285 MetadataXMLFileManager.loadMetadataXMLFiles(new File(Gatherer.c_man.getCollectionImport()));
286 }
287 }
288 }
289
290
291 private class MetadataSetListCellRenderer
292 implements ListCellRenderer
293 {
294 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
295 {
296 DefaultListCellRenderer default_list_cell_renderer = new DefaultListCellRenderer();
297 JLabel list_cell_label = (JLabel) default_list_cell_renderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
298
299 if (value instanceof MetadataSet) {
300 MetadataSet metadata_set = (MetadataSet) value;
301 String metadata_set_name = MetadataTools.getMetadataSetAttribute(metadata_set, "Name", Configuration.getLanguage(), "en");
302 list_cell_label.setText("metadataset " + metadata_set.getNamespace() + " \"" + metadata_set_name + "\"");
303 }
304
305 return list_cell_label;
306 }
307 }
308
309
310 private class MetadataSetListSelectionListener
311 implements ListSelectionListener {
312
313 public void valueChanged(ListSelectionEvent event)
314 {
315 // Wait until we get a stable event
316 if (event.getValueIsAdjusting()) {
317 return;
318 }
319
320 // Now we can process it
321 if (!set_list.isSelectionEmpty()) {
322 MetadataSet metadata_set = (MetadataSet) set_list.getSelectedValue();
323 element_list.setListData(new Vector(metadata_set.getMetadataSetElements()));
324 remove_button.setEnabled(true);
325
326 // Finally check the directionality and scroll as necessary
327 JScrollBar scroll_bar = element_list_scroll_pane.getHorizontalScrollBar();
328 if (element_list_cell_renderer.getDirectionality() == Character.DIRECTIONALITY_RIGHT_TO_LEFT) {
329 scroll_bar.setValue(scroll_bar.getMaximum());
330 }
331 else {
332 scroll_bar.setValue(scroll_bar.getMinimum());
333 }
334 }
335 else {
336 remove_button.setEnabled(false);
337 }
338 }
339 }
340
341
342 /** Listens for clicks on the remove button. */
343 private class RemoveButtonListener
344 implements ActionListener {
345
346 /** Called when the remove button is clicked.
347 * @param event an ActionEvent containing information about the mouse click
348 */
349 public void actionPerformed(ActionEvent event)
350 {
351 MetadataSet metadata_set = (MetadataSet) set_list.getSelectedValue();
352 Gatherer.c_man.removeMetadataSet(metadata_set);
353 refreshModel();
354 element_list.setListData(new Vector());
355 }
356 }
357 }
358}
Note: See TracBrowser for help on using the repository browser.