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

Last change on this file since 36299 was 36299, checked in by kjdon, 21 months ago

deleted some unused code

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