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

Last change on this file since 12080 was 11635, checked in by kjdon, 18 years ago

changed the file chooser add button to 'add' instead of 'add metadata set'

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