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

Last change on this file since 8056 was 8002, checked in by mdewsnip, 20 years ago

Tightened up many public functions to private.

  • Property svn:keywords set to Author Date Id Revision
File size: 62.2 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.GComboBox;
43import org.greenstone.gatherer.gui.GLIButton;
44import org.greenstone.gatherer.msm.ElementWrapper;
45import org.greenstone.gatherer.util.ExclusiveListSelectionListener;
46import org.greenstone.gatherer.util.StaticStrings;
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 FIELD_SIZE = new Dimension(200,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 private 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 private 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(levels_model.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 levels_model.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 private 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 private 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 private 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 private 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 if(default_index != null) {
435 default_index.setAssigned(false);
436 }
437 }
438 else {
439 Element mgpp_element = root;
440 // Retrieve and assign MG element and default index element
441 Element mg_element = CollectionDesignManager.collect_config.getMGIndexes();
442 mg_element.setAttribute(CollectionConfiguration.ASSIGNED_ATTRIBUTE, CollectionConfiguration.TRUE_STR);
443 if(default_index != null) {
444 default_index.setAssigned(true);
445 }
446 // 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.
447 NodeList indexes = mgpp_element.getElementsByTagName(CollectionConfiguration.INDEX_ELEMENT);
448 if(indexes.getLength() == 0) {
449 Index index = getIndex(CollectionConfiguration.TEXT_STR);
450 if(index != null) {
451 // Replace mgpp element with mg element
452 setRoot(mg_element);
453 int level_size = levels_model.getSize();
454 for(int i = 0; i < level_size; i++) {
455 Level level = (Level) levels_model.getElementAt(i);
456 Index new_index = new Index(level.getName(), index.getSources());
457 // Try to retrieve existing metadatum
458 String source_str = new_index.getID();
459 CollectionMeta metadatum = CollectionDesignManager.collectionmeta_manager.getMetadatum(CollectionConfiguration.STOP_CHARACTER + source_str, false);
460 // If no metadata was found, add new pseudo metadata using the id
461 if(metadatum == null) {
462 metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + source_str);
463 metadatum.setAssigned(true);
464 metadatum.setValue(source_str);
465 }
466 // If it was found, ensure it is assigned
467 else {
468 metadatum.setAssigned(true);
469 }
470 source_str = null;
471 addIndex(new_index, metadatum);
472 new_index = null;
473 level = null;
474 }
475 }
476 }
477 else {
478 // Replace mgpp element with mg element
479 setRoot(mg_element);
480 }
481 // Unassign mgpp element and levels
482 mgpp_element.setAttribute(CollectionConfiguration.ASSIGNED_ATTRIBUTE, CollectionConfiguration.FALSE_STR);
483 levels_model.root.setAttribute(CollectionConfiguration.ASSIGNED_ATTRIBUTE, CollectionConfiguration.FALSE_STR);
484 }
485 }
486 }
487
488
489 /** This class creates a set of controls for editing the indexes. */
490 private class IndexControl
491 extends JPanel
492 implements Control {
493
494 private CardLayout card_layout;
495 private CheckList source_list;
496 private JButton add_button;
497 private JButton move_down_button;
498 private JButton move_up_button;
499 private JButton remove_button;
500 private JButton set_default_button;
501 private JComboBox level_combobox;
502 private JList index_list;
503 private JTextArea instruction_textarea;
504 private JTextField name_textfield ;
505
506 private MGPPControl mgppindexes_control;
507
508 /** Constructor.
509 * @see org.greenstone.gatherer.Configuration
510 * @see org.greenstone.gatherer.Gatherer
511 * @see org.greenstone.gatherer.cdm.IndexManager.IndexControl.AddListener
512 * @see org.greenstone.gatherer.cdm.IndexManager.IndexControl.NameListener
513 * @see org.greenstone.gatherer.cdm.IndexManager.IndexControl.RemoveListener
514 * @see org.greenstone.gatherer.cdm.IndexManager.IndexControl.SetDefaultListener
515 * @see org.greenstone.gatherer.collection.CollectionManager
516 * @see org.greenstone.gatherer.gui.Coloring
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 JButton("", Utility.getImage("arrow-up.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 JButton("", Utility.getImage("arrow-down.gif"));
561 move_down_button.setEnabled(false);
562 move_down_button.setMnemonic(KeyEvent.VK_D);
563 Dictionary.registerBoth(move_down_button, "CDM.Move.Move_Down", "CDM.Move.Move_Down_Tooltip");
564
565 JPanel index_pane = new JPanel();
566 JPanel details_pane = new JPanel();
567 JPanel labels_pane = new JPanel();
568 JPanel boxes_pane = new JPanel();
569
570 JLabel name_label = new JLabel();
571 Dictionary.registerText(name_label, "CDM.IndexManager.Index_Name");
572 name_textfield = new JTextField();
573 name_textfield.setPreferredSize(FIELD_SIZE);
574 Dictionary.registerTooltip(name_textfield, "CDM.IndexManager.Index_Name_Tooltip");
575
576 JLabel source_label = new JLabel();
577 Dictionary.registerText(source_label, "CDM.IndexManager.Source");
578 source_list = new CheckList(new_data, false);
579 Dictionary.registerTooltip(source_list, "CDM.IndexManager.Source_Tooltip");
580
581 JLabel level_label = new JLabel();
582 Dictionary.registerText(level_label, "CDM.IndexManager.Level");
583 level_combobox = new JComboBox();
584 level_combobox.setPreferredSize(FIELD_SIZE);
585 level_combobox.addItem(CollectionConfiguration.DOCUMENT_STR);//Dictionary.get("CDM.IndexManager.Document"));
586 level_combobox.addItem(CollectionConfiguration.PARAGRAPH_STR);//Dictionary.get("CDM.IndexManager.Paragraph"));
587 level_combobox.addItem(CollectionConfiguration.SECTION_STR);//Dictionary.get("CDM.IndexManager.Section"));
588 level_combobox.setEditable(false);
589 Dictionary.registerTooltip(level_combobox, "CDM.IndexManager.Level_Tooltip");
590
591 JPanel button_pane = new JPanel();
592 add_button = new GLIButton();
593 add_button.setEnabled(false);
594 add_button.setMnemonic(KeyEvent.VK_A);
595 Dictionary.registerBoth(add_button, "CDM.IndexManager.Add_Index", "CDM.IndexManager.Add_Index_Tooltip");
596 set_default_button = new GLIButton();
597 set_default_button.setEnabled(false);
598 set_default_button.setMnemonic(KeyEvent.VK_S);
599 Dictionary.registerBoth(set_default_button, "CDM.IndexManager.Set_Default", "CDM.IndexManager.Set_Default_Tooltip");
600 remove_button = new GLIButton();
601 remove_button.setEnabled(false);
602 remove_button.setMnemonic(KeyEvent.VK_R);
603 Dictionary.registerBoth(remove_button, "CDM.IndexManager.Remove_Index", "CDM.IndexManager.Remove_Index_Tooltip");
604
605 // This class is getting a little crowded, so I'll generate the many mgpp controls in a inner class.
606 mgppindexes_control = new MGPPControl();
607
608 // Listeners
609 add_button.addActionListener(new AddListener());
610 move_down_button.addActionListener(new MoveListener(false));
611 move_up_button.addActionListener(new MoveListener(true));
612 remove_button.addActionListener(new RemoveListener());
613 set_default_button.addActionListener(new SetDefaultListener());
614 name_textfield.getDocument().addDocumentListener(new NameListener());
615 index_list.addListSelectionListener(new IndexListListener());
616 source_list.addListSelectionListener(new SourceListListener());
617 ExclusiveListSelectionListener elsl = new ExclusiveListSelectionListener();
618 elsl.add(index_list);
619 elsl.add(source_list);
620 elsl = null; // We don't want to hold a reference to this
621
622 // Layout
623 instruction_pane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
624 instruction_pane.setLayout(new BorderLayout());
625 instruction_pane.add(title_label, BorderLayout.NORTH);
626 instruction_pane.add(new JScrollPane(instruction_textarea), BorderLayout.CENTER);
627
628 movement_pane.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));
629 movement_pane.setLayout(new GridLayout(2,1));
630 movement_pane.add(move_up_button);
631 movement_pane.add(move_down_button);
632
633 assigned_indexes_pane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
634 assigned_indexes_pane.setLayout(new BorderLayout());
635 assigned_indexes_pane.add(index_label, BorderLayout.NORTH);
636 assigned_indexes_pane.add(new JScrollPane(index_list), BorderLayout.CENTER);
637 assigned_indexes_pane.add(movement_pane, BorderLayout.EAST);
638
639 labels_pane.setLayout(new BorderLayout());
640 labels_pane.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5));
641 labels_pane.add(name_label, BorderLayout.NORTH);
642 labels_pane.add(source_label, BorderLayout.CENTER);
643 labels_pane.add(level_label, BorderLayout.SOUTH);
644
645 boxes_pane.setLayout(new BorderLayout());
646 boxes_pane.add(name_textfield, BorderLayout.NORTH);
647 boxes_pane.add(new JScrollPane(source_list), BorderLayout.CENTER);
648 boxes_pane.add(level_combobox, BorderLayout.SOUTH);
649
650 details_pane.setLayout(new BorderLayout());
651 details_pane.add(labels_pane, BorderLayout.WEST);
652 details_pane.add(boxes_pane, BorderLayout.CENTER);
653
654 button_pane.setLayout(new GridLayout(1,3));
655 button_pane.add(add_button);
656 button_pane.add(set_default_button);
657 button_pane.add(remove_button);
658
659 index_pane.setLayout(new BorderLayout());
660 index_pane.add(details_pane, BorderLayout.CENTER);
661 index_pane.add(button_pane, BorderLayout.SOUTH);
662
663 mgindexes_panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
664 mgindexes_panel.setLayout(new BorderLayout());
665 mgindexes_panel.add(instruction_pane, BorderLayout.NORTH);
666 mgindexes_panel.add(assigned_indexes_pane, BorderLayout.CENTER);
667 mgindexes_panel.add(index_pane, BorderLayout.SOUTH);
668
669 setLayout(card_layout);
670 add(mgindexes_panel, MGINDEXES);
671 add(mgppindexes_control, MGPPINDEXES);
672 }
673
674 /* Destructor, removes persistant listeners from the Dictionary.
675 */
676 public void destroy() {
677 mgppindexes_control.destroy();
678 mgppindexes_control = null;
679 }
680
681 public void gainFocus() {
682 boolean mgpp_enabled = CollectionDesignManager.searchtype_manager.isMGPPEnabled();
683 if(instruction_textarea != null) {
684 instruction_textarea.setCaretPosition(0);
685 }
686 if(mgpp_enabled) {
687 mgppindexes_control.gainFocus();
688 }
689 else {
690 // Reload the assigned indexes list.
691 ArrayList new_data = new ArrayList();
692 new_data.add(CollectionConfiguration.TEXT_STR);
693 new_data.addAll(Gatherer.c_man.getCollection().msm.getAssignedElements());
694 // reset the model in the list and combobox
695 source_list.setListData(new_data.toArray());
696 new_data = null;
697 }
698 // Bring the appropriate card to the front
699 if(mgpp_enabled) {
700 card_layout.show(this, MGPPINDEXES);
701 }
702 else {
703 card_layout.show(this, MGINDEXES);
704 }
705 }
706
707 public void loseFocus() {
708 }
709
710 private void validateAddButton() {
711 boolean add_enabled = false;
712 // Indexes must have a name
713 if(name_textfield.getText().length() == 0) {
714 add_enabled = false;
715 }
716 // Can't add a new index if no sources are selected
717 else if(source_list.isSelectionEmpty()) {
718 add_enabled = false;
719 }
720 // If we get this far, create a dummy index and see if its already assigned in the collection
721 else {
722 Object object[] = source_list.getSelected().toArray();
723 ArrayList sources = new ArrayList();
724 for(int i = 0; i < object.length; i++) {
725 sources.add(object[i]);
726 }
727 object = null;
728 Index index = new Index(level_combobox.getSelectedIndex(), sources);
729 sources = null;
730 if(model.contains(index)) {
731 add_enabled = false;
732 }
733 else {
734 add_enabled = true;
735 }
736 }
737 // We should now know the add_button state
738 add_button.setEnabled(add_enabled);
739 }
740
741 /** 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. */
742 private class AddListener
743 implements ActionListener {
744 /** 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.
745 * @param event An <strong>ActionEvent</strong> providing extra information about the event.
746 * @see org.greenstone.gatherer.cdm.CollectionDesignManager
747 * @see org.greenstone.gatherer.cdm.CollectionMeta
748 * @see org.greenstone.gatherer.cdm.CollectionMetaManager
749 * @see org.greenstone.gatherer.cdm.Index
750 * @see org.greenstone.gatherer.cdm.Language
751 * @see org.greenstone.gatherer.cdm.LanguageManager
752 */
753 public void actionPerformed(ActionEvent event) {
754 String name = name_textfield.getText();
755 if(!source_list.isSelectionEmpty() && name.length() != 0) {
756 ArrayList sources = source_list.getSelected();
757 Index index = new Index(level_combobox.getSelectedIndex(), sources);
758 sources = null;
759 // Before we add the index to the model, we have to add the collection metadata for this.
760 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
761 metadatum.setValue(name);
762 // Finally add index.
763 addIndex(index, metadatum);
764 metadatum = null;
765 index = null;
766 }
767 name = null;
768 }
769 }
770
771 /** Listens for selections within the list on the IndexManager controls, and if a change is detected enables, or disables, controls appropriately. */
772 private class IndexListListener
773 implements ListSelectionListener {
774 /** 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.
775 * @param event A <strong>ListSelectionEvent</strong> containing further information about the list selection.
776 */
777 public void valueChanged(ListSelectionEvent event) {
778 Object value = index_list.getSelectedValue();
779 move_down_button.setEnabled(value != null);
780 move_up_button.setEnabled(value != null);
781 remove_button.setEnabled(value != null);
782 set_default_button.setEnabled(value != null && (default_index == null || !default_index.equals(value)));
783 }
784 }
785
786 private class IndexListRenderer
787 extends DefaultListCellRenderer {
788
789 /** Return a component that has been configured to display the specified value. */
790 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
791 JLabel component = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
792 if(default_index != null && default_index.equals(value)) {
793 component.setText(component.getText() + " " + Dictionary.get("CDM.IndexManager.Default_Index_Indicator"));
794 }
795 return component;
796 }
797
798 }
799
800 private class MoveListener
801 implements ActionListener {
802
803 private boolean move_up;
804
805 public MoveListener(boolean move_up) {
806 this.move_up = move_up;
807 }
808
809 public void actionPerformed(ActionEvent event) {
810 // Retrieve the selected index
811 Index index = (Index) index_list.getSelectedValue();
812 if(index != null) {
813 moveIndex(index, move_up);
814 // Ensure the index that moved is still selected
815 index_list.setSelectedValue(index, true);
816 index = null;
817 }
818 }
819 }
820
821 /** 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. */
822 private class RemoveListener
823 implements ActionListener {
824 /** If called when an action occurs on a registered component, we remove the currently selected index, if there is one.
825 * @param event An <strong>ActionEvent</strong> containing extra information about the action that occured.
826 * @see org.greenstone.gatherer.cdm.Index
827 */
828 public void actionPerformed(ActionEvent event) {
829 if(!index_list.isSelectionEmpty()) {
830 removeIndex((Index)index_list.getSelectedValue());
831 }
832 move_down_button.setEnabled(false);
833 move_up_button.setEnabled(false);
834 remove_button.setEnabled(false);
835 }
836 }
837
838 private class SetDefaultListener
839 implements ActionListener {
840
841 public void actionPerformed(ActionEvent event) {
842 Index index = (Index) index_list.getSelectedValue();
843 if(index != null) {
844 setDefault(index);
845 // This should cause a repaint of just the desired row
846 index_list.setSelectedValue(index, true);
847 }
848 set_default_button.setEnabled(false);
849 }
850 }
851
852 /** Listens for selections within the list on the IndexManager controls, and if a change is detected enables, or disables, controls appropriately. */
853 private class SourceListListener
854 implements ListSelectionListener {
855 /** 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.
856 * @param event A <strong>ListSelectionEvent</strong> containing further information about the list selection.
857 */
858 public void valueChanged(ListSelectionEvent event) {
859 validateAddButton();
860 }
861 }
862
863 /** Listens for key presses within the name field, and enabled or disables controls as appropriate. */
864 private class NameListener
865 implements DocumentListener {
866 /** Gives notification that an attribute or set of attributes changed. */
867 public void changedUpdate(DocumentEvent e) {
868 validateAddButton();
869 }
870
871 /** Gives notification that there was an insert into the document. */
872 public void insertUpdate(DocumentEvent e) {
873 validateAddButton();
874 }
875
876 /** Gives notification that a portion of the document has been removed. */
877 public void removeUpdate(DocumentEvent e) {
878 validateAddButton();
879 }
880 }
881 }
882
883 private class MGPPControl
884 extends JPanel {
885
886 private GComboBox index_combobox;
887 private GComboBox level_combobox;
888 private JButton add_index_button;
889 private JButton add_all_button;
890 private JButton add_level_button;
891 private JButton move_index_down_button;
892 private JButton move_level_down_button;
893 private JButton move_index_up_button;
894 private JButton move_level_up_button;
895 private JButton replace_button;
896 private JButton remove_index_button;
897 private JButton remove_level_button;
898 private JLabel current_levels_label;
899 private JLabel current_indexes_label;
900 private JLabel index_label;
901 private JLabel index_name_label;
902 private JLabel level_label;
903 private JLabel level_name_label;
904 private JLabel move_index_down_label;
905 private JLabel move_level_down_label;
906 private JLabel move_index_up_label;
907 private JLabel move_level_up_label;
908 private JLabel title_label;
909 private JList current_levels_list;
910 private JList current_indexes_list;
911 private JTabbedPane tabbed_pane;
912 private JTextArea instructions_textarea;
913 private JTextField index_name_field;
914 private JTextField level_name_field;
915
916 public MGPPControl() {
917 // Create Indexes
918 JPanel indexes_panel = new JPanel();
919
920 JPanel current_indexes_panel = new JPanel();
921
922 current_indexes_label = new JLabel();
923 Dictionary.registerText(current_indexes_label, "CDM.IndexManager.MGPP.Current_Indexes");
924 current_indexes_list = new JList(model);
925 current_indexes_list.setVisibleRowCount(5);
926
927 JPanel index_movement_panel = new JPanel();
928
929 move_index_up_button = new JButton("", Utility.getImage("arrow-up.gif"));
930 move_index_up_button.setEnabled(false);
931 move_index_up_button.setMnemonic(KeyEvent.VK_U);
932 //move_index_up_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
933 Dictionary.registerBoth(move_index_up_button, "CDM.Move.Move_Up", "CDM.Move.Move_Up_Tooltip");
934
935 move_index_down_button = new JButton("", Utility.getImage("arrow-down.gif"));
936 move_index_down_button.setEnabled(false);
937 move_index_down_button.setMnemonic(KeyEvent.VK_D);
938 //move_index_down_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
939 Dictionary.registerBoth(move_index_down_button, "CDM.Move.Move_Down", "CDM.Move.Move_Down_Tooltip");
940
941 JPanel index_spacer_panel = new JPanel();
942 JPanel index_body_panel = new JPanel();
943 JPanel index_details_panel = new JPanel();
944 JPanel index_labels_panel = new JPanel();
945
946 index_name_label = new JLabel();
947 Dictionary.registerText(index_name_label, "CDM.IndexManager.Index_Name");
948
949 index_name_field = new JTextField();
950 index_name_field.setPreferredSize(FIELD_SIZE);
951 Dictionary.registerTooltip(index_name_field, "CDM.IndexManager.Index_Name_Tooltip");
952
953 JPanel index_boxes_panel = new JPanel();
954
955 index_label = new JLabel("CDM.IndexManager.MGPP.Index");
956 Dictionary.registerText(index_label, "CDM.IndexManager.MGPP.Index");
957
958 index_combobox = new GComboBox();
959 index_combobox.setPreferredSize(FIELD_SIZE);
960 index_combobox.setBackgroundNonSelectionColor(Gatherer.config.getColor("coloring.editable_background", false));
961 index_combobox.setBackgroundSelectionColor(Gatherer.config.getColor("coloring.collection_selection_background", false));
962 index_combobox.setEditable(true);
963 index_combobox.setTextNonSelectionColor(Gatherer.config.getColor("coloring.workspace_tree_foreground", false));
964 index_combobox.setTextSelectionColor(Gatherer.config.getColor("coloring.collection_selection_foreground", false));
965 Dictionary.registerTooltip(index_combobox, "CDM.IndexManager.MGPP.Index_Tooltip");
966
967 JPanel index_button_panel = new JPanel();
968
969 add_index_button = new GLIButton();
970 add_index_button.setEnabled(false);
971 add_index_button.setMnemonic(KeyEvent.VK_A);
972 Dictionary.registerBoth(add_index_button, "CDM.IndexManager.Add_Index", "CDM.IndexManager.Add_Index_Tooltip");
973
974 add_all_button = new GLIButton();
975 add_all_button.setEnabled(true);
976 add_all_button.setMnemonic(KeyEvent.VK_L);
977 Dictionary.registerBoth(add_all_button, "CDM.IndexManager.MGPP.Add_All_Metadata", "CDM.IndexManager.MGPP.Add_All_Metadata_Tooltip");
978
979 replace_button = new GLIButton();
980 replace_button.setEnabled(false);
981 replace_button.setMnemonic(KeyEvent.VK_C);
982 Dictionary.registerBoth(replace_button, "CDM.IndexManager.MGPP.Replace_Index", "CDM.IndexManager.MGPP.Replace_Index_Tooltip");
983
984 remove_index_button = new GLIButton();
985 remove_index_button.setEnabled(false);
986 remove_index_button.setMnemonic(KeyEvent.VK_A);
987 Dictionary.registerBoth(remove_index_button, "CDM.IndexManager.Remove_Index", "CDM.IndexManager.Remove_Index_Tooltip");
988
989 JPanel index_empty_panel = new JPanel();
990
991 // Connect Indexes
992 EnableAddIndexListener index_eal = new EnableAddIndexListener();
993 add_index_button.addActionListener(new AddIndexActionListener());
994 add_all_button.addActionListener(new AddAllActionListener());
995 current_indexes_list.addListSelectionListener(new CurrentIndexesListSelectionListener());
996 index_combobox.addActionListener(index_eal);
997 ((JTextField)index_combobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(index_eal);
998 index_name_field.getDocument().addDocumentListener(index_eal);
999 move_index_down_button.addActionListener(new MoveIndexDownListener());
1000 move_index_up_button.addActionListener(new MoveIndexUpListener());
1001 replace_button.addActionListener(new ReplaceIndexActionListener());
1002 remove_index_button.addActionListener(new RemoveIndexActionListener(index_eal));
1003
1004 // Layout Indexes
1005 index_movement_panel.setLayout(new GridLayout(2,1));
1006 index_movement_panel.add(move_index_up_button);
1007 index_movement_panel.add(move_index_down_button);
1008
1009 current_indexes_panel.setLayout(new BorderLayout());
1010 current_indexes_panel.add(current_indexes_label, BorderLayout.NORTH);
1011 current_indexes_panel.add(new JScrollPane(current_indexes_list), BorderLayout.CENTER);
1012 current_indexes_panel.add(index_movement_panel, BorderLayout.EAST);
1013
1014
1015 index_labels_panel.setLayout(new GridLayout(2,1));
1016 index_labels_panel.add(index_name_label);
1017 index_labels_panel.add(index_label);
1018
1019 index_boxes_panel.setLayout(new GridLayout(2,1));
1020 index_boxes_panel.add(index_name_field);
1021 index_boxes_panel.add(index_combobox);
1022
1023 index_details_panel.setLayout(new BorderLayout(5,0));
1024 index_details_panel.add(index_labels_panel, BorderLayout.WEST);
1025 index_details_panel.add(index_boxes_panel, BorderLayout.CENTER);
1026
1027 index_button_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1028 index_button_panel.setLayout(new GridLayout(2,2,5,0));
1029 index_button_panel.add(add_index_button);
1030 index_button_panel.add(add_all_button);
1031 index_button_panel.add(replace_button);
1032 index_button_panel.add(remove_index_button);
1033
1034 index_body_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1035 index_body_panel.setLayout(new BorderLayout());
1036 index_body_panel.add(index_details_panel, BorderLayout.CENTER);
1037 index_body_panel.add(index_button_panel, BorderLayout.SOUTH);
1038
1039 index_spacer_panel.setLayout(new BorderLayout());
1040 index_spacer_panel.add(index_body_panel, BorderLayout.NORTH);
1041 index_spacer_panel.add(index_empty_panel, BorderLayout.CENTER);
1042
1043 indexes_panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
1044 indexes_panel.setLayout(new BorderLayout());
1045 indexes_panel.add(current_indexes_panel, BorderLayout.NORTH);
1046 indexes_panel.add(index_spacer_panel, BorderLayout.CENTER);
1047
1048 // Create Levels
1049 JPanel levels_panel = new JPanel();
1050
1051 JPanel current_levels_panel = new JPanel();
1052
1053 current_levels_label = new JLabel();
1054 Dictionary.registerText(current_levels_label, "CDM.IndexManager.MGPP.Current_Levels");
1055
1056 current_levels_list = new JList(levels_model);
1057 current_levels_list.setVisibleRowCount(5);
1058
1059 JPanel level_movement_panel = new JPanel();
1060
1061 move_level_up_button = new JButton("", Utility.getImage("arrow-up.gif"));
1062 move_level_up_button.setEnabled(false);
1063 move_level_up_button.setMnemonic(KeyEvent.VK_U);
1064 //move_level_up_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
1065 Dictionary.registerBoth(move_level_up_button, "CDM.Move.Move_Up", "CDM.Move.Move_Up_Tooltip");
1066
1067 move_level_down_button = new JButton("", Utility.getImage("arrow-down.gif"));
1068 move_level_down_button.setEnabled(false);
1069 move_level_down_button.setMnemonic(KeyEvent.VK_D);
1070 //move_level_down_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
1071 Dictionary.registerBoth(move_level_down_button, "CDM.Move.Move_Down", "CDM.Move.Move_Down_Tooltip");
1072
1073 JPanel level_spacer_panel = new JPanel();
1074 JPanel level_body_panel = new JPanel();
1075 JPanel level_details_panel = new JPanel();
1076 JPanel level_labels_panel = new JPanel();
1077 JPanel level_boxes_panel = new JPanel();
1078
1079 level_name_label = new JLabel();
1080 Dictionary.registerText(level_name_label, "CDM.IndexManager.MGPP.Level_Name");
1081
1082 level_name_field = new JTextField();
1083 level_name_field.setPreferredSize(FIELD_SIZE);
1084 Dictionary.registerTooltip(level_name_field, "CDM.IndexManager.MGPP.Level_Name_Tooltip");
1085
1086
1087 level_label = new JLabel();
1088 Dictionary.registerText(level_label, "CDM.IndexManager.MGPP.Level");
1089
1090 level_combobox = new GComboBox(Index.LEVEL);
1091 level_combobox.setPreferredSize(FIELD_SIZE);
1092 level_combobox.setBackgroundNonSelectionColor(Gatherer.config.getColor("coloring.editable_background", false));
1093 level_combobox.setBackgroundSelectionColor(Gatherer.config.getColor("coloring.collection_selection_background", false));
1094 level_combobox.setEditable(true);
1095 level_combobox.setTextNonSelectionColor(Gatherer.config.getColor("coloring.workspace_tree_foreground", false));
1096 level_combobox.setTextSelectionColor(Gatherer.config.getColor("coloring.collection_selection_foreground", false));
1097 Dictionary.registerTooltip(level_combobox, "CDM.IndexManager.Level_Tooltip");
1098
1099 JPanel level_button_panel = new JPanel();
1100
1101 add_level_button = new GLIButton("CDM.IndexManager.MGPP.Add_Level");
1102 add_level_button.setEnabled(false);
1103 add_level_button.setMnemonic(KeyEvent.VK_A);
1104 Dictionary.registerBoth(add_level_button, "CDM.IndexManager.MGPP.Add_Level", "CDM.IndexManager.MGPP.Add_Level_Tooltip");
1105
1106 remove_level_button = new GLIButton("CDM.IndexManager.MGPP.Remove_Level");
1107 remove_level_button.setEnabled(false);
1108 remove_level_button.setMnemonic(KeyEvent.VK_A);
1109 Dictionary.registerBoth(remove_level_button, "CDM.IndexManager.MGPP.Remove_Level", "CDM.IndexManager.MGPP.Remove_Level_Tooltip");
1110
1111 JPanel level_empty_panel = new JPanel();
1112
1113 // Connect Levels
1114 EnableAddLevelListener level_eal = new EnableAddLevelListener();
1115 add_level_button.addActionListener(new AddLevelActionListener());
1116 current_levels_list.addListSelectionListener(new CurrentLevelsListSelectionListener());
1117 level_combobox.addActionListener(level_eal);
1118 ((JTextField)level_combobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(level_eal);
1119 level_name_field.getDocument().addDocumentListener(level_eal);
1120 move_level_down_button.addActionListener(new MoveLevelDownListener());
1121 move_level_up_button.addActionListener(new MoveLevelUpListener());
1122 remove_level_button.addActionListener(new RemoveLevelActionListener(level_eal));
1123 // Layout Levels
1124
1125 level_movement_panel.setLayout(new GridLayout(2,1));
1126 level_movement_panel.add(move_level_up_button);
1127 level_movement_panel.add(move_level_down_button);
1128
1129 current_levels_panel.setLayout(new BorderLayout());
1130 current_levels_panel.add(current_levels_label, BorderLayout.NORTH);
1131 current_levels_panel.add(new JScrollPane(current_levels_list), BorderLayout.CENTER);
1132 current_levels_panel.add(level_movement_panel, BorderLayout.EAST);
1133
1134 level_labels_panel.setLayout(new GridLayout(2,1));
1135 level_labels_panel.add(level_name_label);
1136 level_labels_panel.add(level_label);
1137
1138 level_boxes_panel.setLayout(new GridLayout(2,1));
1139 level_boxes_panel.add(level_name_field);
1140 level_boxes_panel.add(level_combobox);
1141
1142 level_details_panel.setLayout(new BorderLayout(5,0));
1143 level_details_panel.add(level_labels_panel, BorderLayout.WEST);
1144 level_details_panel.add(level_boxes_panel, BorderLayout.CENTER);
1145
1146 level_button_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1147 level_button_panel.setLayout(new GridLayout(1,2,5,0));
1148 level_button_panel.add(add_level_button);
1149 level_button_panel.add(remove_level_button);
1150
1151 level_body_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1152 level_body_panel.setLayout(new BorderLayout());
1153 level_body_panel.add(level_details_panel, BorderLayout.CENTER);
1154 level_body_panel.add(level_button_panel, BorderLayout.SOUTH);
1155
1156 level_spacer_panel.setLayout(new BorderLayout());
1157 level_spacer_panel.add(level_body_panel, BorderLayout.NORTH);
1158 level_spacer_panel.add(level_empty_panel, BorderLayout.CENTER);
1159
1160 levels_panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
1161 levels_panel.setLayout(new BorderLayout());
1162 levels_panel.add(current_levels_panel, BorderLayout.NORTH);
1163 levels_panel.add(level_spacer_panel, BorderLayout.CENTER);
1164
1165 // Create General
1166 JPanel header_panel = new JPanel();
1167
1168 title_label = new JLabel();
1169 title_label.setHorizontalAlignment(JLabel.CENTER);
1170 Dictionary.registerText(title_label, "CDM.IndexManager.MGPP.Title");
1171
1172 instructions_textarea = new JTextArea();
1173 instructions_textarea.setEditable(false);
1174 instructions_textarea.setLineWrap(true);
1175 instructions_textarea.setRows(6);
1176 instructions_textarea.setWrapStyleWord(true);
1177 Dictionary.registerText(instructions_textarea, "CDM.IndexManager.MGPP.Instructions");
1178
1179 tabbed_pane = new JTabbedPane();
1180
1181 // Layout General
1182 header_panel.setBorder(BorderFactory.createEmptyBorder(0,0,2,0));
1183 header_panel.setLayout(new BorderLayout());
1184 header_panel.add(title_label, BorderLayout.NORTH);
1185 header_panel.add(new JScrollPane(instructions_textarea), BorderLayout.CENTER);
1186
1187 tabbed_pane.add(Dictionary.get("CDM.IndexManager.MGPP.Indexes"), indexes_panel);
1188 tabbed_pane.add(Dictionary.get("CDM.IndexManager.MGPP.Levels"), levels_panel);
1189
1190 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
1191 setLayout(new BorderLayout());
1192 add(header_panel, BorderLayout.NORTH);
1193 add(tabbed_pane, BorderLayout.CENTER);
1194 }
1195
1196 public void destroy() {
1197 }
1198
1199 public void gainFocus() {
1200 // Reload the assigned indexes list.
1201 index_combobox.removeAllItems();
1202 index_combobox.addItem(CollectionConfiguration.ALLFIELDS_STR);
1203 index_combobox.addItem(CollectionConfiguration.METADATA_STR);
1204 index_combobox.addItem(CollectionConfiguration.TEXT_STR);
1205 java.util.List assigned_elements = Gatherer.c_man.getCollection().msm.getAssignedElements();
1206 int assigned_elements_size = assigned_elements.size();
1207 for(int i = 0; i < assigned_elements_size; i++) {
1208 index_combobox.addItem(assigned_elements.get(i));
1209 }
1210 assigned_elements = null;
1211 // Ensure the level manager has at least documents assigned
1212 if(levels_model.getSize() == 0) {
1213 Level level = new Level(CollectionConfiguration.DOCUMENT_STR);
1214 // Create new metadatum
1215 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + CollectionConfiguration.DOCUMENT_STR);
1216 metadatum.setValue(CollectionConfiguration.DOCUMENT_STR);
1217 // Assign new level
1218 addLevel(level, metadatum);
1219 level = null;
1220 }
1221 }
1222
1223 private class AddIndexActionListener
1224 implements ActionListener {
1225 public void actionPerformed(ActionEvent event) {
1226 // Retrieve the name
1227 String name = index_name_field.getText();
1228 // Retrieve the source
1229 Object source = index_combobox.getSelectedItem();
1230 // If this object isn't yet in the combobox add it.
1231 if(index_combobox.getSelectedIndex() == -1) {
1232 index_combobox.insertItemAt(source, index_combobox.getItemCount());
1233 }
1234 // Create new index
1235 ArrayList sources = new ArrayList();
1236 sources.add(source);
1237 Index index = new Index(sources);
1238 if(!model.contains(index)) {
1239 // Create new metadatum
1240 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
1241 metadatum.setValue(name);
1242 // Assign new index
1243 addIndex(index, metadatum);
1244 }
1245 // Done. Disable add
1246 add_index_button.setEnabled(false);
1247 }
1248 }
1249
1250 private class AddAllActionListener
1251 implements ActionListener {
1252
1253 public void actionPerformed(ActionEvent event) {
1254 for(int i = 0; i < index_combobox.getItemCount(); i++) {
1255 Object source = index_combobox.getItemAt(i);
1256 // Create new index
1257 ArrayList sources = new ArrayList();
1258 sources.add(source);
1259 Index index = new Index(sources);
1260 sources = null;
1261 if(!model.contains(index)) {
1262 // Determine the metadatum value
1263 String name = source.toString();
1264 if(name.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
1265 name = name.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
1266 }
1267 // Create new metadatum
1268 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
1269 metadatum.setValue(name);
1270 name = null;
1271 // Assign new index
1272 addIndex(index, metadatum);
1273 }
1274 source = null;
1275 index = null;
1276 }
1277 // Done. Disable add
1278 add_index_button.setEnabled(false);
1279 }
1280 }
1281
1282 private class AddLevelActionListener
1283 implements ActionListener {
1284 public void actionPerformed(ActionEvent event) {
1285 // Retrieve the name
1286 String name = level_name_field.getText();
1287 // Retrieve the source
1288 String source = (String)level_combobox.getSelectedItem();
1289 // If this object isn't yet in the combobox add it.
1290 if(level_combobox.getSelectedIndex() == -1) {
1291 level_combobox.insertItemAt(source, level_combobox.getItemCount());
1292 }
1293 Level level = new Level(source);
1294 // Create new metadatum
1295 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + source);
1296 metadatum.setValue(name);
1297 // Assign new level
1298 addLevel(level, metadatum);
1299 // Done. Disable add
1300 add_level_button.setEnabled(false);
1301 }
1302 }
1303
1304 private class CurrentIndexesListSelectionListener
1305 implements ListSelectionListener {
1306 public void valueChanged(ListSelectionEvent event) {
1307 if(!event.getValueIsAdjusting()) {
1308 Index index = (Index)current_indexes_list.getSelectedValue();
1309 Object[] selected_objects = current_indexes_list.getSelectedValues();
1310 if(selected_objects.length == 1) {
1311 String full_text = index.toString();
1312 if(full_text.indexOf("\"") != -1) {
1313 index_name_field.setText(index.getName());
1314 }
1315 ArrayList sources = index.getSources();
1316 index_combobox.setSelectedItem(sources.get(0));
1317 }
1318 if(index != null) {
1319 move_index_down_button.setEnabled((model.indexOf(index) < model.getSize() - 1));
1320 move_index_up_button.setEnabled((model.indexOf(index) > 0));
1321 remove_index_button.setEnabled(true);
1322 }
1323 else {
1324 move_index_down_button.setEnabled(false);
1325 move_index_up_button.setEnabled(false);
1326 remove_index_button.setEnabled(false);
1327 }
1328 }
1329 }
1330 }
1331
1332 private class CurrentLevelsListSelectionListener
1333 implements ListSelectionListener {
1334 public void valueChanged(ListSelectionEvent event) {
1335 if(!event.getValueIsAdjusting()) {
1336 Level level = (Level)current_levels_list.getSelectedValue();
1337 if(level != null) {
1338 move_level_down_button.setEnabled((levels_model.indexOf(level) < levels_model.getSize() - 1));
1339 move_level_up_button.setEnabled((levels_model.indexOf(level) > 0));
1340 remove_level_button.setEnabled(!level.getName().equals(CollectionConfiguration.DOCUMENT_STR) || levels_model.getSize() > 1);
1341 }
1342 else {
1343 move_level_down_button.setEnabled(false);
1344 move_level_up_button.setEnabled(false);
1345 remove_level_button.setEnabled(false);
1346 }
1347 }
1348 }
1349 }
1350
1351 private class EnableAddIndexListener
1352 implements ActionListener, DocumentListener {
1353 /** Called whenever a selection action occurs on the combobox.
1354 * @param event an ActionEvent containing information about the selection event
1355 */
1356 public void actionPerformed(ActionEvent event) {
1357 validateAddButton();
1358 }
1359
1360 /** Gives notification that an attribute or set of attributes changed.
1361 * @param event a DocumentEvent containing information about the text changed
1362 */
1363 public void changedUpdate(DocumentEvent event) {
1364 validateAddButton();
1365 }
1366
1367 /** Gives notification that there was an insert into the document.
1368 * @param event a DocumentEvent containing information about the text added
1369 */
1370 public void insertUpdate(DocumentEvent event) {
1371 validateAddButton();
1372 }
1373
1374 /** Gives notification that a portion of the document has been removed.
1375 * @param event a DocumentEvent containing information about the text removed
1376 */
1377 public void removeUpdate(DocumentEvent event) {
1378 validateAddButton();
1379 }
1380
1381 /** Change the enable state of the add button depending on the current value in the search type combobox. */
1382 public void validateAddButton() {
1383 String name = index_name_field.getText();
1384 Object selected_object = index_combobox.getSelectedItem();
1385 if(name.length() > 0 && selected_object != null) {
1386 // Unfortunately we have to generate a valid id
1387 String id = null;
1388 if(selected_object instanceof ElementWrapper) {
1389 id = ((ElementWrapper)selected_object).getName();
1390 }
1391 else {
1392 id = selected_object.toString();
1393 }
1394 if(id.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
1395 id = id.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
1396 }
1397 Index index = getIndex(id);
1398 if(index == null) {
1399 add_index_button.setEnabled(true);
1400 replace_button.setEnabled(false);
1401 }
1402 else {
1403 add_index_button.setEnabled(false);
1404 replace_button.setEnabled(!name.equals(index.getName()));
1405 }
1406 }
1407 else {
1408 add_index_button.setEnabled(false);
1409 }
1410 }
1411 }
1412
1413 private class EnableAddLevelListener
1414 implements ActionListener, DocumentListener {
1415 /** Called whenever a selection action occurs on the combobox.
1416 * @param event an ActionEvent containing information about the selection event
1417 */
1418 public void actionPerformed(ActionEvent event) {
1419 validateAddButton();
1420 }
1421
1422 /** Gives notification that an attribute or set of attributes changed.
1423 * @param event a DocumentEvent containing information about the text changed
1424 */
1425 public void changedUpdate(DocumentEvent event) {
1426 validateAddButton();
1427 }
1428
1429 /** Gives notification that there was an insert into the document.
1430 * @param event a DocumentEvent containing information about the text added
1431 */
1432 public void insertUpdate(DocumentEvent event) {
1433 validateAddButton();
1434 }
1435
1436 /** Gives notification that a portion of the document has been removed.
1437 * @param event a DocumentEvent containing information about the text removed
1438 */
1439 public void removeUpdate(DocumentEvent event) {
1440 validateAddButton();
1441 }
1442
1443 /** Change the enable state of the add button depending on the current value in the search type combobox. */
1444 public void validateAddButton() {
1445 String name = level_name_field.getText();
1446 Object selected_object = level_combobox.getSelectedItem();
1447 if(name.length() > 0 && selected_object != null) {
1448 add_level_button.setEnabled(getLevel((String)selected_object) == null);
1449 }
1450 else {
1451 add_level_button.setEnabled(false);
1452 }
1453 }
1454 }
1455
1456 private class MoveIndexDownListener
1457 implements ActionListener {
1458 public void actionPerformed(ActionEvent event) {
1459 // Retrieve the first selected item
1460 Index index = (Index) current_indexes_list.getSelectedValue();
1461 moveIndex(index, false);
1462 current_indexes_list.setSelectedValue(index, true);
1463 }
1464 }
1465
1466 private class MoveLevelDownListener
1467 implements ActionListener {
1468 public void actionPerformed(ActionEvent event) {
1469 // Retrieve the first selected item
1470 Level level = (Level) current_levels_list.getSelectedValue();
1471 moveLevel(level, false);
1472 current_levels_list.setSelectedValue(level, true);
1473 }
1474 }
1475
1476 private class MoveIndexUpListener
1477 implements ActionListener {
1478 public void actionPerformed(ActionEvent event) {
1479 // Retrieve the first selected item
1480 Index index = (Index) current_indexes_list.getSelectedValue();
1481 moveIndex(index, true);
1482 current_indexes_list.setSelectedValue(index, true);
1483 }
1484 }
1485
1486 private class MoveLevelUpListener
1487 implements ActionListener {
1488 public void actionPerformed(ActionEvent event) {
1489 // Retrieve the first selected item
1490 Level level = (Level) current_levels_list.getSelectedValue();
1491 moveLevel(level, true);
1492 current_levels_list.setSelectedValue(level, true);
1493 }
1494 }
1495
1496 /** Replace really only replaces the string. */
1497 private class ReplaceIndexActionListener
1498 implements ActionListener {
1499
1500 public void actionPerformed(ActionEvent event) {
1501 Object[] selected_objects = current_indexes_list.getSelectedValues();
1502 if(selected_objects.length == 1) {
1503 Index index = (Index) selected_objects[0];
1504 // Remove old name
1505 CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + index.getID());
1506 // Enter new name
1507 String name = index_name_field.getText();
1508 // Create new metadatum
1509 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
1510 index = null;
1511 metadatum.setValue(name);
1512 name = null;
1513 // Assign new index
1514 CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
1515 metadatum = null;
1516 }
1517 current_indexes_list.setSelectedValue(selected_objects[0], true);
1518 // Done. Disable add
1519 add_index_button.setEnabled(false);
1520 replace_button.setEnabled(false);
1521 }
1522 }
1523
1524 private class RemoveIndexActionListener
1525 implements ActionListener {
1526
1527 private EnableAddIndexListener eal = null;
1528
1529 public RemoveIndexActionListener(EnableAddIndexListener eal) {
1530 this.eal = eal;
1531 }
1532
1533 public void actionPerformed(ActionEvent event) {
1534 // Retrieve the selected items
1535 Object[] selected_objects = current_indexes_list.getSelectedValues();
1536 // Clear selection
1537 current_indexes_list.clearSelection();
1538 for(int i = 0; i < selected_objects.length; i++) {
1539 Index index = (Index) selected_objects[i];
1540 // Remove any related metadata
1541 CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + index.getID());
1542 // Remove the index
1543 removeIndex(index);
1544 }
1545 // Disable remove button
1546 remove_index_button.setEnabled(false);
1547 // Check if add should be reenabled
1548 eal.validateAddButton();
1549 }
1550 }
1551
1552 private class RemoveLevelActionListener
1553 implements ActionListener {
1554
1555 private EnableAddLevelListener eal = null;
1556
1557 public RemoveLevelActionListener(EnableAddLevelListener eal) {
1558 this.eal = eal;
1559 }
1560
1561 public void actionPerformed(ActionEvent event) {
1562 // Retrieve the selected items
1563 Object[] selected_objects = current_levels_list.getSelectedValues();
1564 // Clear selection
1565 current_levels_list.clearSelection();
1566 for(int i = 0; i < selected_objects.length; i++) {
1567 Level level = (Level) selected_objects[i];
1568 // Remove any related metadata
1569 CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + level.getName());
1570 // Remove the index
1571 removeLevel(level);
1572 }
1573 // Disable remove button
1574 remove_level_button.setEnabled(false);
1575 // If there are no levels left, put document back in
1576 if(levels_model.getSize() == 0) {
1577 Level level = new Level(CollectionConfiguration.DOCUMENT_STR);
1578 // Create new metadatum
1579 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + CollectionConfiguration.DOCUMENT_STR);
1580 metadatum.setValue(CollectionConfiguration.DOCUMENT_STR);
1581 // Assign new level
1582 addLevel(level, metadatum);
1583 level = null;
1584 }
1585 // Check if add should be reenabled
1586 eal.validateAddButton();
1587 }
1588 }
1589 }
1590}
Note: See TracBrowser for help on using the repository browser.