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

Last change on this file since 7110 was 6847, checked in by kjdon, 20 years ago

unfixed the size of labels so that other langs fit in

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