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

Last change on this file since 7206 was 7151, checked in by kjdon, 20 years ago

fixed some more static label sizes and deleted a lot of commented out stuff

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