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

Last change on this file since 5206 was 5206, checked in by jmt12, 21 years ago

Fix 203B122 and 203B149

  • Property svn:keywords set to Author Date Id Revision
File size: 24.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.Dictionary;
36import org.greenstone.gatherer.Gatherer;
37import org.greenstone.gatherer.cdm.CollectionConfiguration;
38import org.greenstone.gatherer.cdm.CollectionDesignManager;
39import org.greenstone.gatherer.cdm.CollectionMeta;
40import org.greenstone.gatherer.cdm.CollectionMetaManager;
41import org.greenstone.gatherer.cdm.Control;
42import org.greenstone.gatherer.cdm.Index;
43import org.greenstone.gatherer.cdm.LanguageListCellRenderer;
44import org.greenstone.gatherer.cdm.LanguageManager;
45import org.greenstone.gatherer.cdm.SubcollectionIndex;
46
47/** 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.
48 * @author John Thompson, Greenstone Digital Library, University of Waikato
49 * @version 2.3
50 */
51public class TranslationView {
52
53 private Control controls;
54
55 static final private Dimension LABEL_SIZE = new Dimension(225,25);
56 static final private int LANGUAGE_WIDTH = 75;
57 static final private String GENERAL_STR = "General:";
58 static final private String INDEX_STR = "Index:";
59 static final private String PARTITION_STR = "Partitions:";
60
61 public TranslationView() {
62 Gatherer.println("TranslationView: Initialized.");
63 }
64
65 public void destroy() {
66 if(controls != null) {
67 controls.destroy();
68 controls = null;
69 }
70 }
71
72 public Control getControls() {
73 if(controls == null) {
74 controls = new TranslationControl();
75 }
76 return controls;
77 }
78
79 private String get(String key) {
80 if(key.indexOf(".") == -1) {
81 key = "CDM.TranslationManager." + key;
82 }
83 return Gatherer.dictionary.get(key);
84 }
85
86 private Object[] getFeaturesList() {
87 ArrayList features_model = new ArrayList();
88
89 // Add the indexes
90 ArrayList indexes = CollectionDesignManager.index_manager.getIndexes();
91 int indexes_size = indexes.size();
92 for(int j = 0; j < indexes_size; j++) {
93 Object bob = new BobTheMagicalComparableWrapper(indexes.get(j));
94 if(!features_model.contains(bob)) {
95 features_model.add(bob);
96 }
97 }
98
99 // We also add subindexes.
100 ArrayList subindexes = CollectionDesignManager.subcollectionindex_manager.getSubcollectionIndexes();
101 int subindexes_size = subindexes.size();
102 for(int j = 0; j < subindexes_size; j++) {
103 Object bob = new BobTheMagicalComparableWrapper(subindexes.get(j));
104 if(!features_model.contains(bob)) {
105 features_model.add(bob);
106 }
107 }
108
109 // Finally we add any remaining metadata as general
110 ArrayList general_metadata = CollectionDesignManager.collectionmeta_manager.getMetadata();
111 for(int i = 0; i < general_metadata.size(); i++) {
112 CollectionMeta metadata = (CollectionMeta) general_metadata.get(i);
113 if(!metadata.isSpecial()) {
114 Object bob = new BobTheMagicalComparableWrapper(metadata.getName());
115 if(!features_model.contains(bob)) {
116 features_model.add(bob);
117 }
118 }
119 }
120
121 Collections.sort(features_model);
122
123 return features_model.toArray();
124 }
125
126 private class BobTheMagicalComparableWrapper
127 implements Comparable {
128 private Object content;
129 private String text;
130 BobTheMagicalComparableWrapper(Object content) {
131 this.content = content;
132 }
133 public int compareTo(Object object) {
134 if(object == null) {
135 object = "";
136 }
137 if(text == null) {
138 toString();
139 }
140 return text.compareTo(object.toString());
141 }
142
143 /** Equals is used by contains and since we want to prevent double up of metadata we compare differently than in compareTo. */
144 public boolean equals(Object object) {
145 return (object != null && content.toString().equals(((BobTheMagicalComparableWrapper)object).getContent().toString()));
146 }
147
148 public Object getContent() {
149 return content;
150 }
151
152 public String getName() {
153 if(content instanceof Index) {
154 return CollectionConfiguration.STOP_CHARACTER + ((Index)content).getID();
155 }
156 else if (content instanceof SubcollectionIndex) {
157 return CollectionConfiguration.STOP_CHARACTER + ((SubcollectionIndex)content).getID();
158 }
159 else {
160 return content.toString();
161 }
162 }
163
164 public String toString() {
165 if(text == null) {
166 String temp = content.toString();
167 if(temp.indexOf(CollectionConfiguration.SPACE_CHARACTER) != -1) {
168 temp = temp.substring(0, temp.indexOf(CollectionConfiguration.SPACE_CHARACTER));
169 }
170 if(content instanceof Index) {
171 text = INDEX_STR + temp;
172 }
173 else if(content instanceof SubcollectionIndex) {
174 text = PARTITION_STR + temp;
175 }
176 else {
177 text = GENERAL_STR + temp;
178 }
179 }
180 return text;
181 }
182 }
183
184 private class TranslationControl
185 extends JPanel
186 implements Control {
187
188 private boolean ignore_event = false;
189 private FragmentTableModel fragment_table_model;
190 private JButton add_button;
191 private JButton remove_button;
192 private JButton replace_button;
193 private JComboBox language_combobox;
194 private JList features_list;
195 private JTable fragment_table;
196 private JTextArea default_area;
197 private JTextArea translation_area;
198
199 TranslationControl() {
200 fragment_table_model = new FragmentTableModel(new ArrayList());
201 // Creation
202 JPanel header_panel = new JPanel();
203 JLabel title_label = new JLabel(get("Title"));
204 title_label.setHorizontalAlignment(JLabel.CENTER);
205 JTextArea instruction_area = new JTextArea(get("Instructions"));
206 instruction_area.setEditable(false);
207 instruction_area.setLineWrap(true);
208 instruction_area.setRows(6);
209 instruction_area.setWrapStyleWord(true);
210
211 JPanel center_panel = new JPanel();
212
213 JPanel selection_panel = new JPanel();
214
215 JPanel component_selection_panel = new JPanel();
216 JLabel component_label = new JLabel(get("Affected_Features"));
217 features_list = new JList(getFeaturesList());
218 features_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
219
220 JPanel fragment_selection_panel = new JPanel();
221 JLabel fragment_label = new JLabel(get("Assigned_Fragments"));
222
223 fragment_table = new JTable(fragment_table_model);
224 fragment_table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
225 fragment_table.setBackground(Gatherer.config.getColor("coloring.collection_tree_background", false));
226 fragment_table.setColumnSelectionAllowed(false);
227 fragment_table.setDefaultRenderer(Object.class, new FragmentTableRenderer());
228 fragment_table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
229
230 JScrollPane table_scroll = new JScrollPane(fragment_table);
231 table_scroll.getViewport().setBackground(Gatherer.config.getColor("coloring.collection_tree_background", false));
232 table_scroll.setOpaque(true);
233
234 JPanel south_panel = new JPanel();
235
236 JPanel text_panel = new JPanel();
237
238 JPanel language_panel = new JPanel();
239 JLabel language_label = new JLabel(get("Language"));
240 language_label.setPreferredSize(LABEL_SIZE);
241 language_combobox = new JComboBox(CollectionDesignManager.language_manager.getLanguageCodes().toArray());
242 language_combobox.setRenderer(new LanguageListCellRenderer());
243
244 JPanel default_text_panel = new JPanel();
245 JLabel default_label = new JLabel(get("Default_Text"));
246 default_area = new JTextArea();
247 default_area.setBackground(Gatherer.config.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(get("Translation"));
254 translation_area = new JTextArea();
255 translation_area.setBackground(Gatherer.config.getColor("coloring.disabled", false));
256 translation_area.setEnabled(false);
257 translation_area.setLineWrap(true);
258 translation_area.setWrapStyleWord(true);
259
260 JPanel button_pane = new JPanel();
261 add_button = new JButton(get("Add"));
262 add_button.setEnabled(false);
263 add_button.setMnemonic(KeyEvent.VK_A);
264 replace_button = new JButton(get("Replace"));
265 replace_button.setEnabled(false);
266 replace_button.setMnemonic(KeyEvent.VK_C);
267 remove_button = new JButton(get("Remove"));
268 remove_button.setEnabled(false);
269 remove_button.setMnemonic(KeyEvent.VK_R);
270
271 // Connection
272 add_button.addActionListener(new AddListener());
273 remove_button.addActionListener(new RemoveListener());
274 replace_button.addActionListener(new ReplaceListener());
275 language_combobox.addActionListener(new LanguageActionListener());
276 translation_area.getDocument().addDocumentListener(new TranslationDocumentListener());
277 features_list.addListSelectionListener(new FeaturesListSelectionListener());
278 fragment_table.getSelectionModel().addListSelectionListener(new FragmentListSelectionListener());
279
280 // Layout
281 header_panel.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
282 header_panel.setLayout(new BorderLayout());
283 header_panel.add(title_label, BorderLayout.NORTH);
284 header_panel.add(new JScrollPane(instruction_area), BorderLayout.CENTER);
285
286 component_selection_panel.setLayout(new BorderLayout());
287 component_selection_panel.add(component_label, BorderLayout.NORTH);
288 component_selection_panel.add(new JScrollPane(features_list), BorderLayout.CENTER);
289
290 fragment_selection_panel.setLayout(new BorderLayout());
291 fragment_selection_panel.add(fragment_label, BorderLayout.NORTH);
292 fragment_selection_panel.add(table_scroll, BorderLayout.CENTER);
293
294 selection_panel.setLayout(new GridLayout(2,1,0,5));
295 selection_panel.add(component_selection_panel);
296 selection_panel.add(fragment_selection_panel);
297
298 default_text_panel.setLayout(new BorderLayout());
299 default_text_panel.add(default_label, BorderLayout.NORTH);
300 default_text_panel.add(new JScrollPane(default_area), BorderLayout.CENTER);
301
302 translated_text_panel.setLayout(new BorderLayout());
303 translated_text_panel.add(translation_label, BorderLayout.NORTH);
304 translated_text_panel.add(new JScrollPane(translation_area), BorderLayout.CENTER);
305
306 text_panel.setLayout(new GridLayout(1,2,5,0));
307 text_panel.add(default_text_panel);
308 text_panel.add(translated_text_panel);
309
310 language_panel.setLayout(new BorderLayout());
311 language_panel.add(language_label, BorderLayout.WEST);
312 language_panel.add(language_combobox, BorderLayout.CENTER);
313
314 south_panel.setLayout(new BorderLayout());
315 south_panel.add(language_panel, BorderLayout.NORTH);
316 south_panel.add(text_panel, BorderLayout.CENTER);
317
318 center_panel.setLayout(new GridLayout(2,1,0,5));
319 center_panel.add(selection_panel);
320 center_panel.add(south_panel);
321
322 button_pane.setBorder(BorderFactory.createEmptyBorder(2,0,0,0));
323 button_pane.setLayout(new GridLayout(1,3));
324 button_pane.add(add_button);
325 button_pane.add(replace_button);
326 button_pane.add(remove_button);
327
328 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
329 setLayout(new BorderLayout());
330 add(header_panel, BorderLayout.NORTH);
331 add(center_panel, BorderLayout.CENTER);
332 add(button_pane, BorderLayout.SOUTH);
333 }
334
335 public void destroy() {
336 }
337
338 public void gainFocus() {
339 // Rebuild the features model, just incase features have been added or removed.
340 if(features_list != null) {
341 Object selected_feature = features_list.getSelectedValue();
342 features_list.setListData(getFeaturesList());
343 if(selected_feature != null) {
344 features_list.setSelectedValue(selected_feature, true);
345 }
346 }
347 }
348
349 public void loseFocus() {
350 }
351
352
353 private class AddListener
354 implements ActionListener {
355
356 public void actionPerformed(ActionEvent event) {
357 ignore_event = true;
358 String translation_text = translation_area.getText();
359 if(translation_text.length() > 0) {
360 // 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.
361 BobTheMagicalComparableWrapper selected_feature = (BobTheMagicalComparableWrapper)features_list.getSelectedValue();
362 String language = (String) language_combobox.getSelectedItem();
363 CollectionMeta metadatum = new CollectionMeta(selected_feature.getName(), language);
364 metadatum.setValue(translation_text);
365 CollectionDesignManager.collectionmeta_manager.addMetadatum(metadatum);
366 fragment_table.clearSelection();
367 ArrayList metadata = CollectionDesignManager.collectionmeta_manager.getMetadata(selected_feature.getName());
368 fragment_table_model.setData(metadata);
369 int index = fragment_table_model.getMetadataIndexByLanguage(language);
370 fragment_table.setRowSelectionInterval(index, index);
371 metadatum = null;
372 language = null;
373 selected_feature = null;
374 translation_text = null;
375 replace_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());
438 }
439 // Update the text fragment table.
440 fragment_table.clearSelection();
441 fragment_table_model.setData(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 translation_area.setText(metadata.getValue());
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(Gatherer.config.getColor("coloring.editable_background", false));
458 }
459 else {
460 default_area.setText("");
461 fragment_table.clearSelection();
462 fragment_table_model.setData(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(Gatherer.config.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 ///ystem.err.println("FragmentListSelectionListener");
478 int index = -1;
479 if((index = fragment_table.getSelectedRow()) != -1) {
480 // A row has been selected. Retrieve the collection metadata.
481 CollectionMeta metadata = fragment_table_model.getMetadata(index);
482 if(metadata != null) {
483 // Update the combobox to show the current language.
484 String language = metadata.getLanguage();
485 ///ystem.err.println("Searching for the language: " + language_name);
486 for(int i = 0; i < language_combobox.getItemCount(); i++) {
487 if(language_combobox.getItemAt(i).toString().equals(language)) {
488 language_combobox.setSelectedIndex(i);
489 }
490 }
491 }
492 translation_area.setText(metadata.getValue());
493 remove_button.setEnabled(true);
494 }
495 else {
496 translation_area.setText("");
497 remove_button.setEnabled(false);
498 }
499 }
500 }
501 }
502
503 private class FragmentTableModel
504 extends AbstractTableModel {
505
506 private ArrayList metadata;
507
508 FragmentTableModel(ArrayList metadata) {
509 this.metadata = metadata;
510 }
511 public int getRowCount() {
512 return metadata.size();
513 }
514 public int getColumnCount() {
515 return 2;
516 }
517 public String getColumnName(int column) {
518 return get("Column_Name_" + column);
519 }
520
521 public CollectionMeta getMetadata(int row) {
522 if(0 <= row && row < metadata.size()) {
523 return (CollectionMeta) metadata.get(row);
524 }
525 return null;
526 }
527
528 public int getMetadataIndexByLanguage(String language) {
529 for(int i = 0; i < metadata.size(); i++) {
530 CollectionMeta metadatum = (CollectionMeta) metadata.get(i);
531 if(language.equals(metadatum.getLanguage())) {
532 return i;
533 }
534 }
535 return -1;
536 }
537
538 public Object getValueAt(int row, int column) {
539 if(0 <= row && row < metadata.size()) {
540 CollectionMeta metadatum = (CollectionMeta) metadata.get(row);
541 switch(column) {
542 case 0:
543 return CollectionDesignManager.language_manager.getLanguageName(metadatum.getLanguage());
544 default:
545 return metadatum.getValue();
546 }
547 }
548 return "#Error";
549 }
550
551 public void remove(int index) {
552 metadata.remove(index);
553 fireTableRowsDeleted(index, index);
554 }
555
556 public void setData(ArrayList metadata) {
557 this.metadata = metadata;
558 fireTableDataChanged();
559 }
560
561 public int size() {
562 return metadata.size();
563 }
564 }
565
566 private class FragmentTableRenderer
567 extends DefaultTableCellRenderer {
568 /** Retrieve the component used to rubberstamp the table based on the given parameters.
569 * @param table The <strong>JTable</strong> to rendered.
570 * @param value The <strong>Object</strong> whose representation will be shown in the table row.
571 * @param isSelected <i>true</i> iff the column/row is selected.
572 * @param hasFocus <i>true</i> iff the column/row is in focus.
573 * @param row An <i>int</i> specifying the target row.
574 * @param column An <i>int</i> specifying the target column.
575 * @see org.greenstone.gatherer.cdm.Language
576 */
577 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
578 JComponent component = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
579 if(isSelected) {
580 component.setBackground(Gatherer.config.getColor("coloring.workspace_heading_background", false));
581 }
582 else {
583 component.setBackground(Gatherer.config.getColor("coloring.collection_tree_background", false));
584 }
585 return component;
586 }
587 }
588
589 private class LanguageActionListener
590 implements ActionListener {
591 public void actionPerformed(ActionEvent event) {
592 if(!ignore_event) {
593 ignore_event = true;
594 ///ystem.err.println("LanguageActionListener");
595 // 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.
596 String language_name = language_combobox.getSelectedItem().toString();
597 int index = fragment_table_model.getMetadataIndexByLanguage(language_name);
598 if(index != -1) {
599 CollectionMeta metadata = fragment_table_model.getMetadata(index);
600 fragment_table.setRowSelectionInterval(index, index);
601 translation_area.setText(metadata.getValue());
602 }
603 else {
604 fragment_table.clearSelection();
605 translation_area.setText("");
606 }
607 // Ready the text area
608 translation_area.setEnabled(true);
609 translation_area.setBackground(Gatherer.config.getColor("coloring.editable_background", false));
610 ignore_event = false;
611 }
612 }
613 }
614
615 private class TranslationDocumentListener
616 implements DocumentListener {
617 /** Gives notification that an attribute or set of attributes changed. */
618 public void changedUpdate(DocumentEvent e) {
619 update();
620 }
621 /** Gives notification that there was an insert into the document. */
622 public void insertUpdate(DocumentEvent e) {
623 update();
624 }
625 /** Gives notification that a portion of the document has been removed. */
626 public void removeUpdate(DocumentEvent e) {
627 update();
628 }
629 /** 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. */
630 private void update() {
631 String translation_text = translation_area.getText();
632 // 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
633 String language = (String) language_combobox.getSelectedItem();
634 add_button.setEnabled(translation_text.length() > 0 && fragment_table_model.getMetadataIndexByLanguage(language) == -1);
635 language = null;
636 // 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.
637 if(fragment_table.getSelectedRowCount() > 0) {
638 replace_button.setEnabled(!translation_text.equals(fragment_table.getValueAt(fragment_table.getSelectedRow(), 1)));
639 }
640 // Nothing selected, nothing to replace
641 else {
642 replace_button.setEnabled(false);
643 }
644 translation_text = null;
645 }
646 }
647 }
648
649}
650
651
Note: See TracBrowser for help on using the repository browser.