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

Last change on this file since 12123 was 12123, checked in by kjdon, 18 years ago

Changed text handling to use Dictionary.get rather than Dictionary.setText or Dictionary.registerBoth etc. also removed mnemonics cos they suck for other languages.

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