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

Last change on this file since 19041 was 18533, checked in by kjdon, 15 years ago

added Level strings to the list for translation

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