source: gli/branches/2.81-fixed/src/org/greenstone/gatherer/cdm/TranslationView.java@ 18834

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

committing fix 18533 to branch - added Level strings to the list for translation

  • Property svn:keywords set to Author Date Id Revision
File size: 27.9 KB
Line 
1/**
2 *#########################################################################
3 *
4 * A component of the Gatherer application, part of the Greenstone digital
5 * library suite from the New Zealand Digital Library Project at the
6 * University of Waikato, New Zealand.
7 *
8 * Author: John Thompson, Greenstone Digital Library, University of Waikato
9 *
10 * Copyright (C) 1999 New Zealand Digital Library Project
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 *########################################################################
26 */
27package org.greenstone.gatherer.cdm;
28
29import java.awt.*;
30import java.awt.event.*;
31import java.util.*;
32import javax.swing.*;
33import javax.swing.event.*;
34import javax.swing.table.*;
35import org.greenstone.gatherer.Configuration;
36import org.greenstone.gatherer.DebugStream;
37import org.greenstone.gatherer.Dictionary;
38import org.greenstone.gatherer.Gatherer;
39import org.greenstone.gatherer.gui.DesignPaneHeader;
40import org.greenstone.gatherer.gui.GLIButton;
41import org.greenstone.gatherer.util.StaticStrings;
42import org.greenstone.gatherer.util.Utility;
43
44/** This class provides a graphical interface to allow a user to quickly and conviently (ie all in one place) translate the text fragments associated with general metadata and indexes into each of the assigned languages in the collection. It should provide clear controls for the editing of these text fragments, plus clear indicate what languages still need further translation, which it will do through a combination of coloring and other visual indicators.
45 * @author John Thompson, Greenstone Digital Library, University of Waikato
46 * @version 2.3
47 */
48public class TranslationView {
49
50 private Control controls;
51
52 static final private Dimension COMPONENT_SIZE = new Dimension(225,25);
53 static final private int LANGUAGE_WIDTH = 75;
54 static final private String GENERAL_STR = "General:";
55 static final private String INDEX_STR = "Index:";
56 static final private String LEVEL_STR = "Level:";
57 static final private String PARTITION_STR = "Partitions:";
58
59 public TranslationView() {
60 DebugStream.println("TranslationView: Initialized.");
61 }
62
63 public void destroy() {
64 if(controls != null) {
65 controls.destroy();
66 controls = null;
67 }
68 }
69
70 public Control getControls() {
71 if(controls == null) {
72 controls = new TranslationControl();
73 }
74 return controls;
75 }
76
77 /** Called when the detail mode has changed which in turn may cause several design elements to be available/hidden
78 * @param mode the new mode as an int
79 */
80 public void modeChanged(int mode) {
81
82 }
83
84 private 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 fragment_table_model = new FragmentTableModel("", new TreeSet(), new ArrayList());
215 // Creation
216 JPanel header_panel = new DesignPaneHeader("CDM.GUI.Translation", "translatetext");
217
218 JPanel center_panel = new JPanel();
219
220 JPanel selection_panel = new JPanel();
221
222 JPanel component_selection_panel = new JPanel();
223 JLabel component_label = new JLabel(Dictionary.get("CDM.TranslationManager.Affected_Features"));
224
225
226 Object[] features = getFeaturesList();
227 features_list = new JList(features);
228 features_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
229 if (features != null && features.length >0){
230 features_list.setSelectedIndex(0);
231 }
232
233 JPanel fragment_selection_panel = new JPanel();
234 JLabel fragment_label = new JLabel(Dictionary.get("CDM.TranslationManager.Assigned_Fragments"));
235
236 fragment_table = new JTable(fragment_table_model);
237 fragment_table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
238 fragment_table.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
239 fragment_table.setColumnSelectionAllowed(false);
240 fragment_table.setDefaultRenderer(Object.class, new FragmentTableRenderer());
241 fragment_table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
242
243 JScrollPane table_scroll = new JScrollPane(fragment_table);
244 table_scroll.getViewport().setBackground(Configuration.getColor("coloring.collection_tree_background", false));
245 table_scroll.setOpaque(true);
246
247 JPanel south_panel = new JPanel();
248
249 JPanel text_panel = new JPanel();
250
251 JPanel language_panel = new JPanel();
252 JLabel language_label = new JLabel(Dictionary.get("CDM.TranslationManager.Language"));
253
254 language_combobox = new JComboBox(CollectionDesignManager.language_manager.getLanguageCodes().toArray());
255 language_combobox.setOpaque(!Utility.isMac());
256 language_combobox.setPreferredSize(COMPONENT_SIZE);
257 language_combobox.setRenderer(new LanguageListCellRenderer());
258 language_combobox.setToolTipText(Dictionary.get("CDM.TranslationManager.Language_Tooltip"));
259
260 JPanel default_text_panel = new JPanel();
261 JLabel default_label = new JLabel(Dictionary.get("CDM.TranslationManager.Default_Text"));
262
263 default_area = new JTextArea();
264 default_area.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
265 default_area.setEditable(false);
266 default_area.setLineWrap(true);
267 default_area.setWrapStyleWord(true);
268
269 JPanel translated_text_panel = new JPanel();
270 JLabel translation_label = new JLabel(Dictionary.get("CDM.TranslationManager.Translation"));
271
272 translation_area = new JTextArea();
273 translation_area.setBackground(Configuration.getColor("coloring.disabled", false));
274 translation_area.setEnabled(false);
275 translation_area.setLineWrap(true);
276 translation_area.setWrapStyleWord(true);
277 translation_area.setToolTipText(Dictionary.get("CDM.TranslationManager.Translation_Tooltip"));
278
279 JPanel button_pane = new JPanel();
280 add_button = new GLIButton(Dictionary.get("CDM.TranslationManager.Add"), Dictionary.get("CDM.TranslationManager.Add_Tooltip"));
281 add_button.setEnabled(false);
282
283 replace_button = new GLIButton(Dictionary.get("CDM.TranslationManager.Replace"), Dictionary.get("CDM.TranslationManager.Replace_Tooltip"));
284 replace_button.setEnabled(false);
285
286 remove_button = new GLIButton(Dictionary.get("CDM.TranslationManager.Remove"), Dictionary.get("CDM.TranslationManager.Remove_Tooltip"));
287 remove_button.setEnabled(false);
288
289
290 // Connection
291 add_button.addActionListener(new AddListener());
292 remove_button.addActionListener(new RemoveListener());
293 replace_button.addActionListener(new ReplaceListener());
294 language_combobox.addActionListener(new LanguageActionListener());
295 translation_area.getDocument().addDocumentListener(new TranslationDocumentListener());
296 features_list.addListSelectionListener(new FeaturesListSelectionListener());
297 fragment_table.getSelectionModel().addListSelectionListener(new FragmentListSelectionListener());
298
299 // Layout
300 component_selection_panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0));
301 component_selection_panel.setLayout(new BorderLayout());
302 component_selection_panel.add(component_label, BorderLayout.NORTH);
303 component_selection_panel.add(new JScrollPane(features_list), BorderLayout.CENTER);
304
305 fragment_selection_panel.setLayout(new BorderLayout());
306 fragment_selection_panel.add(fragment_label, BorderLayout.NORTH);
307 fragment_selection_panel.add(table_scroll, BorderLayout.CENTER);
308
309 selection_panel.setLayout(new GridLayout(2,1,0,5));
310 selection_panel.add(component_selection_panel);
311 selection_panel.add(fragment_selection_panel);
312
313 default_text_panel.setLayout(new BorderLayout());
314 default_text_panel.add(default_label, BorderLayout.NORTH);
315 default_text_panel.add(new JScrollPane(default_area), BorderLayout.CENTER);
316
317 translated_text_panel.setLayout(new BorderLayout());
318 translated_text_panel.add(translation_label, BorderLayout.NORTH);
319 translated_text_panel.add(new JScrollPane(translation_area), BorderLayout.CENTER);
320
321 text_panel.setLayout(new GridLayout(1,2,5,0));
322 text_panel.add(default_text_panel);
323 text_panel.add(translated_text_panel);
324
325 language_panel.setLayout(new BorderLayout(5,0));
326 language_panel.add(language_label, BorderLayout.WEST);
327 language_panel.add(language_combobox, BorderLayout.CENTER);
328
329 south_panel.setLayout(new BorderLayout());
330 south_panel.add(language_panel, BorderLayout.NORTH);
331 south_panel.add(text_panel, BorderLayout.CENTER);
332
333 center_panel.setLayout(new GridLayout(2,1,0,5));
334 center_panel.add(selection_panel);
335 center_panel.add(south_panel);
336
337 button_pane.setBorder(BorderFactory.createEmptyBorder(2,0,0,0));
338 button_pane.setLayout(new GridLayout(1,3));
339 button_pane.add(add_button);
340 button_pane.add(replace_button);
341 button_pane.add(remove_button);
342
343 setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
344 setLayout(new BorderLayout());
345 add(header_panel, BorderLayout.NORTH);
346 add(center_panel, BorderLayout.CENTER);
347 add(button_pane, BorderLayout.SOUTH);
348 }
349
350 public void destroy() {
351 }
352
353 public void gainFocus() {
354 // Rebuild the features model, just incase features have been added or removed.
355 if(features_list != null) {
356 Object selected_feature = features_list.getSelectedValue();
357 features_list.setListData(getFeaturesList());
358 if(selected_feature != null) {
359 features_list.setSelectedValue(selected_feature, true);
360 }
361 }
362 }
363
364 public void loseFocus() {
365 }
366
367
368 private class AddListener
369 implements ActionListener {
370
371 public void actionPerformed(ActionEvent event) {
372 ignore_event = true;
373 String translation_text = translation_area.getText();
374 if(translation_text.length() > 0) {
375 // 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.
376 BobTheMagicalComparableWrapper selected_feature = (BobTheMagicalComparableWrapper)features_list.getSelectedValue();
377 String language = (String) language_combobox.getSelectedItem();
378 CollectionMeta metadatum = new CollectionMeta(selected_feature.getName(), language);
379 metadatum.setValue(translation_text);
380 CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
381 fragment_table.clearSelection();
382 ArrayList metadata = CollectionDesignManager.collectionmeta_manager.getMetadata(selected_feature.getName());
383 fragment_table_model.setData(selected_feature.getName(), CollectionDesignManager.collectionmeta_manager.getLanguages(), metadata);
384 int index = fragment_table_model.getMetadataIndexByLanguage(language);
385 ///ystem.err.println("I want to select the row " + index + " out of " + metadata.size());
386 fragment_table.setRowSelectionInterval(index, index);
387 metadatum = null;
388 language = null;
389 selected_feature = null;
390 translation_text = null;
391 remove_button.setEnabled(true);
392 }
393 add_button.setEnabled(false);
394 replace_button.setEnabled(false);
395 ignore_event = false;
396 }
397 }
398
399 private class RemoveListener
400 implements ActionListener {
401
402 public void actionPerformed(ActionEvent event) {
403 ignore_event = true;
404 int index = -1;
405 if((index = fragment_table.getSelectedRow()) != -1) {
406 CollectionMeta metadata = fragment_table_model.getMetadata(index);
407 CollectionDesignManager.collectionmeta_manager.removeMetadata(metadata);
408 fragment_table_model.remove(index);
409 // If a remove occured then enable add
410 add_button.setEnabled(true);
411 }
412 // Either way disable replace and remove
413 replace_button.setEnabled(false);
414 remove_button.setEnabled(false);
415 ignore_event = false;
416 }
417 }
418
419 private class ReplaceListener
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 String translation_text = translation_area.getText();
427 // Get the selected collection metadata
428 CollectionMeta metadata = fragment_table_model.getMetadata(index);
429 // Update the fragment metadata and ask the table to repaint the appropriate row
430 metadata.setValue(translation_text);
431 fragment_table_model.fireTableRowsUpdated(index, index);
432 metadata = null;
433 remove_button.setEnabled(true);
434 }
435 // Either way disable replace
436 add_button.setEnabled(false);
437 replace_button.setEnabled(false);
438 ignore_event = false;
439 }
440 }
441
442 private class FeaturesListSelectionListener
443 implements ListSelectionListener {
444 public void valueChanged(ListSelectionEvent event) {
445 if(!event.getValueIsAdjusting() && !ignore_event) {
446 ///ystem.err.println("FeaturesListSelectionListener");
447 if(!features_list.isSelectionEmpty()) {
448 // Determine the features name. Remember to remove our helpful source prefix (delimited by ':').
449 BobTheMagicalComparableWrapper selected_feature = (BobTheMagicalComparableWrapper)features_list.getSelectedValue();
450 // Retrieve the default language translation, or otherwise the first match, to be default text.
451 CollectionMeta default_metadata = CollectionDesignManager.collectionmeta_manager.getMetadatum(selected_feature.getName());
452 if(default_metadata != null) {
453 default_area.setText(default_metadata.getValue(CollectionMeta.TEXT));
454 }
455 // Update the text fragment table.
456 fragment_table.clearSelection();
457 fragment_table_model.setData(selected_feature.getName(), CollectionDesignManager.collectionmeta_manager.getLanguages(), CollectionDesignManager.collectionmeta_manager.getMetadata(selected_feature.getName()));
458 selected_feature = null;
459 // Now we check whatever value is currently selected in the combobox to see if it is valid to add.
460 String language_name = (String) language_combobox.getSelectedItem();
461 int index = fragment_table_model.getMetadataIndexByLanguage(language_name);
462 if(index != -1) {
463 CollectionMeta metadata = fragment_table_model.getMetadata(index);
464 fragment_table.setRowSelectionInterval(index, index);
465 if(metadata != null) {
466 translation_area.setText(metadata.getValue(CollectionMeta.TEXT));
467 }
468 else {
469 translation_area.setText("");
470 }
471 metadata = null;
472 }
473 else {
474 translation_area.setText("");
475 }
476 // Update and enable the text area
477 translation_area.setEnabled(true);
478 translation_area.setBackground(Configuration.getColor("coloring.editable_background", false));
479 }
480 else {
481 default_area.setText("");
482 fragment_table.clearSelection();
483 fragment_table_model.setData("", new TreeSet(), new ArrayList());
484 translation_area.setText("");
485 // Update and disable the text area
486 translation_area.setText("");
487 translation_area.setEnabled(false);
488 translation_area.setBackground(Configuration.getColor("coloring.disabled", false));
489 }
490 }
491 }
492 }
493
494 private class FragmentListSelectionListener
495 implements ListSelectionListener {
496 public void valueChanged(ListSelectionEvent event) {
497 if(!event.getValueIsAdjusting() && !ignore_event) {
498 ignore_event = true;
499 ///ystem.err.println("FragmentListSelectionListener");
500 int index = -1;
501 if((index = fragment_table.getSelectedRow()) != -1) {
502 // A row has been selected. Retrieve the collection metadata.
503 CollectionMeta metadatum = fragment_table_model.getMetadata(index);
504 if(metadatum != null) {
505 // Update the combobox to show the current language.
506 String language = metadatum.getLanguage();
507 ///ystem.err.println("Searching for the language: " + language_name);
508 for(int i = 0; i < language_combobox.getItemCount(); i++) {
509 if(language_combobox.getItemAt(i).toString().equals(language)) {
510 language_combobox.setSelectedIndex(i);
511 }
512 }
513 translation_area.setText(metadatum.getValue(CollectionMeta.TEXT));
514 remove_button.setEnabled(!metadatum.isDummy());
515 }
516 else {
517 remove_button.setEnabled(false);
518 }
519 }
520 else {
521 translation_area.setText("");
522 remove_button.setEnabled(false);
523 }
524 ignore_event = false;
525 }
526 }
527 }
528
529 private class FragmentTableModel
530 extends AbstractTableModel {
531
532 private ArrayList metadata;
533 private String feature_name;
534 private TreeSet languages;
535
536 FragmentTableModel(String feature_name, TreeSet languages, ArrayList metadata) {
537 this.feature_name = feature_name;
538 this.languages = languages;
539 this.metadata = metadata;
540 }
541 public int getRowCount() {
542 // The row count is equal to the maximum number of languages currently assigned in the collection.
543 return languages.size();
544 }
545 public int getColumnCount() {
546 return 2;
547 }
548
549 public String getColumnName(int column) {
550 if (column == 0) {
551 return Dictionary.get("CDM.TranslationManager.Language_Column");
552 }
553 if (column == 1) {
554 return Dictionary.get("CDM.TranslationManager.Fragment_Column");
555 }
556 return "";
557 }
558
559 /** 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).
560 * @param row the row number as an int
561 * @return the CollectionMeta requested, which may be a dummy metadata pair
562 */
563 public CollectionMeta getMetadata(int row) {
564 // Determine what language we are talking about
565 String language = null;
566 Iterator language_iterator = languages.iterator();
567 int current_row = 0;
568 while(current_row != row && language_iterator.hasNext()) {
569 language_iterator.next();
570 current_row++;
571 }
572 if(current_row == row) {
573 language = (String) language_iterator.next();
574 return getMetadata(language);
575 }
576 language_iterator = null;
577 return null;
578 }
579
580 public CollectionMeta getMetadata(String language) {
581 // Attempt to retrieve metadata with that language
582 for(int i = 0; i < metadata.size(); i++) {
583 CollectionMeta metadatum = (CollectionMeta) metadata.get(i);
584 if(metadatum.getLanguage().equals(language)) {
585 return metadatum;
586 }
587 }
588 return new CollectionMeta(feature_name, language, true);
589 }
590
591 public int getMetadataIndexByLanguage(String language) {
592 ///ystem.err.println("Find the index for the language " + language + " (out of " + languages.size() + ")");
593 // First we have to iterate to the correct place
594 Iterator language_iterator = languages.iterator();
595 int current_row = 0;
596 while(language_iterator.hasNext()) {
597 String target = (String)language_iterator.next();
598 if(language.equals(target)) {
599 ///ystem.err.println("Matches " + target);
600 return current_row;
601 }
602 else {
603 ///ystem.err.println("Doesn't match " + target);
604 current_row++;
605 }
606 }
607 ///ystem.err.println("No such language in model: -1");
608 return -1;
609 }
610
611 public Object getValueAt(int row, int column) {
612 if(0 <= row && row < 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(current_row != row && language_iterator.hasNext()) {
617 language_iterator.next();
618 current_row++;
619 }
620 if(current_row == row) {
621 String language = (String)language_iterator.next();
622 if(column == 0) {
623 return CollectionDesignManager.language_manager.getLanguageName(language);
624 }
625 else {
626 CollectionMeta metadatum = getMetadata(language);
627 return metadatum.getValue(CollectionMeta.TEXT);
628 }
629 }
630 language_iterator = null;
631 }
632 return "#Error";
633 }
634
635 public void remove(int index) {
636 metadata.remove(index);
637 fireTableRowsDeleted(index, index);
638 }
639
640 public void setData(String feature_name, TreeSet languages, ArrayList metadata) {
641 this.feature_name = feature_name;
642 this.languages = languages;
643 this.metadata = metadata;
644 fireTableDataChanged();
645 }
646
647 public int size() {
648 return metadata.size();
649 }
650 }
651
652 private class FragmentTableRenderer
653 extends DefaultTableCellRenderer {
654 /** Retrieve the component used to rubberstamp the table based on the given parameters.
655 * @param table The <strong>JTable</strong> to rendered.
656 * @param value The <strong>Object</strong> whose representation will be shown in the table row.
657 * @param isSelected <i>true</i> iff the column/row is selected.
658 * @param hasFocus <i>true</i> iff the column/row is in focus.
659 * @param row An <i>int</i> specifying the target row.
660 * @param column An <i>int</i> specifying the target column.
661 * @see org.greenstone.gatherer.cdm.Language
662 */
663 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
664 JComponent component = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
665 if(isSelected) {
666 component.setBackground(Configuration.getColor("coloring.workspace_heading_background", false));
667 }
668 else {
669 component.setBackground(Configuration.getColor("coloring.collection_tree_background", false));
670 }
671 return component;
672 }
673 }
674
675 private class LanguageActionListener
676 implements ActionListener {
677 public void actionPerformed(ActionEvent event) {
678 if(!ignore_event && features_list.getSelectedIndex()>-1) {
679 ignore_event = true;
680 ///ystem.err.println("LanguageActionListener");
681 // 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.
682 String language_name = language_combobox.getSelectedItem().toString();
683 int index = fragment_table_model.getMetadataIndexByLanguage(language_name);
684 if(index != -1) {
685 CollectionMeta metadata = fragment_table_model.getMetadata(index);
686 fragment_table.setRowSelectionInterval(index, index);
687 translation_area.setText(metadata.getValue(CollectionMeta.TEXT));
688 }
689 else {
690 fragment_table.clearSelection();
691 translation_area.setText("");
692 }
693 // Ready the text area
694 translation_area.setEnabled(true);
695 translation_area.setBackground(Configuration.getColor("coloring.editable_background", false));
696 ignore_event = false;
697 }
698 }
699 }
700
701 private class TranslationDocumentListener
702 implements DocumentListener {
703 /** Gives notification that an attribute or set of attributes changed. */
704 public void changedUpdate(DocumentEvent e) {
705 update();
706 }
707 /** Gives notification that there was an insert into the document. */
708 public void insertUpdate(DocumentEvent e) {
709 update();
710 }
711 /** Gives notification that a portion of the document has been removed. */
712 public void removeUpdate(DocumentEvent e) {
713 update();
714 }
715 /** 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. */
716 private void update() {
717 String translation_text = translation_area.getText();
718 // 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
719 String language = (String) language_combobox.getSelectedItem();
720 CollectionMeta metadatum = fragment_table_model.getMetadata(language);
721 add_button.setEnabled(translation_text.length() > 0 && (metadatum.isDummy() || fragment_table_model.getMetadataIndexByLanguage(language) == -1));
722 language = null;
723 // 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.
724 if(fragment_table.getSelectedRowCount() > 0) {
725 replace_button.setEnabled(!metadatum.isDummy() && !translation_text.equals(fragment_table.getValueAt(fragment_table.getSelectedRow(), 1)));
726 }
727 // Nothing selected, nothing to replace
728 else {
729 replace_button.setEnabled(false);
730 }
731 translation_text = null;
732 }
733 }
734 }
735}
Note: See TracBrowser for help on using the repository browser.