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

Last change on this file since 11038 was 11038, checked in by mdewsnip, 18 years ago

Tidied up the look of the Design pane. Each Design pane screen now has consistent borders, and vertical spacing between elements has been improved.

  • Property svn:keywords set to Author Date Id Revision
File size: 13.0 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 int return_val = chooser.showDialog(Gatherer.g_man, Dictionary.get("CDM.MetadataSetManager.Add"));
271 if (return_val == JFileChooser.APPROVE_OPTION) {
272 Gatherer.c_man.importMetadataSet(new MetadataSet(chooser.getSelectedFile()));
273 refreshModel();
274
275 // The metadata.xml files may possibly contain metadata for this newly added metadata set
276 // Re-read all the metadata.xml files to account for this case
277 MetadataXMLFileManager.clearMetadataXMLFiles();
278 MetadataXMLFileManager.loadMetadataXMLFiles(new File(Gatherer.c_man.getCollectionImportDirectoryPath()));
279 }
280 }
281 }
282
283
284 /** Listens for clicks on the edit button. */
285 private class EditButtonListener
286 implements ActionListener {
287
288 /** Called when the edit button is clicked.
289 * @param event an ActionEvent containing information about the mouse click
290 */
291 public void actionPerformed(ActionEvent event)
292 {
293 // do a pop up message
294 JOptionPane.showMessageDialog(Gatherer.g_man, Dictionary.get("CDM.MetadataSetManager.Edit_Message"), Dictionary.get("CDM.MetadataSetManager.Edit_Message_Title"), JOptionPane.INFORMATION_MESSAGE);
295
296 }
297 }
298
299
300 private class MetadataSetListCellRenderer
301 implements ListCellRenderer
302 {
303 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
304 {
305 DefaultListCellRenderer default_list_cell_renderer = new DefaultListCellRenderer();
306 JLabel list_cell_label = (JLabel) default_list_cell_renderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
307
308 if (value instanceof MetadataSet) {
309 MetadataSet metadata_set = (MetadataSet) value;
310 String metadata_set_name = MetadataTools.getMetadataSetAttribute(metadata_set, "Name", Configuration.getLanguage(), "en");
311 list_cell_label.setText("metadataset " + metadata_set.getNamespace() + " \"" + metadata_set_name + "\"");
312 }
313
314 return list_cell_label;
315 }
316 }
317
318
319 private class MetadataSetListSelectionListener
320 implements ListSelectionListener {
321
322 public void valueChanged(ListSelectionEvent event)
323 {
324 // Wait until we get a stable event
325 if (event.getValueIsAdjusting()) {
326 return;
327 }
328
329 // Now we can process it
330 if (!set_list.isSelectionEmpty()) {
331 MetadataSet metadata_set = (MetadataSet) set_list.getSelectedValue();
332 element_list.setListData(new Vector(metadata_set.getMetadataSetElements()));
333 remove_button.setEnabled(true);
334 edit_button.setEnabled(true);
335
336 // Finally check the directionality and scroll as necessary
337 JScrollBar scroll_bar = element_list_scroll_pane.getHorizontalScrollBar();
338 if (element_list_cell_renderer.getDirectionality() == Character.DIRECTIONALITY_RIGHT_TO_LEFT) {
339 scroll_bar.setValue(scroll_bar.getMaximum());
340 }
341 else {
342 scroll_bar.setValue(scroll_bar.getMinimum());
343 }
344 }
345 else {
346 remove_button.setEnabled(false);
347 edit_button.setEnabled(false);
348 }
349 }
350 }
351
352
353 /** Listens for clicks on the remove button. */
354 private class RemoveButtonListener
355 implements ActionListener {
356
357 /** Called when the remove button is clicked.
358 * @param event an ActionEvent containing information about the mouse click
359 */
360 public void actionPerformed(ActionEvent event)
361 {
362 MetadataSet metadata_set = (MetadataSet) set_list.getSelectedValue();
363 Gatherer.c_man.removeMetadataSet(metadata_set);
364 refreshModel();
365 element_list.setListData(new Vector());
366 }
367 }
368 }
369}
Note: See TracBrowser for help on using the repository browser.