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

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

major mods to the mg index controls. added a replace button, enabled selections on the index list and source list at teh same time, and fixed up some other stuff to do with current selections

  • Property svn:keywords set to Author Date Id Revision
File size: 66.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.Configuration;
35import org.greenstone.gatherer.DebugStream;
36import org.greenstone.gatherer.Dictionary;
37import org.greenstone.gatherer.Gatherer;
38import org.greenstone.gatherer.checklist.CheckList;
39import org.greenstone.gatherer.gui.GComboBox;
40import org.greenstone.gatherer.gui.GLIButton;
41import org.greenstone.gatherer.metadata.MetadataElement;
42import org.greenstone.gatherer.metadata.MetadataSetManager;
43import org.greenstone.gatherer.util.ExclusiveListSelectionListener;
44import org.greenstone.gatherer.util.StaticStrings;
45import org.greenstone.gatherer.util.Utility;
46import org.w3c.dom.*;
47/** 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.
48 * @author John Thompson, Greenstone Digital Library, University of Waikato
49 * @version 2.3
50 */
51public class IndexManager
52 extends DOMProxyListModel {
53
54 static final private Dimension FIELD_SIZE = new Dimension(200,30);
55 static final private Dimension BUTTON_SIZE = new Dimension(100,30);
56 static final private String MGINDEXES = "mg indexes";
57 static final private String MGPPINDEXES = "mgpp indexes";
58
59 /** The controls for editing the indexes. */
60 private Control controls = null;
61 /** A model of the levels, also based on the DOM. */
62 private DOMProxyListModel levels_model = null;
63 /** A reference to ourselves so our inner methods have access. */
64 private DOMProxyListModel model = null;
65 /** The default index. */
66 private Index default_index = null;
67
68 /** Constructor. */
69 public IndexManager(Element indexes) {
70 super(indexes, CollectionConfiguration.INDEX_ELEMENT, new Index());
71 DebugStream.println("IndexManager: " + getSize() + " indexes parsed.");
72 model = this;
73 // Parse and retrieve the default index
74 NodeList default_index_elements = CollectionDesignManager.collect_config.getDocumentElement().getElementsByTagName(CollectionConfiguration.INDEX_DEFAULT_ELEMENT);
75 if(default_index_elements.getLength() > 0) {
76 default_index = new Index((Element)default_index_elements.item(0));
77 }
78 // Parse and retrieve the levels element
79 Element levels_element = CollectionDesignManager.collect_config.getLevels();
80 levels_model = new DOMProxyListModel(levels_element, CollectionConfiguration.CONTENT_ELEMENT, new Level());
81 DebugStream.println(" + " + levels_model.getSize() + " levels parsed.");
82 }
83
84 /** Method to add a new index.
85 * @param index The <strong>Index</strong> to add.
86 * @see org.greenstone.gatherer.Gatherer
87 * @see org.greenstone.gatherer.collection.CollectionManager
88 */
89 private void addIndex(Index index, CollectionMeta metadatum) {
90 ///ystem.err.println("Adding an index: " + index.toString());
91 if(!contains(index)) {
92 CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
93 // Retrieve the currently last index
94 if(getSize() > 0) {
95 Index last_index = (Index)getElementAt(getSize() - 1);
96 addAfter(index, last_index);
97
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 MetadataElement) {
389 source_str = ((MetadataElement) source_object).getFullName();
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 replace_button;
501 private JButton set_default_button;
502 private JComboBox level_combobox;
503 private JList index_list;
504 private JTextArea instruction_textarea;
505 private JTextField name_textfield ;
506
507 private MGPPControl mgppindexes_control;
508
509 /** Constructor.
510 * @see org.greenstone.gatherer.Configuration
511 * @see org.greenstone.gatherer.Gatherer
512 * @see org.greenstone.gatherer.cdm.IndexManager.IndexControl.AddListener
513 * @see org.greenstone.gatherer.cdm.IndexManager.IndexControl.NameListener
514 * @see org.greenstone.gatherer.cdm.IndexManager.IndexControl.RemoveListener
515 * @see org.greenstone.gatherer.cdm.IndexManager.IndexControl.SetDefaultListener
516 * @see org.greenstone.gatherer.collection.CollectionManager
517 * @see org.greenstone.gatherer.gui.Coloring
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(MetadataSetManager.getEveryMetadataSetElement());
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 index_list.setVisibleRowCount(5);
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 replace_button = new GLIButton();
605 replace_button.setEnabled(false);
606 replace_button.setMnemonic(KeyEvent.VK_P);
607 Dictionary.registerBoth(replace_button, "CDM.IndexManager.MGPP.Replace_Index", "CDM.IndexManager.MGPP.Replace_Index_Tooltip");
608
609 // This class is getting a little crowded, so I'll generate the many mgpp controls in a inner class.
610 mgppindexes_control = new MGPPControl();
611
612 // Listeners
613 add_button.addActionListener(new AddListener());
614 move_down_button.addActionListener(new MoveListener(false));
615 move_up_button.addActionListener(new MoveListener(true));
616 remove_button.addActionListener(new RemoveListener());
617 replace_button.addActionListener(new ReplaceListener());
618 set_default_button.addActionListener(new SetDefaultListener());
619 name_textfield.getDocument().addDocumentListener(new NameListener());
620 level_combobox.addItemListener(new LevelListener());
621 index_list.addListSelectionListener(new IndexListListener());
622 source_list.addListSelectionListener(new SourceListListener());
623
624 // Layout
625 instruction_pane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
626 instruction_pane.setLayout(new BorderLayout());
627 instruction_pane.add(title_label, BorderLayout.NORTH);
628 instruction_pane.add(new JScrollPane(instruction_textarea), BorderLayout.CENTER);
629
630 movement_pane.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));
631 movement_pane.setLayout(new GridLayout(3,1));
632 movement_pane.add(move_up_button);
633 movement_pane.add(move_down_button);
634 movement_pane.add(set_default_button);
635
636 assigned_indexes_pane.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
637 assigned_indexes_pane.setLayout(new BorderLayout());
638 assigned_indexes_pane.add(index_label, BorderLayout.NORTH);
639 assigned_indexes_pane.add(new JScrollPane(index_list), BorderLayout.CENTER);
640 assigned_indexes_pane.add(movement_pane, BorderLayout.EAST);
641
642 labels_pane.setLayout(new BorderLayout());
643 labels_pane.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5));
644 labels_pane.add(name_label, BorderLayout.NORTH);
645 labels_pane.add(source_label, BorderLayout.CENTER);
646 labels_pane.add(level_label, BorderLayout.SOUTH);
647
648 boxes_pane.setLayout(new BorderLayout());
649 boxes_pane.add(name_textfield, BorderLayout.NORTH);
650 boxes_pane.add(new JScrollPane(source_list), BorderLayout.CENTER);
651 boxes_pane.add(level_combobox, BorderLayout.SOUTH);
652
653 details_pane.setLayout(new BorderLayout());
654 details_pane.add(labels_pane, BorderLayout.WEST);
655 details_pane.add(boxes_pane, BorderLayout.CENTER);
656
657 button_pane.setLayout(new GridLayout(1,3));
658 button_pane.add(add_button);
659 button_pane.add(replace_button);
660 button_pane.add(remove_button);
661
662 index_pane.setLayout(new BorderLayout());
663 index_pane.add(details_pane, BorderLayout.CENTER);
664 index_pane.add(button_pane, BorderLayout.SOUTH);
665
666 mgindexes_panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
667 mgindexes_panel.setLayout(new BorderLayout());
668 mgindexes_panel.add(instruction_pane, BorderLayout.NORTH);
669 mgindexes_panel.add(assigned_indexes_pane, BorderLayout.CENTER);
670 mgindexes_panel.add(index_pane, BorderLayout.SOUTH);
671
672 setLayout(card_layout);
673 add(mgindexes_panel, MGINDEXES);
674 add(mgppindexes_control, MGPPINDEXES);
675 }
676
677 /* Destructor, removes persistant listeners from the Dictionary.
678 */
679 public void destroy() {
680 mgppindexes_control.destroy();
681 mgppindexes_control = null;
682 }
683
684 public void gainFocus() {
685 boolean mgpp_enabled = CollectionDesignManager.searchtype_manager.isMGPPEnabled();
686 if(instruction_textarea != null) {
687 instruction_textarea.setCaretPosition(0);
688 }
689 if(mgpp_enabled) {
690 mgppindexes_control.gainFocus();
691 }
692 else {
693 // Reload the assigned indexes list.
694 ArrayList new_data = new ArrayList();
695 new_data.add(CollectionConfiguration.TEXT_STR);
696 new_data.addAll(MetadataSetManager.getEveryMetadataSetElement());
697 // reset the model in the list and combobox
698 source_list.setListData(new_data.toArray());
699 new_data = null;
700 // refresh the indexList
701 index_list.updateUI();
702 // if there is one selected, fill in the controls
703 updateControlsWithSelectedIndex();
704 }
705 // Bring the appropriate card to the front
706 if(mgpp_enabled) {
707 card_layout.show(this, MGPPINDEXES);
708 }
709 else {
710 card_layout.show(this, MGINDEXES);
711 }
712 }
713
714 public void loseFocus() {
715 }
716
717 private void updateControlsWithSelectedIndex() {
718
719 Index selected_index = (Index)index_list.getSelectedValue();
720 if (selected_index == null) {
721 return;
722 }
723 String id = selected_index.getID();
724 if (id == null || id.equals("")) {
725 return;
726 }
727 String name = CollectionDesignManager.collectionmeta_manager.getMetadatum(CollectionConfiguration.STOP_CHARACTER+selected_index.getID()).getValue(true);
728 name_textfield.setText(name);
729 level_combobox.setSelectedIndex(selected_index.getLevel());
730 source_list.clearSelection();
731 ArrayList sources = selected_index.getSources();
732 source_list.setSelectedObjects(sources.toArray());
733
734 }
735
736 private void validateAddButton() {
737 boolean add_enabled = false;
738 boolean replace_enabled = false;
739 // Indexes must have a name
740 if(name_textfield.getText().length() == 0) {
741 add_enabled = false;
742 }
743 // Can't add a new index if no sources are selected
744 else if(source_list.isSelectionEmpty()) {
745 add_enabled = false;
746 }
747 // If we get this far, create a dummy index and see if its already assigned in the collection
748 else {
749 Object object[] = source_list.getSelected().toArray();
750 ArrayList sources = new ArrayList();
751 for(int i = 0; i < object.length; i++) {
752 sources.add(object[i]);
753 }
754 object = null;
755 Index index = new Index(level_combobox.getSelectedIndex(), sources);
756 sources = null;
757 if(model.contains(index)) {
758 add_enabled = false;
759 // here we need to check if we have changed the name - if so, we can enable the replace button
760 if (index_list.getSelectedIndex() != -1) {
761 Index selected_index = (Index)index_list.getSelectedValue();
762 String name = name_textfield.getText();
763 String index_name = CollectionDesignManager.collectionmeta_manager.getMetadatum(CollectionConfiguration.STOP_CHARACTER+selected_index.getID()).getValue(true);
764 if (!index_name.equals(name)){
765 replace_enabled = true;
766 }
767 }
768 }
769 else {
770 add_enabled = true;
771 // we have a new index, do we have something selected in the index list? if so, enable the replace button
772 if (index_list.getSelectedIndex() != -1) {
773 replace_enabled = true;
774 }
775
776 }
777 }
778 // We should now know the add_button state
779 add_button.setEnabled(add_enabled);
780 replace_button.setEnabled(replace_enabled);
781 }
782
783 /** 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. */
784 private class AddListener
785 implements ActionListener {
786 /** 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.
787 * @param event An <strong>ActionEvent</strong> providing extra information about the event.
788 * @see org.greenstone.gatherer.cdm.CollectionDesignManager
789 * @see org.greenstone.gatherer.cdm.CollectionMeta
790 * @see org.greenstone.gatherer.cdm.CollectionMetaManager
791 * @see org.greenstone.gatherer.cdm.Index
792 * @see org.greenstone.gatherer.cdm.Language
793 * @see org.greenstone.gatherer.cdm.LanguageManager
794 */
795 public void actionPerformed(ActionEvent event) {
796 String name = name_textfield.getText();
797 if(!source_list.isSelectionEmpty() && name.length() != 0) {
798 ArrayList sources = source_list.getSelected();
799 Index index = new Index(level_combobox.getSelectedIndex(), sources);
800 sources = null;
801 // Before we add the index to the model, we have to add the collection metadata for this.
802 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
803 metadatum.setValue(name);
804 // Finally add index.
805 addIndex(index, metadatum);
806 index_list.setSelectedValue(index, true);
807 metadatum = null;
808 index = null;
809 }
810 name = null;
811 }
812 }
813
814 /** Listens for selections within the list on the IndexManager controls, and if a change is detected enables, or disables, controls appropriately. */
815 private class IndexListListener
816 implements ListSelectionListener {
817 /** This method is called whenever the source list selection changes. When it does we need to fill in the various parts of the list description panel
818 * @param event A <strong>ListSelectionEvent</strong> containing further information about the list selection.
819 */
820 public void valueChanged(ListSelectionEvent event)
821 {
822 if (event.getValueIsAdjusting()) {
823 return;
824 }
825
826 Object value = index_list.getSelectedValue();
827 if (value == null) {
828 move_down_button.setEnabled(false);
829 move_up_button.setEnabled(false);
830 remove_button.setEnabled(false);
831 replace_button.setEnabled(false);
832 set_default_button.setEnabled(false);
833 return;
834 }
835 // enable the buttons appropriately
836 remove_button.setEnabled(true);
837 set_default_button.setEnabled(default_index == null || !default_index.equals(value));
838 int i = index_list.getSelectedIndex();
839 int size = index_list.getModel().getSize();
840 if (i > 0) {
841 move_up_button.setEnabled(true);
842 } else {
843 move_up_button.setEnabled(false);
844 }
845 if (i<size-1){
846 move_down_button.setEnabled(true);
847 } else {
848 move_down_button.setEnabled(false);
849 }
850
851 // need to fill in the rest of the bits
852 updateControlsWithSelectedIndex();
853 }
854 }
855
856 private class IndexListRenderer
857 extends DefaultListCellRenderer {
858
859 /** Return a component that has been configured to display the specified value. */
860 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
861 JLabel component = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
862 if(default_index != null && default_index.equals(value)) {
863 component.setText(component.getText() + " " + Dictionary.get("CDM.IndexManager.Default_Index_Indicator"));
864 }
865 return component;
866 }
867
868 }
869
870 private class LevelListener
871 implements ItemListener {
872 public void itemStateChanged(ItemEvent event) {
873 if(event.getStateChange() == ItemEvent.SELECTED) {
874 // just want to validate the add button
875 validateAddButton();
876
877 }
878 }
879 }
880
881 private class MoveListener
882 implements ActionListener {
883
884 private boolean move_up;
885
886 public MoveListener(boolean move_up) {
887 this.move_up = move_up;
888 }
889
890 public void actionPerformed(ActionEvent event) {
891 // Retrieve the selected index
892 Index index = (Index) index_list.getSelectedValue();
893 if(index != null) {
894 moveIndex(index, move_up);
895 // Ensure the index that moved is still selected
896 index_list.setSelectedValue(index, true);
897 index = null;
898 }
899 }
900 }
901
902 /** 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. */
903 private class RemoveListener
904 implements ActionListener {
905 /** If called when an action occurs on a registered component, we remove the currently selected index, if there is one.
906 * @param event An <strong>ActionEvent</strong> containing extra information about the action that occured.
907 * @see org.greenstone.gatherer.cdm.Index
908 */
909 public void actionPerformed(ActionEvent event) {
910 int i = index_list.getSelectedIndex();
911 if(i != -1) {
912 removeIndex((Index)index_list.getSelectedValue());
913 }
914 int size = index_list.getModel().getSize();
915 if (i == size) {
916 i--;
917 }
918
919 index_list.setSelectedIndex(i);
920 // this will produce an event on the list, updating the other buttons
921 if (size == 0) {
922 // we have removed the last index, should be able to add whats filled in currently, if valid
923 validateAddButton();
924 }
925 }
926 }
927
928 /** 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. */
929 private class ReplaceListener
930 implements ActionListener {
931 /** If called when an action occurs on a registered component, we replace the currently selected index, with the new details
932 * @param event An <strong>ActionEvent</strong> containing extra information about the action that occured.
933 * @see org.greenstone.gatherer.cdm.Index
934 */
935 public void actionPerformed(ActionEvent event) {
936 if(index_list.isSelectionEmpty()) {
937 // this should never happen, but just in case..
938 replace_button.setEnabled(false);
939 return;
940 }
941 // we'll just remove the old one and add the new one
942 removeIndex((Index)index_list.getSelectedValue());
943 replace_button.setEnabled(false);
944 add_button.setEnabled(true);
945 add_button.doClick();
946 add_button.setEnabled(false);
947 }
948 }
949
950 private class SetDefaultListener
951 implements ActionListener {
952
953 public void actionPerformed(ActionEvent event) {
954 Index index = (Index) index_list.getSelectedValue();
955 if(index != null) {
956 setDefault(index);
957 // This should cause a repaint of just the desired row
958 index_list.setSelectedValue(index, true);
959 }
960 set_default_button.setEnabled(false);
961 }
962 }
963
964 /** Listens for selections within the list on the IndexManager controls, and if a change is detected enables, or disables, controls appropriately. */
965 private class SourceListListener
966 implements ListSelectionListener {
967 /** 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.
968 * @param event A <strong>ListSelectionEvent</strong> containing further information about the list selection.
969 */
970 public void valueChanged(ListSelectionEvent event) {
971 validateAddButton();
972 }
973 }
974
975 /** Listens for key presses within the name field, and enabled or disables controls as appropriate. */
976 private class NameListener
977 implements DocumentListener {
978 /** Gives notification that an attribute or set of attributes changed. */
979 public void changedUpdate(DocumentEvent e) {
980 validateAddButton();
981 }
982
983 /** Gives notification that there was an insert into the document. */
984 public void insertUpdate(DocumentEvent e) {
985 validateAddButton();
986 }
987
988 /** Gives notification that a portion of the document has been removed. */
989 public void removeUpdate(DocumentEvent e) {
990 validateAddButton();
991 }
992 }
993 }
994
995 private class MGPPControl
996 extends JPanel {
997
998 private GComboBox index_combobox;
999 private GComboBox level_combobox;
1000 private JButton add_index_button;
1001 private JButton add_all_button;
1002 private JButton add_level_button;
1003 private JButton move_index_down_button;
1004 private JButton move_level_down_button;
1005 private JButton move_index_up_button;
1006 private JButton move_level_up_button;
1007 private JButton replace_button;
1008 private JButton remove_index_button;
1009 private JButton remove_level_button;
1010 private JLabel current_levels_label;
1011 private JLabel current_indexes_label;
1012 private JLabel index_label;
1013 private JLabel index_name_label;
1014 private JLabel level_label;
1015 private JLabel level_name_label;
1016 private JLabel move_index_down_label;
1017 private JLabel move_level_down_label;
1018 private JLabel move_index_up_label;
1019 private JLabel move_level_up_label;
1020 private JLabel title_label;
1021 private JList current_levels_list;
1022 private JList current_indexes_list;
1023 private JTabbedPane tabbed_pane;
1024 private JTextArea instructions_textarea;
1025 private JTextField index_name_field;
1026 private JTextField level_name_field;
1027
1028 public MGPPControl() {
1029 // Create Indexes
1030 JPanel indexes_panel = new JPanel();
1031
1032 JPanel current_indexes_panel = new JPanel();
1033
1034 current_indexes_label = new JLabel();
1035 Dictionary.registerText(current_indexes_label, "CDM.IndexManager.MGPP.Current_Indexes");
1036 current_indexes_list = new JList(model);
1037 current_indexes_list.setVisibleRowCount(5);
1038
1039 JPanel index_movement_panel = new JPanel();
1040
1041 move_index_up_button = new JButton("", Utility.getImage("arrow-up.gif"));
1042 move_index_up_button.setEnabled(false);
1043 move_index_up_button.setMnemonic(KeyEvent.VK_U);
1044 //move_index_up_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
1045 Dictionary.registerBoth(move_index_up_button, "CDM.Move.Move_Up", "CDM.Move.Move_Up_Tooltip");
1046
1047 move_index_down_button = new JButton("", Utility.getImage("arrow-down.gif"));
1048 move_index_down_button.setEnabled(false);
1049 move_index_down_button.setMnemonic(KeyEvent.VK_D);
1050 //move_index_down_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
1051 Dictionary.registerBoth(move_index_down_button, "CDM.Move.Move_Down", "CDM.Move.Move_Down_Tooltip");
1052
1053 JPanel index_spacer_panel = new JPanel();
1054 JPanel index_body_panel = new JPanel();
1055 JPanel index_details_panel = new JPanel();
1056 JPanel index_labels_panel = new JPanel();
1057
1058 index_name_label = new JLabel();
1059 Dictionary.registerText(index_name_label, "CDM.IndexManager.Index_Name");
1060
1061 index_name_field = new JTextField();
1062 index_name_field.setPreferredSize(FIELD_SIZE);
1063 Dictionary.registerTooltip(index_name_field, "CDM.IndexManager.Index_Name_Tooltip");
1064
1065 JPanel index_boxes_panel = new JPanel();
1066
1067 index_label = new JLabel("CDM.IndexManager.MGPP.Index");
1068 Dictionary.registerText(index_label, "CDM.IndexManager.MGPP.Index");
1069
1070 index_combobox = new GComboBox();
1071 index_combobox.setPreferredSize(FIELD_SIZE);
1072 index_combobox.setBackgroundNonSelectionColor(Configuration.getColor("coloring.editable_background", false));
1073 index_combobox.setBackgroundSelectionColor(Configuration.getColor("coloring.collection_selection_background", false));
1074 index_combobox.setEditable(true);
1075 index_combobox.setTextNonSelectionColor(Configuration.getColor("coloring.workspace_tree_foreground", false));
1076 index_combobox.setTextSelectionColor(Configuration.getColor("coloring.collection_selection_foreground", false));
1077 Dictionary.registerTooltip(index_combobox, "CDM.IndexManager.MGPP.Index_Tooltip");
1078
1079 JPanel index_button_panel = new JPanel();
1080
1081 add_index_button = new GLIButton();
1082 add_index_button.setEnabled(false);
1083 add_index_button.setMnemonic(KeyEvent.VK_A);
1084 Dictionary.registerBoth(add_index_button, "CDM.IndexManager.Add_Index", "CDM.IndexManager.Add_Index_Tooltip");
1085
1086 add_all_button = new GLIButton();
1087 add_all_button.setEnabled(true);
1088 add_all_button.setMnemonic(KeyEvent.VK_L);
1089 Dictionary.registerBoth(add_all_button, "CDM.IndexManager.MGPP.Add_All_Metadata", "CDM.IndexManager.MGPP.Add_All_Metadata_Tooltip");
1090
1091 replace_button = new GLIButton();
1092 replace_button.setEnabled(false);
1093 replace_button.setMnemonic(KeyEvent.VK_C);
1094 Dictionary.registerBoth(replace_button, "CDM.IndexManager.MGPP.Replace_Index", "CDM.IndexManager.MGPP.Replace_Index_Tooltip");
1095
1096 remove_index_button = new GLIButton();
1097 remove_index_button.setEnabled(false);
1098 remove_index_button.setMnemonic(KeyEvent.VK_A);
1099 Dictionary.registerBoth(remove_index_button, "CDM.IndexManager.Remove_Index", "CDM.IndexManager.Remove_Index_Tooltip");
1100
1101 JPanel index_empty_panel = new JPanel();
1102
1103 // Connect Indexes
1104 EnableAddIndexListener index_eal = new EnableAddIndexListener();
1105 add_index_button.addActionListener(new AddIndexActionListener());
1106 add_all_button.addActionListener(new AddAllActionListener());
1107 current_indexes_list.addListSelectionListener(new CurrentIndexesListSelectionListener());
1108 index_combobox.addActionListener(index_eal);
1109 ((JTextField)index_combobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(index_eal);
1110 index_name_field.getDocument().addDocumentListener(index_eal);
1111 move_index_down_button.addActionListener(new MoveIndexDownListener());
1112 move_index_up_button.addActionListener(new MoveIndexUpListener());
1113 replace_button.addActionListener(new ReplaceIndexActionListener());
1114 remove_index_button.addActionListener(new RemoveIndexActionListener(index_eal));
1115
1116 // Layout Indexes
1117 index_movement_panel.setLayout(new GridLayout(2,1));
1118 index_movement_panel.add(move_index_up_button);
1119 index_movement_panel.add(move_index_down_button);
1120
1121 current_indexes_panel.setLayout(new BorderLayout());
1122 current_indexes_panel.add(current_indexes_label, BorderLayout.NORTH);
1123 current_indexes_panel.add(new JScrollPane(current_indexes_list), BorderLayout.CENTER);
1124 current_indexes_panel.add(index_movement_panel, BorderLayout.EAST);
1125
1126
1127 index_labels_panel.setLayout(new GridLayout(2,1));
1128 index_labels_panel.add(index_name_label);
1129 index_labels_panel.add(index_label);
1130
1131 index_boxes_panel.setLayout(new GridLayout(2,1));
1132 index_boxes_panel.add(index_name_field);
1133 index_boxes_panel.add(index_combobox);
1134
1135 index_details_panel.setLayout(new BorderLayout(5,0));
1136 index_details_panel.add(index_labels_panel, BorderLayout.WEST);
1137 index_details_panel.add(index_boxes_panel, BorderLayout.CENTER);
1138
1139 index_button_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1140 index_button_panel.setLayout(new GridLayout(2,2,5,0));
1141 index_button_panel.add(add_index_button);
1142 index_button_panel.add(add_all_button);
1143 index_button_panel.add(replace_button);
1144 index_button_panel.add(remove_index_button);
1145
1146 index_body_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1147 index_body_panel.setLayout(new BorderLayout());
1148 index_body_panel.add(index_details_panel, BorderLayout.CENTER);
1149 index_body_panel.add(index_button_panel, BorderLayout.SOUTH);
1150
1151 index_spacer_panel.setLayout(new BorderLayout());
1152 index_spacer_panel.add(index_body_panel, BorderLayout.NORTH);
1153 index_spacer_panel.add(index_empty_panel, BorderLayout.CENTER);
1154
1155 indexes_panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
1156 indexes_panel.setLayout(new BorderLayout());
1157 indexes_panel.add(current_indexes_panel, BorderLayout.NORTH);
1158 indexes_panel.add(index_spacer_panel, BorderLayout.CENTER);
1159
1160 // Create Levels
1161 JPanel levels_panel = new JPanel();
1162
1163 JPanel current_levels_panel = new JPanel();
1164
1165 current_levels_label = new JLabel();
1166 Dictionary.registerText(current_levels_label, "CDM.IndexManager.MGPP.Current_Levels");
1167
1168 current_levels_list = new JList(levels_model);
1169 current_levels_list.setVisibleRowCount(5);
1170
1171 JPanel level_movement_panel = new JPanel();
1172
1173 move_level_up_button = new JButton("", Utility.getImage("arrow-up.gif"));
1174 move_level_up_button.setEnabled(false);
1175 move_level_up_button.setMnemonic(KeyEvent.VK_U);
1176 //move_level_up_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
1177 Dictionary.registerBoth(move_level_up_button, "CDM.Move.Move_Up", "CDM.Move.Move_Up_Tooltip");
1178
1179 move_level_down_button = new JButton("", Utility.getImage("arrow-down.gif"));
1180 move_level_down_button.setEnabled(false);
1181 move_level_down_button.setMnemonic(KeyEvent.VK_D);
1182 //move_level_down_button.setPreferredSize(Utility.DOUBLE_IMAGE_BUTTON_SIZE);
1183 Dictionary.registerBoth(move_level_down_button, "CDM.Move.Move_Down", "CDM.Move.Move_Down_Tooltip");
1184
1185 JPanel level_spacer_panel = new JPanel();
1186 JPanel level_body_panel = new JPanel();
1187 JPanel level_details_panel = new JPanel();
1188 JPanel level_labels_panel = new JPanel();
1189 JPanel level_boxes_panel = new JPanel();
1190
1191 level_name_label = new JLabel();
1192 Dictionary.registerText(level_name_label, "CDM.IndexManager.MGPP.Level_Name");
1193
1194 level_name_field = new JTextField();
1195 level_name_field.setPreferredSize(FIELD_SIZE);
1196 Dictionary.registerTooltip(level_name_field, "CDM.IndexManager.MGPP.Level_Name_Tooltip");
1197
1198
1199 level_label = new JLabel();
1200 Dictionary.registerText(level_label, "CDM.IndexManager.MGPP.Level");
1201
1202 level_combobox = new GComboBox(Index.LEVEL);
1203 level_combobox.setPreferredSize(FIELD_SIZE);
1204 level_combobox.setBackgroundNonSelectionColor(Configuration.getColor("coloring.editable_background", false));
1205 level_combobox.setBackgroundSelectionColor(Configuration.getColor("coloring.collection_selection_background", false));
1206 level_combobox.setEditable(true);
1207 level_combobox.setTextNonSelectionColor(Configuration.getColor("coloring.workspace_tree_foreground", false));
1208 level_combobox.setTextSelectionColor(Configuration.getColor("coloring.collection_selection_foreground", false));
1209 Dictionary.registerTooltip(level_combobox, "CDM.IndexManager.Level_Tooltip");
1210
1211 JPanel level_button_panel = new JPanel();
1212
1213 add_level_button = new GLIButton("CDM.IndexManager.MGPP.Add_Level");
1214 add_level_button.setEnabled(false);
1215 add_level_button.setMnemonic(KeyEvent.VK_A);
1216 Dictionary.registerBoth(add_level_button, "CDM.IndexManager.MGPP.Add_Level", "CDM.IndexManager.MGPP.Add_Level_Tooltip");
1217
1218 remove_level_button = new GLIButton("CDM.IndexManager.MGPP.Remove_Level");
1219 remove_level_button.setEnabled(false);
1220 remove_level_button.setMnemonic(KeyEvent.VK_A);
1221 Dictionary.registerBoth(remove_level_button, "CDM.IndexManager.MGPP.Remove_Level", "CDM.IndexManager.MGPP.Remove_Level_Tooltip");
1222
1223 JPanel level_empty_panel = new JPanel();
1224
1225 // Connect Levels
1226 EnableAddLevelListener level_eal = new EnableAddLevelListener();
1227 add_level_button.addActionListener(new AddLevelActionListener());
1228 current_levels_list.addListSelectionListener(new CurrentLevelsListSelectionListener());
1229 level_combobox.addActionListener(level_eal);
1230 ((JTextField)level_combobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(level_eal);
1231 level_name_field.getDocument().addDocumentListener(level_eal);
1232 move_level_down_button.addActionListener(new MoveLevelDownListener());
1233 move_level_up_button.addActionListener(new MoveLevelUpListener());
1234 remove_level_button.addActionListener(new RemoveLevelActionListener(level_eal));
1235 // Layout Levels
1236
1237 level_movement_panel.setLayout(new GridLayout(2,1));
1238 level_movement_panel.add(move_level_up_button);
1239 level_movement_panel.add(move_level_down_button);
1240
1241 current_levels_panel.setLayout(new BorderLayout());
1242 current_levels_panel.add(current_levels_label, BorderLayout.NORTH);
1243 current_levels_panel.add(new JScrollPane(current_levels_list), BorderLayout.CENTER);
1244 current_levels_panel.add(level_movement_panel, BorderLayout.EAST);
1245
1246 level_labels_panel.setLayout(new GridLayout(2,1));
1247 level_labels_panel.add(level_name_label);
1248 level_labels_panel.add(level_label);
1249
1250 level_boxes_panel.setLayout(new GridLayout(2,1));
1251 level_boxes_panel.add(level_name_field);
1252 level_boxes_panel.add(level_combobox);
1253
1254 level_details_panel.setLayout(new BorderLayout(5,0));
1255 level_details_panel.add(level_labels_panel, BorderLayout.WEST);
1256 level_details_panel.add(level_boxes_panel, BorderLayout.CENTER);
1257
1258 level_button_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1259 level_button_panel.setLayout(new GridLayout(1,2,5,0));
1260 level_button_panel.add(add_level_button);
1261 level_button_panel.add(remove_level_button);
1262
1263 level_body_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
1264 level_body_panel.setLayout(new BorderLayout());
1265 level_body_panel.add(level_details_panel, BorderLayout.CENTER);
1266 level_body_panel.add(level_button_panel, BorderLayout.SOUTH);
1267
1268 level_spacer_panel.setLayout(new BorderLayout());
1269 level_spacer_panel.add(level_body_panel, BorderLayout.NORTH);
1270 level_spacer_panel.add(level_empty_panel, BorderLayout.CENTER);
1271
1272 levels_panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
1273 levels_panel.setLayout(new BorderLayout());
1274 levels_panel.add(current_levels_panel, BorderLayout.NORTH);
1275 levels_panel.add(level_spacer_panel, BorderLayout.CENTER);
1276
1277 // Create General
1278 JPanel header_panel = new JPanel();
1279
1280 title_label = new JLabel();
1281 title_label.setHorizontalAlignment(JLabel.CENTER);
1282 Dictionary.registerText(title_label, "CDM.IndexManager.MGPP.Title");
1283
1284 instructions_textarea = new JTextArea();
1285 instructions_textarea.setEditable(false);
1286 instructions_textarea.setLineWrap(true);
1287 instructions_textarea.setRows(6);
1288 instructions_textarea.setWrapStyleWord(true);
1289 Dictionary.registerText(instructions_textarea, "CDM.IndexManager.MGPP.Instructions");
1290
1291 tabbed_pane = new JTabbedPane();
1292
1293 // Layout General
1294 header_panel.setBorder(BorderFactory.createEmptyBorder(0,0,2,0));
1295 header_panel.setLayout(new BorderLayout());
1296 header_panel.add(title_label, BorderLayout.NORTH);
1297 header_panel.add(new JScrollPane(instructions_textarea), BorderLayout.CENTER);
1298
1299 tabbed_pane.add(Dictionary.get("CDM.IndexManager.MGPP.Indexes"), indexes_panel);
1300 tabbed_pane.add(Dictionary.get("CDM.IndexManager.MGPP.Levels"), levels_panel);
1301
1302 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
1303 setLayout(new BorderLayout());
1304 add(header_panel, BorderLayout.NORTH);
1305 add(tabbed_pane, BorderLayout.CENTER);
1306 }
1307
1308 public void destroy() {
1309 }
1310
1311 public void gainFocus() {
1312 // Reload the assigned indexes list.
1313 index_combobox.removeAllItems();
1314 index_combobox.addItem(CollectionConfiguration.ALLFIELDS_STR);
1315 index_combobox.addItem(CollectionConfiguration.METADATA_STR);
1316 index_combobox.addItem(CollectionConfiguration.TEXT_STR);
1317 ArrayList every_metadata_set_element = MetadataSetManager.getEveryMetadataSetElement();
1318 for(int i = 0; i < every_metadata_set_element.size(); i++) {
1319 index_combobox.addItem(every_metadata_set_element.get(i));
1320 }
1321 // Ensure the level manager has at least documents assigned
1322 if(levels_model.getSize() == 0) {
1323 Level level = new Level(CollectionConfiguration.DOCUMENT_STR);
1324 // Create new metadatum
1325 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + CollectionConfiguration.DOCUMENT_STR);
1326 metadatum.setValue(CollectionConfiguration.DOCUMENT_STR);
1327 // Assign new level
1328 addLevel(level, metadatum);
1329 level = null;
1330 }
1331
1332 // refresh
1333 current_indexes_list.updateUI();
1334 }
1335
1336 private class AddIndexActionListener
1337 implements ActionListener {
1338 public void actionPerformed(ActionEvent event) {
1339 // Retrieve the name
1340 String name = index_name_field.getText();
1341 // Retrieve the source
1342 Object source = index_combobox.getSelectedItem();
1343 // If this object isn't yet in the combobox add it.
1344 if(index_combobox.getSelectedIndex() == -1) {
1345 index_combobox.insertItemAt(source, index_combobox.getItemCount());
1346 }
1347 // Create new index
1348 ArrayList sources = new ArrayList();
1349 sources.add(source);
1350 Index index = new Index(sources);
1351 if(!model.contains(index)) {
1352 // Create new metadatum
1353 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
1354 metadatum.setValue(name);
1355 // Assign new index
1356 addIndex(index, metadatum);
1357 }
1358 // Done. Disable add
1359 add_index_button.setEnabled(false);
1360 }
1361 }
1362
1363 private class AddAllActionListener
1364 implements ActionListener {
1365
1366 public void actionPerformed(ActionEvent event) {
1367 for(int i = 0; i < index_combobox.getItemCount(); i++) {
1368 Object source = index_combobox.getItemAt(i);
1369 // Create new index
1370 ArrayList sources = new ArrayList();
1371 sources.add(source);
1372 Index index = new Index(sources);
1373 sources = null;
1374 if(!model.contains(index)) {
1375 // Determine the metadatum value
1376 String name = source.toString();
1377 if(name.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
1378 name = name.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
1379 }
1380 // Create new metadatum
1381 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
1382 metadatum.setValue(name);
1383 name = null;
1384 // Assign new index
1385 addIndex(index, metadatum);
1386 }
1387 source = null;
1388 index = null;
1389 }
1390 // Done. Disable add
1391 add_index_button.setEnabled(false);
1392 }
1393 }
1394
1395 private class AddLevelActionListener
1396 implements ActionListener {
1397 public void actionPerformed(ActionEvent event) {
1398 // Retrieve the name
1399 String name = level_name_field.getText();
1400 // Retrieve the source
1401 String source = (String)level_combobox.getSelectedItem();
1402 // If this object isn't yet in the combobox add it.
1403 if(level_combobox.getSelectedIndex() == -1) {
1404 level_combobox.insertItemAt(source, level_combobox.getItemCount());
1405 }
1406 Level level = new Level(source);
1407 // Create new metadatum
1408 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + source);
1409 metadatum.setValue(name);
1410 // Assign new level
1411 addLevel(level, metadatum);
1412 // Done. Disable add
1413 add_level_button.setEnabled(false);
1414 }
1415 }
1416
1417 private class CurrentIndexesListSelectionListener
1418 implements ListSelectionListener {
1419 public void valueChanged(ListSelectionEvent event) {
1420 if(!event.getValueIsAdjusting()) {
1421 Index index = (Index)current_indexes_list.getSelectedValue();
1422 Object[] selected_objects = current_indexes_list.getSelectedValues();
1423 if(selected_objects.length == 1) {
1424 String full_text = index.toString();
1425 if(full_text.indexOf("\"") != -1) {
1426 index_name_field.setText(index.getName());
1427 }
1428 ArrayList sources = index.getSources();
1429 index_combobox.setSelectedItem(sources.get(0));
1430 }
1431 if(index != null) {
1432 move_index_down_button.setEnabled((model.indexOf(index) < model.getSize() - 1));
1433 move_index_up_button.setEnabled((model.indexOf(index) > 0));
1434 remove_index_button.setEnabled(true);
1435 }
1436 else {
1437 move_index_down_button.setEnabled(false);
1438 move_index_up_button.setEnabled(false);
1439 remove_index_button.setEnabled(false);
1440 }
1441 }
1442 }
1443 }
1444
1445 private class CurrentLevelsListSelectionListener
1446 implements ListSelectionListener {
1447 public void valueChanged(ListSelectionEvent event) {
1448 if(!event.getValueIsAdjusting()) {
1449 Level level = (Level)current_levels_list.getSelectedValue();
1450 if(level != null) {
1451 move_level_down_button.setEnabled((levels_model.indexOf(level) < levels_model.getSize() - 1));
1452 move_level_up_button.setEnabled((levels_model.indexOf(level) > 0));
1453 remove_level_button.setEnabled(!level.getName().equals(CollectionConfiguration.DOCUMENT_STR) || levels_model.getSize() > 1);
1454 }
1455 else {
1456 move_level_down_button.setEnabled(false);
1457 move_level_up_button.setEnabled(false);
1458 remove_level_button.setEnabled(false);
1459 }
1460 }
1461 }
1462 }
1463
1464 private class EnableAddIndexListener
1465 implements ActionListener, DocumentListener {
1466 /** Called whenever a selection action occurs on the combobox.
1467 * @param event an ActionEvent containing information about the selection event
1468 */
1469 public void actionPerformed(ActionEvent event) {
1470 validateAddButtonIndex();
1471 }
1472
1473 /** Gives notification that an attribute or set of attributes changed.
1474 * @param event a DocumentEvent containing information about the text changed
1475 */
1476 public void changedUpdate(DocumentEvent event) {
1477 validateAddButtonIndex();
1478 }
1479
1480 /** Gives notification that there was an insert into the document.
1481 * @param event a DocumentEvent containing information about the text added
1482 */
1483 public void insertUpdate(DocumentEvent event) {
1484 validateAddButtonIndex();
1485 }
1486
1487 /** Gives notification that a portion of the document has been removed.
1488 * @param event a DocumentEvent containing information about the text removed
1489 */
1490 public void removeUpdate(DocumentEvent event) {
1491 validateAddButtonIndex();
1492 }
1493
1494 /** Change the enable state of the add button depending on the current value in the search type combobox. */
1495 public void validateAddButtonIndex() {
1496 String name = index_name_field.getText();
1497 Object selected_object = index_combobox.getSelectedItem();
1498 if(name.length() > 0 && selected_object != null) {
1499 // Unfortunately we have to generate a valid id
1500 String id = null;
1501 if (selected_object instanceof MetadataElement) {
1502 id = ((MetadataElement) selected_object).getFullName();
1503 }
1504 else {
1505 id = selected_object.toString();
1506 }
1507 if(id.startsWith(StaticStrings.EXTRACTED_NAMESPACE)) {
1508 id = id.substring(StaticStrings.EXTRACTED_NAMESPACE.length());
1509 }
1510 Index index = getIndex(id);
1511 if(index == null) {
1512 add_index_button.setEnabled(true);
1513 replace_button.setEnabled(false);
1514 }
1515 else {
1516 add_index_button.setEnabled(false);
1517 replace_button.setEnabled(!name.equals(index.getName()));
1518 }
1519 }
1520 else {
1521 add_index_button.setEnabled(false);
1522 }
1523 }
1524 }
1525
1526 private class EnableAddLevelListener
1527 implements ActionListener, DocumentListener {
1528 /** Called whenever a selection action occurs on the combobox.
1529 * @param event an ActionEvent containing information about the selection event
1530 */
1531 public void actionPerformed(ActionEvent event) {
1532 validateAddButtonLevel();
1533 }
1534
1535 /** Gives notification that an attribute or set of attributes changed.
1536 * @param event a DocumentEvent containing information about the text changed
1537 */
1538 public void changedUpdate(DocumentEvent event) {
1539 validateAddButtonLevel();
1540 }
1541
1542 /** Gives notification that there was an insert into the document.
1543 * @param event a DocumentEvent containing information about the text added
1544 */
1545 public void insertUpdate(DocumentEvent event) {
1546 validateAddButtonLevel();
1547 }
1548
1549 /** Gives notification that a portion of the document has been removed.
1550 * @param event a DocumentEvent containing information about the text removed
1551 */
1552 public void removeUpdate(DocumentEvent event) {
1553 validateAddButtonLevel();
1554 }
1555
1556 /** Change the enable state of the add button depending on the current value in the search type combobox. */
1557 public void validateAddButtonLevel() {
1558 String name = level_name_field.getText();
1559 Object selected_object = level_combobox.getSelectedItem();
1560 if(name.length() > 0 && selected_object != null) {
1561 add_level_button.setEnabled(getLevel((String)selected_object) == null);
1562 }
1563 else {
1564 add_level_button.setEnabled(false);
1565 }
1566 }
1567 }
1568
1569 private class MoveIndexDownListener
1570 implements ActionListener {
1571 public void actionPerformed(ActionEvent event) {
1572 // Retrieve the first selected item
1573 Index index = (Index) current_indexes_list.getSelectedValue();
1574 moveIndex(index, false);
1575 current_indexes_list.setSelectedValue(index, true);
1576 }
1577 }
1578
1579 private class MoveLevelDownListener
1580 implements ActionListener {
1581 public void actionPerformed(ActionEvent event) {
1582 // Retrieve the first selected item
1583 Level level = (Level) current_levels_list.getSelectedValue();
1584 moveLevel(level, false);
1585 current_levels_list.setSelectedValue(level, true);
1586 }
1587 }
1588
1589 private class MoveIndexUpListener
1590 implements ActionListener {
1591 public void actionPerformed(ActionEvent event) {
1592 // Retrieve the first selected item
1593 Index index = (Index) current_indexes_list.getSelectedValue();
1594 moveIndex(index, true);
1595 current_indexes_list.setSelectedValue(index, true);
1596 }
1597 }
1598
1599 private class MoveLevelUpListener
1600 implements ActionListener {
1601 public void actionPerformed(ActionEvent event) {
1602 // Retrieve the first selected item
1603 Level level = (Level) current_levels_list.getSelectedValue();
1604 moveLevel(level, true);
1605 current_levels_list.setSelectedValue(level, true);
1606 }
1607 }
1608
1609 /** Replace really only replaces the string. */
1610 private class ReplaceIndexActionListener
1611 implements ActionListener {
1612
1613 public void actionPerformed(ActionEvent event) {
1614 Object[] selected_objects = current_indexes_list.getSelectedValues();
1615 if(selected_objects.length == 1) {
1616 Index index = (Index) selected_objects[0];
1617 // Remove old name
1618 CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + index.getID());
1619 // Enter new name
1620 String name = index_name_field.getText();
1621 // Create new metadatum
1622 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + index.getID());
1623 index = null;
1624 metadatum.setValue(name);
1625 name = null;
1626 // Assign new index
1627 CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
1628 metadatum = null;
1629 }
1630 current_indexes_list.setSelectedValue(selected_objects[0], true);
1631 // Done. Disable add
1632 add_index_button.setEnabled(false);
1633 replace_button.setEnabled(false);
1634 }
1635 }
1636
1637 private class RemoveIndexActionListener
1638 implements ActionListener {
1639
1640 private EnableAddIndexListener eal = null;
1641
1642 public RemoveIndexActionListener(EnableAddIndexListener eal) {
1643 this.eal = eal;
1644 }
1645
1646 public void actionPerformed(ActionEvent event) {
1647 // Retrieve the selected items
1648 Object[] selected_objects = current_indexes_list.getSelectedValues();
1649 // Clear selection
1650 current_indexes_list.clearSelection();
1651 for(int i = 0; i < selected_objects.length; i++) {
1652 Index index = (Index) selected_objects[i];
1653 // Remove any related metadata
1654 CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + index.getID());
1655 // Remove the index
1656 removeIndex(index);
1657 }
1658 // Disable remove button
1659 remove_index_button.setEnabled(false);
1660 // Check if add should be reenabled
1661 eal.validateAddButtonIndex();
1662 }
1663 }
1664
1665 private class RemoveLevelActionListener
1666 implements ActionListener {
1667
1668 private EnableAddLevelListener eal = null;
1669
1670 public RemoveLevelActionListener(EnableAddLevelListener eal) {
1671 this.eal = eal;
1672 }
1673
1674 public void actionPerformed(ActionEvent event) {
1675 // Retrieve the selected items
1676 Object[] selected_objects = current_levels_list.getSelectedValues();
1677 // Clear selection
1678 current_levels_list.clearSelection();
1679 for(int i = 0; i < selected_objects.length; i++) {
1680 Level level = (Level) selected_objects[i];
1681 // Remove any related metadata
1682 CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + level.getName());
1683 // Remove the index
1684 removeLevel(level);
1685 }
1686 // Disable remove button
1687 remove_level_button.setEnabled(false);
1688 // If there are no levels left, put document back in
1689 if(levels_model.getSize() == 0) {
1690 Level level = new Level(CollectionConfiguration.DOCUMENT_STR);
1691 // Create new metadatum
1692 CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + CollectionConfiguration.DOCUMENT_STR);
1693 metadatum.setValue(CollectionConfiguration.DOCUMENT_STR);
1694 // Assign new level
1695 addLevel(level, metadatum);
1696 level = null;
1697 }
1698 // Check if add should be reenabled
1699 eal.validateAddButtonLevel();
1700 }
1701 }
1702 } // MGPPControls
1703
1704}
Note: See TracBrowser for help on using the repository browser.