net.sf.jhylafax.SettingsDialog.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.jhylafax.SettingsDialog.java

Source

/**
 * JHylaFax - A java client for HylaFAX.
 *
 * Copyright (C) 2005 by Steffen Pingel <steffenp@gmx.de>
 *
 * 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 net.sf.jhylafax;

import static net.sf.jhylafax.JHylaFAX.i18n;
import java.awt.Color;
import java.util.Locale;
import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JSpinner;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import org.xnap.commons.gui.DefaultDialog;
import org.xnap.commons.gui.FileChooserPanel;
import org.xnap.commons.gui.completion.CompletionModeFactory;
import org.xnap.commons.gui.completion.CompletionModeFactory.CompletionModeInfo;
import org.xnap.commons.gui.settings.SettingComponentMediator;
import org.xnap.commons.gui.util.EnableListener;
import org.xnap.commons.gui.util.WhatsThis;
import org.xnap.commons.util.PortRange;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;

/**
 * A dialog for editing of global settings.
 * 
 * @author Steffen Pingel
 */
public class SettingsDialog extends DefaultDialog implements LocaleChangeListener {

    private JPanel connectionPanel;
    private JLabel hostnameLabel;
    private JTextField hostnameTextField;
    private JPanel jobPanel;
    private JobPanel jobParameterPanel;
    private JTabbedPane mainTabbedPane;
    private JLabel passwordLabel;
    private JTextField passwordTextField;
    private JLabel portLabel;
    private JSpinner portSpinner;
    private JLabel usernameLabel;
    private JTextField usernameTextField;
    private JLabel languageLabel;
    private DefaultComboBoxModel languageModel;
    private JCheckBox confirmNonPSCheckBox;
    private JCheckBox confirmDeleteCheckBox;
    private JRadioButton internalCoverRadionButton;
    private JLabel viewerPathLabel;
    private JLabel docViewerPathLabel;
    private JPanel pathsPanel;
    private JPanel monitorPanel;
    private JRadioButton externalCoverRadionButton;
    private FileChooserPanel externalCoverPathFileChooserPanel;
    private ExecutableChooserPanel viewerPathFileChooserPanel;
    private ExecutableChooserPanel docViewerPathFileChooserPanel;
    private JLabel passwordInfoLabel;
    private JCheckBox usePassiveCheckBox;
    private JPanel generalPanel;
    private SpinnerNumberModel portSpinnerModel;
    private DefaultComboBoxModel completionModeModel;
    private JLabel completionModeLabel;
    private JCheckBox sendCoverAsDocumentCheckBox;
    private JCheckBox updateOnStartupCheckBox;
    private JCheckBox showPollqCheckBox;
    private SettingComponentMediator settingMediator = new SettingComponentMediator();
    private JCheckBox adminModeCheckBox;
    private JPasswordField adminPasswordTextField;
    private JCheckBox autoUpdateCheckBox;
    private SpinnerNumberModel autoUpdateIntervalModel;
    private JSpinner autoUpdateIntervalSpinner;
    private JLabel autoUpdateIntervalLabel;
    private JCheckBox monitorPathCheckBox;
    private SpinnerNumberModel monitorPathIntervalModel;
    private JSpinner monitorPathIntervalSpinner;
    private JLabel monitorPathIntervalLabel;
    private ExecutableChooserPanel monitorPathFileChooserPanel;
    private JLabel monitorPathLabel;
    private FileChooserPanel addressBookPathFileChooserPanel;
    private JCheckBox customizeAddressBookCheckBox;

    public SettingsDialog(JFrame owner) {
        super(owner, BUTTON_OKAY | BUTTON_APPLY | BUTTON_CANCEL | BUTTON_CONTEXT_HELP);

        mainTabbedPane = new JTabbedPane();
        setMainComponent(mainTabbedPane);

        initializeConnectionForm();
        initializeGeneralForm();
        initializeJobForm();
        initializePathForm();
        initializeMonitorForm();

        updateLabels();
        revert();

        pack();
    }

    @Override
    public boolean apply() {
        settingMediator.apply();

        Settings.LOCALE.setValue((Locale) languageModel.getSelectedItem());
        Settings.DEFAULT_COMPLETION_MODE
                .setValue(((CompletionModeInfo) completionModeModel.getSelectedItem()).getClassName());

        jobParameterPanel.applyToSettings();

        Settings.VIEWER_PATH.setValue(viewerPathFileChooserPanel.getTextField().getText());
        Settings.DOC_VIEWER_PATH.setValue(docViewerPathFileChooserPanel.getTextField().getText());
        Settings.USE_INTERNAL_COVER.setValue(internalCoverRadionButton.isSelected());
        Settings.COVER_PATH.setValue(externalCoverPathFileChooserPanel.getTextField().getText());
        Settings.MONITOR_PATH_INTERVAL.setValue(monitorPathIntervalModel.getNumber().intValue());

        // XXX this is so wrong
        JHylaFAX.getInstance().settingsUpdated();

        return true;
    }

    private DefaultFormBuilder createForm() {
        FormLayout layout = new FormLayout("left:max(40dlu;pref), 3dlu, pref, pref:grow(0.5), pref:grow(0.5)", "");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        return builder;
    }

    public void initializeConnectionForm() {
        DefaultFormBuilder builder = createForm();
        connectionPanel = builder.getPanel();
        mainTabbedPane.add(connectionPanel);

        builder.appendSeparator(i18n.tr("HylaFAX Server"));

        hostnameTextField = new JTextField(Constants.DEFAULT_COLUMNS);
        settingMediator.add(Settings.HOSTNAME, hostnameTextField);
        hostnameLabel = builder.append("", hostnameTextField, 3);
        builder.nextLine();

        portSpinnerModel = new SpinnerNumberModel();
        portSpinnerModel.setMinimum(PortRange.MIN_PORT);
        portSpinnerModel.setMaximum(PortRange.MAX_PORT);
        settingMediator.add(Settings.PORT, portSpinnerModel);
        portSpinner = new JSpinner(portSpinnerModel);
        portSpinner.setEditor(new JSpinner.NumberEditor(portSpinner, "#"));
        portLabel = builder.append("", portSpinner);
        builder.nextLine();

        usePassiveCheckBox = new JCheckBox();
        settingMediator.add(Settings.USE_PASSIVE, usePassiveCheckBox);
        builder.append("", usePassiveCheckBox, 3);
        builder.nextLine();

        builder.appendSeparator(i18n.tr("Authentication"));

        usernameTextField = new JTextField(Constants.DEFAULT_COLUMNS);
        settingMediator.add(Settings.USERNAME, usernameTextField);
        usernameLabel = builder.append("", usernameTextField, 3);
        builder.nextLine();

        passwordInfoLabel = new JLabel();
        passwordInfoLabel.setForeground(Color.RED);
        builder.append(passwordInfoLabel, 5);
        builder.nextLine();

        passwordTextField = new JPasswordField(Constants.DEFAULT_COLUMNS);
        settingMediator.add(Settings.PASSWORD, passwordTextField);
        passwordLabel = builder.append("", passwordTextField, 3);
        builder.nextLine();

        adminModeCheckBox = new JCheckBox();
        settingMediator.add(Settings.ADMIN_MODE, adminModeCheckBox);
        adminPasswordTextField = new JPasswordField(Constants.DEFAULT_COLUMNS);
        settingMediator.add(Settings.ADMIN_PASSWORD, adminPasswordTextField);
        builder.append(adminModeCheckBox);
        builder.append(adminPasswordTextField, 3);
        builder.nextLine();

        adminModeCheckBox.addItemListener(new EnableListener(adminPasswordTextField));

        builder.appendSeparator(i18n.tr("Status Update"));

        updateOnStartupCheckBox = new JCheckBox();
        settingMediator.add(Settings.UPDATE_ON_STARTUP, updateOnStartupCheckBox);
        builder.append(updateOnStartupCheckBox, 4);
        builder.nextLine();

        autoUpdateCheckBox = new JCheckBox();
        autoUpdateCheckBox.setEnabled(false);
        settingMediator.add(Settings.DO_AUTO_UPDATE, autoUpdateCheckBox);
        // the auto updater is error prone, therefore it has been disabled
        // until fixed
        //builder.append(autoUpdateCheckBox, 4);
        builder.nextLine();

        autoUpdateIntervalModel = new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 30);
        settingMediator.add(Settings.AUTO_UPDATE_INTERVAL, autoUpdateIntervalModel);
        autoUpdateIntervalSpinner = new JSpinner(autoUpdateIntervalModel);
        autoUpdateIntervalSpinner.setEditor(new JSpinner.NumberEditor(autoUpdateIntervalSpinner, "# s"));
        //autoUpdateIntervalLabel = builder.append("", autoUpdateIntervalSpinner);
        autoUpdateIntervalLabel = new JLabel();
        builder.nextLine();

        autoUpdateCheckBox.addItemListener(new EnableListener(autoUpdateIntervalSpinner));
    }

    public void initializeGeneralForm() {
        DefaultFormBuilder builder = createForm();
        generalPanel = builder.getPanel();
        mainTabbedPane.add(generalPanel);

        builder.appendSeparator(i18n.tr("Appearance"));

        showPollqCheckBox = new JCheckBox();
        settingMediator.add(Settings.SHOW_POLLQ, showPollqCheckBox);
        builder.append(showPollqCheckBox, 5);
        builder.nextLine();

        languageModel = new DefaultComboBoxModel();
        JComboBox lanuageComboBox = new JComboBox(languageModel);
        lanuageComboBox.setRenderer(new DefaultListCellRenderer() {
            public java.awt.Component getListCellRendererComponent(javax.swing.JList list, Object value, int index,
                    boolean isSelected, boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if (value != null) {
                    setText(((Locale) value).getDisplayName());
                }
                return this;
            }
        });
        languageLabel = builder.append("", lanuageComboBox, 2);
        builder.nextLine();

        builder.appendSeparator(i18n.tr("Behavior"));

        completionModeModel = new DefaultComboBoxModel();
        JComboBox completionModeComboBox = new JComboBox(completionModeModel);
        completionModeComboBox.setRenderer(new DefaultListCellRenderer() {
            public java.awt.Component getListCellRendererComponent(javax.swing.JList list, Object value, int index,
                    boolean isSelected, boolean cellHasFocus) {
                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
                if (value != null) {
                    setText(((CompletionModeFactory.CompletionModeInfo) value).getName());
                }
                return this;
            }
        });
        completionModeLabel = builder.append("", completionModeComboBox, 2);
        builder.nextLine();

        builder.appendSeparator(i18n.tr("Confirmations"));

        confirmNonPSCheckBox = new JCheckBox();
        settingMediator.add(Settings.CONFIRM_NONPS, confirmNonPSCheckBox);
        builder.append(confirmNonPSCheckBox, 5);
        builder.nextLine();

        confirmDeleteCheckBox = new JCheckBox();
        settingMediator.add(Settings.CONFIRM_DELETE, confirmDeleteCheckBox);
        builder.append(confirmDeleteCheckBox, 5);
        builder.nextLine();
    }

    private void initializeJobForm() {
        DefaultFormBuilder builder = createForm();
        jobPanel = builder.getPanel();
        mainTabbedPane.add(jobPanel);

        jobParameterPanel = new JobPanel(false);
        builder.append(jobParameterPanel, 5);
    }

    public void initializePathForm() {
        DefaultFormBuilder builder = createForm();
        pathsPanel = builder.getPanel();
        mainTabbedPane.add(pathsPanel);

        builder.appendSeparator(i18n.tr("Programs"));

        viewerPathFileChooserPanel = new ExecutableChooserPanel(Constants.DEFAULT_COLUMNS);
        viewerPathFileChooserPanel.setDialogParent(this);
        viewerPathLabel = builder.append("", viewerPathFileChooserPanel, 3);
        builder.nextLine();

        docViewerPathFileChooserPanel = new ExecutableChooserPanel(Constants.DEFAULT_COLUMNS);
        docViewerPathFileChooserPanel.setDialogParent(this);
        docViewerPathLabel = builder.append("", docViewerPathFileChooserPanel, 3);
        builder.nextLine();

        builder.appendSeparator(i18n.tr("Address Book"));

        customizeAddressBookCheckBox = new JCheckBox();
        settingMediator.add(Settings.CUSTOMIZE_ADDRESS_BOOK_FILENAME, customizeAddressBookCheckBox);
        builder.append(customizeAddressBookCheckBox, 5);
        builder.nextLine();

        addressBookPathFileChooserPanel = new FileChooserPanel(Constants.DEFAULT_COLUMNS);
        settingMediator.add(Settings.ADDRESS_BOOK_FILENAME, addressBookPathFileChooserPanel.getTextField());
        addressBookPathFileChooserPanel.setDialogParent(this);
        builder.append(addressBookPathFileChooserPanel, 5);
        builder.nextLine();

        customizeAddressBookCheckBox.addItemListener(new EnableListener(addressBookPathFileChooserPanel));

        builder.appendSeparator(i18n.tr("Cover"));

        internalCoverRadionButton = new JRadioButton();
        internalCoverRadionButton.setSelected(true);
        builder.append(internalCoverRadionButton, 5);
        builder.nextLine();

        externalCoverRadionButton = new JRadioButton();
        externalCoverPathFileChooserPanel = new FileChooserPanel(Constants.DEFAULT_COLUMNS);
        externalCoverPathFileChooserPanel.setEnabled(false);
        externalCoverPathFileChooserPanel.setDialogParent(this);
        builder.append(externalCoverRadionButton, 5);
        builder.nextLine();

        externalCoverRadionButton.addItemListener(new EnableListener(externalCoverPathFileChooserPanel));

        builder.append(externalCoverPathFileChooserPanel, 5);
        builder.nextLine();

        ButtonGroup buttonGroup = new ButtonGroup();
        buttonGroup.add(internalCoverRadionButton);
        buttonGroup.add(externalCoverRadionButton);

        sendCoverAsDocumentCheckBox = new JCheckBox();
        settingMediator.add(Settings.SEND_COVER_AS_DOCUMENT, sendCoverAsDocumentCheckBox);
        builder.append(sendCoverAsDocumentCheckBox, 5);
        builder.nextLine();
    }

    public void initializeMonitorForm() {
        DefaultFormBuilder builder = createForm();
        monitorPanel = builder.getPanel();
        mainTabbedPane.add(monitorPanel);

        monitorPathCheckBox = new JCheckBox();
        settingMediator.add(Settings.DO_MONITOR_PATH, monitorPathCheckBox);
        builder.append(monitorPathCheckBox, 4);
        builder.nextLine();

        monitorPathFileChooserPanel = new ExecutableChooserPanel(Constants.DEFAULT_COLUMNS);
        monitorPathFileChooserPanel.setDialogParent(this);
        settingMediator.add(Settings.MONITOR_PATH, monitorPathFileChooserPanel.getTextField());
        monitorPathLabel = builder.append("", monitorPathFileChooserPanel, 3);
        builder.nextLine();

        monitorPathIntervalModel = new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 30);
        monitorPathIntervalSpinner = new JSpinner(monitorPathIntervalModel);
        monitorPathIntervalSpinner.setEditor(new JSpinner.NumberEditor(monitorPathIntervalSpinner, "# s"));
        monitorPathIntervalLabel = builder.append("", monitorPathIntervalSpinner);
        builder.nextLine();

        monitorPathCheckBox
                .addItemListener(new EnableListener(monitorPathFileChooserPanel, monitorPathIntervalSpinner));
    }

    public void defaults() {
        settingMediator.revertToDefaults();

        languageModel.setSelectedItem(Settings.LOCALE.getDefaultValue());
        completionModeModel.setSelectedItem(CompletionModeFactory
                .getCompletionModeInfoByClassName(Settings.DEFAULT_COMPLETION_MODE.getDefaultValue()));

        jobParameterPanel.revertFromDefaultSettings();

        viewerPathFileChooserPanel.getTextField().setText(Settings.VIEWER_PATH.getDefaultValue());
        docViewerPathFileChooserPanel.getTextField().setText(Settings.DOC_VIEWER_PATH.getDefaultValue());
        internalCoverRadionButton.setSelected(Settings.USE_INTERNAL_COVER.getDefaultValue());
        externalCoverPathFileChooserPanel.getTextField().setText(Settings.COVER_PATH.getDefaultValue());
        monitorPathIntervalModel.setValue(Settings.MONITOR_PATH_INTERVAL.getDefaultValue());
    }

    public void revert() {
        settingMediator.revert();

        languageModel.setSelectedItem(Settings.LOCALE.getValue());
        completionModeModel.setSelectedItem(CompletionModeFactory
                .getCompletionModeInfoByClassName(Settings.DEFAULT_COMPLETION_MODE.getValue()));

        jobParameterPanel.revertFromSettings();

        viewerPathFileChooserPanel.getTextField().setText(Settings.VIEWER_PATH.getValue());
        docViewerPathFileChooserPanel.getTextField().setText(Settings.DOC_VIEWER_PATH.getValue());
        internalCoverRadionButton.setSelected(Settings.USE_INTERNAL_COVER.getValue());
        externalCoverPathFileChooserPanel.getTextField().setText(Settings.COVER_PATH.getValue());
        monitorPathIntervalModel.setValue(Settings.MONITOR_PATH_INTERVAL.getValue());
    }

    public void updateLabels() {
        setTitle(i18n.tr("Settings"));

        mainTabbedPane.setTitleAt(mainTabbedPane.indexOfComponent(connectionPanel), i18n.tr("Connection"));
        hostnameLabel.setText(i18n.tr("Host"));
        usePassiveCheckBox.setText(i18n.tr("Passive Transfers (Select If Transfers Timeout)"));
        portLabel.setText(i18n.tr("Port"));
        usernameLabel.setText(i18n.tr("Username"));
        WhatsThis.setText(usernameTextField, i18n.tr("The username that is sent to the server."));
        passwordLabel.setText(i18n.tr("Password"));
        passwordInfoLabel
                .setText("Warning: Passwords are saved in plain text! If not entered a prompt will be displayed.");
        adminModeCheckBox.setText(i18n.tr("Admin Privileges"));
        updateOnStartupCheckBox.setText(i18n.tr("Update Status on Startup"));
        autoUpdateCheckBox.setText(i18n.tr("Automatically Update Status"));
        autoUpdateIntervalLabel.setText(i18n.tr("Update Interval"));

        mainTabbedPane.setTitleAt(mainTabbedPane.indexOfComponent(generalPanel), i18n.tr("General"));
        Object selectedItem = languageModel.getSelectedItem();
        languageModel.removeAllElements();
        for (Locale locale : JHylaFAX.SUPPORTED_LOCALES) {
            languageModel.addElement(locale);
        }
        languageModel.setSelectedItem(selectedItem);
        showPollqCheckBox.setText(i18n.tr("Show Pollable Faxes (Takes Effect after Restart)"));
        selectedItem = completionModeModel.getSelectedItem();
        completionModeModel.removeAllElements();
        for (CompletionModeInfo mode : CompletionModeFactory.getInstalledCompletionModes()) {
            completionModeModel.addElement(mode);
        }
        completionModeModel.setSelectedItem(selectedItem);
        languageLabel.setText(i18n.tr("Lanuage"));
        completionModeLabel.setText(i18n.tr("Default Text Completion"));
        confirmNonPSCheckBox.setText(i18n.tr("Confirm Sending Non-Postscript Documents"));
        confirmDeleteCheckBox.setText(i18n.tr("Confirm Delete"));

        mainTabbedPane.setTitleAt(mainTabbedPane.indexOfComponent(jobPanel), i18n.tr("Fax"));
        jobParameterPanel.updateLabels();

        mainTabbedPane.setTitleAt(mainTabbedPane.indexOfComponent(pathsPanel), i18n.tr("Paths"));
        viewerPathLabel.setText(i18n.tr("Fax Viewer"));
        docViewerPathLabel.setText(i18n.tr("Document Viewer"));
        customizeAddressBookCheckBox.setText(i18n.tr("Use Custom Address Book (Takes Effect after Restart)"));
        internalCoverRadionButton.setText(i18n.tr("Use Internal Cover"));
        externalCoverRadionButton.setText(i18n.tr("Use Custom PostScript File"));
        sendCoverAsDocumentCheckBox.setText(i18n.tr("Save Cover in Document Queue After Sending"));

        mainTabbedPane.setTitleAt(mainTabbedPane.indexOfComponent(monitorPanel), i18n.tr("Monitor"));
        monitorPathCheckBox.setText(i18n.tr("Monitor File"));
        monitorPathLabel.setText(i18n.tr("File"));
        monitorPathIntervalLabel.setText(i18n.tr("Monitor Interval"));
    }

}