Changeset 12278


Ignore:
Timestamp:
2006-07-24T11:26:58+12:00 (18 years ago)
Author:
kjdon
Message:

tidied this up. now can have a list of languages per partition.

File:
1 edited

Legend:

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

    r12123 r12278  
    3333import java.util.*;
    3434import javax.swing.*;
     35import javax.swing.border.*;
    3536import javax.swing.event.*;
    3637import org.greenstone.gatherer.Configuration;
     
    3940import org.greenstone.gatherer.Gatherer;
    4041import org.greenstone.gatherer.gui.GLIButton;
     42import org.greenstone.gatherer.util.CheckList;
     43import org.greenstone.gatherer.util.CheckListEntry;
    4144import org.greenstone.gatherer.util.JarTools;
    4245import org.greenstone.gatherer.util.XMLTools;
     
    7780    // 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.
    7881    known_languages = new LinkedHashMap();
    79     /*
    80       try {
    81         File in_file = new File("languages.dat");
    82         FileReader in_reader = new FileReader(in_file);
    83         BufferedReader in = new BufferedReader(in_reader);
    84         String entry = null;
    85         while((entry = in.readLine()) != null) {
    86         if(!entry.startsWith("#")) {
    87             StringTokenizer tokenizer = new StringTokenizer(entry);
    88             if(tokenizer.countTokens() >= 2) {
    89             String name = tokenizer.nextToken();
    90             String code = tokenizer.nextToken().toLowerCase();
    91             known_languages.put(code, name);
    92             }
    93         }
    94         }
    95         in.close();
    96         in_reader.close();
    97         in = null;
    98         in_reader = null;
    99         in_file = null;
    100     }
    101     catch (Exception error) {
    102         error.printStackTrace();
    103     }
    104     */
    10582    NodeList language_elements = LANGUAGES_DOCUMENT.getDocumentElement().getElementsByTagName(CollectionConfiguration.LANGUAGE_ELEMENT);
    10683    for(int i = 0; i < language_elements.getLength(); i++) {
     
    12299    private void addLanguage(Language language) {
    123100    if(!contains(language)) {
    124         Element element = language.getElement();
    125         append(language);
     101        // need to add a pseudo metadata
     102        CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + language.getCode());
     103        metadatum.setValue(language.getName());
     104        CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
     105        add(getSize(), language);
    126106        Gatherer.c_man.configurationChanged();
    127107    }
     
    148128    return controls;
    149129    }
    150 
    151     /** Method to retrieve the default language code.
    152      * @return A <strong>Language</strong> containing a two letter code.
    153      */
    154     /* private Language getDefaultLanguage() {
    155     // If no default is set...
    156     if(default_language != null && default_language.isAssigned()) {
    157         return default_language;
    158     }
    159     return null;
    160     } */
    161 
     130   
    162131    /** Method to retrieve a certain language object by its code.
    163132     * @param code The two letter code of a language, as a <strong>String</strong>.
     
    239208    private void removeLanguage(Language language) {
    240209    remove(language);
     210    // Remove any collection metadata for this language
     211    CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + language.getCode());
    241212    if(default_language != null && default_language.equals(language)) {
    242         default_language = null;
     213        setDefault(null);
    243214    }
    244215    Gatherer.c_man.configurationChanged();
    245216    }
    246217
     218    private void replaceLanguage(Language old_language, Language new_language) {
     219    // Remove old lang collection meta
     220    CollectionDesignManager.collectionmeta_manager.removeMetadata(CollectionConfiguration.STOP_CHARACTER + old_language.getCode());
     221    // Add new one
     222    CollectionMeta metadatum = new CollectionMeta(CollectionConfiguration.STOP_CHARACTER + new_language.getCode());
     223    metadatum.setValue(new_language.getName());
     224    CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
     225    if(default_language != null && default_language.equals(old_language)) {
     226        setDefault(new_language);
     227    }
     228
     229    // get the position of the old one
     230    int position = indexOf(old_language);
     231    remove(old_language);
     232    add(position, new_language);
     233
     234    // Schedule the collection for saving
     235    Gatherer.c_man.configurationChanged();
     236
     237    }
    247238    /** Method to set the default language.
    248239     * @param language The <strong>Language</strong> to use as a default, or <i>null</i> for no default.
     
    280271    extends JPanel
    281272    implements Control {
     273    /** The list of available languages */
     274    private CheckList language_list = null;
    282275    /** The button to add a new language support. */
    283276    private JButton add_button = null;
     277    /** The button to replace a language support. */
     278    private JButton replace_button = null;
    284279    /** The button to remove a supported language. */
    285280    private JButton remove_button = null;
     
    291286    private JButton set_default_button = null;
    292287    /** A combobox listing the available supported languages. */
    293     private JComboBox language_combobox = null;
     288    //private JComboBox language_combobox = null;
    294289    /** A list of currently supported languages. */
    295290    private JList selected_languages_list = null;
     
    317312        JLabel selector_label = new JLabel(Dictionary.get("CDM.LanguageManager.Selector"));
    318313       
    319         language_combobox = new JComboBox(getLanguageCodes().toArray());
    320         language_combobox.setPreferredSize(COMPONENT_SIZE);
    321         language_combobox.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
    322         language_combobox.setRenderer(new LanguageListCellRenderer());
    323         language_combobox.setToolTipText(Dictionary.get("CDM.LanguageManager.Selector_Tooltip"));
    324        
     314        language_list = new CheckList(false);
     315        language_list.setListData(getLanguageCodes());
     316        language_list.setToolTipText(Dictionary.get("CDM.LanguageManager.Selector_Tooltip"));
     317        language_list.setCellRenderer(new LanguageCheckListCellRenderer());
     318               
    325319        JPanel movement_pane = new JPanel();
    326320        move_up_button = new GLIButton(Dictionary.get("CDM.Move.Move_Up"), JarTools.getImage("arrow-up.gif"), Dictionary.get("CDM.Move.Move_Up_Tooltip"));
     
    335329        JPanel button_panel = new JPanel();
    336330
    337         add_button = new GLIButton(Dictionary.get("CDM.LanguageManager.Add"), Dictionary.get("CDM.LanguageManager.Add_Tooltip"));
    338        
    339         if (getLanguage((String)language_combobox.getItemAt(0))==null) {
    340         add_button.setEnabled(true);
    341         } else {
    342         add_button.setEnabled(false);
    343         }
    344         remove_button = new GLIButton(Dictionary.get("CDM.LanguageManager.Remove"), Dictionary.get("CDM.LanguageManager.Remove_Tooltip"));
     331        add_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Add_Subindex"), Dictionary.get("CDM.LanguageManager.Add_Tooltip"));
     332        add_button.setEnabled(false);
     333
     334        replace_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Replace_Subindex"), Dictionary.get("CDM.LanguageManager.Replace_Tooltip"));
     335        replace_button.setEnabled(false);
     336       
     337        remove_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Remove_Subindex"), Dictionary.get("CDM.LanguageManager.Remove_Tooltip"));
    345338        remove_button.setEnabled(false);
    346339       
     
    354347        remove_button.addActionListener(new RemoveListener());
    355348        remove_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
    356         language_combobox.addActionListener(new SelectorListener());
     349        replace_button.addActionListener(new ReplaceListener());
     350        replace_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
     351
     352        language_list.addListSelectionListener(new LanguageListListener());
     353       
    357354        set_default_button.addActionListener(new SetDefaultListener());
    358355        set_default_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
     
    360357
    361358        // Layout components
     359        button_panel.setLayout(new GridLayout(1,3));
     360        button_panel.add(add_button);
     361        button_panel.add(replace_button);
     362        button_panel.add(remove_button);
     363
    362364        movement_pane.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));
    363365        movement_pane.setLayout(new GridLayout(3,1));
     
    369371        control_panel.setLayout(new BorderLayout());
    370372        control_panel.add(selector_label, BorderLayout.WEST);
    371         control_panel.add(language_combobox, BorderLayout.CENTER);
     373        control_panel.add(new JScrollPane(language_list), BorderLayout.CENTER);
     374        control_panel.add(button_panel, BorderLayout.SOUTH);
    372375
    373376        center_panel.setLayout(new BorderLayout());
     
    375378        center_panel.add(new JScrollPane(selected_languages_list), BorderLayout.CENTER);
    376379        center_panel.add(movement_pane, BorderLayout.EAST);
    377         center_panel.add(control_panel, BorderLayout.SOUTH);
    378 
    379         button_panel.setLayout(new GridLayout(1,2));
    380         button_panel.add(add_button);
    381         button_panel.add(remove_button);
    382 //      button_panel.add(set_button);
    383 //      button_panel.add(clear_button);
    384 
    385         //when we go to a multi list, remove inner_panel and empty_panel
    386         JPanel empty_panel = new JPanel();
    387         JPanel inner_panel = new JPanel();
    388 
    389         inner_panel.setLayout(new BorderLayout());
    390         inner_panel.add(center_panel, BorderLayout.CENTER);
    391         inner_panel.add(button_panel, BorderLayout.SOUTH);
     380
    392381        setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
    393382        setLayout(new BorderLayout());
    394         //add(center_panel, BorderLayout.CENTER);
    395         //add(button_panel, BorderLayout.SOUTH);
    396         add(inner_panel, BorderLayout.NORTH);
    397         add(empty_panel, BorderLayout.CENTER);
     383        add(center_panel, BorderLayout.NORTH);
     384        add(control_panel, BorderLayout.CENTER);
    398385    }
    399386   
     
    408395    }
    409396
     397   
     398    private void clearControls() {
     399        selected_languages_list.clearSelection();
     400        language_list.clearTicked();
     401        add_button.setEnabled(false);
     402        remove_button.setEnabled(false);
     403        replace_button.setEnabled(false);
     404        set_default_button.setEnabled(false);
     405        move_down_button.setEnabled(false);
     406        move_up_button.setEnabled(false);
     407
     408    }
     409   
     410    private void updateControlsWithSelectedLanguage()
     411    {
     412        Language selected_lang = (Language) selected_languages_list.getSelectedValue();
     413        if (selected_lang == null) {
     414        clearControls();
     415        return;
     416        }
     417       
     418        // Display the selected subcollection index's sources
     419        language_list.clearTicked();
     420        language_list.setTickedObjects(selected_lang.getCode().split(","));
     421       
     422    }
     423
     424    private void validateButtons() {
     425        boolean add_enabled = false;
     426        boolean replace_enabled = false;
     427
     428        if (!language_list.isNothingTicked()) {
     429        // Create a dummy Langauge and see if its in the collection
     430        ArrayList langs = language_list.getTicked();
     431        StringBuffer code_str = new StringBuffer();
     432        boolean first = true;
     433        for (int i=0; i<langs.size(); i++) {
     434            if (!first) {
     435            code_str.append(",");
     436            } else {
     437            first = false;
     438            }
     439            code_str.append(langs.get(i));
     440        }
     441        String lang_str = code_str.toString();
     442       
     443        if (!model.contains(lang_str)) {
     444            add_enabled = true;
     445            if (!selected_languages_list.isSelectionEmpty()) {
     446            replace_enabled = true;
     447            }
     448        }
     449
     450        }
     451        add_button.setEnabled(add_enabled);
     452        replace_button.setEnabled(replace_enabled);
     453    }
     454   
    410455    /** 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. */
    411456    private class AddListener
     
    416461         */
    417462        public void actionPerformed(ActionEvent event) {
    418         String language_code = (String) language_combobox.getSelectedItem();
    419         if(language_code != null) {
    420             addLanguage(new Language(language_code));
    421         }
    422         // add some collectionmeta
    423         String lang_name = getLanguageName(language_code);
    424         CollectionMeta metadatum = new CollectionMeta("." + language_code);
    425         metadatum.setValue(lang_name);
    426         CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
    427 
    428         add_button.setEnabled(false);
     463        if (!language_list.isNothingTicked()) {
     464            ArrayList langs = language_list.getTicked();
     465            addLanguage(new Language(language_list.getTicked()));
     466            clearControls();
     467        }
    429468        }
    430469    }
     
    440479        Language delete_me = (Language)selected_languages_list.getSelectedValue();
    441480        if(delete_me != null) {
    442             // Remove any current metadata for this language
    443             CollectionDesignManager.collectionmeta_manager.removeMetadata("." + delete_me.getCode());
    444481            removeLanguage(delete_me);
    445             if(default_language != null && default_language.equals(delete_me)) {
    446             setDefault(null);
    447             //clear_button.setEnabled(false);
    448             //default_language_field.setText("");
    449             }
    450         }
    451         remove_button.setEnabled(false);
    452         }
    453     }
    454 
    455     /** Listens for selections within the combobox on the LanguageManager controls, and if a change is detected enables, or disables, controls appropriately. */
    456     private class SelectorListener
     482        }
     483        }
     484    }
     485
     486    private class ReplaceListener
    457487        implements ActionListener {
    458         /** Enable or disable controls depeding on selection.
    459          * @param event An <strong>ActionEvent</strong>.
    460          */
     488       
    461489        public void actionPerformed(ActionEvent event) {
    462         String language_code = (String) language_combobox.getSelectedItem();
    463         if(language_code != null && getLanguage(language_code) == null) {
    464             add_button.setEnabled(true);
    465         }
    466         else {
    467             add_button.setEnabled(false);
    468         }
    469         }
    470     }
    471 
     490        if (selected_languages_list.isSelectionEmpty() || language_list.isNothingTicked()) {
     491            // This should never happen, but just in case...
     492            replace_button.setEnabled(false);
     493            return;
     494        }
     495        Language old_language = (Language) selected_languages_list.getSelectedValue();
     496        Language new_language = new Language(language_list.getTicked());
     497        replaceLanguage(old_language, new_language);
     498       
     499        }
     500    }
     501   
     502    private class LanguageListListener
     503        implements ListSelectionListener {
     504
     505        public void valueChanged(ListSelectionEvent event) {
     506        if (event.getValueIsAdjusting()) {
     507            return;
     508        }
     509        validateButtons();
     510        }
     511    }
     512   
    472513    /** 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. */
    473514    private class SetDefaultListener
     
    481522        if(selected_language != null) {
    482523            setDefault(selected_language);
    483             //clear_button.setEnabled(true);
    484524            // This should cause a repaint of just the desired row
    485525            selected_languages_list.setSelectedValue(selected_language, true);
     
    523563        }
    524564        if(selected_languages_list.isSelectionEmpty()) {
    525             remove_button.setEnabled(false);
    526             set_default_button.setEnabled(false);
    527             move_down_button.setEnabled(false);
    528             move_up_button.setEnabled(false);
     565            clearControls();
    529566            return;
    530567        }
     
    534571        Language selected_lang = (Language)selected_languages_list.getSelectedValue();
    535572        remove_button.setEnabled(true);
     573        replace_button.setEnabled(false);
     574        add_button.setEnabled(false);
    536575        set_default_button.setEnabled(default_language == null || !default_language.equals(selected_lang));
    537576       
     
    548587            move_down_button.setEnabled(false);
    549588        }
     589        updateControlsWithSelectedLanguage();
    550590        }
    551591    }
     
    564604    }
    565605    }
     606   
     607    /** A custom list cell renderer for producing rows which contain clickable check boxes. */
     608    private class LanguageCheckListCellRenderer
     609    implements ListCellRenderer
     610    {
     611    /** 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.
     612     * @param list The </strong>JList</strong> we're painting.
     613     * @param value The value returned by list.getModel().getElementAt(index), as an <strong>Object</strong>.
     614     * @param index The cells index as an <i>int</i>.
     615     * @param is_selected <i>true</i> if the specified cell was selected, <i>false</i> otherwise.
     616     * @param cell_has_focus <i>true</i> if and only if the specified cell has the focus.
     617     * @return A <strong>Component</strong> whose paint() method will render the specified value.
     618     */
     619    public Component getListCellRendererComponent(JList list, Object value, int index, boolean is_selected, boolean cell_has_focus) {
     620        JCheckBox checkbox = (JCheckBox) value;
     621        checkbox.setBackground(list.getBackground());
     622        checkbox.setForeground(list.getForeground());
     623        checkbox.setBorderPainted(false);
     624        checkbox.setEnabled(list.isEnabled());
     625        checkbox.setFont(list.getFont());
     626        checkbox.setFocusPainted(false);
     627        checkbox.setBorder((is_selected) ? UIManager.getBorder("List.focusCellHighlightBorder") : new EmptyBorder(1, 1, 1, 1));
     628       
     629        String code = (String)((CheckListEntry)list.getModel().getElementAt(index)).getObject();
     630        checkbox.setText((String)known_languages.get(code));
     631
     632        return checkbox;
     633    }
     634    }
     635
    566636}
Note: See TracChangeset for help on using the changeset viewer.