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

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

removed instructions, changed title to be the same string as in the contents, and use a new class DesignPaneHeader to create teh header which has title and help button

  • 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.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.setLayout(new BorderLayout());
211 element_pane.add(element_label, BorderLayout.NORTH);
212 element_pane.add(element_list_scroll_pane, BorderLayout.CENTER);
213
214 central_pane.setLayout(new GridLayout(2,1));
215 central_pane.add(set_pane);
216 central_pane.add(element_pane);
217
218 button_pane.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
219 button_pane.setLayout(new GridLayout(1,3,0,0));
220 button_pane.add(add_button);
221 button_pane.add(edit_button);
222 button_pane.add(remove_button);
223
224 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
225 setLayout(new BorderLayout());
226 add(header_pane, BorderLayout.NORTH);
227 add(central_pane, BorderLayout.CENTER);
228 add(button_pane, BorderLayout.SOUTH);
229 }
230
231
232 public void destroy() { }
233
234
235 public void gainFocus()
236 {
237
238 // If no current selection, select first available set
239 if (set_list.isSelectionEmpty() && set_list.getModel().getSize() > 0) {
240 set_list.setSelectedIndex(0);
241 list_listener.valueChanged(new ListSelectionEvent(set_list, 0, 0, true));
242 }
243 if (!set_list.isSelectionEmpty()) {
244 edit_button.setEnabled(true);
245 remove_button.setEnabled(true);
246 } else {
247 edit_button.setEnabled(false);
248 remove_button.setEnabled(false);
249 }
250
251 }
252
253
254 public void loseFocus() { }
255
256
257 /** Listens for clicks on the add button. */
258 private class AddButtonListener
259 implements ActionListener {
260
261 /** Called when the add button is clicked.
262 * @param event an ActionEvent containing information about the mouse click
263 */
264 public void actionPerformed(ActionEvent event)
265 {
266 JFileChooser chooser = new JFileChooser(new File(Gatherer.getGLIMetadataDirectoryPath()));
267 chooser.setFileFilter(new MetadataSet.MetadataSetFileFilter());
268 int return_val = chooser.showDialog(Gatherer.g_man, Dictionary.get("CDM.MetadataSetManager.Add"));
269 if (return_val == JFileChooser.APPROVE_OPTION) {
270 Gatherer.c_man.importMetadataSet(new MetadataSet(chooser.getSelectedFile()));
271 refreshModel();
272
273 // The metadata.xml files may possibly contain metadata for this newly added metadata set
274 // Re-read all the metadata.xml files to account for this case
275 MetadataXMLFileManager.clearMetadataXMLFiles();
276 MetadataXMLFileManager.loadMetadataXMLFiles(new File(Gatherer.c_man.getCollectionImportDirectoryPath()));
277 }
278 }
279 }
280
281
282 /** Listens for clicks on the edit button. */
283 private class EditButtonListener
284 implements ActionListener {
285
286 /** Called when the edit button is clicked.
287 * @param event an ActionEvent containing information about the mouse click
288 */
289 public void actionPerformed(ActionEvent event)
290 {
291 // do a pop up message
292 JOptionPane.showMessageDialog(Gatherer.g_man, Dictionary.get("CDM.MetadataSetManager.Edit_Message"), Dictionary.get("CDM.MetadataSetManager.Edit_Message_Title"), JOptionPane.INFORMATION_MESSAGE);
293
294 }
295 }
296
297
298 private class MetadataSetListCellRenderer
299 implements ListCellRenderer
300 {
301 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
302 {
303 DefaultListCellRenderer default_list_cell_renderer = new DefaultListCellRenderer();
304 JLabel list_cell_label = (JLabel) default_list_cell_renderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
305
306 if (value instanceof MetadataSet) {
307 MetadataSet metadata_set = (MetadataSet) value;
308 String metadata_set_name = MetadataTools.getMetadataSetAttribute(metadata_set, "Name", Configuration.getLanguage(), "en");
309 list_cell_label.setText("metadataset " + metadata_set.getNamespace() + " \"" + metadata_set_name + "\"");
310 }
311
312 return list_cell_label;
313 }
314 }
315
316
317 private class MetadataSetListSelectionListener
318 implements ListSelectionListener {
319
320 public void valueChanged(ListSelectionEvent event)
321 {
322 // Wait until we get a stable event
323 if (event.getValueIsAdjusting()) {
324 return;
325 }
326
327 // Now we can process it
328 if (!set_list.isSelectionEmpty()) {
329 MetadataSet metadata_set = (MetadataSet) set_list.getSelectedValue();
330 element_list.setListData(new Vector(metadata_set.getMetadataSetElements()));
331 remove_button.setEnabled(true);
332 edit_button.setEnabled(true);
333
334 // Finally check the directionality and scroll as necessary
335 JScrollBar scroll_bar = element_list_scroll_pane.getHorizontalScrollBar();
336 if (element_list_cell_renderer.getDirectionality() == Character.DIRECTIONALITY_RIGHT_TO_LEFT) {
337 scroll_bar.setValue(scroll_bar.getMaximum());
338 }
339 else {
340 scroll_bar.setValue(scroll_bar.getMinimum());
341 }
342 }
343 else {
344 remove_button.setEnabled(false);
345 edit_button.setEnabled(false);
346 }
347 }
348 }
349
350
351 /** Listens for clicks on the remove button. */
352 private class RemoveButtonListener
353 implements ActionListener {
354
355 /** Called when the remove button is clicked.
356 * @param event an ActionEvent containing information about the mouse click
357 */
358 public void actionPerformed(ActionEvent event)
359 {
360 MetadataSet metadata_set = (MetadataSet) set_list.getSelectedValue();
361 Gatherer.c_man.removeMetadataSet(metadata_set);
362 refreshModel();
363 element_list.setListData(new Vector());
364 }
365 }
366 }
367}
Note: See TracBrowser for help on using the repository browser.