source: other-projects/FileTransfer-WebSocketPair/testGXTWithGreenstone/src/org/greenstone/gatherer/cdm/TranslationView.java@ 33053

Last change on this file since 33053 was 33053, checked in by ak19, 5 years ago

I still had some stuff of Nathan Kelly's (FileTransfer-WebSocketPair) sitting on my USB. Had already commited the Themes folder at the time, 2 years back. Not sure if he wanted this additional folder commited. But I didn't want to delete it and decided it will be better off on SVN. When we use his project, if we find we didn't need this test folder, we can remove it from svn then.

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