[4932] | 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 | */
|
---|
| 27 | package org.greenstone.gatherer.cdm;
|
---|
[5590] | 28 |
|
---|
[10011] | 29 |
|
---|
[4932] | 30 | import java.awt.*;
|
---|
| 31 | import java.awt.event.*;
|
---|
| 32 | import java.io.*;
|
---|
| 33 | import java.util.*;
|
---|
| 34 | import javax.swing.*;
|
---|
[12278] | 35 | import javax.swing.border.*;
|
---|
[4932] | 36 | import javax.swing.event.*;
|
---|
[8231] | 37 | import org.greenstone.gatherer.Configuration;
|
---|
[8236] | 38 | import org.greenstone.gatherer.DebugStream;
|
---|
[5590] | 39 | import org.greenstone.gatherer.Dictionary;
|
---|
[4932] | 40 | import org.greenstone.gatherer.Gatherer;
|
---|
[6318] | 41 | import org.greenstone.gatherer.gui.GLIButton;
|
---|
[12349] | 42 | import org.greenstone.gatherer.metadata.MetadataElement;
|
---|
| 43 | import org.greenstone.gatherer.metadata.MetadataSetManager;
|
---|
[12278] | 44 | import org.greenstone.gatherer.util.CheckList;
|
---|
| 45 | import org.greenstone.gatherer.util.CheckListEntry;
|
---|
[10011] | 46 | import org.greenstone.gatherer.util.JarTools;
|
---|
[12641] | 47 | import org.greenstone.gatherer.util.StaticStrings;
|
---|
[10006] | 48 | import org.greenstone.gatherer.util.XMLTools;
|
---|
[4932] | 49 | import org.w3c.dom.*;
|
---|
[5590] | 50 |
|
---|
[4932] | 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 | */
|
---|
| 55 | public class LanguageManager
|
---|
| 56 | extends DOMProxyListModel {
|
---|
| 57 |
|
---|
[10006] | 58 | static public Document LANGUAGES_DOCUMENT = XMLTools.parseXMLFile("xml/languages.xml", true);
|
---|
[6539] | 59 |
|
---|
[7157] | 60 | static final private Dimension COMPONENT_SIZE = new Dimension(125,25);
|
---|
[4932] | 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;
|
---|
[12728] | 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;
|
---|
[4932] | 73 | /** Constructor. */
|
---|
| 74 | public LanguageManager(Element languages_element) {
|
---|
[12641] | 75 | super(languages_element, StaticStrings.LANGUAGE_ELEMENT, new Language());
|
---|
[4932] | 76 |
|
---|
[8236] | 77 | DebugStream.println("LanguageManager: " + getSize() + " languages parsed.");
|
---|
[4932] | 78 |
|
---|
| 79 | this.model = this;
|
---|
| 80 | // Retrieve the default language
|
---|
[12800] | 81 | NodeList default_language_elements = CollectionConfiguration.getElementsByTagName(StaticStrings.LANGUAGE_DEFAULT_ELEMENT);
|
---|
[4932] | 82 | if(default_language_elements.getLength() > 0) {
|
---|
| 83 | default_language = new Language((Element)default_language_elements.item(0));
|
---|
| 84 | }
|
---|
[12349] | 85 |
|
---|
| 86 | // Retrieve the language metadata
|
---|
[12728] | 87 | language_metadata = CollectionDesignManager.collect_config.getLanguageMetadata();
|
---|
[6539] | 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.
|
---|
[4932] | 89 | known_languages = new LinkedHashMap();
|
---|
[12641] | 90 | NodeList language_elements = LANGUAGES_DOCUMENT.getDocumentElement().getElementsByTagName(StaticStrings.LANGUAGE_ELEMENT);
|
---|
[6539] | 91 | for(int i = 0; i < language_elements.getLength(); i++) {
|
---|
| 92 | Element language_element = (Element) language_elements.item(i);
|
---|
[12641] | 93 | String code = language_element.getAttribute(StaticStrings.CODE_ATTRIBUTE);
|
---|
| 94 | String name = language_element.getAttribute(StaticStrings.NAME_ATTRIBUTE);
|
---|
[6539] | 95 | known_languages.put(code.toLowerCase(), name);
|
---|
| 96 | name = null;
|
---|
| 97 | code = null;
|
---|
| 98 | language_element = null;
|
---|
| 99 | }
|
---|
[4932] | 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 | */
|
---|
[8002] | 107 | private void addLanguage(Language language) {
|
---|
[4932] | 108 | if(!contains(language)) {
|
---|
[12278] | 109 | // need to add a pseudo metadata
|
---|
[12641] | 110 | CollectionMeta metadatum = new CollectionMeta(StaticStrings.STOP_CHARACTER + language.getCode());
|
---|
[12278] | 111 | metadatum.setValue(language.getName());
|
---|
| 112 | CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
|
---|
| 113 | add(getSize(), language);
|
---|
[4932] | 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;
|
---|
[9563] | 124 | default_language = null;
|
---|
[4932] | 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 | }
|
---|
[12278] | 137 |
|
---|
[4932] | 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 | }
|
---|
[12092] | 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 | }
|
---|
[4932] | 174 |
|
---|
[9563] | 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 |
|
---|
[4932] | 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 | */
|
---|
[8002] | 213 | private void removeLanguage(Language language) {
|
---|
[4932] | 214 | remove(language);
|
---|
[12278] | 215 | // Remove any collection metadata for this language
|
---|
[12641] | 216 | CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + language.getCode());
|
---|
[4932] | 217 | if(default_language != null && default_language.equals(language)) {
|
---|
[12278] | 218 | setDefault(null);
|
---|
[4932] | 219 | }
|
---|
| 220 | }
|
---|
| 221 |
|
---|
[12278] | 222 | private void replaceLanguage(Language old_language, Language new_language) {
|
---|
| 223 | // Remove old lang collection meta
|
---|
[12641] | 224 | CollectionDesignManager.collectionmeta_manager.removeMetadata(StaticStrings.STOP_CHARACTER + old_language.getCode());
|
---|
[12278] | 225 | // Add new one
|
---|
[12641] | 226 | CollectionMeta metadatum = new CollectionMeta(StaticStrings.STOP_CHARACTER + new_language.getCode());
|
---|
[12278] | 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);
|
---|
[12808] | 237 | }
|
---|
[12278] | 238 |
|
---|
| 239 |
|
---|
[4932] | 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.
|
---|
[12641] | 249 | Element default_language_element = root.getOwnerDocument().createElement(StaticStrings.LANGUAGE_DEFAULT_ELEMENT);
|
---|
[4932] | 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 {
|
---|
[12278] | 274 | /** The list of available languages */
|
---|
| 275 | private CheckList language_list = null;
|
---|
[4932] | 276 | /** The button to add a new language support. */
|
---|
| 277 | private JButton add_button = null;
|
---|
[12278] | 278 | /** The button to replace a language support. */
|
---|
| 279 | private JButton replace_button = null;
|
---|
[4932] | 280 | /** The button to remove a supported language. */
|
---|
| 281 | private JButton remove_button = null;
|
---|
[9563] | 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;
|
---|
[14746] | 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;
|
---|
[4932] | 290 | /** The button to set the current language as the default one. */
|
---|
[9563] | 291 | private JButton set_default_button = null;
|
---|
[4932] | 292 | /** A list of currently supported languages. */
|
---|
[9563] | 293 | private JList selected_languages_list = null;
|
---|
[12349] | 294 | /** A list of metadata elements that may hold the language metadata */
|
---|
| 295 | private JComboBox language_metadata_combo = null;
|
---|
| 296 |
|
---|
[4932] | 297 | /** Constructor.
|
---|
[6389] | 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
|
---|
[4932] | 304 | */
|
---|
| 305 | public LanguageControl() {
|
---|
| 306 | super();
|
---|
| 307 | // Creation.
|
---|
| 308 | JPanel center_panel = new JPanel();
|
---|
| 309 |
|
---|
[12123] | 310 | JLabel selected_languages_list_label = new JLabel(Dictionary.get("CDM.LanguageManager.Assigned_Languages"));
|
---|
[9563] | 311 | selected_languages_list = new JList(model);
|
---|
| 312 | selected_languages_list.setCellRenderer(new MyLanguageListCellRenderer());
|
---|
| 313 | selected_languages_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
---|
| 314 | selected_languages_list.setVisibleRowCount(5);
|
---|
[12300] | 315 |
|
---|
[4932] | 316 | JPanel control_panel = new JPanel();
|
---|
[14746] | 317 |
|
---|
| 318 | JPanel labels_pane = new JPanel();
|
---|
[12123] | 319 | JLabel selector_label = new JLabel(Dictionary.get("CDM.LanguageManager.Selector"));
|
---|
[14746] | 320 | select_all_button = new GLIButton(Dictionary.get("CDM.IndexManager.Select_All"), Dictionary.get("CDM.IndexManager.Select_All_Tooltip"));
|
---|
| 321 | select_none_button = new GLIButton(Dictionary.get("CDM.IndexManager.Select_None"), Dictionary.get("CDM.IndexManager.Select_None_Tooltip"));
|
---|
[12123] | 322 |
|
---|
[12349] | 323 | language_metadata_combo = new JComboBox(MetadataSetManager.getEveryMetadataSetElement().toArray());
|
---|
[13195] | 324 | language_metadata_combo.setOpaque(false);
|
---|
[12349] | 325 | language_metadata_combo.setToolTipText(Dictionary.get("CDM.LanguageManager.LanguageMetadata_Tooltip"));
|
---|
| 326 | JLabel language_metadata_label = new JLabel(Dictionary.get("CDM.LanguageManager.LanguageMetadata"));
|
---|
| 327 | String current_value = "ex.Language";
|
---|
[12728] | 328 | if (language_metadata.getAttribute(StaticStrings.ASSIGNED_ATTRIBUTE).equals(StaticStrings.TRUE_STR) && !language_metadata.getAttribute(StaticStrings.NAME_ATTRIBUTE).equals("")) {
|
---|
| 329 | current_value = language_metadata.getAttribute(StaticStrings.NAME_ATTRIBUTE);
|
---|
[12349] | 330 | }
|
---|
| 331 | ArgumentControl.selectValue(language_metadata_combo, current_value);
|
---|
[12278] | 332 | language_list = new CheckList(false);
|
---|
| 333 | language_list.setListData(getLanguageCodes());
|
---|
| 334 | language_list.setToolTipText(Dictionary.get("CDM.LanguageManager.Selector_Tooltip"));
|
---|
| 335 | language_list.setCellRenderer(new LanguageCheckListCellRenderer());
|
---|
[14746] | 336 |
|
---|
| 337 | select_all_button.setEnabled(isSelectAllEnabled());
|
---|
| 338 | select_none_button.setEnabled(isSelectAllEnabled());
|
---|
[12278] | 339 |
|
---|
[9563] | 340 | JPanel movement_pane = new JPanel();
|
---|
[12123] | 341 | move_up_button = new GLIButton(Dictionary.get("CDM.Move.Move_Up"), JarTools.getImage("arrow-up.gif"), Dictionary.get("CDM.Move.Move_Up_Tooltip"));
|
---|
[9563] | 342 | move_up_button.setEnabled(false);
|
---|
[12123] | 343 |
|
---|
| 344 | move_down_button = new GLIButton(Dictionary.get("CDM.Move.Move_Down"), JarTools.getImage("arrow-down.gif"), Dictionary.get("CDM.Move.Move_Down_Tooltip"));
|
---|
[9563] | 345 | move_down_button.setEnabled(false);
|
---|
[12123] | 346 |
|
---|
| 347 | set_default_button = new GLIButton(Dictionary.get("CDM.LanguageManager.Set_Default"), Dictionary.get("CDM.LanguageManager.Set_Default_Tooltip"));
|
---|
[9563] | 348 | set_default_button.setEnabled(false);
|
---|
[12123] | 349 |
|
---|
[4932] | 350 | JPanel button_panel = new JPanel();
|
---|
| 351 |
|
---|
[12278] | 352 | add_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Add_Subindex"), Dictionary.get("CDM.LanguageManager.Add_Tooltip"));
|
---|
| 353 | add_button.setEnabled(false);
|
---|
| 354 |
|
---|
| 355 | replace_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Replace_Subindex"), Dictionary.get("CDM.LanguageManager.Replace_Tooltip"));
|
---|
| 356 | replace_button.setEnabled(false);
|
---|
[12123] | 357 |
|
---|
[12278] | 358 | remove_button = new GLIButton(Dictionary.get("CDM.SubcollectionIndexManager.Remove_Subindex"), Dictionary.get("CDM.LanguageManager.Remove_Tooltip"));
|
---|
[4932] | 359 | remove_button.setEnabled(false);
|
---|
[12123] | 360 |
|
---|
[4932] | 361 | // Set up and connect listeners.
|
---|
| 362 | add_button.addActionListener(new AddListener());
|
---|
[10237] | 363 | add_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
|
---|
[9563] | 364 | move_down_button.addActionListener(new MoveListener(false));
|
---|
[10237] | 365 | move_down_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
|
---|
[9563] | 366 | move_up_button.addActionListener(new MoveListener(true));
|
---|
[10237] | 367 | move_up_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
|
---|
[4932] | 368 | remove_button.addActionListener(new RemoveListener());
|
---|
[10237] | 369 | remove_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
|
---|
[12278] | 370 | replace_button.addActionListener(new ReplaceListener());
|
---|
| 371 | replace_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
|
---|
[14746] | 372 | select_all_button.addActionListener(new SelectAllListener());
|
---|
| 373 | select_all_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
|
---|
| 374 | select_none_button.addActionListener(new SelectNoneListener());
|
---|
| 375 | select_none_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
|
---|
[12278] | 376 |
|
---|
| 377 | language_list.addListSelectionListener(new LanguageListListener());
|
---|
[12349] | 378 | language_metadata_combo.addActionListener(new ActionListener() {
|
---|
| 379 | public void actionPerformed(ActionEvent event) {
|
---|
| 380 | String value = ((MetadataElement)language_metadata_combo.getSelectedItem()).getFullName();
|
---|
[12728] | 381 | language_metadata.setAttribute(StaticStrings.ASSIGNED_ATTRIBUTE, StaticStrings.TRUE_STR);
|
---|
| 382 | language_metadata.setAttribute(StaticStrings.NAME_ATTRIBUTE, value);
|
---|
[12349] | 383 | }
|
---|
| 384 | });
|
---|
[9563] | 385 | set_default_button.addActionListener(new SetDefaultListener());
|
---|
[10237] | 386 | set_default_button.addActionListener(CollectionDesignManager.buildcol_change_listener);
|
---|
[12281] | 387 | selected_languages_list.addListSelectionListener(new AssignedListListener());
|
---|
[5590] | 388 |
|
---|
| 389 | // Layout components
|
---|
[12278] | 390 | button_panel.setLayout(new GridLayout(1,3));
|
---|
| 391 | button_panel.add(add_button);
|
---|
| 392 | button_panel.add(replace_button);
|
---|
| 393 | button_panel.add(remove_button);
|
---|
| 394 |
|
---|
[12349] | 395 | JPanel metadata_panel = new JPanel();
|
---|
| 396 | metadata_panel.setLayout(new BorderLayout());
|
---|
| 397 | JPanel inner_panel = new JPanel();
|
---|
| 398 | inner_panel.setLayout(new BorderLayout(10,10));
|
---|
| 399 | inner_panel.add(language_metadata_label, BorderLayout.WEST);
|
---|
| 400 | inner_panel.add(language_metadata_combo, BorderLayout.CENTER);
|
---|
| 401 | metadata_panel.add(new JPanel(), BorderLayout.CENTER);
|
---|
| 402 | metadata_panel.add(inner_panel, BorderLayout.EAST);
|
---|
| 403 |
|
---|
[9563] | 404 | movement_pane.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));
|
---|
| 405 | movement_pane.setLayout(new GridLayout(3,1));
|
---|
| 406 | movement_pane.add(move_up_button);
|
---|
| 407 | movement_pane.add(move_down_button);
|
---|
| 408 | movement_pane.add(set_default_button);
|
---|
[4932] | 409 |
|
---|
| 410 | control_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
|
---|
| 411 | control_panel.setLayout(new BorderLayout());
|
---|
[14746] | 412 |
|
---|
| 413 | labels_pane.setLayout(new BorderLayout());
|
---|
| 414 | labels_pane.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5));
|
---|
| 415 |
|
---|
| 416 | // add the select all and select none buttons to the label panel
|
---|
| 417 | GridBagLayout gridbag = new GridBagLayout();
|
---|
| 418 | GridBagConstraints c = new GridBagConstraints();
|
---|
| 419 | labels_pane.setLayout(gridbag);
|
---|
| 420 |
|
---|
| 421 | c.fill = GridBagConstraints.BOTH;
|
---|
| 422 | c.weightx = 1.0;
|
---|
| 423 | c.weighty = 1.0;
|
---|
| 424 | c.gridx = 0;
|
---|
| 425 | c.gridy = 0;
|
---|
| 426 |
|
---|
| 427 | gridbag.setConstraints(selector_label, c);
|
---|
| 428 | labels_pane.add(selector_label);
|
---|
| 429 |
|
---|
| 430 | c.fill = GridBagConstraints.HORIZONTAL;
|
---|
| 431 | c.weighty = 0.0;
|
---|
| 432 | c.gridy = 1;
|
---|
| 433 |
|
---|
| 434 | gridbag.setConstraints(select_all_button, c);
|
---|
| 435 | labels_pane.add(select_all_button);
|
---|
| 436 |
|
---|
| 437 | c.gridy = 2;
|
---|
| 438 | gridbag.setConstraints(select_none_button, c);
|
---|
| 439 | labels_pane.add(select_none_button);
|
---|
| 440 |
|
---|
| 441 | control_panel.add(labels_pane, BorderLayout.WEST);
|
---|
| 442 |
|
---|
[12278] | 443 | control_panel.add(new JScrollPane(language_list), BorderLayout.CENTER);
|
---|
| 444 | control_panel.add(button_panel, BorderLayout.SOUTH);
|
---|
[4932] | 445 |
|
---|
| 446 | center_panel.setLayout(new BorderLayout());
|
---|
[9563] | 447 | center_panel.add(selected_languages_list_label, BorderLayout.NORTH);
|
---|
| 448 | center_panel.add(new JScrollPane(selected_languages_list), BorderLayout.CENTER);
|
---|
| 449 | center_panel.add(movement_pane, BorderLayout.EAST);
|
---|
[4932] | 450 |
|
---|
[12349] | 451 | JPanel top_panel = new JPanel();
|
---|
| 452 | top_panel.setLayout(new BorderLayout());
|
---|
| 453 | top_panel.add(metadata_panel, BorderLayout.NORTH);
|
---|
| 454 | top_panel.add(center_panel, BorderLayout.SOUTH);
|
---|
| 455 |
|
---|
[4932] | 456 | setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
|
---|
| 457 | setLayout(new BorderLayout());
|
---|
[12349] | 458 | add(top_panel, BorderLayout.NORTH);
|
---|
[12278] | 459 | add(control_panel, BorderLayout.CENTER);
|
---|
[4932] | 460 | }
|
---|
[5902] | 461 |
|
---|
[4932] | 462 | /** Destructor. */
|
---|
| 463 | public void destroy() {
|
---|
| 464 | }
|
---|
| 465 |
|
---|
| 466 | public void gainFocus() {
|
---|
| 467 | }
|
---|
| 468 |
|
---|
| 469 | public void loseFocus() {
|
---|
| 470 | }
|
---|
| 471 |
|
---|
[12278] | 472 |
|
---|
| 473 | private void clearControls() {
|
---|
| 474 | selected_languages_list.clearSelection();
|
---|
| 475 | language_list.clearTicked();
|
---|
| 476 | add_button.setEnabled(false);
|
---|
| 477 | remove_button.setEnabled(false);
|
---|
| 478 | replace_button.setEnabled(false);
|
---|
| 479 | set_default_button.setEnabled(false);
|
---|
| 480 | move_down_button.setEnabled(false);
|
---|
| 481 | move_up_button.setEnabled(false);
|
---|
[14746] | 482 | select_all_button.setEnabled(isSelectAllEnabled());
|
---|
| 483 | select_none_button.setEnabled(isSelectAllEnabled());
|
---|
[12278] | 484 |
|
---|
| 485 | }
|
---|
| 486 |
|
---|
| 487 | private void updateControlsWithSelectedLanguage()
|
---|
| 488 | {
|
---|
| 489 | Language selected_lang = (Language) selected_languages_list.getSelectedValue();
|
---|
| 490 | if (selected_lang == null) {
|
---|
| 491 | clearControls();
|
---|
| 492 | return;
|
---|
| 493 | }
|
---|
| 494 |
|
---|
| 495 | // Display the selected subcollection index's sources
|
---|
[14746] | 496 | language_list.clearTicked();
|
---|
| 497 | // for multi-languages indexes, getCode returns null
|
---|
| 498 | if(selected_lang.getCode()==null){
|
---|
| 499 | return;
|
---|
| 500 | }
|
---|
| 501 | language_list.setTickedObjects(selected_lang.getCode().split(","));
|
---|
[12278] | 502 | }
|
---|
| 503 |
|
---|
| 504 | private void validateButtons() {
|
---|
| 505 | boolean add_enabled = false;
|
---|
| 506 | boolean replace_enabled = false;
|
---|
| 507 |
|
---|
| 508 | if (!language_list.isNothingTicked()) {
|
---|
| 509 | // Create a dummy Langauge and see if its in the collection
|
---|
| 510 | ArrayList langs = language_list.getTicked();
|
---|
| 511 | StringBuffer code_str = new StringBuffer();
|
---|
| 512 | boolean first = true;
|
---|
| 513 | for (int i=0; i<langs.size(); i++) {
|
---|
| 514 | if (!first) {
|
---|
| 515 | code_str.append(",");
|
---|
| 516 | } else {
|
---|
| 517 | first = false;
|
---|
| 518 | }
|
---|
| 519 | code_str.append(langs.get(i));
|
---|
| 520 | }
|
---|
| 521 | String lang_str = code_str.toString();
|
---|
| 522 |
|
---|
| 523 | if (!model.contains(lang_str)) {
|
---|
| 524 | add_enabled = true;
|
---|
| 525 | if (!selected_languages_list.isSelectionEmpty()) {
|
---|
| 526 | replace_enabled = true;
|
---|
| 527 | }
|
---|
| 528 | }
|
---|
| 529 |
|
---|
| 530 | }
|
---|
| 531 | add_button.setEnabled(add_enabled);
|
---|
| 532 | replace_button.setEnabled(replace_enabled);
|
---|
[14746] | 533 | select_all_button.setEnabled(isSelectAllEnabled());
|
---|
| 534 | select_none_button.setEnabled(isSelectAllEnabled());
|
---|
[12278] | 535 | }
|
---|
| 536 |
|
---|
[4932] | 537 | /** 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. */
|
---|
| 538 | private class AddListener
|
---|
| 539 | implements ActionListener {
|
---|
| 540 | /** Add a new language support.
|
---|
| 541 | * @param event an ActionEvent
|
---|
| 542 | * @see org.greenstone.gatherer.cdm.Language
|
---|
| 543 | */
|
---|
| 544 | public void actionPerformed(ActionEvent event) {
|
---|
[12278] | 545 | if (!language_list.isNothingTicked()) {
|
---|
| 546 | addLanguage(new Language(language_list.getTicked()));
|
---|
| 547 | clearControls();
|
---|
[4932] | 548 | }
|
---|
| 549 | }
|
---|
| 550 | }
|
---|
| 551 |
|
---|
| 552 | /** 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. */
|
---|
| 553 | private class RemoveListener
|
---|
| 554 | implements ActionListener {
|
---|
| 555 | /** Remove the currently selected language, if any.
|
---|
| 556 | * @param event An <strong>ActionEvent</strong>.
|
---|
| 557 | * @see org.greenstone.gatherer.cdm.Language
|
---|
| 558 | */
|
---|
| 559 | public void actionPerformed(ActionEvent event) {
|
---|
[9563] | 560 | Language delete_me = (Language)selected_languages_list.getSelectedValue();
|
---|
[4932] | 561 | if(delete_me != null) {
|
---|
| 562 | removeLanguage(delete_me);
|
---|
| 563 | }
|
---|
| 564 | }
|
---|
| 565 | }
|
---|
| 566 |
|
---|
[12278] | 567 | private class ReplaceListener
|
---|
[4932] | 568 | implements ActionListener {
|
---|
[12278] | 569 |
|
---|
[4932] | 570 | public void actionPerformed(ActionEvent event) {
|
---|
[12278] | 571 | if (selected_languages_list.isSelectionEmpty() || language_list.isNothingTicked()) {
|
---|
| 572 | // This should never happen, but just in case...
|
---|
| 573 | replace_button.setEnabled(false);
|
---|
| 574 | return;
|
---|
[4932] | 575 | }
|
---|
[12278] | 576 | Language old_language = (Language) selected_languages_list.getSelectedValue();
|
---|
| 577 | Language new_language = new Language(language_list.getTicked());
|
---|
| 578 | replaceLanguage(old_language, new_language);
|
---|
| 579 |
|
---|
| 580 | }
|
---|
| 581 | }
|
---|
| 582 |
|
---|
| 583 | private class LanguageListListener
|
---|
| 584 | implements ListSelectionListener {
|
---|
| 585 |
|
---|
| 586 | public void valueChanged(ListSelectionEvent event) {
|
---|
| 587 | if (event.getValueIsAdjusting()) {
|
---|
| 588 | return;
|
---|
[4932] | 589 | }
|
---|
[12278] | 590 | validateButtons();
|
---|
[4932] | 591 | }
|
---|
| 592 | }
|
---|
[12278] | 593 |
|
---|
[14746] | 594 | private class SelectAllListener
|
---|
| 595 | implements ActionListener {
|
---|
| 596 |
|
---|
| 597 | public void actionPerformed(ActionEvent event){
|
---|
| 598 | if(select_all_button.isEnabled()){
|
---|
| 599 | language_list.setAllTicked();
|
---|
| 600 | validateButtons();
|
---|
| 601 | }
|
---|
| 602 | }
|
---|
| 603 | }
|
---|
| 604 |
|
---|
| 605 | private class SelectNoneListener
|
---|
| 606 | implements ActionListener {
|
---|
| 607 |
|
---|
| 608 | public void actionPerformed(ActionEvent event){
|
---|
| 609 | if(select_all_button.isEnabled()){
|
---|
| 610 | language_list.clearTicked();
|
---|
| 611 | validateButtons();
|
---|
| 612 | }
|
---|
| 613 | }
|
---|
| 614 | }
|
---|
| 615 |
|
---|
[4932] | 616 | /** 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. */
|
---|
| 617 | private class SetDefaultListener
|
---|
| 618 | implements ActionListener {
|
---|
| 619 | /** Set the default index to the one currently selected, if any.
|
---|
| 620 | * @param event An <strong>ActionEvent</strong>.
|
---|
| 621 | * @see org.greenstone.gatherer.cdm.Language
|
---|
| 622 | */
|
---|
| 623 | public void actionPerformed(ActionEvent event) {
|
---|
[9563] | 624 | Language selected_language = (Language) selected_languages_list.getSelectedValue();
|
---|
| 625 | if(selected_language != null) {
|
---|
| 626 | setDefault(selected_language);
|
---|
| 627 | // This should cause a repaint of just the desired row
|
---|
| 628 | selected_languages_list.setSelectedValue(selected_language, true);
|
---|
[4932] | 629 | }
|
---|
[9563] | 630 | set_default_button.setEnabled(false);
|
---|
[4932] | 631 | }
|
---|
| 632 | }
|
---|
| 633 |
|
---|
[9563] | 634 | private class MoveListener
|
---|
| 635 | implements ActionListener
|
---|
| 636 | {
|
---|
| 637 | private boolean move_up;
|
---|
| 638 |
|
---|
| 639 | public MoveListener(boolean move_up)
|
---|
| 640 | {
|
---|
| 641 | this.move_up = move_up;
|
---|
| 642 | }
|
---|
| 643 |
|
---|
| 644 | public void actionPerformed(ActionEvent event)
|
---|
| 645 | {
|
---|
| 646 | // Retrieve the selected language
|
---|
| 647 | Language language = (Language) selected_languages_list.getSelectedValue();
|
---|
| 648 | if (language != null) {
|
---|
| 649 | int new_position = moveLanguage(language, move_up);
|
---|
| 650 | // Ensure the language that moved is still selected
|
---|
| 651 | selected_languages_list.setSelectedIndex(new_position);
|
---|
| 652 | }
|
---|
| 653 | }
|
---|
| 654 | }
|
---|
| 655 |
|
---|
| 656 |
|
---|
[4932] | 657 | /** Listens for selections within the list on the LanguageManager controls, and if a change is detected enables, or disables, controls appropriately. */
|
---|
[12281] | 658 | private class AssignedListListener
|
---|
[4932] | 659 | implements ListSelectionListener {
|
---|
| 660 | /** Enable or disable controls depending on the current list selection.
|
---|
| 661 | * @param event A <strong>ListSelectionEvent</strong>.
|
---|
| 662 | */
|
---|
| 663 | public void valueChanged(ListSelectionEvent event) {
|
---|
[9563] | 664 | if (event.getValueIsAdjusting()) {
|
---|
| 665 | return;
|
---|
| 666 | }
|
---|
| 667 | if(selected_languages_list.isSelectionEmpty()) {
|
---|
[12278] | 668 | clearControls();
|
---|
[9563] | 669 | return;
|
---|
[4932] | 670 | }
|
---|
[9563] | 671 |
|
---|
| 672 | int i = selected_languages_list.getSelectedIndex();
|
---|
| 673 | int size = selected_languages_list.getModel().getSize();
|
---|
[14746] | 674 |
|
---|
| 675 | select_all_button.setEnabled(isSelectAllEnabled());
|
---|
| 676 | select_none_button.setEnabled(isSelectAllEnabled());
|
---|
| 677 |
|
---|
[9563] | 678 | Language selected_lang = (Language)selected_languages_list.getSelectedValue();
|
---|
| 679 | remove_button.setEnabled(true);
|
---|
[12278] | 680 | replace_button.setEnabled(false);
|
---|
| 681 | add_button.setEnabled(false);
|
---|
[9563] | 682 | set_default_button.setEnabled(default_language == null || !default_language.equals(selected_lang));
|
---|
| 683 |
|
---|
| 684 | if (i > 0) {
|
---|
| 685 | move_up_button.setEnabled(true);
|
---|
| 686 | }
|
---|
| 687 | else {
|
---|
| 688 | move_up_button.setEnabled(false);
|
---|
| 689 | }
|
---|
| 690 | if (i < size-1){
|
---|
| 691 | move_down_button.setEnabled(true);
|
---|
| 692 | }
|
---|
| 693 | else {
|
---|
| 694 | move_down_button.setEnabled(false);
|
---|
| 695 | }
|
---|
[12278] | 696 | updateControlsWithSelectedLanguage();
|
---|
[9563] | 697 | }
|
---|
| 698 | }
|
---|
| 699 |
|
---|
| 700 | private class MyLanguageListCellRenderer
|
---|
| 701 | extends DefaultListCellRenderer
|
---|
| 702 | {
|
---|
| 703 | /** Return a component that has been configured to display the specified value. */
|
---|
| 704 | public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
|
---|
| 705 | JLabel component = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
|
---|
| 706 | if (default_language != null && default_language.equals(value)) {
|
---|
[9564] | 707 | component.setText(component.getText() + " [" + Dictionary.get("CDM.LanguageManager.Default_Language")+"]");
|
---|
[4932] | 708 | }
|
---|
[9563] | 709 | return component;
|
---|
[4932] | 710 | }
|
---|
| 711 | }
|
---|
[14746] | 712 |
|
---|
| 713 | private boolean isSelectAllEnabled(){
|
---|
| 714 | return language_list.getModel().getSize() > 0 ? true : false;
|
---|
| 715 | }
|
---|
[4932] | 716 | }
|
---|
[12278] | 717 |
|
---|
| 718 | /** A custom list cell renderer for producing rows which contain clickable check boxes. */
|
---|
| 719 | private class LanguageCheckListCellRenderer
|
---|
| 720 | implements ListCellRenderer
|
---|
| 721 | {
|
---|
| 722 | /** 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.
|
---|
| 723 | * @param list The </strong>JList</strong> we're painting.
|
---|
| 724 | * @param value The value returned by list.getModel().getElementAt(index), as an <strong>Object</strong>.
|
---|
| 725 | * @param index The cells index as an <i>int</i>.
|
---|
| 726 | * @param is_selected <i>true</i> if the specified cell was selected, <i>false</i> otherwise.
|
---|
| 727 | * @param cell_has_focus <i>true</i> if and only if the specified cell has the focus.
|
---|
| 728 | * @return A <strong>Component</strong> whose paint() method will render the specified value.
|
---|
| 729 | */
|
---|
| 730 | public Component getListCellRendererComponent(JList list, Object value, int index, boolean is_selected, boolean cell_has_focus) {
|
---|
| 731 | JCheckBox checkbox = (JCheckBox) value;
|
---|
| 732 | checkbox.setBackground(list.getBackground());
|
---|
| 733 | checkbox.setForeground(list.getForeground());
|
---|
| 734 | checkbox.setBorderPainted(false);
|
---|
| 735 | checkbox.setEnabled(list.isEnabled());
|
---|
| 736 | checkbox.setFont(list.getFont());
|
---|
| 737 | checkbox.setFocusPainted(false);
|
---|
| 738 | checkbox.setBorder((is_selected) ? UIManager.getBorder("List.focusCellHighlightBorder") : new EmptyBorder(1, 1, 1, 1));
|
---|
| 739 |
|
---|
| 740 | String code = (String)((CheckListEntry)list.getModel().getElementAt(index)).getObject();
|
---|
| 741 | checkbox.setText((String)known_languages.get(code));
|
---|
| 742 |
|
---|
| 743 | return checkbox;
|
---|
| 744 | }
|
---|
| 745 | }
|
---|
[14746] | 746 |
|
---|
| 747 |
|
---|
[12278] | 748 |
|
---|
[4932] | 749 | }
|
---|