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.Dictionary; import org.greenstone.gatherer.Gatherer; import org.greenstone.gatherer.checklist.CheckList; import org.greenstone.gatherer.checklist.Entry; import org.greenstone.gatherer.gui.EmailField; import org.greenstone.gatherer.gui.ModalDialog; import org.greenstone.gatherer.gui.SimpleMenuBar; import org.greenstone.gatherer.gui.tree.DragTree; 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 EmailField email_field; 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 email_label; 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 JSpinner proxy_port_field; private Preferences self; static final Dimension LABEL_SIZE = new Dimension(175, 25); static final Dimension ROW_SIZE = new Dimension(640, 25); static final Dimension SIZE = new Dimension(640, 345); static final String TRUE = "true"; public Preferences() { // Initialize super(Gatherer.g_man, true); this.self = this; setSize(SIZE); Dictionary.registerText(this, "Preferences"); setJMenuBar(new SimpleMenuBar("preferences")); // Creation JPanel content_pane = (JPanel) getContentPane(); tab_pane = new JTabbedPane(); JPanel general_preferences = createGeneralPreferences(); tab_pane.add("Preferences.General", general_preferences); tab_pane.add("Preferences.Workflow", createWorkflowPreferences()); tab_pane.add("Preferences.Connection", createConnectionPreferences()); tab_pane.add("Preferences.Warnings", createWarningPreferences()); Dictionary.register(tab_pane); JPanel button_pane = new JPanel(); ok_button = new JButton(); Dictionary.registerBoth(ok_button, "General.OK", "General.OK_Tooltip"); apply_button = new JButton(); Dictionary.registerBoth(apply_button, "General.Apply", "General.Apply_Tooltip"); cancel_button = new JButton(); Dictionary.registerBoth(cancel_button, "General.Cancel", "General.Cancel_Tooltip"); // Connection 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(); library_path_label.setPreferredSize(LABEL_SIZE); Dictionary.registerText(library_path_label, "Preferences.Connection.Library_Path"); library_path_field = new JTextField(Gatherer.config.getString("general.exec_address", true)); library_path_field.setCaretPosition(0); Dictionary.registerTooltip(library_path_field, "Preferences.Connection.Library_Path_Tooltip"); boolean currently_enabled = Gatherer.config.get("general.use_proxy", true); // Creation JPanel connection_pane = new JPanel(); use_proxy_checkbox = new JCheckBox(); use_proxy_checkbox.setSelected(currently_enabled); Dictionary.registerText(use_proxy_checkbox, "Preferences.Connection.Use_Proxy"); use_proxy_checkbox.setPreferredSize(ROW_SIZE); JPanel proxy_host_pane = new JPanel(); proxy_host_pane.setPreferredSize(ROW_SIZE); proxy_host_label = new JLabel(); proxy_host_label.setPreferredSize(LABEL_SIZE); Dictionary.registerText(proxy_host_label, "Preferences.Connection.Proxy_Host"); proxy_host_field = new JTextField(Gatherer.config.getString("general.proxy_host", true)); proxy_host_field.setEnabled(currently_enabled); Dictionary.registerTooltip(proxy_host_field, "Preferences.Connection.Proxy_Host_Tooltip"); JPanel proxy_port_pane = new JPanel(); proxy_port_pane.setPreferredSize(ROW_SIZE); proxy_port_label = new JLabel(); proxy_port_label.setPreferredSize(LABEL_SIZE); Dictionary.registerText(proxy_port_label, "Preferences.Connection.Proxy_Port"); String port_value = Gatherer.config.getString("general.proxy_port", true); if(port_value.length() > 0) { proxy_port_field = new JSpinner(new SpinnerNumberModel((new Integer(port_value)).intValue(), 0, 65535, 1)); } else { proxy_port_field = new JSpinner(new SpinnerNumberModel(0, 0, 65535, 1)); } proxy_port_field.setEnabled(currently_enabled); Dictionary.registerTooltip(proxy_port_field, "Preferences.Connection.Proxy_Port_Tooltip"); // Connection 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.setLayout(new GridLayout(8,1,0,2)); 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(); 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; // Users email JPanel email_pane = new JPanel(); email_label = new JLabel(); email_label.setPreferredSize(LABEL_SIZE); Dictionary.registerText(email_label, "Preferences.General.Email"); email_field = new EmailField(Gatherer.config.getColor("coloring.error_background", false)); email_field.setText(Gatherer.config.getEmail()); Dictionary.registerTooltip(email_field, "Preferences.General.Email_Tooltip"); // Extracted metadata view_extracted_metadata_checkbox = new JCheckBox(); view_extracted_metadata_checkbox.setSelected(false); if (Gatherer.config.get("general.view_extracted_metadata", Configuration.COLLECTION_SPECIFIC)) { view_extracted_metadata_checkbox.setSelected(true); } Dictionary.registerBoth(view_extracted_metadata_checkbox, "Preferences.General.View_Extracted_Metadata", "Preferences.General.View_Extracted_Metadata_Tooltip"); // Show file sizes show_file_size_checkbox = new JCheckBox(); show_file_size_checkbox.setSelected(false); if (Gatherer.config.get("general.show_file_size", Configuration.COLLECTION_SPECIFIC)) { show_file_size_checkbox.setSelected(true); } Dictionary.registerBoth(show_file_size_checkbox, "Preferences.General.Show_File_Size", "Preferences.General.Show_File_Size_Tooltip"); // Language JPanel language_pane = new JPanel(); language_label = new JLabel(); language_label.setPreferredSize(LABEL_SIZE); Dictionary.registerText(language_label, "Preferences.General.Interface_Language"); language_combobox = new JComboBox(dictionary_model.toArray()); Dictionary.registerTooltip(language_combobox, "Preferences.General.Interface_Language_Tooltip"); // Connect language_combobox.addActionListener(new LanguageComboboxListener()); // Layout email_pane.setLayout(new BorderLayout()); email_pane.add(email_label, BorderLayout.WEST); email_pane.add(email_field, BorderLayout.CENTER); 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(email_pane); general_pane.add(language_pane); general_pane.add(view_extracted_metadata_checkbox); general_pane.add(show_file_size_checkbox); 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 = 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(); title_label.setPreferredSize(ROW_SIZE); Dictionary.registerText(title_label, "Preferences.Workflow.Title"); workflow_browse = new JCheckBox(); workflow_browse.setSelected(Gatherer.config.get("workflow.browse", false)); workflow_browse.setPreferredSize(ROW_SIZE); Dictionary.registerText(workflow_browse, "Preferences.Workflow.Browse"); workflow_mirror = new JCheckBox(); workflow_mirror.setSelected(Gatherer.config.get("workflow.mirror", false)); workflow_mirror.setPreferredSize(ROW_SIZE); Dictionary.registerText(workflow_mirror, "Preferences.Workflow.Mirror"); workflow_gather = new JCheckBox(); workflow_gather.setSelected(Gatherer.config.get("workflow.gather", false)); workflow_gather.setPreferredSize(ROW_SIZE); Dictionary.registerText(workflow_gather, "Preferences.Workflow.Gather"); workflow_enrich = new JCheckBox(); workflow_enrich.setSelected(Gatherer.config.get("workflow.enrich", false)); workflow_enrich.setPreferredSize(ROW_SIZE); Dictionary.registerText(workflow_enrich, "Preferences.Workflow.Enrich"); workflow_design = new JCheckBox(); workflow_design.setSelected(Gatherer.config.get("workflow.design", false)); workflow_design.setPreferredSize(ROW_SIZE); Dictionary.registerText(workflow_design, "Preferences.Workflow.Design"); workflow_export = new JCheckBox(); workflow_export.setSelected(Gatherer.config.get("workflow.export", false)); workflow_export.setPreferredSize(ROW_SIZE); Dictionary.registerText(workflow_export, "Preferences.Workflow.Export"); workflow_create = new JCheckBox(); workflow_create.setSelected(Gatherer.config.get("workflow.create", false)); workflow_create.setPreferredSize(ROW_SIZE); Dictionary.registerText(workflow_create, "Preferences.Workflow.Create"); workflow_preview = new JCheckBox(); workflow_preview.setSelected(Gatherer.config.get("workflow.preview", false)); workflow_preview.setPreferredSize(ROW_SIZE); Dictionary.registerText(workflow_preview, "Preferences.Workflow.Preview"); JPanel predefined_pane = new JPanel(); predefined_label = new JLabel(); predefined_label.setPreferredSize(new Dimension(150,25)); Dictionary.registerText(predefined_label, "Preferences.Workflow.Predefined.Label"); JComboBox predefined_combobox = new JComboBox(predefined); // Connection 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() { // Where's my code for unregistering all of the components?!? // 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.getValue() + ""); Gatherer.setProxy(); // General preferences Gatherer.config.setEmail(email_field.getText()); Gatherer.config.set("general.show_file_size", Configuration.COLLECTION_SPECIFIC, show_file_size_checkbox.isSelected()); Gatherer.g_man.refreshTrees(DragTree.TREE_DISPLAY_CHANGED); 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("Hunt", workflow_browse.isSelected()); Gatherer.g_man.workflowUpdate("Mirror", workflow_mirror.isSelected()); Gatherer.g_man.workflowUpdate("Gather", workflow_gather.isSelected()); Gatherer.g_man.workflowUpdate("Enrich", workflow_enrich.isSelected()); Gatherer.g_man.workflowUpdate("Design", 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, Dictionary.get("Preferences.General.Restart_Required"), 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; } } }