package org.greenstone.gatherer.gui; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; import org.greenstone.gatherer.Configuration; import org.greenstone.gatherer.Gatherer; import org.greenstone.gatherer.checklist.CheckList; import org.greenstone.gatherer.checklist.Entry; import org.greenstone.gatherer.gui.GUIManager; import org.greenstone.gatherer.gui.ModalDialog; import org.greenstone.gatherer.gui.NumberField; import org.greenstone.gatherer.gui.SimpleMenuBar; import org.greenstone.gatherer.util.StaticStrings; import org.greenstone.gatherer.util.Utility; import org.w3c.dom.*; public class Preferences extends ModalDialog { private CheckList warning_preferences_check_list; private JButton apply_button; private JButton cancel_button; private JButton ok_button; private JCheckBox show_file_size_checkbox; private JCheckBox use_proxy_checkbox; private JCheckBox view_extracted_metadata_checkbox; private JCheckBox workflow_browse; private JCheckBox workflow_create; private JCheckBox workflow_mirror; private JCheckBox workflow_gather; private JCheckBox workflow_enrich; private JCheckBox workflow_design; private JCheckBox workflow_export; private JCheckBox workflow_preview; private JComboBox language_combobox; private JLabel language_label; private JLabel library_path_label; private JLabel predefined_label; private JLabel proxy_host_label; private JLabel proxy_port_label; private JLabel title_label; private JTabbedPane tab_pane; private JTextField library_path_field; private JTextField proxy_host_field; private JTextField proxy_port_field; private Preferences self; static final Dimension LABEL_SIZE = new Dimension(150, 25); static final Dimension ROW_SIZE = new Dimension(450, 25); static final Dimension SIZE = new Dimension(450, 345); static final String TRUE = "true"; public Preferences() { // Initialize super(Gatherer.g_man, true); this.self = this; setSize(SIZE); setTitle("Preferences"); setJMenuBar(new SimpleMenuBar("10.2")); // Creation JPanel content_pane = (JPanel) getContentPane(); tab_pane = new JTabbedPane(); tab_pane.add("Preferences.General", createGeneralPreferences()); tab_pane.add("Preferences.Workflow", createWorkflowPreferences()); tab_pane.add("Preferences.Connection", createConnectionPreferences()); tab_pane.add("Preferences.Warnings", createWarningPreferences()); JPanel button_pane = new JPanel(); ok_button = new JButton("General.OK"); apply_button = new JButton("General.Apply"); cancel_button = new JButton("General.Cancel"); // Connection Gatherer.dictionary.register(this, null, false); Gatherer.dictionary.register(tab_pane, null, false); Gatherer.dictionary.register(ok_button, null, false); Gatherer.dictionary.register(apply_button, null, false); Gatherer.dictionary.register(cancel_button, null, false); ok_button.addActionListener(new OKButtonListener(true)); apply_button.addActionListener(new OKButtonListener(false)); cancel_button.addActionListener(new CancelButtonListener()); // Layout button_pane.setBorder(BorderFactory.createEmptyBorder(5,2,2,2)); button_pane.setLayout(new GridLayout(1,3,0,5)); button_pane.add(ok_button); button_pane.add(apply_button); button_pane.add(cancel_button); content_pane.setLayout(new BorderLayout()); content_pane.add(tab_pane, BorderLayout.CENTER); content_pane.add(button_pane, BorderLayout.SOUTH); Dimension frame_size = Gatherer.g_man.getSize(); Point frame_location = Gatherer.g_man.getLocation(); //setLocation(frame_location.x + ((frame_size.width - SIZE.width) / 2), frame_location.y + ((frame_size.height - SIZE.height))); setLocation(((frame_size.width - SIZE.width) / 2), ((frame_size.height - SIZE.height))); // Clean up frame_location = null; frame_size = null; cancel_button = null; ok_button = null; button_pane = null; tab_pane = null; content_pane = null; setVisible(true); } private JPanel createConnectionPreferences() { JPanel library_path_pane = new JPanel(); library_path_pane.setPreferredSize(ROW_SIZE); library_path_label = new JLabel("Preferences.Connection.Library_Path"); library_path_label.setPreferredSize(LABEL_SIZE); library_path_field = new JTextField(Gatherer.config.getString("general.exec_address", true)); library_path_field.setCaretPosition(0); boolean currently_enabled = Gatherer.config.get("general.use_proxy", true); // Creation JPanel connection_pane = new JPanel(); use_proxy_checkbox = new JCheckBox("Preferences.Connection.Use_Proxy", currently_enabled); use_proxy_checkbox.setPreferredSize(ROW_SIZE); JPanel proxy_host_pane = new JPanel(); proxy_host_pane.setPreferredSize(ROW_SIZE); proxy_host_label = new JLabel("Preferences.Connection.Proxy_Host"); proxy_host_label.setPreferredSize(LABEL_SIZE); proxy_host_field = new JTextField(Gatherer.config.getString("general.proxy_host", true)); proxy_host_field.setEnabled(currently_enabled); JPanel proxy_port_pane = new JPanel(); proxy_port_pane.setPreferredSize(ROW_SIZE); proxy_port_label = new JLabel("Preferences.Connection.Proxy_Port"); proxy_port_label.setPreferredSize(LABEL_SIZE); proxy_port_field = new NumberField(Gatherer.config.getString("general.proxy_port", true)); proxy_port_field.setEnabled(currently_enabled); // Connection Gatherer.dictionary.register(library_path_label, null, false); Gatherer.dictionary.register(use_proxy_checkbox, null, false); Gatherer.dictionary.register(proxy_host_label, null, false); Gatherer.dictionary.register(proxy_port_label, null, false); use_proxy_checkbox.addActionListener(new UseProxyListener()); // Layout library_path_pane.setLayout(new BorderLayout()); library_path_pane.add(library_path_label, BorderLayout.WEST); library_path_pane.add(library_path_field, BorderLayout.CENTER); proxy_host_pane.setLayout(new BorderLayout()); proxy_host_pane.add(proxy_host_label, BorderLayout.WEST); proxy_host_pane.add(proxy_host_field, BorderLayout.CENTER); proxy_port_pane.setLayout(new BorderLayout()); proxy_port_pane.add(proxy_port_label, BorderLayout.WEST); proxy_port_pane.add(proxy_port_field, BorderLayout.CENTER); connection_pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); connection_pane.add(library_path_pane); connection_pane.add(use_proxy_checkbox); connection_pane.add(proxy_host_pane); connection_pane.add(proxy_port_pane); return connection_pane; } private JPanel createGeneralPreferences() { JPanel general_pane = new JPanel(); // Build the model of available languages ArrayList dictionary_model = new ArrayList(); Locale french = new Locale("fr","FR"); System.err.println("French locale: " + french); dictionary_model.add(new DictionaryEntry(Locale.ENGLISH)); File classes_folder = new File(Utility.BASE_DIR + StaticStrings.CLASSES_FOLDER); File[] possible_dictionaries = classes_folder.listFiles(); for(int i = 0; i < possible_dictionaries.length; i++) { String filename = possible_dictionaries[i].getName(); if(filename.endsWith(StaticStrings.PROPERTIES_FILE_EXTENSION) && filename.indexOf(StaticStrings.UNDERSCORE_CHARACTER) != -1) { StringTokenizer tokenizer = new StringTokenizer(filename.substring(filename.indexOf(StaticStrings.UNDERSCORE_CHARACTER) + 1, filename.indexOf(StaticStrings.STOP_CHARACTER)), StaticStrings.UNDERSCORE_CHARACTER); Locale locale = null; switch(tokenizer.countTokens()) { case 1: locale = new Locale(tokenizer.nextToken().toLowerCase()); break; case 2: locale = new Locale(tokenizer.nextToken().toLowerCase(), tokenizer.nextToken().toUpperCase()); break; } tokenizer = null; // Open the file and read the first line String description = null; try { BufferedReader br = new BufferedReader(new FileReader(possible_dictionaries[i])); String first_line = br.readLine(); br.close(); description = first_line.substring(first_line.indexOf(StaticStrings.COLON_CHARACTER) + 1); } catch(Exception error) { } DictionaryEntry entry = new DictionaryEntry(description, locale); description = null; locale = null; if(!dictionary_model.contains(entry)) { dictionary_model.add(entry); } entry = null; } filename = null; } possible_dictionaries = null; classes_folder = null; // Extracted metadata view_extracted_metadata_checkbox = new JCheckBox("Preferences.General.View_Extracted_Metadata", false); if (Gatherer.config.get("general.view_extracted_metadata", Configuration.COLLECTION_SPECIFIC)) { view_extracted_metadata_checkbox.setSelected(true); } // Show file sizes show_file_size_checkbox = new JCheckBox("Preferences.General.Show_File_Size", false); if (Gatherer.config.get("general.show_file_size", Configuration.COLLECTION_SPECIFIC)) { show_file_size_checkbox.setSelected(true); } // Language JPanel language_pane = new JPanel(); language_label = new JLabel("Preferences.General.Interface_Language"); language_label.setPreferredSize(LABEL_SIZE); language_combobox = new JComboBox(dictionary_model.toArray()); // Connect // Gatherer.dictionary.register(view_extracted_metadata_checkbox); // Gatherer.dictionary.register(show_file_size_checkbox); Gatherer.dictionary.register(language_label, null, false); language_combobox.addActionListener(new LanguageComboboxListener()); // Layout language_pane.setLayout(new BorderLayout()); language_pane.add(language_label, BorderLayout.WEST); language_pane.add(language_combobox, BorderLayout.CENTER); general_pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); general_pane.setLayout(new GridLayout(5,1,0,5)); general_pane.add(view_extracted_metadata_checkbox); general_pane.add(show_file_size_checkbox); general_pane.add(language_pane); return general_pane; } /** The warning preferences are controlled through a checklist. */ private JPanel createWarningPreferences() { // Retrieve all of the warning preferences settings. HashMap warning_preferences = Gatherer.config.getAll("warning\\..*", true); warning_preferences_check_list = new CheckList(false); for(Iterator keys = warning_preferences.keySet().iterator(); keys.hasNext(); ) { String property = (String) keys.next(); String value = (String) warning_preferences.get(property); // Remove 'warning.' String title = Gatherer.dictionary.get(property.substring(8) + ".Title"); Entry entry = new Entry(title, value.equalsIgnoreCase(TRUE)); entry.setProperty(property); warning_preferences_check_list.addEntry(entry); } // Creation JPanel warning_preferences_pane = new JPanel(); // Connection // Layout warning_preferences_pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); warning_preferences_pane.setLayout(new BorderLayout()); warning_preferences_pane.add(new JScrollPane(warning_preferences_check_list), BorderLayout.CENTER); return warning_preferences_pane; } private JPanel createWorkflowPreferences() { // Read in the predefined configurations file. Vector predefined = new Vector(); Document predefined_document = Utility.parse("xml/workflows.xml", true); Element predefined_element = predefined_document.getDocumentElement(); NodeList workflow_elements = predefined_element.getElementsByTagName("Workflow"); for(int i = 0; i < workflow_elements.getLength(); i++) { predefined.add(new WorkflowElementWrapper((Element)workflow_elements.item(i))); } // Creation JPanel workflow_preferences_pane = new JPanel(); JPanel checklist_pane = new JPanel(); title_label = new JLabel("Preferences.Workflow.Title"); title_label.setPreferredSize(ROW_SIZE); workflow_browse = new JCheckBox("Preferences.Workflow.Browse", Gatherer.config.get("workflow.browse", false)); workflow_browse.setPreferredSize(ROW_SIZE); workflow_mirror = new JCheckBox("Preferences.Workflow.Mirror", Gatherer.config.get("workflow.mirror", false)); workflow_mirror.setPreferredSize(ROW_SIZE); workflow_gather = new JCheckBox("Preferences.Workflow.Gather", Gatherer.config.get("workflow.gather", false)); workflow_gather.setPreferredSize(ROW_SIZE); workflow_enrich = new JCheckBox("Preferences.Workflow.Enrich", Gatherer.config.get("workflow.enrich", false)); workflow_enrich.setPreferredSize(ROW_SIZE); workflow_design = new JCheckBox("Preferences.Workflow.Design", Gatherer.config.get("workflow.design", false)); workflow_design.setPreferredSize(ROW_SIZE); workflow_export = new JCheckBox("Preferences.Workflow.Export", Gatherer.config.get("workflow.export", false)); workflow_export.setPreferredSize(ROW_SIZE); workflow_create = new JCheckBox("Preferences.Workflow.Create", Gatherer.config.get("workflow.create", false)); workflow_create.setPreferredSize(ROW_SIZE); workflow_preview = new JCheckBox("Preferences.Workflow.Preview", Gatherer.config.get("workflow.preview", false)); workflow_preview.setPreferredSize(ROW_SIZE); JPanel predefined_pane = new JPanel(); predefined_label = new JLabel("Preferences.Workflow.Predefined.Label"); predefined_label.setPreferredSize(new Dimension(150,25)); JComboBox predefined_combobox = new JComboBox(predefined); // Connection Gatherer.dictionary.register(title_label, null, false); Gatherer.dictionary.register(workflow_browse, null, false); Gatherer.dictionary.register(workflow_mirror, null, false); Gatherer.dictionary.register(workflow_gather, null, false); Gatherer.dictionary.register(workflow_enrich, null, false); Gatherer.dictionary.register(workflow_design, null, false); Gatherer.dictionary.register(workflow_export, null, false); Gatherer.dictionary.register(workflow_create, null, false); Gatherer.dictionary.register(workflow_preview, null, false); Gatherer.dictionary.register(predefined_label, null, false); predefined_combobox.addActionListener(new PredefinedActionListener()); // Layout checklist_pane.setLayout(new BoxLayout(checklist_pane, BoxLayout.Y_AXIS)); checklist_pane.add(title_label); if(Gatherer.config.get("workflow.browse", true)) { checklist_pane.add(workflow_browse); } if(Gatherer.config.get("workflow.mirror", true)) { checklist_pane.add(workflow_mirror); } if(Gatherer.config.get("workflow.gather", true)) { checklist_pane.add(workflow_gather); } if(Gatherer.config.get("workflow.enrich", true)) { checklist_pane.add(workflow_enrich); } if(Gatherer.config.get("workflow.design", true)) { checklist_pane.add(workflow_design); } if(Gatherer.config.get("workflow.export", true)) { checklist_pane.add(workflow_export); } if(Gatherer.config.get("workflow.create", true)) { checklist_pane.add(workflow_create); } if(Gatherer.config.get("workflow.preview", true)) { checklist_pane.add(workflow_preview); } predefined_pane.setLayout(new BorderLayout()); predefined_pane.add(predefined_label, BorderLayout.WEST); predefined_pane.add(predefined_combobox, BorderLayout.CENTER); workflow_preferences_pane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); workflow_preferences_pane.setLayout(new BorderLayout()); workflow_preferences_pane.add(checklist_pane, BorderLayout.CENTER); workflow_preferences_pane.add(predefined_pane, BorderLayout.SOUTH); return workflow_preferences_pane; } public void dispose() { // Deregister dictionary components // Connection Gatherer.dictionary.deregister(library_path_label); Gatherer.dictionary.deregister(use_proxy_checkbox); Gatherer.dictionary.deregister(proxy_host_label); Gatherer.dictionary.deregister(proxy_port_label); // General Gatherer.dictionary.deregister(view_extracted_metadata_checkbox); Gatherer.dictionary.deregister(show_file_size_checkbox); Gatherer.dictionary.deregister(language_label); // Workflow Gatherer.dictionary.deregister(title_label); Gatherer.dictionary.deregister(workflow_browse); Gatherer.dictionary.deregister(workflow_mirror); Gatherer.dictionary.deregister(workflow_gather); Gatherer.dictionary.deregister(workflow_enrich); Gatherer.dictionary.deregister(workflow_design); Gatherer.dictionary.deregister(workflow_export); Gatherer.dictionary.deregister(workflow_create); Gatherer.dictionary.deregister(workflow_preview); Gatherer.dictionary.deregister(predefined_label); // Dialog Gatherer.dictionary.deregister(this); Gatherer.dictionary.deregister(tab_pane); Gatherer.dictionary.deregister(ok_button); Gatherer.dictionary.deregister(apply_button); Gatherer.dictionary.deregister(cancel_button); // Dispose super.dispose(); } private class OKButtonListener implements ActionListener { private boolean close; public OKButtonListener(boolean close) { this.close = close; } public void actionPerformed(ActionEvent event) { // Submit the various changes. // Connection preferences String library_path_string = library_path_field.getText(); Gatherer.config.setString("general.exec_address", true, library_path_string); if (!library_path_string.equals("")) { try { Gatherer.config.exec_address = new URL(library_path_string); } catch (MalformedURLException error) { ///ystem.err.println("Error: Bad address: " + exec_address_string); } } Gatherer.config.set("general.use_proxy", true, use_proxy_checkbox.isSelected()); Gatherer.config.setString("general.proxy_host", true, proxy_host_field.getText()); Gatherer.config.setString("general.proxy_port", true, proxy_port_field.getText()); Gatherer.setProxy(); // General preferences Gatherer.config.set("general.show_file_size", Configuration.COLLECTION_SPECIFIC, show_file_size_checkbox.isSelected()); if(Gatherer.g_man.mirror_pane != null) { Gatherer.g_man.mirror_pane.refreshTrees(); } Gatherer.g_man.collection_pane.refreshTrees(); Gatherer.g_man.metaedit_pane.refreshTrees(); Gatherer.config.set("general.view_extracted_metadata", Configuration.COLLECTION_SPECIFIC, view_extracted_metadata_checkbox.isSelected()); Gatherer.g_man.metaedit_pane.valueChanged((TreeSelectionEvent) null); // Refresh metadata table Gatherer.config.setLocale("general.locale", Configuration.GENERAL_SETTING, ((DictionaryEntry)language_combobox.getSelectedItem()).getLocale()); // Warning preferences for(int i = 0; i < warning_preferences_check_list.getEntryCount(); i++) { Entry entry = warning_preferences_check_list.get(i); Gatherer.config.set(entry.getProperty(), true, entry.isSelected()); } // Workflow preferences Gatherer.config.set("workflow.browse", false, workflow_browse.isSelected()); Gatherer.config.set("workflow.mirror", false, workflow_mirror.isSelected()); Gatherer.config.set("workflow.gather", false, workflow_gather.isSelected()); Gatherer.config.set("workflow.enrich", false, workflow_enrich.isSelected()); Gatherer.config.set("workflow.design", false, workflow_design.isSelected()); Gatherer.config.set("workflow.export", false, workflow_export.isSelected()); Gatherer.config.set("workflow.create", false, workflow_create.isSelected()); Gatherer.config.set("workflow.preview", false, workflow_preview.isSelected()); Gatherer.g_man.workflowUpdate("Browser", workflow_browse.isSelected()); Gatherer.g_man.workflowUpdate("Mirroring", workflow_mirror.isSelected()); Gatherer.g_man.workflowUpdate("Collection", workflow_gather.isSelected()); Gatherer.g_man.workflowUpdate("MetaEdit", workflow_enrich.isSelected()); Gatherer.g_man.workflowUpdate("Build", workflow_design.isSelected()); Gatherer.g_man.workflowUpdate("Export", workflow_export.isSelected()); Gatherer.g_man.workflowUpdate("Create", workflow_create.isSelected()); Gatherer.g_man.workflowUpdate("Preview", workflow_preview.isSelected()); // Hide dialog if(close) { self.dispose(); } } } private class CancelButtonListener implements ActionListener { public void actionPerformed(ActionEvent event) { self.dispose(); } } private class DictionaryEntry implements Comparable { private Locale locale; private String description; public DictionaryEntry(Locale locale) { this.description = null; this.locale = locale; } public DictionaryEntry(String description, Locale locale) { this.description = description; this.locale = locale; } public int compareTo(Object object) { return toString().compareTo(object.toString()); } public boolean equals(Object object) { return toString().equals(object.toString()); } public Locale getLocale() { return locale; } public String toString() { if(description != null) { return description; } else { return locale.getDisplayName(); } } } private class PredefinedActionListener implements ActionListener { public void actionPerformed(ActionEvent event) { JComboBox cb = (JComboBox) event.getSource(); WorkflowElementWrapper element = (WorkflowElementWrapper) cb.getSelectedItem(); CheckboxUpdater task = new CheckboxUpdater(element); SwingUtilities.invokeLater(task); } private class CheckboxUpdater implements Runnable { private WorkflowElementWrapper element; public CheckboxUpdater(WorkflowElementWrapper element) { this.element = element; } public void run() { workflow_browse.setSelected(element.getEnabled("browse")); workflow_create.setSelected(element.getEnabled("create")); workflow_mirror.setSelected(element.getEnabled("mirror")); workflow_gather.setSelected(element.getEnabled("gather")); workflow_enrich.setSelected(element.getEnabled("enrich")); workflow_design.setSelected(element.getEnabled("design")); workflow_export.setSelected(element.getEnabled("export")); workflow_preview.setSelected(element.getEnabled("preview")); } } } private class LanguageComboboxListener implements ActionListener { public void actionPerformed(ActionEvent event) { // Retrieve the entry DictionaryEntry entry = (DictionaryEntry) language_combobox.getSelectedItem(); if(entry != null) { Gatherer.dictionary.changeDictionary(entry.getLocale()); // Display message JOptionPane.showMessageDialog(Gatherer.g_man, Gatherer.dictionary.get("Preferences.General.Restart_Required"), Gatherer.dictionary.get("Preferences.General.Restart_Required"), JOptionPane.WARNING_MESSAGE); } } } private class UseProxyListener implements ActionListener { public void actionPerformed(ActionEvent event) { boolean enabled = use_proxy_checkbox.isSelected(); Gatherer.config.set("general.use_proxy", true, enabled); // Fortunately this is already driven by the event thread. proxy_host_field.setEnabled(enabled); proxy_port_field.setEnabled(enabled); } } private class WorkflowElementWrapper { private Element element; private String text; public WorkflowElementWrapper(Element element) { this.element = element; } public boolean getEnabled(String name) { boolean result = true; if(element.getAttribute(name).equalsIgnoreCase("false")) { result = false; } return result; } public String toString() { if(text == null) { text = element.getFirstChild().getNodeValue(); } return text; } } }