source: gli/trunk/src/org/greenstone/gatherer/cdm/LanguageManager.java@ 18412

Last change on this file since 18412 was 18412, checked in by kjdon, 15 years ago

more modifications for RTL GLI, thanks to Amin Hedjazi

  • Property svn:keywords set to Author Date Id Revision
File size: 29.9 KB
Line 
1/**
2 *#########################################################################
3 *
4 * A component of the Gatherer application, part of the Greenstone digital
5 * library suite from the New Zealand Digital Library Project at the
6 * University of Waikato, New Zealand.
7 *
8 * Author: John Thompson, Greenstone Digital Library, University of Waikato
9 *
10 * Copyright (C) 1999 New Zealand Digital Library Project
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 *########################################################################
26 */
27package org.greenstone.gatherer.cdm;
28
29
30import java.awt.*;
31import java.awt.event.*;
32import java.io.*;
33import java.util.*;
34import javax.swing.*;
35import javax.swing.border.*;
36import javax.swing.event.*;
37import org.greenstone.gatherer.Configuration;
38import org.greenstone.gatherer.DebugStream;
39import org.greenstone.gatherer.Dictionary;
40import org.greenstone.gatherer.Gatherer;
41import org.greenstone.gatherer.gui.GLIButton;
42import org.greenstone.gatherer.metadata.MetadataElement;
43import org.greenstone.gatherer.metadata.MetadataSetManager;
44import org.greenstone.gatherer.util.CheckList;
45import org.greenstone.gatherer.util.CheckListEntry;
46import org.greenstone.gatherer.util.JarTools;
47import org.greenstone.gatherer.util.StaticStrings;
48import org.greenstone.gatherer.util.XMLTools;
49import org.w3c.dom.*;
50
51/** This class manages the language commands, remembering both a list of languages to build indexes in, plus the default language.
52 * @author John Thompson, Greenstone Digital Library, University of Waikato
53 * @version 2.3
54 */
55public class LanguageManager
56 extends DOMProxyListModel {
57
58 static public Document LANGUAGES_DOCUMENT = XMLTools.parseXMLFile("xml/languages.xml", true);
59
60 static final private Dimension COMPONENT_SIZE = new Dimension(125,25);
61
62 /** The visual controls for this manager. */
63 private Control controls = null;
64 /** A reference to this class as a model, for the inner controls class. */
65 private DOMProxyListModel model = null;
66 /** A hashtable of code->name mappings of known languages. */
67 private LinkedHashMap known_languages = null;
68 /** The default language object. */
69 private Language default_language = null;
70 /** The language metadata element - specifies which metadata the
71 language should be read from to determine the partitons */
72 private Element language_metadata = null;
73 /** Constructor. */
74 public LanguageManager(Element languages_element) {
75 super(languages_element, StaticStrings.LANGUAGE_ELEMENT, new Language());
76
77 DebugStream.println("LanguageManager: " + getSize() + " languages parsed.");
78
79 this.model = this;
80 // Retrieve the default language
81 NodeList default_language_elements = CollectionConfiguration.getElementsByTagName(StaticStrings.LANGUAGE_DEFAULT_ELEMENT);
82 if(default_language_elements.getLength() > 0) {
83 default_language = new Language((Element)default_language_elements.item(0));
84 }
85
86 // Retrieve the language metadata
87 language_metadata = CollectionDesignManager.collect_config.getLanguageMetadata();
88 // Load a series of code->language mappings into known_languages, by reading from the 'languages.xml' file, which is essentially a subset of the ISO 639 Standard.
89 known_languages = new LinkedHashMap();
90 NodeList language_elements = LANGUAGES_DOCUMENT.getDocumentElement().getElementsByTagName(StaticStrings.LANGUAGE_ELEMENT);
91 for(int i = 0; i < language_elements.getLength(); i++) {
92 Element language_element = (Element) language_elements.item(i);
93 String code = language_element.getAttribute(StaticStrings.CODE_ATTRIBUTE);
94 String name = language_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
95 known_languages.put(code.toLowerCase(), name);
96 name = null;
97 code = null;
98 language_element = null;
99 }
100 }
101
102 /** Method to add a new language.
103 * @param language The <strong>Language</strong> to add.
104 * @see org.greenstone.gatherer.Gatherer
105 * @see org.greenstone.gatherer.collection.CollectionManager
106 */
107 private void addLanguage(Language language) {
108 if(!contains(language)) {
109 // need to add a pseudo metadata
110 CollectionMeta metadatum = new CollectionMeta(StaticStrings.STOP_CHARACTER + language.getCode());
111 metadatum.setValue(language.getName());
112 CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
113 add(getSize(), language);
114 }
115 }
116
117 public void destroy() {
118 if(controls != null) {
119 controls.destroy();
120 controls = null;
121 }
122 known_languages.clear();
123 known_languages = null;
124 default_language = null;
125 }
126
127 /** Method to retrieve the control for this manager.
128 * @return the Control for editing the language partitions
129 */
130 public Control getControls() {
131 if(controls == null) {
132 // Build controls
133 controls = new LanguageControl();
134 }
135 return controls;
136 }
137
138 /** Method to retrieve a certain language object by its code.
139 * @param code The two letter code of a language, as a <strong>String</strong>.
140 * @return The <strong>Language</strong> that matches the given code, or <i>null</i> if no such language exists.
141 */
142 public Language getLanguage(String code) {
143 int size = getSize();
144 for(int i = 0; i < size; i++) {
145 Language language = (Language) getElementAt(i);
146 if(language.getCode().equals(code)) {
147 return language;
148 }
149 }
150 return null;
151 }
152
153 public ArrayList getLanguages() {
154 return children();
155 }
156
157 /** Method to return a list of the known language codes.
158 * @return an ArrayList containing the series of known language codes as per the languages.dat file
159 */
160 public ArrayList getLanguageCodes() {
161 return new ArrayList(known_languages.keySet());
162 }
163
164 public String getLanguageName(String code) {
165 return (String) known_languages.get(code);
166 }
167
168 /** Called when the detail mode has changed which in turn may cause several design elements to be available/hidden
169 * @param mode the new mode as an int
170 */
171 public void modeChanged(int mode) {
172
173 }
174
175 private int moveLanguage(Language lang, boolean move_up)
176 {
177 // Determine the current position of the language
178 int position = indexOf(lang);
179 int new_position;
180
181 // Attempt to move the language up
182 if (move_up) {
183 // Check it's not already at the top
184 if (position == 0) {
185 return position;
186 }
187
188 // This automatically removes the language first, as an Element can only exist once in a particular document
189 new_position = position - 1;
190 addBefore(lang, (Language) getElementAt(new_position));
191 }
192
193 // Attempt to move the language down
194 else {
195 // Check it's not already at the bottom
196 if (position == (getSize()) - 1) {
197 return position;
198 }
199
200 // This automatically removes the language first, as an Element can only exist once in a particular document
201 new_position = position + 1;
202 addAfter(lang, (Language) getElementAt(new_position));
203 }
204
205 return new_position;
206 }
207
208 /** Method to remove a certain language.
209 * @param language The <strong>Language</strong> to remove.
210 * @see org.greenstone.gatherer.Gatherer
211 * @see org.greenstone.gatherer.collection.CollectionManager
212 */
213 private void removeLanguage(Language language) {
214 remove(language);
215 // Remove any collection metadata for this language
216 CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + language.getCode());
217 if(default_language != null && default_language.equals(language)) {
218 setDefault(null);
219 }
220 }
221
222 private void replaceLanguage(Language old_language, Language new_language) {
223 // Remove old lang collection meta
224 CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + old_language.getCode());
225 // Add new one
226 CollectionMeta metadatum = new CollectionMeta(StaticStrings.STOP_CHARACTER + new_language.getCode());
227 metadatum.setValue(new_language.getName());
228 CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
229 if(default_language != null && default_language.equals(old_language)) {
230 setDefault(new_language);
231 }
232
233 // get the position of the old one
234 int position = indexOf(old_language);
235 remove(old_language);
236 add(position, new_language);
237 }
238
239
240 /** Method to set the default language.
241 * @param language The <strong>Language</strong> to use as a default, or <i>null</i> for no default.
242 * @see org.greenstone.gatherer.Gatherer
243 * @see org.greenstone.gatherer.collection.CollectionManager
244 */
245 public void setDefault(Language language) {
246 if(language != null) {
247 if(default_language == null) {
248 // Create the default index element, and place immediately after indexes element.
249 Element default_language_element = root.getOwnerDocument().createElement(StaticStrings.LANGUAGE_DEFAULT_ELEMENT);
250 default_language = new Language(default_language_element);
251 Node target_node = CollectionConfiguration.findInsertionPoint(default_language_element);
252 if(target_node != null) {
253 root.getOwnerDocument().getDocumentElement().insertBefore(default_language_element, target_node);
254 }
255 else {
256 root.getOwnerDocument().getDocumentElement().appendChild(default_language_element);
257 }
258 }
259 default_language.setAssigned(true);
260 default_language.setCode(language.getCode());
261 }
262 else {
263 if(default_language != null) {
264 default_language.setAssigned(false);
265 }
266 }
267 }
268
269
270 /** This class represents the visual component of the Language Manager. */
271 private class LanguageControl
272 extends JPanel
273 implements Control {
274 /** The list of available languages */
275 private CheckList language_list = null;
276 /** The button to add a new language support. */
277 private JButton add_button = null;
278 /** The button to replace a language support. */
279 private JButton replace_button = null;
280 /** The button to remove a supported language. */
281 private JButton remove_button = null;
282 /** button to move a language up in the list */
283 private JButton move_down_button;
284 /** button to move a language down in the list */
285 private JButton move_up_button;
286 /** button to select all the languages in the list */
287 private JButton select_all_button;
288 /** button to clear the current selection in the list */
289 private JButton select_none_button;
290 /** The button to set the current language as the default one. */
291 private JButton set_default_button = null;
292 /** A list of currently supported languages. */
293 private JList selected_languages_list = null;
294 /** A list of metadata elements that may hold the language metadata */
295 private JComboBox language_metadata_combo = null;
296
297 /** Constructor.
298 * @see org.greenstone.gatherer.cdm.LanguageManager.LanguageControl.AddListener
299 * @see org.greenstone.gatherer.cdm.LanguageManager.LanguageControl.ClearDefaultListener
300 * @see org.greenstone.gatherer.cdm.LanguageManager.LanguageControl.ListListener
301 * @see org.greenstone.gatherer.cdm.LanguageManager.LanguageControl.RemoveListener
302 * @see org.greenstone.gatherer.cdm.LanguageManager.LanguageControl.SelectorListener
303 * @see org.greenstone.gatherer.cdm.LanguageManager.LanguageControl.SetDefaultListener
304 */
305 public LanguageControl() {
306 super();
307 // Creation.
308 this.setComponentOrientation(Dictionary.getOrientation());
309 JPanel center_panel = new JPanel();
310 center_panel.setComponentOrientation(Dictionary.getOrientation());
311
312 JLabel selected_languages_list_label = new JLabel(Dictionary.get("CDM.LanguageManager.Assigned_Languages"));
313 selected_languages_list = new JList(model);
314 selected_languages_list.setCellRenderer(new MyLanguageListCellRenderer());
315 selected_languages_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
316 selected_languages_list.setVisibleRowCount(5);
317 selected_languages_list.setComponentOrientation(Dictionary.getOrientation());
318
319 JPanel control_panel = new JPanel();
320 control_panel.setComponentOrientation(Dictionary.getOrientation());
321
322 JPanel labels_pane = new JPanel();
323 labels_pane.setComponentOrientation(Dictionary.getOrientation());
324 JLabel selector_label = new JLabel(Dictionary.get("CDM.LanguageManager.Selector"));
325 selector_label.setComponentOrientation(Dictionary.getOrientation());
326 select_all_button = new GLIButton(Dictionary.get("CDM.IndexManager.Select_All"), Dictionary.get("CDM.IndexManager.Select_All_Tooltip"));
327 select_none_button = new GLIButton(Dictionary.get("CDM.IndexManager.Select_None"), Dictionary.get("CDM.IndexManager.Select_None_Tooltip"));
328
329 language_metadata_combo = new JComboBox(MetadataSetManager.getEveryMetadataSetElement().toArray());
330 language_metadata_combo.setOpaque(false);
331 language_metadata_combo.setToolTipText(Dictionary.get("CDM.LanguageManager.LanguageMetadata_Tooltip"));
332 language_metadata_combo.setComponentOrientation(Dictionary.getOrientation());
333
334 JLabel language_metadata_label = new JLabel(Dictionary.get("CDM.LanguageManager.LanguageMetadata"));
335 language_metadata_label.setComponentOrientation(Dictionary.getOrientation());
336
337 String current_value = "ex.Language";
338 if (language_metadata.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.TRUE_STR) && !language_metadata.getAttribute(StaticStrings.NAME_ATTRIBUTE).equals("")) {
339 current_value = language_metadata.getAttribute(StaticStrings.NAME_ATTRIBUTE);
340 }
341 ArgumentControl.selectValue(language_metadata_combo, current_value);
342 language_list = new CheckList(false);
343 language_list.setListData(getLanguageCodes());
344 language_list.setToolTipText(Dictionary.get("CDM.LanguageManager.Selector_Tooltip"));
345 language_list.setCellRenderer(new LanguageCheckListCellRenderer());
346
347 select_all_button.setEnabled(isSelectAllEnabled());
348 select_none_button.setEnabled(isSelectAllEnabled());
349
350 JPanel movement_pane = new JPanel();
351 movement_pane.setComponentOrientation(Dictionary.getOrientation());
352
353 move_up_button = new GLIButton(Dictionary.get("CDM.Move.Move_Up"), JarTools.getImage("arrow-up.gif"), Dictionary.get("CDM.Move.Move_Up_Tooltip"));
354 move_up_button.setEnabled(false);
355
356 move_down_button = new GLIButton(Dictionary.get("CDM.Move.Move_Down"), JarTools.getImage("arrow-down.gif"), Dictionary.get("CDM.Move.Move_Down_Tooltip"));
357 move_down_button.setEnabled(false);
358
359 set_default_button = new GLIButton(Dictionary.get("CDM.LanguageManager.Set_Default"), Dictionary.get("CDM.LanguageManager.Set_Default_Tooltip"));
360 set_default_button.setEnabled(false);
361
362 JPanel button_panel = new JPanel();
363 button_panel.setComponentOrientation(Dictionary.getOrientation());
364
365 add_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Add_Subindex"), Dictionary.get("CDM.LanguageManager.Add_Tooltip"));
366 add_button.setEnabled(false);
367
368 replace_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Replace_Subindex"), Dictionary.get("CDM.LanguageManager.Replace_Tooltip"));
369 replace_button.setEnabled(false);
370
371 remove_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Remove_Subindex"), Dictionary.get("CDM.LanguageManager.Remove_Tooltip"));
372 remove_button.setEnabled(false);
373
374 // Set up and connect listeners.
375 add_button.addActionListener(new AddListener());
376 add_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
377 move_down_button.addActionListener(new MoveListener(false));
378 move_down_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
379 move_up_button.addActionListener(new MoveListener(true));
380 move_up_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
381 remove_button.addActionListener(new RemoveListener());
382 remove_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
383 replace_button.addActionListener(new ReplaceListener());
384 replace_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
385 select_all_button.addActionListener(new SelectAllListener());
386 select_all_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
387 select_none_button.addActionListener(new SelectNoneListener());
388 select_none_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
389
390 language_list.addListSelectionListener(new LanguageListListener());
391 language_metadata_combo.addActionListener(new ActionListener() {
392 public void actionPerformed(ActionEvent event) {
393 String value = ((MetadataElement)language_metadata_combo.getSelectedItem()).getFullName();
394 language_metadata.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
395 language_metadata.setAttribute(StaticStrings.NAME_ATTRIBUTE, value);
396 }
397 });
398 set_default_button.addActionListener(new SetDefaultListener());
399 set_default_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
400 selected_languages_list.addListSelectionListener(new AssignedListListener());
401
402 // Layout components
403 button_panel.setLayout(new GridLayout(1,3));
404 button_panel.add(add_button);
405 button_panel.add(replace_button);
406 button_panel.add(remove_button);
407
408 JPanel metadata_panel = new JPanel();
409 metadata_panel.setComponentOrientation(Dictionary.getOrientation());
410 metadata_panel.setLayout(new BorderLayout());
411 JPanel inner_panel = new JPanel();
412 inner_panel.setComponentOrientation(Dictionary.getOrientation());
413 inner_panel.setLayout(new BorderLayout(10,10));
414 inner_panel.add(language_metadata_label, BorderLayout.LINE_START);
415 inner_panel.add(language_metadata_combo, BorderLayout.CENTER);
416 metadata_panel.add(new JPanel(), BorderLayout.CENTER);
417 metadata_panel.add(inner_panel, BorderLayout.LINE_END);
418
419 movement_pane.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));
420 movement_pane.setLayout(new GridLayout(3,1));
421 movement_pane.add(move_up_button);
422 movement_pane.add(move_down_button);
423 movement_pane.add(set_default_button);
424
425 control_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
426 control_panel.setLayout(new BorderLayout());
427
428 labels_pane.setLayout(new BorderLayout());
429 labels_pane.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5));
430
431 // add the select all and select none buttons to the label panel
432 GridBagLayout gridbag = new GridBagLayout();
433 GridBagConstraints c = new GridBagConstraints();
434 labels_pane.setLayout(gridbag);
435
436 c.fill = GridBagConstraints.BOTH;
437 c.weightx = 1.0;
438 c.weighty = 1.0;
439 c.gridx = 0;
440 c.gridy = 0;
441
442 gridbag.setConstraints(selector_label, c);
443 labels_pane.add(selector_label);
444
445 c.fill = GridBagConstraints.HORIZONTAL;
446 c.weighty = 0.0;
447 c.gridy = 1;
448
449 gridbag.setConstraints(select_all_button, c);
450 labels_pane.add(select_all_button);
451
452 c.gridy = 2;
453 gridbag.setConstraints(select_none_button, c);
454 labels_pane.add(select_none_button);
455
456 control_panel.add(labels_pane, BorderLayout.LINE_START);
457
458 control_panel.add(new JScrollPane(language_list), BorderLayout.CENTER);
459 control_panel.add(button_panel, BorderLayout.SOUTH);
460
461 center_panel.setLayout(new BorderLayout());
462 center_panel.add(selected_languages_list_label, BorderLayout.NORTH);
463 center_panel.add(new JScrollPane(selected_languages_list), BorderLayout.CENTER);
464 center_panel.add(movement_pane, BorderLayout.LINE_END);
465
466 JPanel top_panel = new JPanel();
467 top_panel.setComponentOrientation(Dictionary.getOrientation());
468 top_panel.setLayout(new BorderLayout());
469 top_panel.add(metadata_panel, BorderLayout.NORTH);
470 top_panel.add(center_panel, BorderLayout.SOUTH);
471
472 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
473 setLayout(new BorderLayout());
474 add(top_panel, BorderLayout.NORTH);
475 add(control_panel, BorderLayout.CENTER);
476 }
477
478 /** Destructor. */
479 public void destroy() {
480 }
481
482 public void gainFocus() {
483 }
484
485 public void loseFocus() {
486 }
487
488
489 private void clearControls() {
490 selected_languages_list.clearSelection();
491 language_list.clearTicked();
492 add_button.setEnabled(false);
493 remove_button.setEnabled(false);
494 replace_button.setEnabled(false);
495 set_default_button.setEnabled(false);
496 move_down_button.setEnabled(false);
497 move_up_button.setEnabled(false);
498 select_all_button.setEnabled(isSelectAllEnabled());
499 select_none_button.setEnabled(isSelectAllEnabled());
500
501 }
502
503 private void updateControlsWithSelectedLanguage()
504 {
505 Language selected_lang = (Language) selected_languages_list.getSelectedValue();
506 if (selected_lang == null) {
507 clearControls();
508 return;
509 }
510
511 // Display the selected subcollection index's sources
512 language_list.clearTicked();
513 // for multi-languages indexes, getCode returns null
514 if(selected_lang.getCode()==null){
515 return;
516 }
517 language_list.setTickedObjects(selected_lang.getCode().split(","));
518 }
519
520 private void validateButtons() {
521 boolean add_enabled = false;
522 boolean replace_enabled = false;
523
524 if (!language_list.isNothingTicked()) {
525 // Create a dummy Langauge and see if its in the collection
526 ArrayList langs = language_list.getTicked();
527 StringBuffer code_str = new StringBuffer();
528 boolean first = true;
529 for (int i=0; i<langs.size(); i++) {
530 if (!first) {
531 code_str.append(",");
532 } else {
533 first = false;
534 }
535 code_str.append(langs.get(i));
536 }
537 String lang_str = code_str.toString();
538
539 if (!model.contains(lang_str)) {
540 add_enabled = true;
541 if (!selected_languages_list.isSelectionEmpty()) {
542 replace_enabled = true;
543 }
544 }
545
546 }
547 add_button.setEnabled(add_enabled);
548 replace_button.setEnabled(replace_enabled);
549 select_all_button.setEnabled(isSelectAllEnabled());
550 select_none_button.setEnabled(isSelectAllEnabled());
551 }
552
553 /** Listens for actions apon the 'add' button in the LanguageManager controls, and if detected calls the add method of the manager with a newly created language. */
554 private class AddListener
555 implements ActionListener {
556 /** Add a new language support.
557 * @param event an ActionEvent
558 * @see org.greenstone.gatherer.cdm.Language
559 */
560 public void actionPerformed(ActionEvent event) {
561 if (!language_list.isNothingTicked()) {
562 addLanguage(new Language(language_list.getTicked()));
563 clearControls();
564 }
565 }
566 }
567
568 /** Listens for actions apon the 'remove' button in the LanguageManager controls, and if detected calls the remove method of the manager with the language selected for removal. */
569 private class RemoveListener
570 implements ActionListener {
571 /** Remove the currently selected language, if any.
572 * @param event An <strong>ActionEvent</strong>.
573 * @see org.greenstone.gatherer.cdm.Language
574 */
575 public void actionPerformed(ActionEvent event) {
576 Language delete_me = (Language)selected_languages_list.getSelectedValue();
577 if(delete_me != null) {
578 removeLanguage(delete_me);
579 }
580 }
581 }
582
583 private class ReplaceListener
584 implements ActionListener {
585
586 public void actionPerformed(ActionEvent event) {
587 if (selected_languages_list.isSelectionEmpty() || language_list.isNothingTicked()) {
588 // This should never happen, but just in case...
589 replace_button.setEnabled(false);
590 return;
591 }
592 Language old_language = (Language) selected_languages_list.getSelectedValue();
593 Language new_language = new Language(language_list.getTicked());
594 replaceLanguage(old_language, new_language);
595
596 }
597 }
598
599 private class LanguageListListener
600 implements ListSelectionListener {
601
602 public void valueChanged(ListSelectionEvent event) {
603 if (event.getValueIsAdjusting()) {
604 return;
605 }
606 validateButtons();
607 }
608 }
609
610 private class SelectAllListener
611 implements ActionListener {
612
613 public void actionPerformed(ActionEvent event){
614 if(select_all_button.isEnabled()){
615 language_list.setAllTicked();
616 validateButtons();
617 }
618 }
619 }
620
621 private class SelectNoneListener
622 implements ActionListener {
623
624 public void actionPerformed(ActionEvent event){
625 if(select_all_button.isEnabled()){
626 language_list.clearTicked();
627 validateButtons();
628 }
629 }
630 }
631
632 /** Listens for actions apon the 'set default' button in the LanguageManager controls, and if detected calls the <i>setDefault()</i> method of the manager with the language selected for default. */
633 private class SetDefaultListener
634 implements ActionListener {
635 /** Set the default index to the one currently selected, if any.
636 * @param event An <strong>ActionEvent</strong>.
637 * @see org.greenstone.gatherer.cdm.Language
638 */
639 public void actionPerformed(ActionEvent event) {
640 Language selected_language = (Language) selected_languages_list.getSelectedValue();
641 if(selected_language != null) {
642 setDefault(selected_language);
643 // This should cause a repaint of just the desired row
644 selected_languages_list.setSelectedValue(selected_language, true);
645 }
646 set_default_button.setEnabled(false);
647 }
648 }
649
650 private class MoveListener
651 implements ActionListener
652 {
653 private boolean move_up;
654
655 public MoveListener(boolean move_up)
656 {
657 this.move_up = move_up;
658 }
659
660 public void actionPerformed(ActionEvent event)
661 {
662 // Retrieve the selected language
663 Language language = (Language) selected_languages_list.getSelectedValue();
664 if (language != null) {
665 int new_position = moveLanguage(language, move_up);
666 // Ensure the language that moved is still selected
667 selected_languages_list.setSelectedIndex(new_position);
668 }
669 }
670 }
671
672
673 /** Listens for selections within the list on the LanguageManager controls, and if a change is detected enables, or disables, controls appropriately. */
674 private class AssignedListListener
675 implements ListSelectionListener {
676 /** Enable or disable controls depending on the current list selection.
677 * @param event A <strong>ListSelectionEvent</strong>.
678 */
679 public void valueChanged(ListSelectionEvent event) {
680 if (event.getValueIsAdjusting()) {
681 return;
682 }
683 if(selected_languages_list.isSelectionEmpty()) {
684 clearControls();
685 return;
686 }
687
688 int i = selected_languages_list.getSelectedIndex();
689 int size = selected_languages_list.getModel().getSize();
690
691 select_all_button.setEnabled(isSelectAllEnabled());
692 select_none_button.setEnabled(isSelectAllEnabled());
693
694 Language selected_lang = (Language)selected_languages_list.getSelectedValue();
695 remove_button.setEnabled(true);
696 replace_button.setEnabled(false);
697 add_button.setEnabled(false);
698 set_default_button.setEnabled(default_language == null || !default_language.equals(selected_lang));
699
700 if (i > 0) {
701 move_up_button.setEnabled(true);
702 }
703 else {
704 move_up_button.setEnabled(false);
705 }
706 if (i < size-1){
707 move_down_button.setEnabled(true);
708 }
709 else {
710 move_down_button.setEnabled(false);
711 }
712 updateControlsWithSelectedLanguage();
713 }
714 }
715
716 private class MyLanguageListCellRenderer
717 extends DefaultListCellRenderer
718 {
719 /** Return a component that has been configured to display the specified value. */
720 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
721 JLabel component = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
722 if (default_language != null && default_language.equals(value)) {
723 component.setText(component.getText() + " [" + Dictionary.get("CDM.LanguageManager.Default_Language")+"]");
724 }
725 return component;
726 }
727 }
728
729 private boolean isSelectAllEnabled(){
730 return language_list.getModel().getSize() > 0 ? true : false;
731 }
732 }
733
734 /** A custom list cell renderer for producing rows which contain clickable check boxes. */
735 private class LanguageCheckListCellRenderer
736 implements ListCellRenderer
737 {
738 /** Return a component that has been configured to display the specified value. That component's paint method is then called to "render" the cell. If it is necessary to compute the dimensions of a list because the list cells do not have a fixed size, this method is called to generate a component on which getPreferredSize can be invoked.
739 * @param list The </strong>JList</strong> we're painting.
740 * @param value The value returned by list.getModel().getElementAt(index), as an <strong>Object</strong>.
741 * @param index The cells index as an <i>int</i>.
742 * @param is_selected <i>true</i> if the specified cell was selected, <i>false</i> otherwise.
743 * @param cell_has_focus <i>true</i> if and only if the specified cell has the focus.
744 * @return A <strong>Component</strong> whose paint() method will render the specified value.
745 */
746 public Component getListCellRendererComponent(JList list, Object value, int index, boolean is_selected, boolean cell_has_focus) {
747 JCheckBox checkbox = (JCheckBox) value;
748 checkbox.setBackground(list.getBackground());
749 checkbox.setForeground(list.getForeground());
750 checkbox.setBorderPainted(false);
751 checkbox.setEnabled(list.isEnabled());
752 checkbox.setFont(list.getFont());
753 checkbox.setFocusPainted(false);
754 checkbox.setBorder((is_selected) ? UIManager.getBorder("List.focusCellHighlightBorder") : new EmptyBorder(1, 1, 1, 1));
755
756 String code = (String)((CheckListEntry)list.getModel().getElementAt(index)).getObject();
757 checkbox.setText((String)known_languages.get(code));
758
759 return checkbox;
760 }
761 }
762
763
764
765}
Note: See TracBrowser for help on using the repository browser.