source: trunk/gli/src/org/greenstone/gatherer/cdm/IndexManager.java@ 5859

Last change on this file since 5859 was 5593, checked in by mdewsnip, 21 years ago

Changed calls to the Dictionary.

  • Property svn:keywords set to Author Date Id Revision
File size: 61.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.util.*;
32import javax.swing.*;
33import javax.swing.event.*;
34import org.greenstone.gatherer.Dictionary;
35import org.greenstone.gatherer.Gatherer;
36import org.greenstone.gatherer.cdm.CollectionMeta;
37import org.greenstone.gatherer.cdm.CommandTokenizer;
38import org.greenstone.gatherer.cdm.Control;
39import org.greenstone.gatherer.cdm.DOMProxyListModel;
40import org.greenstone.gatherer.cdm.Index;
41import org.greenstone.gatherer.checklist.CheckList;
42import org.greenstone.gatherer.gui.DoubleImageButton;
43import org.greenstone.gatherer.gui.GComboBox;
44import org.greenstone.gatherer.msm.ElementWrapper;
45import org.greenstone.gatherer.msm.MSMUtils;
46import org.greenstone.gatherer.util.ExclusiveListSelectionListener;
47import org.greenstone.gatherer.util.Utility;
48import org.w3c.dom.*;
49/** This class is resposible for storing the indexes which have been assigned to this collection and the default index, and providing methods for interacting with both these data pools. It also knows how to turn itself into a String as it would be displayed in the collection configuration file.
50 * @author John Thompson, Greenstone Digital Library, University of Waikato
51 * @version 2.3
52 */
53public class IndexManager
54 extends DOMProxyListModel {
55
56 static final private Dimension LABEL_SIZE = new Dimension(150,30);
57 static final private String MGINDEXES = "mg indexes";
58 static final private String MGPPINDEXES = "mgpp indexes";
59
60 /** The controls for editing the indexes. */
61 private Control controls = null;
62 /** A model of the levels, also based on the DOM. */
63 private DOMProxyListModel levels_model = null;
64 /** A reference to ourselves so our inner methods have access. */
65 private DOMProxyListModel model = null;
66 /** The default index. */
67 private Index default_index = null;
68
69 /** Constructor. */
70 public IndexManager(Element indexes) {
71 super(indexes, CollectionConfiguration.INDEX_ELEMENT, new Index());
72 Gatherer.println("IndexManager: " + getSize() + " indexes parsed.");
73 model = this;
74 // Parse and retrieve the default index
75 NodeList default_index_elements = CollectionDesignManager.collect_config.getDocumentElement().getElementsByTagName(CollectionConfiguration.INDEX_DEFAULT_ELEMENT);
76 if(default_index_elements.getLength() > 0) {
77 default_index = new Index((Element)default_index_elements.item(0));
78 }
79 // Parse and retrieve the levels element
80 Element levels_element = CollectionDesignManager.collect_config.getLevels();
81 levels_model = new DOMProxyListModel(levels_element, CollectionConfiguration.CONTENT_ELEMENT, new Level());
82 Gatherer.println(" + " + levels_model.getSize() + " levels parsed.");
83 }
84
85 /** Method to add a new index.
86 * @param index The <strong>Index</strong> to add.
87 * @see org.greenstone.gatherer.Gatherer
88 * @see org.greenstone.gatherer.collection.CollectionManager
89 */
90 public void addIndex(Index index, CollectionMeta metadatum) {
91 ///ystem.err.println("Adding an index: " + index.toString());
92 if(!contains(index)) {
93 CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
94 // Retrieve the currently last index
95 if(getSize() > 0) {
96 Index last_index = (Index)getElementAt(getSize() - 1);
97 addAfter(index, last_index);
98 }
99 else {
100 add(index);
101 // Also set this index as the default one, but only if there are levels available (ie mg only)
102 if(index.getLevel() != -1) {
103 setDefault(index);
104 }
105 }
106 Gatherer.c_man.configurationChanged();
107 }
108 else {
109 JOptionPane.showMessageDialog(Gatherer.g_man, Dictionary.get("CDM.IndexManager.Index_Exists"), Dictionary.get("General.Warning"), JOptionPane.WARNING_MESSAGE);
110 }
111 }
112
113 public void addLevel(Level level, CollectionMeta metadatum) {
114 if(!levels_model.contains(level)) {
115 CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
116 // Retrieve the currently last index
117 if(getSize() > 0) {
118 Level last_level = (Level)levels_model.getElementAt(levels_model.getSize() - 1);
119 levels_model.addAfter(level, last_level);
120 }
121 else {
122 add(level);
123 }
124 Gatherer.c_man.configurationChanged();
125 }
126 else {
127 JOptionPane.showMessageDialog(Gatherer.g_man, Dictionary.get("CDM.IndexManager.Level_Exists"), Dictionary.get("General.Warning"), JOptionPane.WARNING_MESSAGE);
128 }
129 }
130
131 public void destroy() {
132 if(controls != null) {
133 controls.destroy();
134 controls = null;
135 }
136 default_index = null;
137 model = null;
138 }
139
140 /** Method to acquire the controls for editing the indexes.
141 * @return the Control
142 */
143 public Control getControls() {
144 if(controls == null) {
145 // Build controls
146 controls = new IndexControl();
147 }
148 return controls;
149 }
150
151 /** Method to get the default index.
152 * @return The default <strong>Index</strong>.
153 */
154 public Index getDefault() {
155 if(default_index != null && default_index.isAssigned()) {
156 return default_index;
157 }
158 else {
159 return null;
160 }
161 }
162
163 /** Method to retrieve a certain index, as referenced by an index number.
164 * @param index An <i>int</i> which indicates the position of the desired index.
165 * @return The <strong>Index</strong> at the given index, or <i>null</i> if no such index exists.
166 */
167 public Index getIndex(int index) {
168 if(0 <= index && index < getSize()) {
169 return (Index)getElementAt(index);
170 }
171 return null;
172 }
173
174 /** Method to retrieve a certain index, given its id.
175 * @param id the id of the index as a String
176 * @return the Index that matches id, or null if no such index exists
177 */
178 public Index getIndex(String id) {
179 int size = getSize();
180 for(int i = 0; i < size; i++) {
181 Index index = (Index) getElementAt(i);
182 if(index.getID().equals(id)) {
183 return index;
184 }
185 }
186 return null;
187 }
188
189 public ArrayList getIndexes() {
190 return children();
191 }
192
193 public Level getLevel(String name) {
194 int levels_model_size = levels_model.getSize();
195 for(int i = 0; i < levels_model_size; i++) {
196 Level level = (Level) levels_model.getElementAt(i);
197 if(level.getName().equals(name)) {
198 return level;
199 }
200 }
201 return null;
202 }
203
204 public void moveIndex(Index index, boolean move_up) {
205 // Determine the indexes current position
206 int position = indexOf(index);
207 // Determine if it can be moved, ie if its not already at the top trying to move up, or at the bottom trying to move down.
208 if(position == -1) {
209 return;
210 }
211 if(position == 0 && move_up) {
212 return;
213 }
214 if(position == (getSize()) - 1 && !move_up) {
215 return;
216 }
217 // Ok, move the index
218 if(move_up) {
219 // Retrieve the index at position - 1
220 Index previous_index = (Index) getElementAt(position - 1);
221 // And add before. This will automatically remove the index first, as an Element can only exist once in a particular document
222 addBefore(index, previous_index);
223 }
224 else {
225 // Retrieve the index at position + 1
226 Index next_index = (Index) getElementAt(position + 1);
227 // And add after. This will automatically remove the index first, as an Element can only exist once in a particular document
228 addAfter(index, next_index);
229 }
230 // Schedule the collection for saving
231 Gatherer.c_man.configurationChanged();
232 }
233
234 public void moveLevel(Level level, boolean move_up) {
235 // Determine the leveles current position
236 int position = levels_model.indexOf(level);
237 // Determine if it can be moved, ie if its not already at the top trying to move up, or at the bottom trying to move down.
238 if(position == -1) {
239 return;
240 }
241 if(position == 0 && move_up) {
242 return;
243 }
244 if(position == (levels_model.getSize()) - 1 && !move_up) {
245 return;
246 }
247 // Ok, move the level
248 if(move_up) {
249 // Retrieve the level at position - 1
250 Level previous_level = (Level) levels_model.getElementAt(position - 1);
251 // And add before. This will automatically remove the level first, as an Element can only exist once in a particular document
252 levels_model.addBefore(level, previous_level);
253 }
254 else {
255 // Retrieve the level at position + 1
256 Level next_level = (Level) levels_model.getElementAt(position + 1);
257 // And add after. This will automatically remove the level first, as an Element can only exist once in a particular document
258 levels_model.addAfter(level, next_level);
259 }
260 // Schedule the collection for saving
261 Gatherer.c_man.configurationChanged();
262 }
263
264 /** Method to remove a certain index.
265 * @param index the Index to remove.
266 * @see org.greenstone.gatherer.Gatherer
267 * @see org.greenstone.gatherer.cdm.CollectionDesignManager
268 * @see org.greenstone.gatherer.cdm.CollectionMetaManager
269 * @see org.greenstone.gatherer.collection.CollectionManager
270 */
271 public void removeIndex(Index index) {
272 if(index != null) {
273 // Remove any current metadata from this index
274 CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + index.getID());
275 // Check if the index removed happens to be the default index
276 if(default_index != null && default_index.equals(index)) {
277 // If so our first solution is to set the first index to be default
278 if(getSize() > 0) {
279 Index another_index = (Index) getElementAt(0);
280 setDefault(another_index);
281 another_index = null;
282 }
283 else {
284 default_index.setAssigned(false);
285 }
286 }
287 // Remove the index
288 remove(index);
289 Gatherer.c_man.configurationChanged();
290 }
291 }
292
293 public void removeLevel(Level level) {
294 if(level != null) {
295 // Remove any current metadata from this level
296 CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + level.getName());
297 // Remove the level
298 levels_model.remove(level);
299 Gatherer.c_man.configurationChanged();
300 }
301 }
302
303 /** Method to set the default index.
304 * @param index the new default Index
305 * @see org.greenstone.gatherer.Gatherer
306 * @see org.greenstone.gatherer.collection.CollectionManager
307 */
308 public void setDefault(Index index) {
309 if(index != null) {
310 if(default_index == null) {
311 // Create the default index element, and place immediately after indexes element.
312 Element default_index_element = root.getOwnerDocument().createElement(CollectionConfiguration.INDEX_DEFAULT_ELEMENT);
313 default_index = new Index(default_index_element);
314 Node target_node = CollectionConfiguration.findInsertionPoint(default_index_element);
315 if(target_node != null) {
316 root.getOwnerDocument().getDocumentElement().insertBefore(default_index_element, target_node);
317 }
318 else {
319 root.getOwnerDocument().getDocumentElement().appendChild(default_index_element);
320 }
321 }
322 default_index.setAssigned(true);
323 default_index.setLevel(index.getLevel());
324 default_index.setSources(index.getSources());
325 }
326 else {
327 if(default_index != null) {
328 default_index.setAssigned(false);
329 }
330 }
331 Gatherer.c_man.configurationChanged();
332 }
333
334 /** This method is reponsible for changing the underlying Index commands from MG to MGPP and back again. This turns out to be easyish for MG->MGPP and very hard for the reverse. For the former we remove the level fragment and make sure the same levels are set, then we produce a list of the sources involved, breaking down comma seperated lists and making sure each item it unique. Changing back the other way turns out to be impossible, so we don't (beyond generating document:text, section:text and paragraph:text if text is an index and the respective levels are present). In either case we start by creating a comment containing the old index information.
335 * @param state true to enable MGPP indexes, false to use standard MG style ones
336 */
337 public void setMGPPEnabled(boolean state) {
338 if(state != root.getAttribute(CollectionConfiguration.MGPP_ATTRIBUTE).equals(CollectionConfiguration.TRUE_STR)) {
339 if(state) {
340 Element mg_element = root;
341 // Retrieve and assign the MGPP indexes element.
342 Element mgpp_element = CollectionDesignManager.collect_config.getMGPPIndexes();
343 mgpp_element.setAttribute(CollectionConfiguration.ASSIGNED_ATTRIBUTE, CollectionConfiguration.TRUE_STR);
344 levels_model.root.setAttribute(CollectionConfiguration.ASSIGNED_ATTRIBUTE, CollectionConfiguration.TRUE_STR);
345 // If the MGPP indexes element is empty (ie was created by CollectionConfiguration), generate new MGPP index from the existing index
346 NodeList indexes = mgpp_element.getElementsByTagName(CollectionConfiguration.INDEX_ELEMENT);
347 if(indexes.getLength() == 0) {
348 ArrayList levels_list = new ArrayList();
349 ArrayList sources_list = new ArrayList();
350 // We first use details from the default index if any
351 if(default_index != null) {
352 int level_int = default_index.getLevel();
353 if(0 <= level_int && level_int < 3) {
354 String level = Index.LEVEL[level_int];
355 if(!levels_list.contains(level)) {
356 levels_list.add(level);
357 }
358 level = null;
359 }
360 ArrayList sources = default_index.getSources();
361 sources.removeAll(sources_list);
362 sources_list.addAll(sources);
363 }
364 int size = getSize();
365 for(int i = 0; i < size; i++) {
366 Index index = (Index) getElementAt(i);
367 int level_int = index.getLevel();
368 if(0 <= level_int && level_int < 3) {
369 String level = Index.LEVEL[level_int];
370 if(!levels_list.contains(level)) {
371 levels_list.add(level);
372 }
373 level = null;
374 }
375 ArrayList sources = index.getSources();
376 sources.removeAll(sources_list);
377 sources_list.addAll(sources);
378 index = null;
379 }
380 // Replace mg element with mgpp element
381 setRoot(mgpp_element);
382
383 // We now have a list of sources and a list of levels, so create new indexes and levels based on these
384 int sources_list_size = sources_list.size();
385 for(int j = 0; j < sources_list_size; j++) {
386 Object source_object = sources_list.get(j);
387 String source_str = null;
388 if(source_object instanceof ElementWrapper) {
389 source_str = ((ElementWrapper)source_object).getName();
390 }
391 else {
392 source_str = source_object.toString();
393 }
394 ArrayList new_sources = new ArrayList();
395 new_sources.add(source_object);
396 source_object = null;
397 Index new_index = new Index(new_sources);
398 // Try to retrieve existing metadatum
399 source_str = new_index.getID();
400 CollectionMeta metadatum = CollectionDesignManager.collectionmeta_manager.getMetadatum(CollectionConfiguration.STOP_CHARACTER + source_str, false);
401 // If no metadata was found, add new pseudo metadata using the id
402 if(metadatum == null) {
403 metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + source_str);
404 metadatum.setAssigned(true);
405 metadatum.setValue(source_str);
406 }
407 // If it was found, ensure it is assigned
408 else {
409 metadatum.setAssigned(true);
410 }
411 source_str = null;
412 addIndex(new_index, metadatum);
413 metadatum = null;
414 new_index = null;
415 new_sources = null;
416 source_str = null;
417 }
418 int levels_list_size = levels_list.size();
419 for(int k = 0; k < levels_list_size; k++) {
420 Level new_level = new Level((String)levels_list.get(k));
421 if(!levels_model.contains(new_level)) {
422 levels_model.add(levels_model.getSize(), new_level);
423 }
424 new_level = null;
425 }
426 }
427 else {
428 // Replace mg element with mgpp element
429 setRoot(mgpp_element);
430 }
431 // Unassign MG element and default index
432 mg_element.setAttribute(CollectionConfiguration.ASSIGNED_ATTRIBUTE, CollectionConfiguration.FALSE_STR);
433 mg_element = null;
434 default_index.setAssigned(false);
435 }
436 else {
437 Element mgpp_element = root;
438 // Retrieve and assign MG element and default index element
439 Element mg_element = CollectionDesignManager.collect_config.getMGIndexes();
440 mg_element.setAttribute(CollectionConfiguration.ASSIGNED_ATTRIBUTE, CollectionConfiguration.TRUE_STR);
441 if(default_index != null) {
442 default_index.setAssigned(true);
443 }
444 // If mg element has no indexes, and the current mgpp index include a text one, then generate text indexes for each of the registered levels.
445 NodeList indexes = mgpp_element.getElementsByTagName(CollectionConfiguration.INDEX_ELEMENT);
446 if(indexes.getLength() == 0) {
447 Index index = getIndex(CollectionConfiguration.TEXT_STR);
448 if(index != null) {
449 // Replace mgpp element with mg element
450 setRoot(mg_element);
451 int level_size = levels_model.getSize();
452 for(int i = 0; i < level_size; i++) {
453 Level level = (Level) levels_model.getElementAt(i);
454 Index new_index = new Index(level.getName(), index.getSources());
455 // Try to retrieve existing metadatum
456 String source_str = new_index.getID();
457 CollectionMeta metadatum = CollectionDesignManager.collectionmeta_manager.getMetadatum(CollectionConfiguration.STOP_CHARACTER + source_str, false);
458 // If no metadata was found, add new pseudo metadata using the id
459 if(metadatum == null) {
460 metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + source_str);
461 metadatum.setAssigned(true);
462 metadatum.setValue(source_str);
463 }
464 // If it was found, ensure it is assigned
465 else {
466 metadatum.setAssigned(true);
467 }
468 source_str = null;
469 addIndex(new_index, metadatum);
470 new_index = null;
471 level = null;
472 }
473 }
474 }
475 else {
476 // Replace mgpp element with mg element
477 setRoot(mg_element);
478 }
479 // Unassign mgpp element and levels
480 mgpp_element.setAttribute(CollectionConfiguration.ASSIGNED_ATTRIBUTE, CollectionConfiguration.FALSE_STR);
481 levels_model.root.setAttribute(CollectionConfiguration.ASSIGNED_ATTRIBUTE, CollectionConfiguration.FALSE_STR);
482 }
483 }
484 }
485
486
487 /** This class creates a set of controls for editing the indexes. */
488 private class IndexControl
489 extends JPanel
490 implements Control {
491
492 private CardLayout card_layout;
493 private CheckList source_list;
494 private JButton add_button;
495 private JButton move_down_button;
496 private JButton move_up_button;
497 private JButton remove_button;
498 private JButton set_default_button;
499 private JComboBox level_combobox;
500 private JList index_list;
501 private JTextArea instruction_textarea;
502 private JTextField name_textfield ;
503
504 private MGPPControl mgppindexes_control;
505
506 /** Constructor.
507 * @see org.greenstone.gatherer.Configuration
508 * @see org.greenstone.gatherer.Gatherer
509 * @see org.greenstone.gatherer.cdm.IndexManager.Control.AddListener
510 * @see org.greenstone.gatherer.cdm.IndexManager.Control.ClearDefaultListener
511 * @see org.greenstone.gatherer.cdm.IndexManager.Control.NameListener
512 * @see org.greenstone.gatherer.cdm.IndexManager.Control.RemoveListener
513 * @see org.greenstone.gatherer.cdm.IndexManager.Control.SetDefaultListener
514 * @see org.greenstone.gatherer.collection.CollectionManager
515 * @see org.greenstone.gatherer.gui.Coloring
516 * @see org.greenstone.gatherer.msm.MetadataSetManager
517 * @see org.greenstone.gatherer.util.ExclusiveListSelectionListener
518 */
519 public IndexControl() {
520 super();
521
522 ArrayList new_data = new ArrayList();
523 new_data.add(CollectionConfiguration.TEXT_STR);
524 new_data.addAll(Gatherer.c_man.getCollection().msm.getAssignedElements());
525
526 // Creation
527 JPanel mgindexes_panel = new JPanel();
528 card_layout = new CardLayout();
529
530 // MG Index Controls
531
532 JPanel mg_indexes_pane = new JPanel();
533
534 JPanel instruction_pane = new JPanel();
535 JLabel title_label = new JLabel();
536 title_label.setHorizontalAlignment(JLabel.CENTER);
537 Dictionary.registerText(title_label, "CDM.IndexManager.Title");
538
539 instruction_textarea = new JTextArea();
540 instruction_textarea.setEditable(false);
541 instruction_textarea.setLineWrap(true);
542 instruction_textarea.setRows(6);
543 instruction_textarea.setWrapStyleWord(true);
544 Dictionary.registerText(instruction_textarea, "CDM.IndexManager.Instructions");
545
546 JPanel assigned_indexes_pane = new JPanel();
547 JLabel index_label = new JLabel();
548 Dictionary.registerText(index_label, "CDM.IndexManager.Indexes");
549 index_list = new JList(model);
550 index_list.setCellRenderer(new IndexListRenderer());
551
552 JPanel movement_pane = new JPanel();
553
554 move_up_button = new DoubleImageButton("", Utility.getImage("arrow-up.gif"), Utility.getImage("arrow-up-disabled.gif"));
555 move_up_button.setEnabled(false);
556 move_up_button.setMnemonic(KeyEvent.VK_U);
557 move_up_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
558 Dictionary.registerBoth(move_up_button, "CDM.Move.Move_Up", "CDM.Move.Move_Up_Tooltip");
559
560 move_down_button = new DoubleImageButton("", Utility.getImage("arrow-down.gif"), Utility.getImage("arrow-down-disabled.gif"));
561 move_down_button.setEnabled(false);
562 move_down_button.setMnemonic(KeyEvent.VK_D);
563 move_down_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
564 Dictionary.registerBoth(move_down_button, "CDM.Move.Move_Down", "CDM.Move.Move_Down_Tooltip");
565
566 JPanel index_pane = new JPanel();
567
568 JPanel details_pane = new JPanel();
569
570 JPanel name_pane = new JPanel();
571 JLabel name_label = new JLabel();
572 name_label.setPreferredSize(Utility.LABEL_SIZE);
573 Dictionary.registerText(name_label, "CDM.IndexManager.Index_Name");
574 name_textfield = new JTextField();
575 Dictionary.registerTooltip(name_textfield, "CDM.IndexManager.Index_Name_Tooltip");
576
577 JPanel source_pane = new JPanel();
578 JLabel source_label = new JLabel();
579 source_label.setPreferredSize(Utility.LABEL_SIZE);
580 Dictionary.registerText(source_label, "CDM.IndexManager.Source");
581 source_list = new CheckList(new_data, false);
582 Dictionary.registerTooltip(source_list, "CDM.IndexManager.Source_Tooltip");
583
584 JPanel level_pane = new JPanel();
585 JLabel level_label = new JLabel();
586 level_label.setPreferredSize(Utility.LABEL_SIZE);
587 Dictionary.registerText(level_label, "CDM.IndexManager.Level");
588 level_combobox = new JComboBox();
589 level_combobox.addItem(Dictionary.get("CDM.IndexManager.Document"));
590 level_combobox.addItem(Dictionary.get("CDM.IndexManager.Paragraph"));
591 level_combobox.addItem(Dictionary.get("CDM.IndexManager.Section"));
592 level_combobox.setEditable(false);
593 Dictionary.registerTooltip(level_combobox, "CDM.IndexManager.Level_Tooltip");
594
595 JPanel button_pane = new JPanel();
596 add_button = new JButton();
597 add_button.setEnabled(false);
598 add_button.setMnemonic(KeyEvent.VK_A);
599 Dictionary.registerBoth(add_button, "CDM.IndexManager.Add_Index", "CDM.IndexManager.Add_Index_Tooltip");
600 set_default_button = new JButton();
601 set_default_button.setEnabled(false);
602 set_default_button.setMnemonic(KeyEvent.VK_S);
603 Dictionary.registerBoth(set_default_button, "CDM.IndexManager.Set_Default", "CDM.IndexManager.Set_Default_Tooltip");
604 remove_button = new JButton();
605 remove_button.setEnabled(false);
606 remove_button.setMnemonic(KeyEvent.VK_R);
607 Dictionary.registerBoth(remove_button, "CDM.IndexManager.Remove_Index", "CDM.IndexManager.Remove_Index_Tooltip");
608
609 // This class is getting a little crowded, so I'll generate the many mgpp controls in a inner class.
610 mgppindexes_control = new MGPPControl();
611
612 // Listeners
613 add_button.addActionListener(new AddListener());
614 move_down_button.addActionListener(new MoveListener(false));
615 move_up_button.addActionListener(new MoveListener(true));
616 remove_button.addActionListener(new RemoveListener());
617 set_default_button.addActionListener(new SetDefaultListener());
618 name_textfield.getDocument().addDocumentListener(new NameListener());
619 index_list.addListSelectionListener(new IndexListListener());
620 source_list.addListSelectionListener(new SourceListListener());
621 ExclusiveListSelectionListener elsl = new ExclusiveListSelectionListener();
622 elsl.add(index_list);
623 elsl.add(source_list);
624 elsl = null; // We don't want to hold a reference to this
625
626 // Layout
627 instruction_pane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
628 instruction_pane.setLayout(new BorderLayout());
629 instruction_pane.add(title_label, BorderLayout.NORTH);
630 instruction_pane.add(new JScrollPane(instruction_textarea), BorderLayout.CENTER);
631
632 movement_pane.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));
633 movement_pane.setLayout(new GridLayout(2,1));
634 movement_pane.add(move_up_button);
635 movement_pane.add(move_down_button);
636
637 assigned_indexes_pane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
638 assigned_indexes_pane.setLayout(new BorderLayout());
639 assigned_indexes_pane.add(index_label, BorderLayout.NORTH);
640 assigned_indexes_pane.add(new JScrollPane(index_list), BorderLayout.CENTER);
641 assigned_indexes_pane.add(movement_pane, BorderLayout.EAST);
642
643 name_pane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
644 name_pane.setLayout(new BorderLayout());
645 name_pane.add(name_label, BorderLayout.WEST);
646 name_pane.add(name_textfield, BorderLayout.CENTER);
647
648 source_pane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
649 source_pane.setLayout(new BorderLayout());
650 source_pane.add(source_label, BorderLayout.WEST);
651 source_pane.add(new JScrollPane(source_list), BorderLayout.CENTER);
652
653 level_pane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
654 level_pane.setLayout(new BorderLayout());
655 level_pane.add(level_label, BorderLayout.WEST);
656 level_pane.add(level_combobox, BorderLayout.CENTER);
657
658 details_pane.setLayout(new BorderLayout());
659 details_pane.add(name_pane, BorderLayout.NORTH);
660 details_pane.add(source_pane, BorderLayout.CENTER);
661 details_pane.add(level_pane, BorderLayout.SOUTH);
662
663 button_pane.setLayout(new GridLayout(1,3));
664 button_pane.add(add_button);
665 button_pane.add(set_default_button);
666 button_pane.add(remove_button);
667
668 index_pane.setLayout(new BorderLayout());
669 index_pane.add(details_pane, BorderLayout.CENTER);
670 index_pane.add(button_pane, BorderLayout.SOUTH);
671
672 mgindexes_panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
673 mgindexes_panel.setLayout(new BorderLayout());
674 mgindexes_panel.add(instruction_pane, BorderLayout.NORTH);
675 mgindexes_panel.add(assigned_indexes_pane, BorderLayout.CENTER);
676 mgindexes_panel.add(index_pane, BorderLayout.SOUTH);
677
678 setLayout(card_layout);
679 add(mgindexes_panel, MGINDEXES);
680 add(mgppindexes_control, MGPPINDEXES);
681 }
682
683 /* Destructor, removes persistant listeners from the Dictionary.
684 */
685 public void destroy() {
686 mgppindexes_control.destroy();
687 mgppindexes_control = null;
688 }
689
690 public void gainFocus() {
691 boolean mgpp_enabled = CollectionDesignManager.searchtype_manager.isMGPPEnabled();
692 if(instruction_textarea != null) {
693 instruction_textarea.setCaretPosition(0);
694 }
695 if(mgpp_enabled) {
696 mgppindexes_control.gainFocus();
697 }
698 else {
699 // Reload the assigned indexes list.
700 ArrayList new_data = new ArrayList();
701 new_data.add(CollectionConfiguration.TEXT_STR);
702 new_data.addAll(Gatherer.c_man.getCollection().msm.getAssignedElements());
703 // reset the model in the list and combobox
704 source_list.setListData(new_data.toArray());
705 new_data = null;
706 }
707 // Bring the appropriate card to the front
708 if(mgpp_enabled) {
709 card_layout.show(this, MGPPINDEXES);
710 }
711 else {
712 card_layout.show(this, MGINDEXES);
713 }
714 }
715
716 public void loseFocus() {
717 }
718
719 private void validateAddButton() {
720 boolean add_enabled = false;
721 // Indexes must have a name
722 if(name_textfield.getText().length() == 0) {
723 add_enabled = false;
724 }
725 // Can't add a new index if no sources are selected
726 else if(source_list.isSelectionEmpty()) {
727 add_enabled = false;
728 }
729 // If we get this far, create a dummy index and see if its already assigned in the collection
730 else {
731 Object object[] = source_list.getSelected().toArray();
732 ArrayList sources = new ArrayList();
733 for(int i = 0; i < object.length; i++) {
734 sources.add(object[i]);
735 }
736 object = null;
737 Index index = new Index(level_combobox.getSelectedIndex(), sources);
738 sources = null;
739 if(model.contains(index)) {
740 add_enabled = false;
741 }
742 else {
743 add_enabled = true;
744 }
745 }
746 // We should now know the add_button state
747 add_button.setEnabled(add_enabled);
748 }
749
750 /** Listens for actions apon the 'add' button in the IndexManager controls, and if detected calls the add method of the manager with a newly created index. */
751 private class AddListener
752 implements ActionListener {
753 /** Method called when an action is performed on a registered component, and when it does we check if we have enough data to create a new index, and if so we create one.
754 * @param event An <strong>ActionEvent</strong> providing extra information about the event.
755 * @see org.greenstone.gatherer.cdm.CollectionDesignManager
756 * @see org.greenstone.gatherer.cdm.CollectionMeta
757 * @see org.greenstone.gatherer.cdm.CollectionMetaManager
758 * @see org.greenstone.gatherer.cdm.Index
759 * @see org.greenstone.gatherer.cdm.Language
760 * @see org.greenstone.gatherer.cdm.LanguageManager
761 */
762 public void actionPerformed(ActionEvent event) {
763 String name = name_textfield.getText();
764 if(!source_list.isSelectionEmpty() && name.length() != 0) {
765 ArrayList sources = source_list.getSelected();
766 Index index = new Index(level_combobox.getSelectedIndex(), sources);
767 sources = null;
768 // Before we add the index to the model, we have to add the collection metadata for this.
769 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
770 metadatum.setValue(name);
771 // Finally add index.
772 addIndex(index, metadatum);
773 metadatum = null;
774 index = null;
775 }
776 name = null;
777 }
778 }
779
780 /** Listens for selections within the list on the IndexManager controls, and if a change is detected enables, or disables, controls appropriately. */
781 private class IndexListListener
782 implements ListSelectionListener {
783 /** This method is called whenever the source list selection changes. When it does we need to check if the add button should now be enabled.
784 * @param event A <strong>ListSelectionEvent</strong> containing further information about the list selection.
785 */
786 public void valueChanged(ListSelectionEvent event) {
787 Object value = index_list.getSelectedValue();
788 move_down_button.setEnabled(value != null);
789 move_up_button.setEnabled(value != null);
790 remove_button.setEnabled(value != null);
791 set_default_button.setEnabled(value != null && (default_index == null || !default_index.equals(value)));
792 }
793 }
794
795 private class IndexListRenderer
796 extends DefaultListCellRenderer {
797
798 /** Return a component that has been configured to display the specified value. */
799 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
800 JLabel component = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
801 if(default_index != null && default_index.equals(value)) {
802 component.setText(component.getText() + " " + Dictionary.get("CDM.IndexManager.Default_Index_Indicator"));
803 }
804 return component;
805 }
806
807 }
808
809 private class MoveListener
810 implements ActionListener {
811
812 private boolean move_up;
813
814 public MoveListener(boolean move_up) {
815 this.move_up = move_up;
816 }
817
818 public void actionPerformed(ActionEvent event) {
819 // Retrieve the selected index
820 Index index = (Index) index_list.getSelectedValue();
821 if(index != null) {
822 moveIndex(index, move_up);
823 // Ensure the index that moved is still selected
824 index_list.setSelectedValue(index, true);
825 index = null;
826 }
827 }
828 }
829
830 /** Listens for actions apon the 'remove' button in the IndexManager controls, and if detected calls the remove method of the manager with the index selected for removal. */
831 private class RemoveListener
832 implements ActionListener {
833 /** If called when an action occurs on a registered component, we remove the currently selected index, if there is one.
834 * @param event An <strong>ActionEvent</strong> containing extra information about the action that occured.
835 * @see org.greenstone.gatherer.cdm.Index
836 */
837 public void actionPerformed(ActionEvent event) {
838 if(!index_list.isSelectionEmpty()) {
839 removeIndex((Index)index_list.getSelectedValue());
840 }
841 move_down_button.setEnabled(false);
842 move_up_button.setEnabled(false);
843 remove_button.setEnabled(false);
844 }
845 }
846
847 private class SetDefaultListener
848 implements ActionListener {
849
850 public void actionPerformed(ActionEvent event) {
851 Index index = (Index) index_list.getSelectedValue();
852 if(index != null) {
853 setDefault(index);
854 // This should cause a repaint of just the desired row
855 index_list.setSelectedValue(index, true);
856 }
857 set_default_button.setEnabled(false);
858 }
859 }
860
861 /** Listens for selections within the list on the IndexManager controls, and if a change is detected enables, or disables, controls appropriately. */
862 private class SourceListListener
863 implements ListSelectionListener {
864 /** This method is called whenever the source list selection changes. When it does we need to check if the add button should now be enabled.
865 * @param event A <strong>ListSelectionEvent</strong> containing further information about the list selection.
866 */
867 public void valueChanged(ListSelectionEvent event) {
868 validateAddButton();
869 }
870 }
871
872 /** Listens for key presses within the name field, and enabled or disables controls as appropriate. */
873 private class NameListener
874 implements DocumentListener {
875 /** Gives notification that an attribute or set of attributes changed. */
876 public void changedUpdate(DocumentEvent e) {
877 validateAddButton();
878 }
879
880 /** Gives notification that there was an insert into the document. */
881 public void insertUpdate(DocumentEvent e) {
882 validateAddButton();
883 }
884
885 /** Gives notification that a portion of the document has been removed. */
886 public void removeUpdate(DocumentEvent e) {
887 validateAddButton();
888 }
889 }
890 }
891
892 private class MGPPControl
893 extends JPanel {
894
895 private GComboBox index_combobox;
896 private GComboBox level_combobox;
897 private JButton add_index_button;
898 private JButton add_all_button;
899 private JButton add_level_button;
900 private JButton move_index_down_button;
901 private JButton move_level_down_button;
902 private JButton move_index_up_button;
903 private JButton move_level_up_button;
904 private JButton replace_button;
905 private JButton remove_index_button;
906 private JButton remove_level_button;
907 private JLabel current_levels_label;
908 private JLabel current_indexes_label;
909 private JLabel index_label;
910 private JLabel index_name_label;
911 private JLabel level_label;
912 private JLabel level_name_label;
913 private JLabel move_index_down_label;
914 private JLabel move_level_down_label;
915 private JLabel move_index_up_label;
916 private JLabel move_level_up_label;
917 private JLabel title_label;
918 private JList current_levels_list;
919 private JList current_indexes_list;
920 private JTabbedPane tabbed_pane;
921 private JTextArea instructions_textarea;
922 private JTextField index_name_field;
923 private JTextField level_name_field;
924
925 public MGPPControl() {
926 // Create Indexes
927 JPanel indexes_panel = new JPanel();
928
929 JPanel current_indexes_panel = new JPanel();
930
931 current_indexes_label = new JLabel();
932 Dictionary.registerText(current_indexes_label, "CDM.IndexManager.MGPP.Current_Indexes");
933 current_indexes_list = new JList(model);
934 current_indexes_list.setVisibleRowCount(5);
935
936 JPanel index_movement_panel = new JPanel();
937
938 move_index_up_button = new DoubleImageButton("", Utility.getImage("arrow-up.gif"), Utility.getImage("arrow-up-disabled.gif"));
939 move_index_up_button.setEnabled(false);
940 move_index_up_button.setMnemonic(KeyEvent.VK_U);
941 move_index_up_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
942 Dictionary.registerBoth(move_index_up_button, "CDM.Move.Move_Up", "CDM.Move.Move_Up_Tooltip");
943
944 move_index_down_button = new DoubleImageButton("", Utility.getImage("arrow-down.gif"), Utility.getImage("arrow-down-disabled.gif"));
945 move_index_down_button.setEnabled(false);
946 move_index_down_button.setMnemonic(KeyEvent.VK_D);
947 move_index_down_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
948 Dictionary.registerBoth(move_index_down_button, "CDM.Move.Move_Down", "CDM.Move.Move_Down_Tooltip");
949
950 JPanel index_spacer_panel = new JPanel();
951
952 JPanel index_body_panel = new JPanel();
953
954 JPanel index_details_panel = new JPanel();
955
956 JPanel index_name_panel = new JPanel();
957
958 index_name_label = new JLabel();
959 index_name_label.setPreferredSize(LABEL_SIZE);
960 Dictionary.registerText(index_name_label, "CDM.IndexManager.Index_Name");
961
962 index_name_field = new JTextField();
963 Dictionary.registerTooltip(index_name_field, "CDM.IndexManager.Index_Name_Tooltip");
964
965 JPanel index_panel = new JPanel();
966
967 index_label = new JLabel("CDM.IndexManager.MGPP.Index");
968 index_label.setPreferredSize(LABEL_SIZE);
969 Dictionary.registerText(index_label, "CDM.IndexManager.MGPP.Index");
970
971 index_combobox = new GComboBox();
972 index_combobox.setBackgroundNonSelectionColor(Gatherer.config.getColor("coloring.editable_background", false));
973 index_combobox.setBackgroundSelectionColor(Gatherer.config.getColor("coloring.collection_selection_background", false));
974 index_combobox.setEditable(true);
975 index_combobox.setTextNonSelectionColor(Gatherer.config.getColor("coloring.workspace_tree_foreground", false));
976 index_combobox.setTextSelectionColor(Gatherer.config.getColor("coloring.collection_selection_foreground", false));
977 Dictionary.registerTooltip(index_combobox, "CDM.IndexManager.MGPP.Index_Tooltip");
978
979 JPanel index_button_panel = new JPanel();
980
981 add_index_button = new JButton();
982 add_index_button.setEnabled(false);
983 add_index_button.setMnemonic(KeyEvent.VK_A);
984 Dictionary.registerBoth(add_index_button, "CDM.IndexManager.Add_Index", "CDM.IndexManager.Add_Index_Tooltip");
985
986 add_all_button = new JButton();
987 add_all_button.setEnabled(true);
988 add_all_button.setMnemonic(KeyEvent.VK_L);
989 Dictionary.registerBoth(add_all_button, "CDM.IndexManager.MGPP.Add_All_Metadata", "CDM.IndexManager.MGPP.Add_All_Metadata_Tooltip");
990
991 replace_button = new JButton();
992 replace_button.setEnabled(false);
993 replace_button.setMnemonic(KeyEvent.VK_C);
994 Dictionary.registerBoth(replace_button, "CDM.IndexManager.MGPP.Replace_Index", "CDM.IndexManager.MGPP.Replace_Index_Tooltip");
995
996 remove_index_button = new JButton();
997 remove_index_button.setEnabled(false);
998 remove_index_button.setMnemonic(KeyEvent.VK_A);
999 Dictionary.registerBoth(remove_index_button, "CDM.IndexManager.Remove_Index", "CDM.IndexManager.Remove_Index_Tooltip");
1000
1001 JPanel index_empty_panel = new JPanel();
1002
1003 // Connect Indexes
1004 EnableAddIndexListener index_eal = new EnableAddIndexListener();
1005 add_index_button.addActionListener(new AddIndexActionListener());
1006 add_all_button.addActionListener(new AddAllActionListener());
1007 current_indexes_list.addListSelectionListener(new CurrentIndexesListSelectionListener());
1008 index_combobox.addActionListener(index_eal);
1009 ((JTextField)index_combobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(index_eal);
1010 index_name_field.getDocument().addDocumentListener(index_eal);
1011 move_index_down_button.addActionListener(new MoveIndexDownListener());
1012 move_index_up_button.addActionListener(new MoveIndexUpListener());
1013 replace_button.addActionListener(new ReplaceIndexActionListener());
1014 remove_index_button.addActionListener(new RemoveIndexActionListener(index_eal));
1015
1016 // Layout Indexes
1017 index_movement_panel.setLayout(new GridLayout(2,1));
1018 index_movement_panel.add(move_index_up_button);
1019 index_movement_panel.add(move_index_down_button);
1020
1021 current_indexes_panel.setLayout(new BorderLayout());
1022 current_indexes_panel.add(current_indexes_label, BorderLayout.NORTH);
1023 current_indexes_panel.add(new JScrollPane(current_indexes_list), BorderLayout.CENTER);
1024 current_indexes_panel.add(index_movement_panel, BorderLayout.EAST);
1025
1026 index_name_panel.setLayout(new BorderLayout());
1027 index_name_panel.add(index_name_label, BorderLayout.WEST);
1028 index_name_panel.add(index_name_field, BorderLayout.CENTER);
1029
1030 index_panel.setLayout(new BorderLayout());
1031 index_panel.add(index_label, BorderLayout.WEST);
1032 index_panel.add(index_combobox, BorderLayout.CENTER);
1033
1034 index_details_panel.setLayout(new GridLayout(2,1,0,5));
1035 index_details_panel.add(index_name_panel);
1036 index_details_panel.add(index_panel);
1037
1038 index_button_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1039 index_button_panel.setLayout(new GridLayout(2,2,5,0));
1040 index_button_panel.add(add_index_button);
1041 index_button_panel.add(add_all_button);
1042 index_button_panel.add(replace_button);
1043 index_button_panel.add(remove_index_button);
1044
1045 index_body_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1046 index_body_panel.setLayout(new BorderLayout());
1047 index_body_panel.add(index_details_panel, BorderLayout.CENTER);
1048 index_body_panel.add(index_button_panel, BorderLayout.SOUTH);
1049
1050 index_spacer_panel.setLayout(new BorderLayout());
1051 index_spacer_panel.add(index_body_panel, BorderLayout.NORTH);
1052 index_spacer_panel.add(index_empty_panel, BorderLayout.CENTER);
1053
1054 indexes_panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
1055 indexes_panel.setLayout(new BorderLayout());
1056 indexes_panel.add(current_indexes_panel, BorderLayout.NORTH);
1057 indexes_panel.add(index_spacer_panel, BorderLayout.CENTER);
1058
1059 // Create Levels
1060 JPanel levels_panel = new JPanel();
1061
1062 JPanel current_levels_panel = new JPanel();
1063
1064 current_levels_label = new JLabel();
1065 Dictionary.registerText(current_levels_label, "CDM.IndexManager.MGPP.Current_Levels");
1066
1067 current_levels_list = new JList(levels_model);
1068 current_levels_list.setVisibleRowCount(5);
1069
1070 JPanel level_movement_panel = new JPanel();
1071
1072 move_level_up_button = new DoubleImageButton("", Utility.getImage("arrow-up.gif"), Utility.getImage("arrow-up-disabled.gif"));
1073 move_level_up_button.setEnabled(false);
1074 move_level_up_button.setMnemonic(KeyEvent.VK_U);
1075 move_level_up_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
1076 Dictionary.registerBoth(move_level_up_button, "CDM.Move.Move_Up", "CDM.Move.Move_Up_Tooltip");
1077
1078 move_level_down_button = new DoubleImageButton("", Utility.getImage("arrow-down.gif"), Utility.getImage("arrow-down-disabled.gif"));
1079 move_level_down_button.setEnabled(false);
1080 move_level_down_button.setMnemonic(KeyEvent.VK_D);
1081 move_level_down_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
1082 Dictionary.registerBoth(move_level_down_button, "CDM.Move.Move_Down", "CDM.Move.Move_Down_Tooltip");
1083
1084 JPanel level_spacer_panel = new JPanel();
1085
1086 JPanel level_body_panel = new JPanel();
1087
1088 JPanel level_details_panel = new JPanel();
1089
1090 JPanel level_name_panel = new JPanel();
1091
1092 level_name_label = new JLabel();
1093 level_name_label.setPreferredSize(LABEL_SIZE);
1094 Dictionary.registerText(level_name_label, "CDM.IndexManager.MGPP.Level_Name");
1095
1096 level_name_field = new JTextField();
1097 Dictionary.registerTooltip(level_name_field, "CDM.IndexManager.MGPP.Level_Name_Tooltip");
1098
1099 JPanel level_panel = new JPanel();
1100
1101 level_label = new JLabel();
1102 level_label.setPreferredSize(LABEL_SIZE);
1103 Dictionary.registerText(level_label, "CDM.IndexManager.MGPP.Level");
1104
1105 level_combobox = new GComboBox(Index.LEVEL);
1106 level_combobox.setBackgroundNonSelectionColor(Gatherer.config.getColor("coloring.editable_background", false));
1107 level_combobox.setBackgroundSelectionColor(Gatherer.config.getColor("coloring.collection_selection_background", false));
1108 level_combobox.setEditable(true);
1109 level_combobox.setTextNonSelectionColor(Gatherer.config.getColor("coloring.workspace_tree_foreground", false));
1110 level_combobox.setTextSelectionColor(Gatherer.config.getColor("coloring.collection_selection_foreground", false));
1111 Dictionary.registerTooltip(level_combobox, "CDM.IndexManager.Level_Tooltip");
1112
1113 JPanel level_button_panel = new JPanel();
1114
1115 add_level_button = new JButton("CDM.IndexManager.MGPP.Add_Level");
1116 add_level_button.setEnabled(false);
1117 add_level_button.setMnemonic(KeyEvent.VK_A);
1118 Dictionary.registerBoth(add_level_button, "CDM.IndexManager.MGPP.Add_Level", "CDM.IndexManager.MGPP.Add_Level_Tooltip");
1119
1120 remove_level_button = new JButton("CDM.IndexManager.MGPP.Remove_Level");
1121 remove_level_button.setEnabled(false);
1122 remove_level_button.setMnemonic(KeyEvent.VK_A);
1123 Dictionary.registerBoth(remove_level_button, "CDM.IndexManager.MGPP.Remove_Level", "CDM.IndexManager.MGPP.Remove_Level_Tooltip");
1124
1125 JPanel level_empty_panel = new JPanel();
1126
1127 // Connect Levels
1128 EnableAddLevelListener level_eal = new EnableAddLevelListener();
1129 add_level_button.addActionListener(new AddLevelActionListener());
1130 current_levels_list.addListSelectionListener(new CurrentLevelsListSelectionListener());
1131 level_combobox.addActionListener(level_eal);
1132 ((JTextField)level_combobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(level_eal);
1133 level_name_field.getDocument().addDocumentListener(level_eal);
1134 move_level_down_button.addActionListener(new MoveLevelDownListener());
1135 move_level_up_button.addActionListener(new MoveLevelUpListener());
1136 remove_level_button.addActionListener(new RemoveLevelActionListener(level_eal));
1137 // Layout Levels
1138
1139 level_movement_panel.setLayout(new GridLayout(2,1));
1140 level_movement_panel.add(move_level_up_button);
1141 level_movement_panel.add(move_level_down_button);
1142
1143 current_levels_panel.setLayout(new BorderLayout());
1144 current_levels_panel.add(current_levels_label, BorderLayout.NORTH);
1145 current_levels_panel.add(new JScrollPane(current_levels_list), BorderLayout.CENTER);
1146 current_levels_panel.add(level_movement_panel, BorderLayout.EAST);
1147
1148 level_name_panel.setLayout(new BorderLayout());
1149 level_name_panel.add(level_name_label, BorderLayout.WEST);
1150 level_name_panel.add(level_name_field, BorderLayout.CENTER);
1151
1152 level_panel.setLayout(new BorderLayout());
1153 level_panel.add(level_label, BorderLayout.WEST);
1154 level_panel.add(level_combobox, BorderLayout.CENTER);
1155
1156 level_details_panel.setLayout(new GridLayout(2,1,0,5));
1157 level_details_panel.add(level_name_panel);
1158 level_details_panel.add(level_panel);
1159
1160 level_button_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1161 level_button_panel.setLayout(new GridLayout(1,2,5,0));
1162 level_button_panel.add(add_level_button);
1163 level_button_panel.add(remove_level_button);
1164
1165 level_body_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1166 level_body_panel.setLayout(new BorderLayout());
1167 level_body_panel.add(level_details_panel, BorderLayout.CENTER);
1168 level_body_panel.add(level_button_panel, BorderLayout.SOUTH);
1169
1170 level_spacer_panel.setLayout(new BorderLayout());
1171 level_spacer_panel.add(level_body_panel, BorderLayout.NORTH);
1172 level_spacer_panel.add(level_empty_panel, BorderLayout.CENTER);
1173
1174 levels_panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
1175 levels_panel.setLayout(new BorderLayout());
1176 levels_panel.add(current_levels_panel, BorderLayout.NORTH);
1177 levels_panel.add(level_spacer_panel, BorderLayout.CENTER);
1178
1179 // Create General
1180 JPanel header_panel = new JPanel();
1181
1182 title_label = new JLabel();
1183 title_label.setHorizontalAlignment(JLabel.CENTER);
1184 Dictionary.registerText(title_label, "CDM.IndexManager.MGPP.Title");
1185
1186 instructions_textarea = new JTextArea();
1187 instructions_textarea.setEditable(false);
1188 instructions_textarea.setLineWrap(true);
1189 instructions_textarea.setRows(6);
1190 instructions_textarea.setWrapStyleWord(true);
1191 Dictionary.registerText(instructions_textarea, "CDM.IndexManager.MGPP.Instructions");
1192
1193 tabbed_pane = new JTabbedPane();
1194
1195 // Layout General
1196 header_panel.setBorder(BorderFactory.createEmptyBorder(0,0,2,0));
1197 header_panel.setLayout(new BorderLayout());
1198 header_panel.add(title_label, BorderLayout.NORTH);
1199 header_panel.add(new JScrollPane(instructions_textarea), BorderLayout.CENTER);
1200
1201 tabbed_pane.add(Dictionary.get("CDM.IndexManager.MGPP.Indexes"), indexes_panel);
1202 tabbed_pane.add(Dictionary.get("CDM.IndexManager.MGPP.Levels"), levels_panel);
1203
1204 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
1205 setLayout(new BorderLayout());
1206 add(header_panel, BorderLayout.NORTH);
1207 add(tabbed_pane, BorderLayout.CENTER);
1208 }
1209
1210 public void destroy() {
1211 }
1212
1213 public void gainFocus() {
1214 // Reload the assigned indexes list.
1215 index_combobox.removeAllItems();
1216 index_combobox.addItem(CollectionConfiguration.ALLFIELDS_STR);
1217 index_combobox.addItem(CollectionConfiguration.TEXT_STR);
1218 java.util.List assigned_elements = Gatherer.c_man.getCollection().msm.getAssignedElements();
1219 int assigned_elements_size = assigned_elements.size();
1220 for(int i = 0; i < assigned_elements_size; i++) {
1221 index_combobox.addItem(assigned_elements.get(i));
1222 }
1223 assigned_elements = null;
1224 }
1225
1226 private class AddIndexActionListener
1227 implements ActionListener {
1228 public void actionPerformed(ActionEvent event) {
1229 // Retrieve the name
1230 String name = index_name_field.getText();
1231 // Retrieve the source
1232 Object source = index_combobox.getSelectedItem();
1233 // If this object isn't yet in the combobox add it.
1234 if(index_combobox.getSelectedIndex() == -1) {
1235 index_combobox.insertItemAt(source, index_combobox.getItemCount());
1236 }
1237 // Create new index
1238 ArrayList sources = new ArrayList();
1239 sources.add(source);
1240 Index index = new Index(sources);
1241 if(!model.contains(index)) {
1242 // Create new metadatum
1243 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
1244 metadatum.setValue(name);
1245 // Assign new index
1246 addIndex(index, metadatum);
1247 }
1248 // Done. Disable add
1249 add_index_button.setEnabled(false);
1250 }
1251 }
1252
1253 private class AddAllActionListener
1254 implements ActionListener {
1255
1256 public void actionPerformed(ActionEvent event) {
1257 for(int i = 0; i < index_combobox.getItemCount(); i++) {
1258 Object source = index_combobox.getItemAt(i);
1259 // Create new index
1260 ArrayList sources = new ArrayList();
1261 sources.add(source);
1262 Index index = new Index(sources);
1263 sources = null;
1264 if(!model.contains(index)) {
1265 // Determine the metadatum value
1266 String name = source.toString();
1267 if(name.startsWith(Utility.EXTRACTED_METADATA_NAMESPACE)) {
1268 name = name.substring(Utility.EXTRACTED_METADATA_NAMESPACE.length() + 1);
1269 }
1270 // Create new metadatum
1271 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
1272 metadatum.setValue(name);
1273 name = null;
1274 // Assign new index
1275 addIndex(index, metadatum);
1276 }
1277 source = null;
1278 index = null;
1279 }
1280 // Done. Disable add
1281 add_index_button.setEnabled(false);
1282 }
1283 }
1284
1285 private class AddLevelActionListener
1286 implements ActionListener {
1287 public void actionPerformed(ActionEvent event) {
1288 // Retrieve the name
1289 String name = level_name_field.getText();
1290 // Retrieve the source
1291 String source = (String)level_combobox.getSelectedItem();
1292 // If this object isn't yet in the combobox add it.
1293 if(level_combobox.getSelectedIndex() == -1) {
1294 level_combobox.insertItemAt(source, level_combobox.getItemCount());
1295 }
1296 Level level = new Level(source);
1297 // Create new metadatum
1298 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + source);
1299 metadatum.setValue(name);
1300 // Assign new level
1301 addLevel(level, metadatum);
1302 // Done. Disable add
1303 add_level_button.setEnabled(false);
1304 }
1305 }
1306
1307 private class CurrentIndexesListSelectionListener
1308 implements ListSelectionListener {
1309 public void valueChanged(ListSelectionEvent event) {
1310 if(!event.getValueIsAdjusting()) {
1311 Index index = (Index)current_indexes_list.getSelectedValue();
1312 Object[] selected_objects = current_indexes_list.getSelectedValues();
1313 if(selected_objects.length == 1) {
1314 String full_text = index.toString();
1315 if(full_text.indexOf("\"") != -1) {
1316 index_name_field.setText(index.getName());
1317 }
1318 ArrayList sources = index.getSources();
1319 index_combobox.setSelectedItem(sources.get(0));
1320 }
1321 if(index != null) {
1322 move_index_down_button.setEnabled((model.indexOf(index) < model.getSize() - 1));
1323 move_index_up_button.setEnabled((model.indexOf(index) > 0));
1324 remove_index_button.setEnabled(true);
1325 }
1326 else {
1327 move_index_down_button.setEnabled(false);
1328 move_index_up_button.setEnabled(false);
1329 remove_index_button.setEnabled(false);
1330 }
1331 }
1332 }
1333 }
1334
1335 private class CurrentLevelsListSelectionListener
1336 implements ListSelectionListener {
1337 public void valueChanged(ListSelectionEvent event) {
1338 if(!event.getValueIsAdjusting()) {
1339 Level level = (Level)current_levels_list.getSelectedValue();
1340 if(level != null) {
1341 move_level_down_button.setEnabled((levels_model.indexOf(level) < levels_model.getSize() - 1));
1342 move_level_up_button.setEnabled((levels_model.indexOf(level) > 0));
1343 remove_level_button.setEnabled(true);
1344 }
1345 else {
1346 move_level_down_button.setEnabled(false);
1347 move_level_up_button.setEnabled(false);
1348 remove_level_button.setEnabled(false);
1349 }
1350 }
1351 }
1352 }
1353
1354 private class EnableAddIndexListener
1355 implements ActionListener, DocumentListener {
1356 /** Called whenever a selection action occurs on the combobox.
1357 * @param event an ActionEvent containing information about the selection event
1358 */
1359 public void actionPerformed(ActionEvent event) {
1360 validateAddButton();
1361 }
1362
1363 /** Gives notification that an attribute or set of attributes changed.
1364 * @param event a DocumentEvent containing information about the text changed
1365 */
1366 public void changedUpdate(DocumentEvent event) {
1367 validateAddButton();
1368 }
1369
1370 /** Gives notification that there was an insert into the document.
1371 * @param event a DocumentEvent containing information about the text added
1372 */
1373 public void insertUpdate(DocumentEvent event) {
1374 validateAddButton();
1375 }
1376
1377 /** Gives notification that a portion of the document has been removed.
1378 * @param event a DocumentEvent containing information about the text removed
1379 */
1380 public void removeUpdate(DocumentEvent e) {
1381 validateAddButton();
1382 }
1383
1384 /** Change the enable state of the add button depending on the current value in the search type combobox. */
1385 public void validateAddButton() {
1386 String name = index_name_field.getText();
1387 Object selected_object = index_combobox.getSelectedItem();
1388 if(name.length() > 0 && selected_object != null) {
1389 // Unfortunately we have to generate a valid id
1390 String id = null;
1391 if(selected_object instanceof ElementWrapper) {
1392 id = ((ElementWrapper)selected_object).getName();
1393 }
1394 else {
1395 id = selected_object.toString();
1396 }
1397 if(id.startsWith(Utility.EXTRACTED_METADATA_NAMESPACE)) {
1398 id = id.substring(Utility.EXTRACTED_METADATA_NAMESPACE.length() + 1);
1399 }
1400 Index index = getIndex(id);
1401 if(index == null) {
1402 add_index_button.setEnabled(true);
1403 replace_button.setEnabled(false);
1404 }
1405 else {
1406 add_index_button.setEnabled(false);
1407 replace_button.setEnabled(!name.equals(index.getName()));
1408 }
1409 }
1410 else {
1411 add_index_button.setEnabled(false);
1412 }
1413 }
1414 }
1415
1416 private class EnableAddLevelListener
1417 implements ActionListener, DocumentListener {
1418 /** Called whenever a selection action occurs on the combobox.
1419 * @param event an ActionEvent containing information about the selection event
1420 */
1421 public void actionPerformed(ActionEvent event) {
1422 validateAddButton();
1423 }
1424
1425 /** Gives notification that an attribute or set of attributes changed.
1426 * @param event a DocumentEvent containing information about the text changed
1427 */
1428 public void changedUpdate(DocumentEvent event) {
1429 validateAddButton();
1430 }
1431
1432 /** Gives notification that there was an insert into the document.
1433 * @param event a DocumentEvent containing information about the text added
1434 */
1435 public void insertUpdate(DocumentEvent event) {
1436 validateAddButton();
1437 }
1438
1439 /** Gives notification that a portion of the document has been removed.
1440 * @param event a DocumentEvent containing information about the text removed
1441 */
1442 public void removeUpdate(DocumentEvent e) {
1443 validateAddButton();
1444 }
1445
1446 /** Change the enable state of the add button depending on the current value in the search type combobox. */
1447 public void validateAddButton() {
1448 String name = level_name_field.getText();
1449 Object selected_object = level_combobox.getSelectedItem();
1450 if(name.length() > 0 && selected_object != null) {
1451 add_level_button.setEnabled(getLevel((String)selected_object) == null);
1452 }
1453 else {
1454 add_level_button.setEnabled(false);
1455 }
1456 }
1457 }
1458
1459 private class MoveIndexDownListener
1460 implements ActionListener {
1461 public void actionPerformed(ActionEvent event) {
1462 // Retrieve the first selected item
1463 Index index = (Index) current_indexes_list.getSelectedValue();
1464 moveIndex(index, false);
1465 current_indexes_list.setSelectedValue(index, true);
1466 }
1467 }
1468
1469 private class MoveLevelDownListener
1470 implements ActionListener {
1471 public void actionPerformed(ActionEvent event) {
1472 // Retrieve the first selected item
1473 Level level = (Level) current_levels_list.getSelectedValue();
1474 moveLevel(level, false);
1475 current_levels_list.setSelectedValue(level, true);
1476 }
1477 }
1478
1479 private class MoveIndexUpListener
1480 implements ActionListener {
1481 public void actionPerformed(ActionEvent event) {
1482 // Retrieve the first selected item
1483 Index index = (Index) current_indexes_list.getSelectedValue();
1484 moveIndex(index, true);
1485 current_indexes_list.setSelectedValue(index, true);
1486 }
1487 }
1488
1489 private class MoveLevelUpListener
1490 implements ActionListener {
1491 public void actionPerformed(ActionEvent event) {
1492 // Retrieve the first selected item
1493 Level level = (Level) current_levels_list.getSelectedValue();
1494 moveLevel(level, true);
1495 current_levels_list.setSelectedValue(level, true);
1496 }
1497 }
1498
1499 /** Replace really only replaces the string. */
1500 private class ReplaceIndexActionListener
1501 implements ActionListener {
1502
1503 public void actionPerformed(ActionEvent event) {
1504 Object[] selected_objects = current_indexes_list.getSelectedValues();
1505 if(selected_objects.length == 1) {
1506 Index index = (Index) selected_objects[0];
1507 // Remove old name
1508 CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + index.getID());
1509 // Enter new name
1510 String name = index_name_field.getText();
1511 // Create new metadatum
1512 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
1513 index = null;
1514 metadatum.setValue(name);
1515 name = null;
1516 // Assign new index
1517 CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
1518 metadatum = null;
1519 }
1520 current_indexes_list.setSelectedValue(selected_objects[0], true);
1521 // Done. Disable add
1522 add_index_button.setEnabled(false);
1523 replace_button.setEnabled(false);
1524 }
1525 }
1526
1527 private class RemoveIndexActionListener
1528 implements ActionListener {
1529
1530 private EnableAddIndexListener eal = null;
1531
1532 public RemoveIndexActionListener(EnableAddIndexListener eal) {
1533 this.eal = eal;
1534 }
1535
1536 public void actionPerformed(ActionEvent event) {
1537 // Retrieve the selected items
1538 Object[] selected_objects = current_indexes_list.getSelectedValues();
1539 // Clear selection
1540 current_indexes_list.clearSelection();
1541 for(int i = 0; i < selected_objects.length; i++) {
1542 Index index = (Index) selected_objects[i];
1543 // Remove any related metadata
1544 CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + index.getID());
1545 // Remove the index
1546 removeIndex(index);
1547 }
1548 // Disable remove button
1549 remove_index_button.setEnabled(false);
1550 // Check if add should be reenabled
1551 eal.validateAddButton();
1552 }
1553 }
1554
1555 private class RemoveLevelActionListener
1556 implements ActionListener {
1557
1558 private EnableAddLevelListener eal = null;
1559
1560 public RemoveLevelActionListener(EnableAddLevelListener eal) {
1561 this.eal = eal;
1562 }
1563
1564 public void actionPerformed(ActionEvent event) {
1565 // Retrieve the selected items
1566 Object[] selected_objects = current_levels_list.getSelectedValues();
1567 // Clear selection
1568 current_levels_list.clearSelection();
1569 for(int i = 0; i < selected_objects.length; i++) {
1570 Level level = (Level) selected_objects[i];
1571 // Remove any related metadata
1572 CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + level.getName());
1573 // Remove the index
1574 removeLevel(level);
1575 }
1576 // Disable remove button
1577 remove_level_button.setEnabled(false);
1578 // Check if add should be reenabled
1579 eal.validateAddButton();
1580 }
1581 }
1582 }
1583}
Note: See TracBrowser for help on using the repository browser.