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

Last change on this file since 5211 was 5211, checked in by jmt12, 21 years ago

Moved buttons and borders etc to make views more consistant

  • Property svn:keywords set to Author Date Id Revision
File size: 17.8 KB
Line 
1/**
2 *#########################################################################
3 *
4 * A component of the Gatherer application, part of the Greenstone digital
5 * library suite from the New Zealand Digital Library Project at the
6 * University of Waikato, New Zealand.
7 *
8 * Author: John Thompson, Greenstone Digital Library, University of Waikato
9 *
10 * Copyright (C) 1999 New Zealand Digital Library Project
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 *########################################################################
26 */
27package org.greenstone.gatherer.cdm;
28/**************************************************************************************
29 * Written: 08/05/02
30 * Revised: 17/11/02 - Commented
31 * 07/07/03 - DOM support
32 **************************************************************************************/
33import java.awt.*;
34import java.awt.event.*;
35import java.io.*;
36import java.util.*;
37import javax.swing.*;
38import javax.swing.event.*;
39import 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;
44import org.greenstone.gatherer.cdm.Language;
45import org.greenstone.gatherer.cdm.LanguageListCellRenderer;
46import org.w3c.dom.*;
47/** This class manages the language commands, remembering both a list of languages to build indexes in, plus the default language.
48 * @author John Thompson, Greenstone Digital Library, University of Waikato
49 * @version 2.3
50 */
51public class LanguageManager
52 extends DOMProxyListModel {
53
54 static final private Dimension LABEL_SIZE = new Dimension(125,25);
55
56 /** The visual controls for this manager. */
57 private Control controls = null;
58 /** A reference to this class as a model, for the inner controls class. */
59 private DOMProxyListModel model = null;
60 /** A hashtable of code->name mappings of known languages. */
61 private LinkedHashMap known_languages = null;
62 /** The default language object. */
63 private Language default_language = null;
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
71 this.model = this;
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();
79 try {
80 File in_file = new File("languages.dat");
81 FileReader in_reader = new FileReader(in_file);
82 BufferedReader in = new BufferedReader(in_reader);
83 String entry = null;
84 while((entry = in.readLine()) != null) {
85 if(!entry.startsWith("#")) {
86 StringTokenizer tokenizer = new StringTokenizer(entry);
87 if(tokenizer.countTokens() >= 2) {
88 String name = tokenizer.nextToken();
89 String code = tokenizer.nextToken().toLowerCase();
90 known_languages.put(code, name);
91 }
92 }
93 }
94 in.close();
95 in_reader.close();
96 in = null;
97 in_reader = null;
98 in_file = null;
99 }
100 catch (Exception error) {
101 error.printStackTrace();
102 }
103 }
104
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
237 /** This class represents the visual component of the Language Manager. */
238 private class LanguageControl
239 extends JPanel
240 implements Control {
241 /** The button to add a new language support. */
242 private JButton add_button = null;
243 /** The button to clear the current default language. */
244 private JButton clear_button = null;
245 /** The button to remove a supported language. */
246 private JButton remove_button = null;
247 /** The button to set the current language as the default one. */
248 private JButton set_button = null;
249 /** A combobox listing the available supported languages. */
250 private JComboBox selector_combobox = null;
251 /** A list of currently supported languages. */
252 private JList language_list = null;
253 /** A description of the language currently selected. */
254 private JTextArea description_textarea = null;
255 /** The text field showing the currently name of the default language. Non-editable. */
256 private JTextField default_language_field = null;
257 /** Constructor.
258 * @see org.greenstone.gatherer.cdm.LanguageManager.Control.AddListener
259 * @see org.greenstone.gatherer.cdm.LanguageManager.Control.ClearDefaultListener
260 * @see org.greenstone.gatherer.cdm.LanguageManager.Control.ListListener
261 * @see org.greenstone.gatherer.cdm.LanguageManager.Control.RemoveListener
262 * @see org.greenstone.gatherer.cdm.LanguageManager.Control.SelectorListener
263 * @see org.greenstone.gatherer.cdm.LanguageManager.Control.SetDefaultListener
264 * @see org.greenstone.gatherer.cdm.LanguageManager.Control.TranslateListener
265 */
266 public LanguageControl() {
267 super();
268 // Creation.
269 JPanel center_panel = new JPanel();
270
271 JLabel language_list_label = new JLabel(get("Assigned_Languages"));
272
273 language_list = new JList(model);
274
275 JPanel details_panel = new JPanel();
276
277 JPanel default_panel = new JPanel();
278
279 JLabel default_label = new JLabel(get("Default_Language"));
280 default_label.setBorder(BorderFactory.createEmptyBorder(0,0,0,5));
281 default_label.setPreferredSize(LABEL_SIZE);
282
283 if(default_language == null) {
284 default_language_field = new JTextField();
285 }
286 else {
287 default_language_field = new JTextField(default_language.toString());
288 }
289 default_language_field.setBackground(Gatherer.config.getColor("coloring.collection_tree_background", false));
290 default_language_field.setEditable(false);
291
292 JPanel control_panel = new JPanel();
293
294 JLabel selector_label = new JLabel(get("Selector"));
295 selector_label.setPreferredSize(LABEL_SIZE);
296
297 selector_combobox = new JComboBox(getLanguageCodes().toArray());
298 selector_combobox.setBackground(Gatherer.config.getColor("coloring.collection_tree_background", false));
299 selector_combobox.setRenderer(new LanguageListCellRenderer());
300
301 JPanel button_panel = new JPanel();
302
303 add_button = new JButton(get("Add"));
304 add_button.setMnemonic(KeyEvent.VK_A);
305
306 remove_button = new JButton(get("Remove"));
307 remove_button.setMnemonic(KeyEvent.VK_R);
308 remove_button.setEnabled(false);
309
310 clear_button = new JButton(get("Clear_Default"));
311 clear_button.setMnemonic(KeyEvent.VK_C);
312 clear_button.setEnabled(false);
313
314 set_button = new JButton(get("Set_Default"));
315 set_button.setMnemonic(KeyEvent.VK_S);
316 set_button.setEnabled(false);
317
318 // Set up and connect listeners.
319 add_button.addActionListener(new AddListener());
320 clear_button.addActionListener(new ClearDefaultListener());
321 remove_button.addActionListener(new RemoveListener());
322 selector_combobox.addActionListener(new SelectorListener());
323 set_button.addActionListener(new SetDefaultListener());
324 language_list.addListSelectionListener(new ListListener());
325 // Layout components.
326 default_panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createRaisedBevelBorder(), BorderFactory.createEmptyBorder(2,0,2,2)));
327 default_panel.setLayout(new BorderLayout());
328 default_panel.add(default_label, BorderLayout.WEST);
329 default_panel.add(default_language_field, BorderLayout.CENTER);
330
331 control_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
332 control_panel.setLayout(new BorderLayout());
333 control_panel.add(selector_label, BorderLayout.WEST);
334 control_panel.add(selector_combobox, BorderLayout.CENTER);
335
336 details_panel.setBorder(BorderFactory.createEmptyBorder(5,0,5,0));
337 details_panel.setLayout(new BorderLayout());
338 details_panel.add(default_panel, BorderLayout.CENTER);
339 details_panel.add(control_panel, BorderLayout.SOUTH);
340
341 center_panel.setLayout(new BorderLayout());
342 center_panel.add(language_list_label, BorderLayout.NORTH);
343 center_panel.add(new JScrollPane(language_list), BorderLayout.CENTER);
344 center_panel.add(details_panel, BorderLayout.SOUTH);
345
346 button_panel.setLayout(new GridLayout(1,4));
347 button_panel.add(add_button);
348 button_panel.add(remove_button);
349 button_panel.add(clear_button);
350 button_panel.add(set_button);
351
352 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
353 setLayout(new BorderLayout());
354 add(center_panel, BorderLayout.CENTER);
355 add(button_panel, BorderLayout.SOUTH);
356 }
357 /** Destructor. */
358 public void destroy() {
359 }
360
361 public void gainFocus() {
362 }
363
364 public void loseFocus() {
365 }
366
367 /** 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. */
368 private class AddListener
369 implements ActionListener {
370 /** Add a new language support.
371 * @param event an ActionEvent
372 * @see org.greenstone.gatherer.cdm.Language
373 */
374 public void actionPerformed(ActionEvent event) {
375 String language_code = (String) selector_combobox.getSelectedItem();
376 if(language_code != null) {
377 addLanguage(new Language(language_code));
378 }
379 add_button.setEnabled(false);
380 }
381 }
382
383 /** 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>. */
384 private class ClearDefaultListener
385 implements ActionListener {
386 /** Clear the default index.
387 * @param event An <strong>ActionEvent</strong>.
388 */
389 public void actionPerformed(ActionEvent event) {
390 setDefault(null);
391 clear_button.setEnabled(false);
392 default_language_field.setText("");
393 }
394 }
395
396 /** 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. */
397 private class RemoveListener
398 implements ActionListener {
399 /** Remove the currently selected language, if any.
400 * @param event An <strong>ActionEvent</strong>.
401 * @see org.greenstone.gatherer.cdm.Language
402 */
403 public void actionPerformed(ActionEvent event) {
404 Language delete_me = (Language)language_list.getSelectedValue();
405 if(delete_me != null) {
406 removeLanguage(delete_me);
407 if(default_language != null && default_language.equals(delete_me)) {
408 setDefault(null);
409 clear_button.setEnabled(false);
410 default_language_field.setText("");
411 }
412 }
413 remove_button.setEnabled(false);
414 }
415 }
416
417 /** Listens for selections within the combobox on the LanguageManager controls, and if a change is detected enables, or disables, controls appropriately. */
418 private class SelectorListener
419 implements ActionListener {
420 /** Enable or disable controls depeding on selection.
421 * @param event An <strong>ActionEvent</strong>.
422 */
423 public void actionPerformed(ActionEvent event) {
424 if(selector_combobox.getSelectedItem() != null) {
425 add_button.setEnabled(true);
426 }
427 else {
428 add_button.setEnabled(false);
429 }
430 }
431 }
432
433 /** 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. */
434 private class SetDefaultListener
435 implements ActionListener {
436 /** Set the default index to the one currently selected, if any.
437 * @param event An <strong>ActionEvent</strong>.
438 * @see org.greenstone.gatherer.cdm.Language
439 */
440 public void actionPerformed(ActionEvent event) {
441 if(!language_list.isSelectionEmpty()) {
442 setDefault((Language)language_list.getSelectedValue());
443 clear_button.setEnabled(true);
444 default_language_field.setText(default_language.toString());
445 }
446 }
447 }
448
449 /** Listens for selections within the list on the LanguageManager controls, and if a change is detected enables, or disables, controls appropriately. */
450 private class ListListener
451 implements ListSelectionListener {
452 /** Enable or disable controls depending on the current list selection.
453 * @param event A <strong>ListSelectionEvent</strong>.
454 */
455 public void valueChanged(ListSelectionEvent event) {
456 if(language_list.isSelectionEmpty()) {
457 remove_button.setEnabled(false);
458 set_button.setEnabled(false);
459 }
460 else {
461 remove_button.setEnabled(true);
462 set_button.setEnabled(true);
463 }
464 }
465 }
466 }
467}
468
469
470
471
472
473
474
Note: See TracBrowser for help on using the repository browser.