source: main/trunk/gli/src/org/greenstone/gatherer/cdm/TranslationView.java@ 36193

Last change on this file since 36193 was 36193, checked in by kjdon, 2 years ago

initial work - not yet finished - on updating translations to handle new searchmeta types

  • Property svn:keywords set to Author Date Id Revision
File size: 33.9 KB
Line 
1/**
2 *#########################################################################
3 *
4 * A component of the Gatherer application, part of the Greenstone digital
5 * library suite from the New Zealand Digital Library Project at the
6 * University of Waikato, New Zealand.
7 *
8 * Author: John Thompson, Greenstone Digital Library, University of Waikato
9 *
10 * Copyright (C) 1999 New Zealand Digital Library Project
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 *########################################################################
26 */
27package org.greenstone.gatherer.cdm;
28
29import java.awt.*;
30import java.awt.event.*;
31import java.util.*;
32import javax.swing.*;
33import javax.swing.event.*;
34import javax.swing.table.*;
35import org.greenstone.gatherer.Configuration;
36import org.greenstone.gatherer.DebugStream;
37import org.greenstone.gatherer.Dictionary;
38import org.greenstone.gatherer.Gatherer;
39import org.greenstone.gatherer.gui.DesignPaneHeader;
40import org.greenstone.gatherer.gui.GLIButton;
41import org.greenstone.gatherer.util.StaticStrings;
42import org.greenstone.gatherer.util.Utility;
43
44/** This class provides a graphical interface to allow a user to quickly and conviently (ie all in one place) translate the text fragments associated with general metadata and indexes into each of the assigned languages in the collection. It should provide clear controls for the editing of these text fragments, plus clear indicate what languages still need further translation, which it will do through a combination of coloring and other visual indicators.
45 * @author John Thompson, Greenstone Digital Library, University of Waikato
46 * @version 2.3
47 */
48public class TranslationView {
49
50 private Control controls;
51
52 static final private Dimension COMPONENT_SIZE = new Dimension(225,25);
53 static final private int LANGUAGE_WIDTH = 75;
54 // static final private String GENERAL_STR = "General:";
55 // static final private String INDEX_STR = "Index:";
56 // static final private String LEVEL_STR = "Level:";
57 // static final private String PARTITION_STR = "Partitions:";
58
59 public TranslationView() {
60 DebugStream.println("TranslationView: Initialized.");
61 }
62
63 public void destroy() {
64 if(controls != null) {
65 controls.destroy();
66 controls = null;
67 }
68 }
69
70 public Control getControls() {
71 if(controls == null) {
72 controls = new TranslationControl();
73 }
74 return controls;
75 }
76
77 /** Called when the detail mode has changed which in turn may cause several design elements to be available/hidden
78 * @param mode the new mode as an int
79 */
80 public void modeChanged(int mode) {
81
82 }
83
84 private CollectionMeta newCollOrSearchMeta(String name, String type, String language) {
85 return newCollOrSearchMeta(name, type, language, false);
86 }
87
88 private CollectionMeta newCollOrSearchMeta(String name, String type, String language, boolean dummy) {
89 CollectionMeta meta;
90 if (type != null) {
91 meta = new SearchMeta(name, type, language, dummy);
92 } else {
93 meta = new CollectionMeta(name, language, dummy);
94 }
95 return meta;
96
97
98 }
99 private TreeSet getLanguages() {
100 TreeSet lang_set = CollectionDesignManager.collectionmeta_manager.getLanguages();
101 System.err.println("coll lang set = "+lang_set);
102 System.err.println("search lang_set = "+CollectionDesignManager.searchmeta_manager.getLanguages());
103 lang_set.addAll(CollectionDesignManager.searchmeta_manager.getLanguages());
104 System.err.println("all lang set = "+lang_set);
105 return lang_set;
106 }
107 private Object[] getFeaturesList() {
108 ArrayList features_model = new ArrayList();
109
110 // add general metadata
111 ArrayList general_metadata = CollectionDesignManager.collectionmeta_manager.getMetadata();
112 for(int i = 0; i < general_metadata.size(); i++) {
113 CollectionMeta metadata = (CollectionMeta) general_metadata.get(i);
114 if(!metadata.isSpecial()) {
115 Object bob = new BobTheMagicalComparableWrapper(metadata.getName(), null);
116 if(!features_model.contains(bob)) {
117 features_model.add(bob);
118 }
119 }
120 }
121
122 // Add the indexes
123 ArrayList indexes = CollectionDesignManager.index_manager.getIndexes();
124 int indexes_size = indexes.size();
125 for(int j = 0; j < indexes_size; j++) {
126 Object bob = new BobTheMagicalComparableWrapper(indexes.get(j), SearchMeta.TYPE_INDEX);
127 if(!features_model.contains(bob)) {
128 features_model.add(bob);
129 }
130 }
131 // Add the levels, if any
132 ArrayList levels = CollectionDesignManager.index_manager.getLevels();
133 if (levels !=null) {
134 int levels_size = levels.size();
135 for (int j=0; j<levels.size(); j++) {
136 Object bob = new BobTheMagicalComparableWrapper(levels.get(j), SearchMeta.TYPE_LEVEL);
137 if(!features_model.contains(bob)) {
138 features_model.add(bob);
139 }
140 }
141 }
142 // Add the sortfields, if any
143 ArrayList sortfields = CollectionDesignManager.index_manager.getSortFields();
144 if (sortfields !=null) {
145 int sort_size = sortfields.size();
146 for (int j=0; j<sort_size; j++) {
147 Object bob = new BobTheMagicalComparableWrapper(sortfields.get(j), SearchMeta.TYPE_SORT);
148 if(!features_model.contains(bob)) {
149 features_model.add(bob);
150 }
151 }
152 }
153 // Add the facets, if any
154 ArrayList facets = CollectionDesignManager.index_manager.getFacets();
155 if (facets !=null) {
156 int facet_size = facets.size();
157 for (int j=0; j<facet_size; j++) {
158 Object bob = new BobTheMagicalComparableWrapper(facets.get(j), SearchMeta.TYPE_FACET);
159 if(!features_model.contains(bob)) {
160 features_model.add(bob);
161 }
162 }
163 }
164 // We also add subindexes.
165 ArrayList subindexes = CollectionDesignManager.subcollectionindex_manager.getSubcollectionIndexes();
166 int subindexes_size = subindexes.size();
167 for(int j = 0; j < subindexes_size; j++) {
168 Object bob = new BobTheMagicalComparableWrapper(subindexes.get(j), SearchMeta.TYPE_PARTITION);
169 if(!features_model.contains(bob)) {
170 features_model.add(bob);
171 }
172 }
173
174 ArrayList languages = CollectionDesignManager.language_manager.getLanguages();
175 int languages_size = languages.size();
176 for(int j = 0; j < languages_size; j++) {
177 Object bob = new BobTheMagicalComparableWrapper(languages.get(j), SearchMeta.TYPE_LANGUAGE);
178 if(!features_model.contains(bob)) {
179 features_model.add(bob);
180 }
181 }
182
183 //Collections.sort(features_model); we want them in this order I reckon
184
185 return features_model.toArray();
186 }
187
188 private class BobTheMagicalComparableWrapper
189 implements Comparable {
190 private Object content;
191 private String text;
192 private String type;
193 BobTheMagicalComparableWrapper(Object content, String type) {
194 this.content = content;
195 this.type = type;
196 }
197 public int compareTo(Object object) {
198 if(object == null) {
199 object = "";
200 }
201 if(text == null) {
202 toString();
203 }
204 return text.compareTo(object.toString());
205 }
206
207 /** Equals is used by contains and since we want to prevent double up of metadata we compare differently than in compareTo. */
208 public boolean equals(Object object) {
209 BobTheMagicalComparableWrapper bob = (BobTheMagicalComparableWrapper)object;
210 return (object != null && content.toString().equals(bob.getContent().toString()) && ((type == null && bob.getType()==null) || type.equals(bob.getType())));
211 }
212
213 public Object getContent() {
214 return content;
215 }
216
217 public String getName() {
218 if (content instanceof IndexOption) {
219 return ((IndexOption)content).getName();
220 }
221 if (content instanceof Index) {
222 return ((Index)content).getID();
223 }
224 if (content instanceof SubcollectionIndex) {
225 return ((SubcollectionIndex)content).getID();
226 }
227 return content.toString();
228 }
229
230 public String getType() {
231 return type;
232 }
233 public String getNameOld() {
234 if(content instanceof Index) {
235 return StaticStrings.STOP_CHARACTER + ((Index)content).getID();
236 }
237 // level
238 else if (content instanceof IndexOption) {
239 return StaticStrings.STOP_CHARACTER + ((IndexOption)content).getName();
240 }
241 else if (content instanceof SubcollectionIndex) {
242 return StaticStrings.STOP_CHARACTER + ((SubcollectionIndex)content).getID();
243 }
244 else {
245 return content.toString();
246 }
247 }
248
249 public String toString() {
250
251 if(text == null) {
252 String temp = content.toString();
253 if (type != null) {
254 text = Dictionary.get("CDM.SearchMetadataManager.Type_"+type)+": "+temp;
255 } else {
256 text = Dictionary.get("CDM.TranslationManager.Type_general")+": "+temp;
257 }
258 // if(temp.indexOf(StaticStrings.SPACE_CHARACTER) != -1) {
259 // temp = temp.substring(0, temp.indexOf(StaticStrings.SPACE_CHARACTER));
260 // }
261 // if(content instanceof Index) {
262 // text = INDEX_STR + temp;
263 // }
264 // else if (content instanceof IndexOption) {
265 // text = LEVEL_STR + temp;
266 // }
267 // else if(content instanceof SubcollectionIndex) {
268 // text = PARTITION_STR + temp;
269 // }
270 // else {
271 // text = GENERAL_STR + temp;
272 // }
273 }
274 return text;
275 }
276 }
277
278 private class TranslationControl
279 extends JPanel
280 implements Control {
281
282 private boolean ignore_event = false;
283 private FragmentTableModel fragment_table_model;
284 private JButton add_button;
285 private JButton remove_button;
286 private JButton replace_button;
287 private JComboBox language_combobox;
288 private JList features_list;
289 private JTable fragment_table;
290 private JTextArea default_area;
291 private JTextArea translation_area;
292
293 TranslationControl() {
294 this.setComponentOrientation(Dictionary.getOrientation());
295 fragment_table_model = new FragmentTableModel("", "", new TreeSet(), new ArrayList());
296 // Creation
297 JPanel header_panel = new DesignPaneHeader("CDM.GUI.Translation", "translatetext");
298
299 JPanel center_panel = new JPanel();
300 center_panel.setComponentOrientation(Dictionary.getOrientation());
301
302 JPanel selection_panel = new JPanel();
303 selection_panel.setComponentOrientation(Dictionary.getOrientation());
304
305 JPanel component_selection_panel = new JPanel();
306 component_selection_panel.setComponentOrientation(Dictionary.getOrientation());
307
308 JLabel component_label = new JLabel(Dictionary.get("CDM.TranslationManager.Affected_Features"));
309 component_label.setComponentOrientation(Dictionary.getOrientation());
310
311 Object[] features = getFeaturesList();
312 features_list = new JList(features);
313 features_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
314 if (features != null && features.length >0){
315 features_list.setSelectedIndex(0);
316 }
317
318 JPanel fragment_selection_panel = new JPanel();
319 fragment_selection_panel.setComponentOrientation(Dictionary.getOrientation());
320 JLabel fragment_label = new JLabel(Dictionary.get("CDM.TranslationManager.Assigned_Fragments"));
321 fragment_label.setComponentOrientation(Dictionary.getOrientation());
322
323 fragment_table = new JTable(fragment_table_model);
324 fragment_table.setComponentOrientation(Dictionary.getOrientation());
325 fragment_table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
326 fragment_table.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
327 fragment_table.setColumnSelectionAllowed(false);
328 fragment_table.setDefaultRenderer(Object.class, new FragmentTableRenderer());
329 fragment_table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
330
331 JScrollPane table_scroll = new JScrollPane(fragment_table);
332 table_scroll.getViewport().setBackground(Configuration.getColor("coloring.collection_tree_background", false));
333 table_scroll.setOpaque(true);
334
335 JPanel south_panel = new JPanel();
336 south_panel.setComponentOrientation(Dictionary.getOrientation());
337
338 JPanel text_panel = new JPanel();
339 text_panel.setComponentOrientation(Dictionary.getOrientation());
340
341 JPanel language_panel = new JPanel();
342 language_panel.setComponentOrientation(Dictionary.getOrientation());
343
344 JLabel language_label = new JLabel(Dictionary.get("CDM.TranslationManager.Language"));
345 language_label.setComponentOrientation(Dictionary.getOrientation());
346
347 language_combobox = new JComboBox(CollectionDesignManager.language_manager.getLanguageCodes().toArray());
348 language_combobox.setOpaque(!Utility.isMac());
349 language_combobox.setPreferredSize(COMPONENT_SIZE);
350 language_combobox.setRenderer(new LanguageListCellRenderer());
351 language_combobox.setToolTipText(Dictionary.get("CDM.TranslationManager.Language_Tooltip"));
352 language_combobox.setComponentOrientation(Dictionary.getOrientation());
353
354 JPanel default_text_panel = new JPanel();
355 default_text_panel.setComponentOrientation(Dictionary.getOrientation());
356 JLabel default_label = new JLabel(Dictionary.get("CDM.TranslationManager.Default_Text"));
357 default_label.setComponentOrientation(Dictionary.getOrientation());
358 default_area = new JTextArea();
359 default_area.setComponentOrientation(Dictionary.getOrientation());
360 default_area.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
361 default_area.setEditable(false);
362 default_area.setLineWrap(true);
363 default_area.setWrapStyleWord(true);
364
365 JPanel translated_text_panel = new JPanel();
366 translated_text_panel.setComponentOrientation(Dictionary.getOrientation());
367 JLabel translation_label = new JLabel(Dictionary.get("CDM.TranslationManager.Translation"));
368 translation_label.setComponentOrientation(Dictionary.getOrientation());
369 translation_area = new JTextArea();
370 translation_area.setComponentOrientation(Dictionary.getOrientation());
371 translation_area.setBackground(Configuration.getColor("coloring.disabled", false));
372 translation_area.setEnabled(false);
373 translation_area.setLineWrap(true);
374 translation_area.setWrapStyleWord(true);
375 translation_area.setToolTipText(Dictionary.get("CDM.TranslationManager.Translation_Tooltip"));
376
377 JPanel button_pane = new JPanel();
378 button_pane.setComponentOrientation(Dictionary.getOrientation());
379 add_button = new GLIButton(Dictionary.get("CDM.TranslationManager.Add"), Dictionary.get("CDM.TranslationManager.Add_Tooltip"));
380 add_button.setEnabled(false);
381
382 replace_button = new GLIButton(Dictionary.get("CDM.TranslationManager.Replace"), Dictionary.get("CDM.TranslationManager.Replace_Tooltip"));
383 replace_button.setEnabled(false);
384
385 remove_button = new GLIButton(Dictionary.get("CDM.TranslationManager.Remove"), Dictionary.get("CDM.TranslationManager.Remove_Tooltip"));
386 remove_button.setEnabled(false);
387
388
389 // Connection
390 add_button.addActionListener(new AddListener());
391 remove_button.addActionListener(new RemoveListener());
392 replace_button.addActionListener(new ReplaceListener());
393 language_combobox.addActionListener(new LanguageActionListener());
394 translation_area.getDocument().addDocumentListener(new TranslationDocumentListener());
395 features_list.addListSelectionListener(new FeaturesListSelectionListener());
396 fragment_table.getSelectionModel().addListSelectionListener(new FragmentListSelectionListener());
397
398 // Layout
399 component_selection_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
400 component_selection_panel.setLayout(new BorderLayout());
401 component_selection_panel.add(component_label, BorderLayout.NORTH);
402 component_selection_panel.add(new JScrollPane(features_list), BorderLayout.CENTER);
403
404 fragment_selection_panel.setLayout(new BorderLayout());
405 fragment_selection_panel.add(fragment_label, BorderLayout.NORTH);
406 fragment_selection_panel.add(table_scroll, BorderLayout.CENTER);
407
408 selection_panel.setLayout(new GridLayout(2,1,0,5));
409 selection_panel.add(component_selection_panel);
410 selection_panel.add(fragment_selection_panel);
411
412 default_text_panel.setLayout(new BorderLayout());
413 default_text_panel.add(default_label, BorderLayout.NORTH);
414 default_text_panel.add(new JScrollPane(default_area), BorderLayout.CENTER);
415
416 translated_text_panel.setLayout(new BorderLayout());
417 translated_text_panel.add(translation_label, BorderLayout.NORTH);
418 translated_text_panel.add(new JScrollPane(translation_area), BorderLayout.CENTER);
419
420 text_panel.setLayout(new GridLayout(1,2,5,0));
421 text_panel.add(default_text_panel);
422 text_panel.add(translated_text_panel);
423
424 language_panel.setLayout(new BorderLayout(5,0));
425 language_panel.add(language_label, BorderLayout.LINE_START);
426 language_panel.add(language_combobox, BorderLayout.CENTER);
427
428 south_panel.setLayout(new BorderLayout());
429 south_panel.add(language_panel, BorderLayout.NORTH);
430 south_panel.add(text_panel, BorderLayout.CENTER);
431
432 center_panel.setLayout(new GridLayout(2,1,0,5));
433 center_panel.add(selection_panel);
434 center_panel.add(south_panel);
435
436 button_pane.setBorder(BorderFactory.createEmptyBorder(2,0,0,0));
437 button_pane.setLayout(new GridLayout(1,3));
438 button_pane.add(add_button);
439 button_pane.add(replace_button);
440 button_pane.add(remove_button);
441
442 setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
443 setLayout(new BorderLayout());
444 add(header_panel, BorderLayout.NORTH);
445 add(center_panel, BorderLayout.CENTER);
446 add(button_pane, BorderLayout.SOUTH);
447 }
448
449 public void destroy() {
450 }
451
452 public void gainFocus() {
453 // Rebuild the features model, just incase features have been added or removed.
454 if(features_list != null) {
455 Object selected_feature = features_list.getSelectedValue();
456 features_list.setListData(getFeaturesList());
457 if(selected_feature != null) {
458 features_list.setSelectedValue(selected_feature, true);
459 }
460 }
461 }
462
463 public void loseFocus() {
464 }
465
466
467 private class AddListener
468 implements ActionListener {
469
470 public void actionPerformed(ActionEvent event) {
471 ignore_event = true;
472 String translation_text = translation_area.getText();
473 if(translation_text.length() > 0) {
474 // If there is no current fragment table selection, but translation text is not an empty string, then this is a new fragment. Create new collection metadata, refresh the fragment table, then ensure that the new metadata is selected. Remember that it is the selected metadata to which changes will be applied.
475 BobTheMagicalComparableWrapper selected_feature = (BobTheMagicalComparableWrapper)features_list.getSelectedValue();
476 String language = (String) language_combobox.getSelectedItem();
477 CollectionMeta metadatum = newCollOrSearchMeta(selected_feature.getName(), selected_feature.getType(), language); //new CollectionMeta(selected_feature.getName(), language);
478 metadatum.setValue(translation_text);
479 fragment_table.clearSelection();
480 ArrayList metadata;
481 if (metadatum instanceof SearchMeta) {
482 System.err.println("adding meta to search" + metadatum);
483 CollectionDesignManager.searchmeta_manager.addMetadatum(metadatum);
484
485 metadata = CollectionDesignManager.searchmeta_manager.getMetadata(selected_feature.getName(), selected_feature.getType());
486 System.err.println("metadata = "+metadata);
487 } else {
488 // just a general metadata
489 System.err.println("adding meta to general");
490 CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
491
492 metadata = CollectionDesignManager.collectionmeta_manager.getMetadata(selected_feature.getName());
493 }
494 System.err.println("new langues = "+getLanguages());
495 fragment_table_model.setData(selected_feature.getName(), selected_feature.getType(), getLanguages(), metadata);
496 int index = fragment_table_model.getMetadataIndexByLanguage(language);
497 System.err.println("I want to select the row " + index + " out of " + metadata.size());
498 fragment_table.setRowSelectionInterval(index, index);
499 metadatum = null;
500 language = null;
501 selected_feature = null;
502 translation_text = null;
503 remove_button.setEnabled(true);
504 }
505 add_button.setEnabled(false);
506 replace_button.setEnabled(false);
507 ignore_event = false;
508 }
509 }
510
511 private class RemoveListener
512 implements ActionListener {
513
514 public void actionPerformed(ActionEvent event) {
515 ignore_event = true;
516 int index = -1;
517 if((index = fragment_table.getSelectedRow()) != -1) {
518 CollectionMeta metadata = fragment_table_model.getMetadata(index);
519 if (metadata instanceof SearchMeta) {
520 CollectionDesignManager.searchmeta_manager.removeMetadata(metadata);
521 } else {
522 CollectionDesignManager.collectionmeta_manager.removeMetadata(metadata);
523 }
524 fragment_table_model.remove(index);
525 // If a remove occured then enable add
526 add_button.setEnabled(true);
527 }
528 // Either way disable replace and remove
529 replace_button.setEnabled(false);
530 remove_button.setEnabled(false);
531 ignore_event = false;
532 }
533 }
534
535 private class ReplaceListener
536 implements ActionListener {
537
538 public void actionPerformed(ActionEvent event) {
539 ignore_event = true;
540 int index = -1;
541 if((index = fragment_table.getSelectedRow()) != -1) {
542 String translation_text = translation_area.getText();
543 // Get the selected collection metadata
544 CollectionMeta metadata = fragment_table_model.getMetadata(index);
545 // Update the fragment metadata and ask the table to repaint the appropriate row
546 metadata.setValue(translation_text);
547 fragment_table_model.fireTableRowsUpdated(index, index);
548 metadata = null;
549 remove_button.setEnabled(true);
550 }
551 // Either way disable replace
552 add_button.setEnabled(false);
553 replace_button.setEnabled(false);
554 ignore_event = false;
555 }
556 }
557
558 private class FeaturesListSelectionListener
559 implements ListSelectionListener {
560 public void valueChanged(ListSelectionEvent event) {
561 if(!event.getValueIsAdjusting() && !ignore_event) {
562 ///ystem.err.println("FeaturesListSelectionListener");
563 if(!features_list.isSelectionEmpty()) {
564 // Determine the features name. Remember to remove our helpful source prefix (delimited by ':').
565 BobTheMagicalComparableWrapper selected_feature = (BobTheMagicalComparableWrapper)features_list.getSelectedValue();
566 // Retrieve the default language translation, or otherwise the first match, to be default text.
567 CollectionMeta default_metadata;
568 // Update the text fragment table.
569 fragment_table.clearSelection();
570 if (selected_feature.getType() != null) {
571 default_metadata = CollectionDesignManager.searchmeta_manager.getMetadatum(selected_feature.getName(), selected_feature.getType());
572 fragment_table_model.setData(selected_feature.getName(), selected_feature.getType(), getLanguages(), CollectionDesignManager.searchmeta_manager.getMetadata(selected_feature.getName()));
573 } else {
574 default_metadata = CollectionDesignManager.collectionmeta_manager.getMetadatum(selected_feature.getName());
575 fragment_table_model.setData(selected_feature.getName(), selected_feature.getType(), getLanguages(), CollectionDesignManager.collectionmeta_manager.getMetadata(selected_feature.getName()));
576 }
577 if(default_metadata != null) {
578 default_area.setText(default_metadata.getValue(CollectionMeta.TEXT));
579 }
580
581 selected_feature = null;
582 // Now we check whatever value is currently selected in the combobox to see if it is valid to add.
583 String language_name = (String) language_combobox.getSelectedItem();
584 int index = fragment_table_model.getMetadataIndexByLanguage(language_name);
585 if(index != -1) {
586 CollectionMeta metadata = fragment_table_model.getMetadata(index);
587 fragment_table.setRowSelectionInterval(index, index);
588 if(metadata != null) {
589 translation_area.setText(metadata.getValue(CollectionMeta.TEXT));
590 }
591 else {
592 translation_area.setText("");
593 }
594 metadata = null;
595 }
596 else {
597 translation_area.setText("");
598 }
599 // Update and enable the text area
600 translation_area.setEnabled(true);
601 translation_area.setBackground(Configuration.getColor("coloring.editable_background", false));
602 }
603 else {
604 default_area.setText("");
605 fragment_table.clearSelection();
606 fragment_table_model.setData("", "", new TreeSet(), new ArrayList());
607 translation_area.setText("");
608 // Update and disable the text area
609 translation_area.setText("");
610 translation_area.setEnabled(false);
611 translation_area.setBackground(Configuration.getColor("coloring.disabled", false));
612 }
613 }
614 }
615 }
616
617 private class FragmentListSelectionListener
618 implements ListSelectionListener {
619 public void valueChanged(ListSelectionEvent event) {
620 if(!event.getValueIsAdjusting() && !ignore_event) {
621 ignore_event = true;
622 ///ystem.err.println("FragmentListSelectionListener");
623 int index = -1;
624 if((index = fragment_table.getSelectedRow()) != -1) {
625 // A row has been selected. Retrieve the collection metadata.
626 CollectionMeta metadatum = fragment_table_model.getMetadata(index);
627 if(metadatum != null) {
628 // Update the combobox to show the current language.
629 String language = metadatum.getLanguage();
630 ///ystem.err.println("Searching for the language: " + language_name);
631 for(int i = 0; i < language_combobox.getItemCount(); i++) {
632 if(language_combobox.getItemAt(i).toString().equals(language)) {
633 language_combobox.setSelectedIndex(i);
634 }
635 }
636 translation_area.setText(metadatum.getValue(CollectionMeta.TEXT));
637 remove_button.setEnabled(!metadatum.isDummy());
638 }
639 else {
640 remove_button.setEnabled(false);
641 }
642 }
643 else {
644 translation_area.setText("");
645 remove_button.setEnabled(false);
646 }
647 ignore_event = false;
648 }
649 }
650 }
651
652 private class FragmentTableModel
653 extends AbstractTableModel {
654
655 private ArrayList metadata;
656 private String feature_name;
657 private String feature_type;
658 private TreeSet languages;
659
660 FragmentTableModel(String feature_name, String feature_type, TreeSet languages, ArrayList metadata) {
661 this.feature_name = feature_name;
662 this.feature_type = feature_type;
663 this.languages = languages;
664 this.metadata = metadata;
665 }
666 public int getRowCount() {
667 // The row count is equal to the maximum number of languages currently assigned in the collection.
668 return languages.size();
669 }
670 public int getColumnCount() {
671 return 2;
672 }
673
674 public String getColumnName(int column) {
675 if (column == 0) {
676 return Dictionary.get("CDM.TranslationManager.Language_Column");
677 }
678 if (column == 1) {
679 return Dictionary.get("CDM.TranslationManager.Fragment_Column");
680 }
681 return "";
682 }
683
684 /** Attempt to retrieve the metadata associated with a certain row - however not all rows actually have metadata with them (say the French row where no metadata has been set).
685 * @param row the row number as an int
686 * @return the CollectionMeta requested, which may be a dummy metadata pair
687 */
688 public CollectionMeta getMetadata(int row) {
689 // Determine what language we are talking about
690 String language = null;
691 Iterator language_iterator = languages.iterator();
692 int current_row = 0;
693 while(current_row != row && language_iterator.hasNext()) {
694 language_iterator.next();
695 current_row++;
696 }
697 if(current_row == row) {
698 language = (String) language_iterator.next();
699 return getMetadata(language);
700 }
701 language_iterator = null;
702 return null;
703 }
704
705 public CollectionMeta getMetadata(String language) {
706 // Attempt to retrieve metadata with that language
707 for(int i = 0; i < metadata.size(); i++) {
708 CollectionMeta metadatum = (CollectionMeta) metadata.get(i);
709 if(metadatum.getLanguage().equals(language)) {
710 return metadatum;
711 }
712 }
713 //return new CollectionMeta(feature_name, language, true);
714 return newCollOrSearchMeta(feature_name, feature_type, language, true);
715 }
716
717 public int getMetadataIndexByLanguage(String language) {
718 ///ystem.err.println("Find the index for the language " + language + " (out of " + languages.size() + ")");
719 // First we have to iterate to the correct place
720 Iterator language_iterator = languages.iterator();
721 int current_row = 0;
722 while(language_iterator.hasNext()) {
723 String target = (String)language_iterator.next();
724 if(language.equals(target)) {
725 ///ystem.err.println("Matches " + target);
726 return current_row;
727 }
728 else {
729 ///ystem.err.println("Doesn't match " + target);
730 current_row++;
731 }
732 }
733 ///ystem.err.println("No such language in model: -1");
734 return -1;
735 }
736
737 public Object getValueAt(int row, int column) {
738 if(0 <= row && row < languages.size()) {
739 // First we have to iterate to the correct place
740 Iterator language_iterator = languages.iterator();
741 int current_row = 0;
742 while(current_row != row && language_iterator.hasNext()) {
743 language_iterator.next();
744 current_row++;
745 }
746 if(current_row == row) {
747 String language = (String)language_iterator.next();
748 if(column == 0) {
749 return CollectionDesignManager.language_manager.getLanguageName(language);
750 }
751 else {
752 CollectionMeta metadatum = getMetadata(language);
753 return metadatum.getValue(CollectionMeta.TEXT);
754 }
755 }
756 language_iterator = null;
757 }
758 return "#Error";
759 }
760
761 public void remove(int index) {
762 metadata.remove(index);
763 fireTableRowsDeleted(index, index);
764 }
765
766 public void setData(String feature_name, String feature_type, TreeSet languages, ArrayList metadata) {
767 this.feature_name = feature_name;
768 this.feature_type = feature_type;
769 this.languages = languages;
770 this.metadata = metadata;
771 fireTableDataChanged();
772 }
773
774 public int size() {
775 return metadata.size();
776 }
777 }
778
779 private class FragmentTableRenderer
780 extends DefaultTableCellRenderer {
781 /** Retrieve the component used to rubberstamp the table based on the given parameters.
782 * @param table The <strong>JTable</strong> to rendered.
783 * @param value The <strong>Object</strong> whose representation will be shown in the table row.
784 * @param isSelected <i>true</i> iff the column/row is selected.
785 * @param hasFocus <i>true</i> iff the column/row is in focus.
786 * @param row An <i>int</i> specifying the target row.
787 * @param column An <i>int</i> specifying the target column.
788 * @see org.greenstone.gatherer.cdm.Language
789 */
790 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
791 JComponent component = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
792 if(isSelected) {
793 component.setBackground(Configuration.getColor("coloring.workspace_heading_background", false));
794 }
795 else {
796 component.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
797 }
798 return component;
799 }
800 }
801
802 private class LanguageActionListener
803 implements ActionListener {
804 public void actionPerformed(ActionEvent event) {
805 if(!ignore_event && features_list.getSelectedIndex()>-1) {
806 ignore_event = true;
807 ///ystem.err.println("LanguageActionListener");
808 // If the newly selected language value already exists in the fragment table, and that row isn't the one selected, then select that row the text area.
809 String language_name = language_combobox.getSelectedItem().toString();
810 int index = fragment_table_model.getMetadataIndexByLanguage(language_name);
811 if(index != -1) {
812 CollectionMeta metadata = fragment_table_model.getMetadata(index);
813 fragment_table.setRowSelectionInterval(index, index);
814 translation_area.setText(metadata.getValue(CollectionMeta.TEXT));
815 }
816 else {
817 fragment_table.clearSelection();
818 translation_area.setText("");
819 }
820 // Ready the text area
821 translation_area.setEnabled(true);
822 translation_area.setBackground(Configuration.getColor("coloring.editable_background", false));
823 ignore_event = false;
824 }
825 }
826 }
827
828 private class TranslationDocumentListener
829 implements DocumentListener {
830 /** Gives notification that an attribute or set of attributes changed. */
831 public void changedUpdate(DocumentEvent e) {
832 update();
833 }
834 /** Gives notification that there was an insert into the document. */
835 public void insertUpdate(DocumentEvent e) {
836 update();
837 }
838 /** Gives notification that a portion of the document has been removed. */
839 public void removeUpdate(DocumentEvent e) {
840 update();
841 }
842 /** The text area has changed in some way. Given that this can only happed when we are editing or adding a text fragment we better respond appropriately. */
843 private void update() {
844 String translation_text = translation_area.getText();
845 // Determine if add should be enabled. You can only add if the current text fragment doesn't already exist in the fragment table for the given language
846 String language = (String) language_combobox.getSelectedItem();
847 CollectionMeta metadatum = fragment_table_model.getMetadata(language);
848 add_button.setEnabled(translation_text.length() > 0 && (metadatum.isDummy() || fragment_table_model.getMetadataIndexByLanguage(language) == -1));
849 language = null;
850 // Determine if replace should be enabled. Replace is only enabled it the text fragment is different from the one in the current fragment table selection.
851 if(fragment_table.getSelectedRowCount() > 0) {
852 replace_button.setEnabled(!metadatum.isDummy() && !translation_text.equals(fragment_table.getValueAt(fragment_table.getSelectedRow(), 1)));
853 }
854 // Nothing selected, nothing to replace
855 else {
856 replace_button.setEnabled(false);
857 }
858 translation_text = null;
859 }
860 }
861 }
862}
Note: See TracBrowser for help on using the repository browser.