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

Last change on this file since 7224 was 7157, checked in by kjdon, 20 years ago

changed LABEL_SIZE to COMPONENT_SIZE to reflect its usage

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