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

Last change on this file since 13074 was 13049, checked in by shaoqun, 18 years ago

added a default selected feature

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