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

Last change on this file since 8853 was 8243, checked in by mdewsnip, 20 years ago

Removed all occurrences of classes explicitly importing other classes in the same package.

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