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

Last change on this file since 8236 was 8236, checked in by mdewsnip, 20 years ago

Replaced all Gatherer.print* with DebugStream.print*.

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