source: trunk/gli/src/org/greenstone/gatherer/cdm/MetadataSetView.java@ 9134

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

Removed unused Coloring class.

  • Property svn:keywords set to Author Date Id Revision
File size: 13.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 * 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 /** Adds a new set to the collection*/
127 private JButton add_button;
128 /** Will eventually launch GEMS for editing the selected set, for now just gives a message */
129 private JButton edit_button;
130 /** REmoves a set from the collection */
131 private JButton remove_button;
132 /** The label denoting the element list. */
133 private JLabel element_label = null;
134 /** The label denoting the set list. */
135 private JLabel set_label = null;
136 /** The title of these controls. */
137 private JLabel title = null;
138 /** The list of elements for the choosen set. */
139 private JList element_list = null;
140 /** The list of sets in this collection. */
141 private JList set_list = null;
142 /** The panel onto which all other panels will be placed. */
143 private JPanel central_pane = null;
144 /** The panel onto which the element list will be placed. */
145 private JPanel element_pane = null;
146 /** The panel containing the title and instructions. */
147 private JPanel header_pane = null;
148 /** The panel containing the set list. */
149 private JPanel set_pane = null;
150
151 private JScrollPane element_list_scroll_pane;
152 /** The text area of inline instructions. */
153 private JTextArea instructions = null;
154
155 private MetadataElementListCellRenderer element_list_cell_renderer;
156 private MetadataSetListSelectionListener list_listener;
157
158 /* Constructor.
159 * @see org.greenstone.gatherer.Dictionary
160 * @see org.greenstone.gatherer.cdm.MetadataSetView.ListListener
161 */
162 public MetadataSetViewControls()
163 {
164 // Create visual components
165 central_pane = new JPanel();
166 element_label = new JLabel();
167 element_label.setHorizontalAlignment(JLabel.CENTER);
168 element_label.setOpaque(true);
169 Dictionary.registerText(element_label, "CDM.MetadataSetManager.Elements");
170 element_list = new JList();
171 element_list_scroll_pane = new JScrollPane();
172 element_list_scroll_pane.setViewportView(element_list);
173 element_list_cell_renderer = new MetadataElementListCellRenderer();
174 element_list.setCellRenderer(element_list_cell_renderer);
175 element_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
176 element_pane = new JPanel();
177 header_pane = new JPanel();
178 instructions = new JTextArea();
179 instructions.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
180 instructions.setEditable(false);
181 instructions.setLineWrap(true);
182 instructions.setRows(6);
183 instructions.setWrapStyleWord(true);
184 Dictionary.registerText(instructions, "CDM.MetadataSetManager.Instructions");
185 set_label = new JLabel();
186 set_label.setHorizontalAlignment(JLabel.CENTER);
187 set_label.setOpaque(true);
188 Dictionary.registerText(set_label, "CDM.MetadataSetManager.Sets");
189 set_list = new JList(model);
190 set_list.setCellRenderer(new MetadataSetListCellRenderer());
191 set_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
192
193 set_pane = new JPanel();
194 title = new JLabel();
195 title.setHorizontalAlignment(JLabel.CENTER);
196 title.setOpaque(true);
197 Dictionary.registerText(title, "CDM.MetadataSetManager.Title");
198
199 JPanel button_pane = new JPanel();
200 add_button = new GLIButton();
201 add_button.setEnabled(true);
202 add_button.setMnemonic(KeyEvent.VK_A);
203 Dictionary.registerBoth(add_button, "CDM.MetadataSetManager.Add", "CDM.MetadataSetManager.Add_Tooltip");
204 edit_button = new GLIButton();
205 edit_button.setEnabled(false);
206 edit_button.setMnemonic(KeyEvent.VK_E);
207 Dictionary.registerBoth(edit_button, "CDM.MetadataSetManager.Edit", "CDM.MetadataSetManager.Edit_Tooltip");
208
209 remove_button = new GLIButton();
210 remove_button.setEnabled(false);
211 remove_button.setMnemonic(KeyEvent.VK_R);
212 Dictionary.registerBoth(remove_button, "CDM.MetadataSetManager.Remove", "CDM.MetadataSetManager.Remove_Tooltip");
213 list_listener = new MetadataSetListSelectionListener();
214
215 // Add listeners
216 add_button.addActionListener(new AddButtonListener());
217 edit_button.addActionListener(new EditButtonListener());
218 remove_button.addActionListener(new RemoveButtonListener());
219 set_list.addListSelectionListener(list_listener);
220 // Layout
221 instructions.setBorder(BorderFactory.createEmptyBorder(2,5,2,5));
222
223 header_pane.setLayout(new BorderLayout());
224 header_pane.add(title, BorderLayout.NORTH);
225 header_pane.add(new JScrollPane(instructions), BorderLayout.CENTER);
226
227 set_pane.setLayout(new BorderLayout());
228 set_pane.add(set_label, BorderLayout.NORTH);
229 set_pane.add(new JScrollPane(set_list), BorderLayout.CENTER);
230
231 element_pane.setLayout(new BorderLayout());
232 element_pane.add(element_label, BorderLayout.NORTH);
233 element_pane.add(element_list_scroll_pane, BorderLayout.CENTER);
234
235 central_pane.setLayout(new GridLayout(2,1));
236 central_pane.add(set_pane);
237 central_pane.add(element_pane);
238
239 button_pane.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
240 button_pane.setLayout(new GridLayout(1,3,0,0));
241 button_pane.add(add_button);
242 button_pane.add(edit_button);
243 button_pane.add(remove_button);
244
245 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
246 setLayout(new BorderLayout());
247 add(header_pane, BorderLayout.NORTH);
248 add(central_pane, BorderLayout.CENTER);
249 add(button_pane, BorderLayout.SOUTH);
250 }
251
252
253 public void destroy() { }
254
255
256 public void gainFocus()
257 {
258 // Ensure the instructions area is scrolled to the top
259 if (instructions != null) {
260 instructions.setCaretPosition(0);
261 }
262
263 // If no current selection, select first available set
264 if (set_list.isSelectionEmpty() && set_list.getModel().getSize() > 0) {
265 set_list.setSelectedIndex(0);
266 list_listener.valueChanged(new ListSelectionEvent(set_list, 0, 0, true));
267 }
268 if (!set_list.isSelectionEmpty()) {
269 edit_button.setEnabled(true);
270 remove_button.setEnabled(true);
271 } else {
272 edit_button.setEnabled(false);
273 remove_button.setEnabled(false);
274 }
275
276 }
277
278
279 public void loseFocus() { }
280
281
282 /** Listens for clicks on the add button. */
283 private class AddButtonListener
284 implements ActionListener {
285
286 /** Called when the add button is clicked.
287 * @param event an ActionEvent containing information about the mouse click
288 */
289 public void actionPerformed(ActionEvent event)
290 {
291 JFileChooser chooser = new JFileChooser(new File(Utility.METADATA_DIR));
292 chooser.setFileFilter(new MetadataSet.MetadataSetFileFilter());
293 int return_val = chooser.showDialog(Gatherer.g_man, Dictionary.get("MSMPrompt.File_Import"));
294 if (return_val == JFileChooser.APPROVE_OPTION) {
295 Gatherer.c_man.importMetadataSet(new MetadataSet(chooser.getSelectedFile()));
296 refreshModel();
297
298 // The metadata.xml files may possibly contain metadata for this newly added metadata set
299 // Re-read all the metadata.xml files to account for this case
300 MetadataXMLFileManager.clearMetadataXMLFiles();
301 MetadataXMLFileManager.loadMetadataXMLFiles(new File(Gatherer.c_man.getCollectionImportDirectoryPath()));
302 }
303 }
304 }
305
306
307 /** Listens for clicks on the edit button. */
308 private class EditButtonListener
309 implements ActionListener {
310
311 /** Called when the edit button is clicked.
312 * @param event an ActionEvent containing information about the mouse click
313 */
314 public void actionPerformed(ActionEvent event)
315 {
316 // do a pop up message
317 JOptionPane.showMessageDialog(Gatherer.g_man, Dictionary.get("CDM.MetadataSetManager.Edit_Message"), Dictionary.get("CDM.MetadataSetManager.Edit_Message_Title"), JOptionPane.INFORMATION_MESSAGE);
318
319 }
320 }
321
322
323 private class MetadataSetListCellRenderer
324 implements ListCellRenderer
325 {
326 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
327 {
328 DefaultListCellRenderer default_list_cell_renderer = new DefaultListCellRenderer();
329 JLabel list_cell_label = (JLabel) default_list_cell_renderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
330
331 if (value instanceof MetadataSet) {
332 MetadataSet metadata_set = (MetadataSet) value;
333 String metadata_set_name = MetadataTools.getMetadataSetAttribute(metadata_set, "Name", Configuration.getLanguage(), "en");
334 list_cell_label.setText("metadataset " + metadata_set.getNamespace() + " \"" + metadata_set_name + "\"");
335 }
336
337 return list_cell_label;
338 }
339 }
340
341
342 private class MetadataSetListSelectionListener
343 implements ListSelectionListener {
344
345 public void valueChanged(ListSelectionEvent event)
346 {
347 // Wait until we get a stable event
348 if (event.getValueIsAdjusting()) {
349 return;
350 }
351
352 // Now we can process it
353 if (!set_list.isSelectionEmpty()) {
354 MetadataSet metadata_set = (MetadataSet) set_list.getSelectedValue();
355 element_list.setListData(new Vector(metadata_set.getMetadataSetElements()));
356 remove_button.setEnabled(true);
357 edit_button.setEnabled(true);
358
359 // Finally check the directionality and scroll as necessary
360 JScrollBar scroll_bar = element_list_scroll_pane.getHorizontalScrollBar();
361 if (element_list_cell_renderer.getDirectionality() == Character.DIRECTIONALITY_RIGHT_TO_LEFT) {
362 scroll_bar.setValue(scroll_bar.getMaximum());
363 }
364 else {
365 scroll_bar.setValue(scroll_bar.getMinimum());
366 }
367 }
368 else {
369 remove_button.setEnabled(false);
370 edit_button.setEnabled(false);
371 }
372 }
373 }
374
375
376 /** Listens for clicks on the remove button. */
377 private class RemoveButtonListener
378 implements ActionListener {
379
380 /** Called when the remove button is clicked.
381 * @param event an ActionEvent containing information about the mouse click
382 */
383 public void actionPerformed(ActionEvent event)
384 {
385 MetadataSet metadata_set = (MetadataSet) set_list.getSelectedValue();
386 Gatherer.c_man.removeMetadataSet(metadata_set);
387 refreshModel();
388 element_list.setListData(new Vector());
389 }
390 }
391 }
392}
Note: See TracBrowser for help on using the repository browser.