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

Last change on this file since 10530 was 10237, checked in by mdewsnip, 19 years ago

New code for "incremental" building, by Matthew Whyte.

I've only had time to look at this briefly; I've fixed a few obvious problems but I imagine this will be pretty flaky for a while.

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