Ignore:
Timestamp:
2003-07-15T13:55:22+12:00 (21 years ago)
Author:
jmt12
Message:

Major CDM rewrite so it uses DOM.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gli/src/org/greenstone/gatherer/cdm/LanguageManager.java

    r4675 r4932  
    66 * University of Waikato, New Zealand.
    77 *
    8  * <BR><BR>
    9  *
    108 * Author: John Thompson, Greenstone Digital Library, University of Waikato
    119 *
    12  * <BR><BR>
    13  *
    1410 * Copyright (C) 1999 New Zealand Digital Library Project
    15  *
    16  * <BR><BR>
    1711 *
    1812 * This program is free software; you can redistribute it and/or modify
     
    2115 * (at your option) any later version.
    2216 *
    23  * <BR><BR>
    24  *
    2517 * This program is distributed in the hope that it will be useful,
    2618 * but WITHOUT ANY WARRANTY; without even the implied warranty of
    2719 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    2820 * GNU General Public License for more details.
    29  *
    30  * <BR><BR>
    3121 *
    3222 * You should have received a copy of the GNU General Public License
     
    3525 *########################################################################
    3626 */
    37 
    38  
    39 
    40 
    41 
    42 
    4327package org.greenstone.gatherer.cdm;
    4428/**************************************************************************************
    45  * Title:        Gatherer
    46  * Description:  The Gatherer: a tool for gathering and enriching a digital collection.
    47  * Copyright:    Copyright (c) 2001
    48  * Company:      The University of Waikato
    4929 * Written:      08/05/02
    5030 * Revised:      17/11/02 - Commented
     31 *               07/07/03 - DOM support
    5132 **************************************************************************************/
    52 import java.awt.BorderLayout;
    53 import java.awt.Color;
    54 import java.awt.Component;
    55 import java.awt.Dimension;
    56 import java.awt.GridLayout;
    57 import java.awt.event.ActionEvent;
    58 import java.awt.event.ActionListener;
    59 import java.awt.event.KeyEvent;
    60 import java.io.BufferedReader;
    61 import java.io.File;
    62 import java.io.FileReader;
    63 import java.util.ArrayList;
    64 import java.util.Collections;
    65 import java.util.Enumeration;
    66 import java.util.Iterator;
    67 import java.util.LinkedHashMap;
    68 import java.util.StringTokenizer;
    69 import java.util.Vector;
    70 import javax.swing.BorderFactory;
    71 import javax.swing.DefaultListCellRenderer;
    72 import javax.swing.DefaultListModel;
    73 import javax.swing.ListModel;
    74 import javax.swing.JButton;
    75 import javax.swing.JComboBox;
    76 import javax.swing.JLabel;
    77 import javax.swing.JList;
    78 import javax.swing.JPanel;
    79 import javax.swing.JScrollPane;
    80 import javax.swing.JTextArea;
    81 import javax.swing.JTextField;
    82 import javax.swing.event.ListSelectionEvent;
    83 import javax.swing.event.ListSelectionListener;
     33import java.awt.*;
     34import java.awt.event.*;
     35import java.io.*;
     36import java.util.*;
     37import javax.swing.*;
     38import javax.swing.event.*;
    8439import org.greenstone.gatherer.Gatherer;
     40import org.greenstone.gatherer.cdm.CollectionConfiguration;
     41import org.greenstone.gatherer.cdm.CollectionDesignManager;
     42import org.greenstone.gatherer.cdm.Control;
     43import org.greenstone.gatherer.cdm.DOMProxyListModel;
    8544import org.greenstone.gatherer.cdm.Language;
     45import org.greenstone.gatherer.cdm.LanguageListCellRenderer;
     46import org.w3c.dom.*;
    8647/** This class manages the language commands, remembering both a list of languages to build indexes in, plus the default language.
    8748 * @author John Thompson, Greenstone Digital Library, University of Waikato
     
    8950 */
    9051public class LanguageManager
    91     extends DefaultListModel {
    92     /** A reference to the collection design manager. */
    93     private CollectionDesignManager manager = null;
     52    extends DOMProxyListModel {
     53
     54    static final private Dimension LABEL_SIZE = new Dimension(125,25);
     55
    9456    /** The visual controls for this manager. */
    9557    private Control controls = null;
    96     /** A reference to the Gatherer. */
    97     private Gatherer gatherer = null;
    9858    /** A reference to this class as a model, for the inner controls class. */
    99     private ListModel model = null;
     59    private DOMProxyListModel model = null;
    10060    /** A hashtable of code->name mappings of known languages. */
    10161    private LinkedHashMap known_languages = null;
    10262    /** The default language object. */
    10363    private Language default_language = null;
    104 
    105     static final private Dimension LABEL_SIZE = new Dimension(125,25);
    106     /** Constructor.
    107      * @param gatherer A reference to the <strong>Gatherer</strong>.
    108      * @param manager A reference to the <strong>CollectionDesignManager</strong>.
    109      */
    110     public LanguageManager(Gatherer gatherer, CollectionDesignManager manager) {
    111     super();
    112     this.gatherer = gatherer;
    113     this.known_languages = new LinkedHashMap();
    114     this.manager = manager;
     64 
     65   /** Constructor. */
     66    public LanguageManager(Element languages_element) {
     67    super(languages_element, CollectionConfiguration.LANGUAGE_ELEMENT, new Language());
     68   
     69    Gatherer.println("LanguageManager: " + getSize() + " languages parsed.");
     70
    11571    this.model = this;
    116     loadLanguages();
    117     }
    118     /** Method to add a new language.
    119       * @param language The <strong>Language</strong> to add.
    120       * @see org.greenstone.gatherer.Gatherer
    121       * @see org.greenstone.gatherer.collection.CollectionManager
    122       */
    123     public void addLanguage(Language language) {
    124     if(!contains(language)) {
    125                 // Add alphabetically.
    126         for(int index = 0; index < size(); index++) {
    127         Language sibling = (Language) get(index);
    128         int position = language.compareTo(sibling);
    129         // Sibling is before language.
    130         if(position > 0) {
    131             // Carry on.
    132         }
    133         // Language is equal to, or before sibling. Insert it.
    134         else if(position == 0 || position < 0) {
    135             add(index, language);
    136             gatherer.c_man.configurationChanged();
    137             return;
    138         }
    139         }
    140                 // If we got this far, we haven't inserted language, and we are out of model so.
    141         addElement(language);
    142         gatherer.c_man.configurationChanged();
    143     }
    144     }
    145     /** Method to retrieve the control for this manager.
    146       * @return A <strong>JPanel</strong> containing the controls.
    147       */
    148     public JPanel getControls() {
    149     if(controls == null) {
    150         controls = new Control();
    151     }
    152     return controls;
    153     }
    154     /** Method to retrieve the default language code.
    155       * @return A <strong>Language</strong> containing a two letter code.
    156       */
    157     public Language getDefaultLanguage() {
    158     // If no default is set...
    159     if(default_language == null) {
    160                 // And we have other assigned languages, use the first one of them.
    161         if(size() >= 1) {
    162         default_language = (Language) get(0);
    163         }
    164                 // And we have nothing else, use English.
    165         else {
    166         default_language = getLanguage("en", false);
    167         // Remember to add it.
    168         addLanguage(default_language);
    169         }
    170     }
    171     return default_language;
    172     }
    173     /** Method to retrieve a certain language object by its code.
    174      * @param code The two letter code of a language, as a <strong>String</strong>.
    175      * @param assigned_only If <i>true</i> only those languages currently having indexes built for them are checked, otherwise the known languages buffer is checked.
    176      * @return The <strong>Language</strong> that matches the given code, or <i>null</i> if no such language exists.
    177      */
    178     public Language getLanguage(String code, boolean assigned_only) {
    179     if(assigned_only) {
    180         for(int i = 0; i < size(); i++) {
    181         Language pos = (Language)get(i);
    182         ///ystem.err.println("Comparing " + pos.getCode() + " and " + code);
    183         if(pos.getCode().equals(code)) {
    184             return pos;
    185         }
    186         }
    187     }
    188     else {
    189         if(known_languages.containsKey(code)) {
    190         return new Language((Language)known_languages.get(code));
    191         }
    192     }
    193     return null;
    194     }
    195     /** Method to return a list of the known language codes.
    196      * @return An <strong>ArrayList</strong> containing a series of alphabetically sorted two letter codes.
    197      */
    198     public ArrayList getLanguageCodes() {
    199     ArrayList result = new ArrayList();
    200     Iterator key_iter = known_languages.keySet().iterator();
    201     while(key_iter.hasNext()) {
    202         result.add(known_languages.get(key_iter.next()));
    203     }
    204     //for(Enumeration keys = known_languages.keys(); keys.hasMoreElements(); ) {
    205     //  result.add(known_languages.get(keys.nextElement()));
    206     //}
    207     //Collections.sort(result);
    208     return result;
    209     }
    210     /** Mark the current set of controls, if any, as obsolete and deallocate them. If further need of the controls will cause new controls to be created.
    211     * @see org.greenstone.gatherer.cdm.IndexManager.Control
    212     */
    213     public void invalidateControls() {
    214     if(controls != null) {
    215         controls.destroy();
    216     }
    217     controls = null;
    218     }
    219 
    220     /** Determine if the given language is the current default language.
    221       * @param language The <strong>Language</strong> to test.
    222       * @return <i>true</i> if the language is the default one, <i>false</i> otherwise.
    223       */
    224     public boolean isDefaultLanguage(Language language) {
    225     return (language.equals(default_language));
    226     }
    227     /** This method attempts to parse a language command from the given string. If such a command is parsed, it is immediately added to the list of languages.
    228       * @param command The <strong>String</strong> containing a possible language command.
    229       * @return A <i>boolean</i> which is <i>true</i> if a command was parsed, <i>false</i> otherwise.
    230       * @see org.greenstone.gatherer.cdm.Language
    231       */
    232     public boolean parse(String command) {
    233     String command_lc = command.toLowerCase();
    234     if(command_lc.startsWith("languages")) {
    235         StringTokenizer tokenizer = new StringTokenizer(command);
    236         tokenizer.nextToken();
    237         while(tokenizer.hasMoreTokens()) {
    238         String code = tokenizer.nextToken();
    239         if(known_languages.containsKey(code)) {
    240             Language language = (Language)known_languages.get(code);
    241             addElement(new Language(language));
    242         }
    243         else {
    244             addElement(new Language(code, code, false));
    245         }
    246         }
    247         return true;
    248     }
    249     if(command_lc.startsWith("defaultlanguage")) {
    250         StringTokenizer tokenizer = new StringTokenizer(command);
    251         tokenizer.nextToken();
    252         if(tokenizer.hasMoreTokens()) {
    253         String code = tokenizer.nextToken();
    254         Language language = getLanguage(code, true);
    255         if(language == null) {
    256             language = new Language(code, (String)known_languages.get(code), true);
    257             addElement(language);
    258         }
    259         else {
    260             language.setDefault(true);
    261         }
    262         setDefault(language);
    263         }
    264         return true;
    265     }
    266     return false;
    267     }
    268     /** Method to cause the list appearance to update if the selection changes. */
    269     public void refreshAppearance() {
    270     fireContentsChanged(this, 0, size());
    271     }
    272     /** Method to remove a certain language.
    273       * @param language The <strong>Language</strong> to remove.
    274       * @see org.greenstone.gatherer.Gatherer
    275       * @see org.greenstone.gatherer.collection.CollectionManager
    276       */
    277     public void removeLanguage(Language language) {
    278     removeElement(language);
    279     if(default_language != null && default_language.equals(language)) {
    280         default_language = null;
    281     }
    282     gatherer.c_man.configurationChanged();
    283     }
    284     /** Method to set the default language.
    285       * @param language The <strong>Language</strong> to use as a default, or <i>null</i> for no default.
    286       * @see org.greenstone.gatherer.Gatherer
    287       * @see org.greenstone.gatherer.collection.CollectionManager
    288       */
    289     public void setDefault(Language language) {
    290     // Unset existing.
    291     Language old = null;
    292     if(default_language != null) {
    293         old = default_language;
    294         default_language.setDefault(false);
    295         default_language = null;
    296     }
    297     // Now set the new if its not null.
    298     if(language != null) {
    299         default_language = language;
    300         default_language.setDefault(true);
    301     }
    302     // Now cause the model to refresh any lists that are listening.
    303     int start = 0;
    304     int end = size() - 1;
    305     if(default_language != null && old != null) {
    306         int index_default = indexOf(default_language);
    307         int index_old = indexOf(old);
    308         if(index_default < index_old) {
    309         start = index_default;
    310         end = index_old;
    311         }
    312         else {
    313         start = index_old;
    314         end = index_default;
    315         }
    316     }
    317     else if(default_language != null) {
    318         start = end = indexOf(default_language);
    319     }
    320     else {
    321         start = end = indexOf(old);
    322     }
    323     fireContentsChanged(this, 0, size());
    324     gatherer.c_man.configurationChanged();
    325     }
    326     /** Method to translate this object into a block of commands as you you expect to find in the collection configuration file.
    327      * @return A <strong>String</string> containing a series of commands.
    328      */
    329     public String toString() {
    330     StringBuffer text = new StringBuffer();
    331     if(size() > 1) {
    332         text.append("languages ");
    333         for(int i = 0; i < size(); i++) {
    334         Language language = (Language) get(i);
    335         text.append(language.getCode());
    336         if(i < size() - 1) {
    337             text.append(" ");
    338         }
    339         else {
    340             text.append("\n");
    341         }
    342         }
    343                 // Only bother with default language if there is more than one language.
    344         if(default_language != null) {
    345         text.append("defaultlanguage ");
    346         text.append(default_language.getCode());
    347         text.append("\n");
    348         }
    349         text.append("\n");
    350     }
    351     return text.toString();
    352     }
    353     /** Overloaded to call get with both a key and an empty argument array.
    354       * @param key A <strong>String</strong> which is mapped to a initial String within the ResourceBundle.
    355       * @return A <strong>String</strong> which has been referenced by the key String and that either contains no argument fields, or has had the argument fields automatiically populated with formatting Strings of with argument String provided in the get call.
    356       */
    357     private String get(String key) {
    358     return get(key, null);
    359     }
    360     /** Used to retrieve a property value from the Locale specific ResourceBundle, based upon the key and arguments supplied. If the key cannot be found or if some other part of the call fails a default (English) error message is returned. <BR>
    361       * Here the get recieves a second argument which is an array of Strings used to populate argument fields, denoted {<I>n</I>}, within the value String returned. Note that argument numbers greater than or equal to 32 are automatically mapped to the formatting String named Farg<I>n</I>.
    362       * @param key A <strong>String</strong> which is mapped to a initial String within the ResourceBundle.
    363       * @param args A <strong>String[]</strong> used to populate argument fields within the complete String.
    364       * @return A <strong>String</strong> which has been referenced by the key String and that either contains no argument fields, or has had the argument fields automatiically populated with formatting Strings of with argument String provided in the get call.
    365       * @see org.greenstone.gatherer.Gatherer
    366       * @see org.greenstone.gatherer.Dictionary
    367       */
    368     private String get(String key, String args[]) {
    369     if(key.indexOf('.') == -1) {
    370         key = "CDM.LanguageManager." + key;
    371     }
    372     return gatherer.dictionary.get(key, args);
    373     }
    374     /** This method loads a series of code->language mappings into known_languages, by reading from the 'languages.dat' file, which is essentially a verbatim copy of the ISO 639 Standard.
    375      * @see org.greenstone.gatherer.cdm.Language
    376       */
    377     private void loadLanguages() {
     72    // Retrieve the default language
     73    NodeList default_language_elements = CollectionDesignManager.collect_config.getDocumentElement().getElementsByTagName(CollectionConfiguration.LANGUAGE_DEFAULT_ELEMENT);
     74    if(default_language_elements.getLength() > 0) {
     75        default_language = new Language((Element)default_language_elements.item(0));
     76    }
     77    // Load a series of code->language mappings into known_languages, by reading from the 'languages.dat' file, which is essentially a subset of the ISO 639 Standard.
     78    known_languages = new LinkedHashMap();
    37879    try {
    37980        File in_file = new File("languages.dat");
     
    38485        if(!entry.startsWith("#")) {
    38586            StringTokenizer tokenizer = new StringTokenizer(entry);
    386             String name = tokenizer.nextToken();
    387             String code = tokenizer.nextToken().toLowerCase();
    388             Language language = new Language(code, name, false);
    389             known_languages.put(code, language);
     87            if(tokenizer.countTokens() >= 2) {
     88            String name = tokenizer.nextToken();
     89            String code = tokenizer.nextToken().toLowerCase();
     90            known_languages.put(code, name);
     91            }
    39092        }
    39193        }
    39294        in.close();
     95        in_reader.close();
     96        in = null;
     97        in_reader = null;
     98        in_file = null;
    39399    }
    394100    catch (Exception error) {
     
    397103    }
    398104
     105    /** Method to add a new language.
     106     * @param language The <strong>Language</strong> to add.
     107     * @see org.greenstone.gatherer.Gatherer
     108     * @see org.greenstone.gatherer.collection.CollectionManager
     109     */
     110    public void addLanguage(Language language) {
     111    if(!contains(language)) {
     112        Element element = language.getElement();
     113        // Locate where we should insert this new subcollection.
     114        Node target_node = CollectionConfiguration.findInsertionPoint(element);
     115        // Failing that we insert immediately after a language string
     116        add(root, language, target_node);
     117        Gatherer.c_man.configurationChanged();
     118    }
     119    }
     120
     121    public void destroy() {
     122    if(controls != null) {
     123        controls.destroy();
     124        controls = null;
     125    }
     126    known_languages.clear();
     127    known_languages = null;
     128    }
     129
     130    /** Method to retrieve the control for this manager.
     131     * @return the Control for editing the language partitions
     132     */
     133    public Control getControls() {
     134    if(controls == null) {
     135        // Build controls
     136        controls = new LanguageControl();
     137    }
     138    return controls;
     139    }
     140
     141    /** Method to retrieve the default language code.
     142     * @return A <strong>Language</strong> containing a two letter code.
     143     */
     144    public Language getDefaultLanguage() {
     145    // If no default is set...
     146    if(default_language != null && default_language.isAssigned()) {
     147        return default_language;
     148    }
     149    return null;
     150    }
     151
     152    /** Method to retrieve a certain language object by its code.
     153     * @param code The two letter code of a language, as a <strong>String</strong>.
     154     * @param assigned_only If <i>true</i> only those languages currently having indexes built for them are checked, otherwise the known languages buffer is checked.
     155     * @return The <strong>Language</strong> that matches the given code, or <i>null</i> if no such language exists.
     156     */
     157    public Language getLanguage(String code) {
     158    int size = getSize();
     159    for(int i = 0; i < size; i++) {
     160        Language language = (Language) getElementAt(i);
     161        if(language.getCode().equals(code)) {
     162        return language;
     163        }
     164    }
     165    return null;
     166    }
     167
     168    public ArrayList getLanguages() {
     169    return children();
     170    }
     171
     172    /** Method to return a list of the known language codes.
     173     * @return an ArrayList containing the series of known language codes as per the languages.dat file
     174     */
     175    public ArrayList getLanguageCodes() {
     176    return new ArrayList(known_languages.keySet());
     177    }
     178
     179    public String getLanguageName(String code) {
     180    return (String) known_languages.get(code);
     181    }
     182
     183    /** Method to remove a certain language.
     184     * @param language The <strong>Language</strong> to remove.
     185     * @see org.greenstone.gatherer.Gatherer
     186     * @see org.greenstone.gatherer.collection.CollectionManager
     187     */
     188    public void removeLanguage(Language language) {
     189    remove(language);
     190    if(default_language != null && default_language.equals(language)) {
     191        default_language = null;
     192    }
     193    Gatherer.c_man.configurationChanged();
     194    }
     195
     196    /** Method to set the default language.
     197     * @param language The <strong>Language</strong> to use as a default, or <i>null</i> for no default.
     198     * @see org.greenstone.gatherer.Gatherer
     199     * @see org.greenstone.gatherer.collection.CollectionManager
     200     */
     201    public void setDefault(Language language) {
     202    if(language != null) {
     203        if(default_language == null) {
     204        // Create the default index element, and place immediately after indexes element.
     205        Element default_language_element = root.getOwnerDocument().createElement(CollectionConfiguration.LANGUAGE_DEFAULT_ELEMENT);
     206        default_language = new Language(default_language_element);
     207        Node target_node = CollectionConfiguration.findInsertionPoint(default_language_element);
     208        if(target_node != null) {
     209            root.getOwnerDocument().getDocumentElement().insertBefore(default_language_element, target_node);
     210        }
     211        else {
     212            root.getOwnerDocument().getDocumentElement().appendChild(default_language_element);
     213        }
     214        }
     215        default_language.setAssigned(true);
     216        default_language.setCode(language.getCode());
     217    }
     218    else {
     219        if(default_language != null) {
     220        default_language.setAssigned(false);
     221        }
     222    }
     223    Gatherer.c_man.configurationChanged();
     224    }
     225
     226    /** Overloaded to call get with both a key and an empty argument array.
     227      * @param key A <strong>String</strong> which is mapped to a initial String within the ResourceBundle.
     228      * @return A <strong>String</strong> which has been referenced by the key String and that either contains no argument fields, or has had the argument fields automatiically populated with formatting Strings of with argument String provided in the get call.
     229      */
     230    private String get(String key) {
     231    if(key.indexOf('.') == -1) {
     232        key = "CDM.LanguageManager." + key;
     233    }
     234    return Gatherer.dictionary.get(key, (String[])null);
     235    }
     236
    399237    /** This class represents the visual component of the Language Manager. */
    400     private class Control
    401     extends JPanel {
     238    private class LanguageControl
     239    extends JPanel
     240    implements Control {
    402241    /** The button to add a new language support. */
    403     private JButton add = null;
     242    private JButton add_button = null;
    404243    /** The button to clear the current default language. */
    405     private JButton clear_default = null;
     244    private JButton clear_button = null;
    406245    /** The button to remove a supported language. */
    407     private JButton remove = null;
     246    private JButton remove_button = null;
    408247    /** The button to set the current language as the default one. */
    409     private JButton set_default = null;
     248    private JButton set_button = null;
    410249    /** A combobox listing the available supported languages. */
    411     private JComboBox selector = null;
     250    private JComboBox selector_combobox = null;
    412251    /** A list of currently supported languages. */
    413     private JList list = null;
     252    private JList language_list = null;
    414253    /** A description of the language currently selected. */
    415     private JTextArea description = null;
     254    private JTextArea description_textarea = null;
    416255    /** The text field showing the currently name of the default language. Non-editable. */
    417     private JTextField default_language_value = null;
     256    private JTextField default_language_field = null;
    418257    /** Constructor.
    419258     * @see org.greenstone.gatherer.cdm.LanguageManager.Control.AddListener
     
    425264     * @see org.greenstone.gatherer.cdm.LanguageManager.Control.TranslateListener
    426265     */
    427     public Control() {
     266    public LanguageControl() {
    428267        super();
    429268        // Creation.
     
    434273        title_label.setOpaque(true);
    435274
    436         list = new JList(model);
    437         list.setCellRenderer(new ListRenderer());
     275        language_list = new JList(model);
    438276
    439277        JPanel details_panel = new JPanel();
     
    446284
    447285        if(default_language == null) {
    448         default_language_value = new JTextField();
     286        default_language_field = new JTextField();
    449287        }
    450288        else {
    451         default_language_value = new JTextField(default_language.toString());
    452         }
    453         default_language_value.setBackground(Gatherer.config.getColor("coloring.collection_tree_background", false));
    454         default_language_value.setEditable(false);
     289        default_language_field = new JTextField(default_language.toString());
     290        }
     291        default_language_field.setBackground(Gatherer.config.getColor("coloring.collection_tree_background", false));
     292        default_language_field.setEditable(false);
    455293
    456294        JPanel control_panel = new JPanel();
     
    459297        selector_label.setPreferredSize(LABEL_SIZE);
    460298
    461         selector = new JComboBox(getLanguageCodes().toArray());
    462         selector.setBackground(Gatherer.config.getColor("coloring.collection_tree_background", false));
     299        selector_combobox = new JComboBox(getLanguageCodes().toArray());
     300        selector_combobox.setBackground(Gatherer.config.getColor("coloring.collection_tree_background", false));
     301        selector_combobox.setRenderer(new LanguageListCellRenderer());
    463302
    464303        JPanel button_panel = new JPanel();
    465304
    466         add = new JButton(get("Add"));
    467         add.setMnemonic(KeyEvent.VK_A);
    468         if(selector.getSelectedItem() != null) {
    469         add.setEnabled(true);
    470         }
    471         else {
    472         add.setEnabled(false);
    473         }
    474 
    475         remove = new JButton(get("Remove"));
    476         remove.setMnemonic(KeyEvent.VK_R);
    477         remove.setEnabled(false);
    478 
    479         clear_default = new JButton(get("Clear_Default"));
    480         clear_default.setMnemonic(KeyEvent.VK_C);
    481         clear_default.setEnabled(false);
    482 
    483         set_default = new JButton(get("Set_Default"));
    484         set_default.setMnemonic(KeyEvent.VK_S);
    485         set_default.setEnabled(false);
     305        add_button = new JButton(get("Add"));
     306        add_button.setMnemonic(KeyEvent.VK_A);
     307
     308        remove_button = new JButton(get("Remove"));
     309        remove_button.setMnemonic(KeyEvent.VK_R);
     310        remove_button.setEnabled(false);
     311
     312        clear_button = new JButton(get("Clear_Default"));
     313        clear_button.setMnemonic(KeyEvent.VK_C);
     314        clear_button.setEnabled(false);
     315
     316        set_button = new JButton(get("Set_Default"));
     317        set_button.setMnemonic(KeyEvent.VK_S);
     318        set_button.setEnabled(false);
    486319
    487320        // Set up and connect listeners.
    488         add.addActionListener(new AddListener());
    489         clear_default.addActionListener(new ClearDefaultListener());
    490         remove.addActionListener(new RemoveListener());
    491         selector.addActionListener(new SelectorListener());
    492         set_default.addActionListener(new SetDefaultListener());
    493         list.addListSelectionListener(new ListListener());
     321        add_button.addActionListener(new AddListener());
     322        clear_button.addActionListener(new ClearDefaultListener());
     323        remove_button.addActionListener(new RemoveListener());
     324        selector_combobox.addActionListener(new SelectorListener());
     325        set_button.addActionListener(new SetDefaultListener());
     326        language_list.addListSelectionListener(new ListListener());
    494327        // Layout components.
    495328        default_panel.setBorder(BorderFactory.createRaisedBevelBorder());
    496329        default_panel.setLayout(new BorderLayout());
    497330        default_panel.add(default_label, BorderLayout.WEST);
    498         default_panel.add(default_language_value, BorderLayout.CENTER);
     331        default_panel.add(default_language_field, BorderLayout.CENTER);
    499332
    500333        control_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
    501334        control_panel.setLayout(new BorderLayout());
    502335        control_panel.add(selector_label, BorderLayout.WEST);
    503         control_panel.add(selector, BorderLayout.CENTER);
     336        control_panel.add(selector_combobox, BorderLayout.CENTER);
    504337
    505338        details_panel.setBorder(BorderFactory.createEmptyBorder(5,0,5,0));
     
    510343        center_panel.setLayout(new BorderLayout());
    511344        center_panel.add(title_label, BorderLayout.NORTH);
    512         center_panel.add(new JScrollPane(list), BorderLayout.CENTER);
     345        center_panel.add(new JScrollPane(language_list), BorderLayout.CENTER);
    513346        center_panel.add(details_panel, BorderLayout.SOUTH);
    514347
    515348        button_panel.setLayout(new GridLayout(2,2,5,5));
    516         button_panel.add(add);
    517         button_panel.add(remove);
    518         button_panel.add(clear_default);
    519         button_panel.add(set_default);
     349        button_panel.add(add_button);
     350        button_panel.add(remove_button);
     351        button_panel.add(clear_button);
     352        button_panel.add(set_button);
    520353
    521354        setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
     
    524357        add(button_panel, BorderLayout.SOUTH);
    525358    }
    526     /** Destructor.
    527             */
     359    /** Destructor. */
    528360    public void destroy() {
    529361    }
     362
     363    public void gainFocus() {
     364    }
     365
     366    public void loseFocus() {
     367    }
     368
    530369    /** 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. */
    531370    private class AddListener
     
    536375         */
    537376        public void actionPerformed(ActionEvent event) {
    538         Language language = (Language)selector.getSelectedItem();
    539         if(language != null) {
    540             addLanguage(new Language(language));
    541         }
    542         }
    543     }
     377        String language_code = (String) selector_combobox.getSelectedItem();
     378        if(language_code != null) {
     379            addLanguage(new Language(language_code));
     380        }
     381        add_button.setEnabled(false);
     382        }
     383    }
     384
    544385    /** Listens for actions apon the 'clear default' button in the LanguageManager controls, and if detected calls the setDefault method of the manager with <i>null</i>. */
    545386    private class ClearDefaultListener
     
    550391        public void actionPerformed(ActionEvent event) {
    551392        setDefault(null);
    552         clear_default.setEnabled(false);
    553         default_language_value.setText("");
    554         }
    555     }
     393        clear_button.setEnabled(false);
     394        default_language_field.setText("");
     395        }
     396    }
     397
    556398    /** 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. */
    557399    private class RemoveListener
     
    562404         */
    563405        public void actionPerformed(ActionEvent event) {
    564         if(!list.isSelectionEmpty()) {
    565             removeLanguage((Language)list.getSelectedValue());
    566             if(default_language == null) {
    567             clear_default.setEnabled(false);
    568             default_language_value.setText("");
     406        Language delete_me = (Language)language_list.getSelectedValue();
     407        if(delete_me != null) {
     408            removeLanguage(delete_me);
     409            if(default_language != null && default_language.equals(delete_me)) {
     410            setDefault(null);
     411            clear_button.setEnabled(false);
     412            default_language_field.setText("");
    569413            }
    570414        }
    571         }
    572     }
    573     /** Listens for selections wihtin the combobox on the LanguageManager controls, and if a change is detected enables, or disables, controls appropriately. */
     415        remove_button.setEnabled(false);
     416        }
     417    }
     418
     419    /** Listens for selections within the combobox on the LanguageManager controls, and if a change is detected enables, or disables, controls appropriately. */
    574420    private class SelectorListener
    575421        implements ActionListener {
     
    578424         */
    579425        public void actionPerformed(ActionEvent event) {
    580         if(selector.getSelectedItem() != null) {
    581             add.setEnabled(true);
    582             //description.setText((String)known_languages.get(code));
     426        if(selector_combobox.getSelectedItem() != null) {
     427            add_button.setEnabled(true);
    583428        }
    584429        else {
    585             add.setEnabled(false);
    586             //description.setText("");
    587         }
    588         }
    589     }
     430            add_button.setEnabled(false);
     431        }
     432        }
     433    }
     434
    590435    /** 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. */
    591436    private class SetDefaultListener
    592437        implements ActionListener {
    593                 /** Set the default index to the one currently selected, if any.
    594                 * @param event An <strong>ActionEvent</strong>.
    595                 * @see org.greenstone.gatherer.cdm.Language
    596                 */
     438        /** Set the default index to the one currently selected, if any.
     439        * @param event An <strong>ActionEvent</strong>.
     440        * @see org.greenstone.gatherer.cdm.Language
     441        */
    597442        public void actionPerformed(ActionEvent event) {
    598         if(!list.isSelectionEmpty()) {
    599             setDefault((Language)list.getSelectedValue());
    600             clear_default.setEnabled(true);
    601             default_language_value.setText(default_language.toString());
    602         }
    603         }
    604     }
     443        if(!language_list.isSelectionEmpty()) {
     444            setDefault((Language)language_list.getSelectedValue());
     445            clear_button.setEnabled(true);
     446            default_language_field.setText(default_language.toString());
     447        }
     448        }
     449    }
     450
    605451    /** Listens for selections within the list on the LanguageManager controls, and if a change is detected enables, or disables, controls appropriately. */
    606452    private class ListListener
     
    610456         */
    611457        public void valueChanged(ListSelectionEvent event) {
    612         if(list.isSelectionEmpty()) {
    613             remove.setEnabled(false);
    614             set_default.setEnabled(false);
     458        if(language_list.isSelectionEmpty()) {
     459            remove_button.setEnabled(false);
     460            set_button.setEnabled(false);
    615461        }
    616462        else {
    617             remove.setEnabled(true);
    618             set_default.setEnabled(true);
    619         }
    620         refreshAppearance();
    621         }
    622     }
    623     /** Our list cel renderer which renders the default cell just a little different. */
    624     private class ListRenderer
    625         extends DefaultListCellRenderer {
    626         /** Method to produce the component used to display an entry in the list.
    627          * @param list The <strong>JList</strong> the component will be placed in.
    628          * @param value A value to be displayed for this component, as a <strong>Object</strong>.
    629          * @param index The position in the list it will occupy as an <i>int</i>.
    630          * @param isSelected Whether the user has currently selected this component, as a <i>boolean</i>.
    631          * @param cellHasFocus Whether the component currently has focus, again as a <i>boolean</i>.
    632          * @return A <strong>Component</strong> to be used as the entry in the list.
    633          * @see org.greenstone.gatherer.cdm.Language
    634          */
    635         public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    636         Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    637         Language language = (Language) value;
    638         if(language.isDefault() && !isSelected) {
    639             component.setBackground(Gatherer.config.getColor("coloring.workspace_selection_background", false));
    640         }
    641         if(component instanceof JLabel) {
    642             ((JLabel)component).setOpaque(true);
    643         }
    644         return component;
     463            remove_button.setEnabled(true);
     464            set_button.setEnabled(true);
     465        }
    645466        }
    646467    }
Note: See TracChangeset for help on using the changeset viewer.