/** *######################################################################### * * A component of the Gatherer application, part of the Greenstone digital * library suite from the New Zealand Digital Library Project at the * University of Waikato, New Zealand. * * Author: John Thompson, Greenstone Digital Library, University of Waikato * * Copyright (C) 1999 New Zealand Digital Library Project * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *######################################################################## */ 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.cdm.ClassifierManager; import org.greenstone.gatherer.cdm.LanguageManager; import org.greenstone.gatherer.cdm.PlugInManager; import org.greenstone.gatherer.checklist.CheckList; import org.greenstone.gatherer.checklist.Entry; import org.greenstone.gatherer.collection.Collection; import org.greenstone.gatherer.gui.EmailField; import org.greenstone.gatherer.gui.GLIButton; 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 { static final public String CONNECTION_PREFS = "connection"; static final public String GENERAL_PREFS = "general"; static final private Dimension LABEL_SIZE = new Dimension(280, 25); static final private Dimension ROW_SIZE = new Dimension(640, 25); static final private Dimension SIZE = new Dimension(640, 345); static final private String TRUE = "true"; private CheckList warning_preferences_check_list; private EmailField email_field; private JButton apply_button; private JButton cancel_button; private JButton clear_cache_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 program_label; private JLabel proxy_host_label; private JLabel proxy_port_label; //private JLabel recursion_depth_label; private JLabel title_label; private JRadioButton assistant_mode_radio_button; private JRadioButton expert_mode_radio_button; private JRadioButton librarian_mode_radio_button; private JRadioButton systems_mode_radio_button; private JSpinner proxy_port_field; //private JSpinner recursion_depth_spinner; private JTabbedPane tab_pane; private JTextArea mode_description_textarea; private JTextField library_path_field; private JTextField program_field; private JTextField proxy_host_field; private Preferences self; public Preferences() { this(GENERAL_PREFS); } public Preferences(String initial_view) { // 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.Mode", createModePreferences()); // !! Temporarily disabled for the UNESCO CD-ROM !! // tab_pane.add("Preferences.Workflow", createWorkflowPreferences()); JPanel connection_preferences = createConnectionPreferences(); tab_pane.add("Preferences.Connection", connection_preferences); tab_pane.add("Preferences.Warnings", createWarningPreferences()); Dictionary.register(tab_pane); JPanel button_pane = new JPanel(); ok_button = new GLIButton(); ok_button.setMnemonic(KeyEvent.VK_O); Dictionary.registerBoth(ok_button, "General.OK", "General.OK_Tooltip"); apply_button = new GLIButton(); apply_button.setMnemonic(KeyEvent.VK_A); Dictionary.registerBoth(apply_button, "General.Apply", "General.Apply_Tooltip"); cancel_button = new GLIButton(); cancel_button.setMnemonic(KeyEvent.VK_C); 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))); // Bring the desired pane to the fore if(initial_view.equals(CONNECTION_PREFS)) { tab_pane.setSelectedComponent(connection_preferences); } else { tab_pane.setSelectedComponent(general_preferences); } // Clean up general_preferences = null; connection_preferences = null; 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 program_pane = new JPanel(); program_pane.setPreferredSize(ROW_SIZE); program_label = new JLabel(); program_label.setPreferredSize(LABEL_SIZE); Dictionary.registerText(program_label, "Preferences.Connection.ProgramCommand"); program_field = new JTextField(Gatherer.config.getPreviewCommand()); program_field.setCaretPosition(0); Dictionary.registerTooltip(program_field, "Preferences.Connection.ProgramCommand_Tooltip"); 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"); /** @todo - add to dictionary. Bet you're getting sick of these by now! */ clear_cache_button = new GLIButton("Preferences.Connection.Clear_Cache"); // Connection use_proxy_checkbox.addActionListener(new UseProxyListener()); clear_cache_button.addActionListener(new ClearCacheListener()); // Layout program_pane.setLayout(new BorderLayout()); program_pane.add(program_label, BorderLayout.WEST); program_pane.add(program_field, BorderLayout.CENTER); 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(program_pane); connection_pane.add(library_path_pane); connection_pane.add(use_proxy_checkbox); connection_pane.add(proxy_host_pane); connection_pane.add(proxy_port_pane); if(Gatherer.config.get(StaticStrings.WORKFLOW_MIRROR, true)) { connection_pane.add(clear_cache_button); } return connection_pane; } private JPanel createGeneralPreferences() { JPanel general_pane = new JPanel(); // Build the model of available languages ArrayList dictionary_model = new ArrayList(); // Old method for determining what languages should be available in the combobox /* 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; */ // The new method makes use of the successor to the languages.dat file, classes/xml/languages.xml NodeList language_elements = LanguageManager.LANGUAGES_DOCUMENT.getDocumentElement().getElementsByTagName(StaticStrings.LANGUAGE_ELEMENT); for(int i = 0; i < language_elements.getLength(); i++) { Element language_element = (Element) language_elements.item(i); if((language_element.getAttribute(StaticStrings.GLI_ATTRIBUTE)).equalsIgnoreCase(StaticStrings.TRUE_STR) || (language_element.getAttribute(StaticStrings.MDS_ATTRIBUTE)).equalsIgnoreCase(StaticStrings.TRUE_STR)) { Locale locale = new Locale(language_element.getAttribute(StaticStrings.CODE_ATTRIBUTE)); String description = language_element.getAttribute(StaticStrings.NAME_ATTRIBUTE); DictionaryEntry entry = new DictionaryEntry(description, locale); if(!dictionary_model.contains(entry)) { dictionary_model.add(entry); } entry = null; description = null; locale = null; } language_element = null; } language_elements = 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"); // Try to locate and select the current language String language_code = Gatherer.config.getLanguage(); for(int b = 0; b < language_combobox.getItemCount(); b++) { DictionaryEntry entry = (DictionaryEntry) language_combobox.getItemAt(b); if(language_code.equalsIgnoreCase(entry.getLocale().getLanguage())) { language_combobox.setSelectedIndex(b); } } // Recursion /* JPanel recursion_depth_pane = new JPanel(); recursion_depth_label = new JLabel(); recursion_depth_label.setPreferredSize(LABEL_SIZE); Dictionary.registerText(recursion_depth_label, "Preferences.General.Recursion_Depth"); recursion_depth_spinner = new JSpinner(new SpinnerNumberModel(Gatherer.config.getInt("general.max_folder_depth", Configuration.COLLECTION_SPECIFIC), 0, Integer.MAX_VALUE, 1)); Dictionary.registerTooltip(recursion_depth_spinner, "Preferences.General.Recursion_Depth_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); //recursion_depth_pane.setLayout(new BorderLayout()); //recursion_depth_pane.add(recursion_depth_label, BorderLayout.WEST); //recursion_depth_pane.add(recursion_depth_spinner, 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(recursion_depth_pane); general_pane.add(view_extracted_metadata_checkbox); general_pane.add(show_file_size_checkbox); return general_pane; } /** Generate the controls for altering the detail mode. * @return a JPanel of controls */ private JPanel createModePreferences() { // Create Controls JPanel mode_panel = new JPanel(); JPanel button_panel = new JPanel(); ButtonGroup mode_button_group = new ButtonGroup(); assistant_mode_radio_button = new JRadioButton(Dictionary.get("Preferences.Mode.Assistant")); assistant_mode_radio_button.setOpaque(false); mode_button_group.add(assistant_mode_radio_button); expert_mode_radio_button = new JRadioButton(Dictionary.get("Preferences.Mode.Expert")); expert_mode_radio_button.setOpaque(false); mode_button_group.add(expert_mode_radio_button); librarian_mode_radio_button = new JRadioButton(Dictionary.get("Preferences.Mode.Librarian")); librarian_mode_radio_button.setOpaque(false); mode_button_group.add(librarian_mode_radio_button); systems_mode_radio_button = new JRadioButton(Dictionary.get("Preferences.Mode.Systems")); systems_mode_radio_button.setOpaque(false); mode_button_group.add(systems_mode_radio_button); mode_description_textarea = new JTextArea(); mode_description_textarea.setEditable(false); mode_description_textarea.setLineWrap(true); mode_description_textarea.setWrapStyleWord(true); // Determine which value is already selected switch(Gatherer.config.getMode()) { case Configuration.ASSISTANT_MODE: assistant_mode_radio_button.setSelected(true); mode_description_textarea.setText(Dictionary.get("Preferences.Mode.Assistant_Description")); break; case Configuration.SYSTEMS_MODE: systems_mode_radio_button.setSelected(true); mode_description_textarea.setText(Dictionary.get("Preferences.Mode.Systems_Description")); break; case Configuration.EXPERT_MODE: expert_mode_radio_button.setSelected(true); mode_description_textarea.setText(Dictionary.get("Preferences.Mode.Expert_Description")); break; default: librarian_mode_radio_button.setSelected(true); mode_description_textarea.setText(Dictionary.get("Preferences.Mode.Librarian_Description")); } // Connection - when a radio button is selected we have to change the description ModeRadioButtonListener listener = new ModeRadioButtonListener(); assistant_mode_radio_button.addActionListener(listener); expert_mode_radio_button.addActionListener(listener); librarian_mode_radio_button.addActionListener(listener); systems_mode_radio_button.addActionListener(listener); listener = null; // Layout button_panel.setBorder(BorderFactory.createEmptyBorder(0,0,5,0)); button_panel.setLayout(new GridLayout(4,1,2,2)); button_panel.add(assistant_mode_radio_button); button_panel.add(librarian_mode_radio_button); button_panel.add(systems_mode_radio_button); button_panel.add(expert_mode_radio_button); mode_panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); mode_panel.setLayout(new BorderLayout()); mode_panel.add(button_panel, BorderLayout.NORTH); mode_panel.add(new JScrollPane(mode_description_textarea), BorderLayout.CENTER); return mode_panel; } /** 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(); 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(5,0)); 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; } 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 program_str = program_field.getText(); if(program_str.length() > 0 && program_str.indexOf("%1") == -1) { program_str = program_str + " %1"; } Gatherer.config.setPreviewCommand(program_str); 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.enrich_pane.valueChanged((TreeSelectionEvent) null); // Refresh metadata table String current_lang = Gatherer.config.getLanguage(); String new_lang = ((DictionaryEntry)language_combobox.getSelectedItem()).getLocale().getLanguage(); if (!current_lang.equals(new_lang)) { Gatherer.config.setLocale("general.locale", Configuration.GENERAL_SETTING, ((DictionaryEntry)language_combobox.getSelectedItem()).getLocale()); // delete the plugins and classifiers.dat files PlugInManager.clearPlugInCache(); ClassifierManager.clearClassifierCache(); } //Gatherer.config.setInt("general.max_folder_depth", Configuration.COLLECTION_SPECIFIC, ((Integer)recursion_depth_spinner.getValue()).intValue()); // Mode preferences int current_mode = Gatherer.config.getMode(); int new_mode; if(assistant_mode_radio_button.isSelected()) { new_mode = Configuration.ASSISTANT_MODE; } else if(systems_mode_radio_button.isSelected()) { new_mode = Configuration.SYSTEMS_MODE; } else if(expert_mode_radio_button.isSelected()) { new_mode = Configuration.EXPERT_MODE; } else { new_mode = Configuration.LIBRARIAN_MODE; } // If there has been a change in modes, update the config, and also inform the persistant gui views that have a need to know if(new_mode != current_mode) { Gatherer.config.setMode(new_mode); Collection collection = Gatherer.c_man.getCollection(); if (collection != null) { collection.cdm.modeChanged(new_mode); } Gatherer.g_man.modeChanged(new_mode); } // 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.config.getMode() > Configuration.ASSISTANT_MODE)); 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 ClearCacheListener implements ActionListener { public void actionPerformed(ActionEvent event) { // Retrieve the cache folder and delete it. Utility.delete(Utility.getCacheDir()); } } 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(); } } } /** This listener updates the mode description depending on what mode is selected. */ private class ModeRadioButtonListener implements ActionListener { public void actionPerformed(ActionEvent event) { Object source = event.getSource(); if(source == assistant_mode_radio_button) { mode_description_textarea.setText(Dictionary.get("Preferences.Mode.Assistant_Description")); } else if(source == expert_mode_radio_button) { mode_description_textarea.setText(Dictionary.get("Preferences.Mode.Expert_Description")); } else if(source == systems_mode_radio_button) { mode_description_textarea.setText(Dictionary.get("Preferences.Mode.Systems_Description")); } else { mode_description_textarea.setText(Dictionary.get("Preferences.Mode.Librarian_Description")); } source = null; } } 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("General.Warning"), 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; } } }