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

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

Changed text handling to use Dictionary.get rather than Dictionary.setText or Dictionary.registerBoth etc. also removed mnemonics cos they suck for other languages.

  • 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 /** Called when the detail mode has changed which in turn may cause several design elements to be available/hidden
90 * @param mode the new mode as an int
91 */
92 public void modeChanged(int mode) {
93
94 }
95
96 public void refreshModel()
97 {
98 // Remove any metadata sets from the model that are no longer loaded
99 ArrayList loaded_metadata_sets = MetadataSetManager.getMetadataSets();
100 for (int i = size() - 1; i >= 0; i--) {
101 MetadataSet metadata_set = (MetadataSet) get(i);
102 if (loaded_metadata_sets.contains(metadata_set) == false) {
103 // System.err.println("Metadata set in list no longer loaded...removing.");
104 remove(i);
105 }
106 }
107
108 // Add any metadata sets that are loaded but not in the model
109 for (int i = 0; i < loaded_metadata_sets.size(); i++) {
110 MetadataSet loaded_metadata_set = (MetadataSet) loaded_metadata_sets.get(i);
111 boolean in_model = false;
112 for (int j = 0; j < size(); j++) {
113 MetadataSet metadata_set = (MetadataSet) get(j);
114 if (metadata_set.equals(loaded_metadata_set)) {
115 in_model = true;
116 break;
117 }
118 }
119
120 if (in_model == false) {
121 // System.err.println("Metadata set loaded but not in list...adding.");
122 addElement(loaded_metadata_set);
123 }
124 }
125 }
126
127
128 /** 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. */
129 private class MetadataSetViewControls
130 extends JPanel
131 implements Control {
132 /** Adds a new set to the collection*/
133 private JButton add_button;
134 /** Will eventually launch GEMS for editing the selected set, for now just gives a message */
135 private JButton edit_button;
136 /** REmoves a set from the collection */
137 private JButton remove_button;
138 /** The label denoting the element list. */
139 private JLabel element_label = null;
140 /** The label denoting the set list. */
141 private JLabel set_label = null;
142 /** The list of elements for the choosen set. */
143 private JList element_list = null;
144 /** The list of sets in this collection. */
145 private JList set_list = null;
146 /** The panel onto which all other panels will be placed. */
147 private JPanel central_pane = null;
148 /** The panel onto which the element list will be placed. */
149 private JPanel element_pane = null;
150 /** The panel containing the set list. */
151 private JPanel set_pane = null;
152
153 private JScrollPane element_list_scroll_pane;
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(Dictionary.get("CDM.MetadataSetManager.Elements"));
167 element_label.setOpaque(true);
168
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
177 JPanel header_pane = new DesignPaneHeader("CDM.GUI.MetadataSets", "metadatasets");
178 set_label = new JLabel(Dictionary.get("CDM.MetadataSetManager.Sets"));
179 set_label.setOpaque(true);
180
181 set_list = new JList(model);
182 set_list.setCellRenderer(new MetadataSetListCellRenderer());
183 set_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
184
185 set_pane = new JPanel();
186
187 JPanel button_pane = new JPanel();
188 add_button = new GLIButton(Dictionary.get("CDM.MetadataSetManager.Add"), Dictionary.get("CDM.MetadataSetManager.Add_Tooltip"));
189 add_button.setEnabled(true);
190
191 edit_button = new GLIButton(Dictionary.get("CDM.MetadataSetManager.Edit"), Dictionary.get("CDM.MetadataSetManager.Edit_Tooltip"));
192 edit_button.setEnabled(false);
193
194 remove_button = new GLIButton(Dictionary.get("CDM.MetadataSetManager.Remove"), Dictionary.get("CDM.MetadataSetManager.Remove_Tooltip"));
195 remove_button.setEnabled(false);
196
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.