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

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

quan's changes to remove blue borders around buttons and comboboxes on macs

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