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

Last change on this file since 12748 was 12748, checked in by mdewsnip, 18 years ago

These panels are on the Format pane, so no rebuild is required when anything on them changes.

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