de.dal33t.powerfolder.ui.preferences.PreferencesDialog.java Source code

Java tutorial

Introduction

Here is the source code for de.dal33t.powerfolder.ui.preferences.PreferencesDialog.java

Source

/*
 * Copyright 2004 - 2008 Christian Sprajc. All rights reserved.
 *
 * This file is part of PowerFolder.
 *
 * PowerFolder 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.
 *
 * PowerFolder 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 PowerFolder. If not, see <http://www.gnu.org/licenses/>.
 *
 * $Id$
 */
package de.dal33t.powerfolder.ui.preferences;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JTabbedPane;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import com.jgoodies.binding.value.ValueHolder;
import com.jgoodies.binding.value.ValueModel;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.factories.ButtonBarFactory;

import de.dal33t.powerfolder.ConfigurationEntry;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.PreferencesEntry;
import de.dal33t.powerfolder.ui.WikiLinks;
import de.dal33t.powerfolder.ui.action.BaseAction;
import de.dal33t.powerfolder.ui.dialog.BaseDialog;
import de.dal33t.powerfolder.ui.dialog.DialogFactory;
import de.dal33t.powerfolder.ui.dialog.GenericDialogType;
import de.dal33t.powerfolder.ui.util.Help;
import de.dal33t.powerfolder.util.BrowserLauncher;
import de.dal33t.powerfolder.util.Translation;

public class PreferencesDialog extends BaseDialog {

    private ValueModel myDynDnsModel;
    private JButton okButton;
    private JButton cancelButton;
    private JButton helpButton;
    private List<PreferenceTab> preferenceTabs;
    private JTabbedPane tabbedPane;

    private InformationTab informationTab;
    private GeneralSettingsTab generalSettingsTab;
    private AdvancedSettingsTab advancedSettingsTab;
    private NetworkSettingsTab networkSettingsTab;
    private WarningsNotificationsSettingsTab warningsNotificationsSettingsTab;
    private DynDnsSettingsTab dynDnsSettingsTab;
    private ExpertSettingsTab expertSettingsTab;
    private PluginSettingsTab pluginSettingsTab;

    public PreferencesDialog(Controller controller) {
        super(Senior.MAIN_FRAME, controller, true);
        preferenceTabs = new ArrayList<PreferenceTab>();
    }

    public JDialog getDialog() {
        return dialog;
    }

    public String getTitle() {
        return Translation.getTranslation("preferences.dialog.title");
    }

    protected Icon getIcon() {
        return null;
    }

    public ValueModel getDynDnsModel() {
        return myDynDnsModel;
    }

    void enableTab(int index, boolean flag) {
        tabbedPane.setEnabledAt(index, flag);
    }

    void selectTab(int index) {
        tabbedPane.setSelectedIndex(index);
    }

    public JComponent getContent() {
        initComponents();

        if (PreferencesEntry.BEGINNER_MODE.getValueBoolean(getController())
                && !PreferencesEntry.EXPERT_MODE.getValueBoolean(getController())) {
            generalSettingsTab.getUIPanel().setBorder(Borders.createEmptyBorder("14dlu, 14dlu, 14dlu, 14dlu"));
            return generalSettingsTab.getUIPanel();
        } else {
            return tabbedPane;
        }
    }

    public void initComponents() {
        preferenceTabs.clear();

        myDynDnsModel = new ValueHolder(ConfigurationEntry.HOSTNAME.getValue(getController()));

        tabbedPane = new JTabbedPane(SwingConstants.TOP, JTabbedPane.WRAP_TAB_LAYOUT);

        // General tab
        generalSettingsTab = new GeneralSettingsTab(getController());
        preferenceTabs.add(generalSettingsTab);
        tabbedPane.addTab(generalSettingsTab.getTabName(), generalSettingsTab.getUIPanel());

        // Advanced tab
        advancedSettingsTab = new AdvancedSettingsTab(getController());
        preferenceTabs.add(advancedSettingsTab);
        tabbedPane.addTab(advancedSettingsTab.getTabName(), advancedSettingsTab.getUIPanel());

        // Warnings and Notifications tab
        warningsNotificationsSettingsTab = new WarningsNotificationsSettingsTab(getController());
        preferenceTabs.add(warningsNotificationsSettingsTab);
        tabbedPane.addTab(warningsNotificationsSettingsTab.getTabName(),
                warningsNotificationsSettingsTab.getUIPanel());

        // Information tab
        informationTab = new InformationTab(getController());
        preferenceTabs.add(informationTab);
        tabbedPane.addTab(informationTab.getTabName(), informationTab.getUIPanel());

        Boolean expertMode = PreferencesEntry.EXPERT_MODE.getValueBoolean(getController());
        if (expertMode) {

            // Expert tab
            expertSettingsTab = new ExpertSettingsTab(getController());
            preferenceTabs.add(expertSettingsTab);
            tabbedPane.addTab(expertSettingsTab.getTabName(), expertSettingsTab.getUIPanel());

            // Network tab
            networkSettingsTab = new NetworkSettingsTab(getController());
            preferenceTabs.add(networkSettingsTab);
            tabbedPane.addTab(networkSettingsTab.getTabName(), networkSettingsTab.getUIPanel());

            // DynDns tab
            if (!getController().isBackupOnly()) {
                dynDnsSettingsTab = new DynDnsSettingsTab(getController(), myDynDnsModel);
                preferenceTabs.add(dynDnsSettingsTab);
                tabbedPane.addTab(dynDnsSettingsTab.getTabName(), dynDnsSettingsTab.getUIPanel());
            }

            // Plugins tab
            if (getController().getPluginManager().countPlugins() > 0) {
                pluginSettingsTab = new PluginSettingsTab(getController(), this);
                preferenceTabs.add(pluginSettingsTab);
                tabbedPane.addTab(pluginSettingsTab.getTabName(), pluginSettingsTab.getUIPanel());
            }
        }

        tabbedPane.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                if (dynDnsSettingsTab == null) {
                    return;
                }
                if (tabbedPane.getSelectedComponent() == dynDnsSettingsTab.getUIPanel()) {
                    dynDnsSettingsTab.updateDynDnsInfo();
                }
            }
        });

        tabbedPane.setSelectedIndex(0);

        // Buttons
        okButton = createOKButton();
        cancelButton = createCancelButton();
        helpButton = createHelpButton();
    }

    private JButton createHelpButton() {
        if (!Help.hasWiki(getController())) {
            return null;
        }
        Action action = new BaseAction("action_help", getController()) {
            private static final long serialVersionUID = 100L;

            public void actionPerformed(ActionEvent e) {
                helpAction();
            }
        };
        return new JButton(action);
    }

    /**
     * Creates the okay button for the whole pref dialog
     */
    private JButton createOKButton() {
        return createOKButton(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //
                // OK button event handler
                //
                // disable the OK button while we are in the
                // working thread (i.e. prohibit re-entrance)
                okButton.setEnabled(false);

                // since we are performing a validation
                // that could take some time we need to warn the user about it.
                // However updating the gui while the task is progressing,
                // requires us to run the validation in a new thread that will
                // give the chance of the swing thread to update the GUI
                SwingWorker<Boolean, Object> worker = new SwingWorker<Boolean, Object>() {

                    protected Boolean doInBackground() throws Exception {
                        try {
                            // validate the user input and check the result
                            boolean success = validateSettings();
                            if (!success) {
                                return false;
                            }

                            // Save settings
                            saveSettings();
                            if (needsRestart()) {
                                handleRestartRequest();
                            }
                            return true;
                        } catch (Exception ex) {
                            logSevere(ex);
                            return false;
                        }
                    }

                    public void done() {
                        try {
                            if (get()) {
                                close();
                            }
                        } catch (Exception e1) {
                            logSevere(e1);
                            DialogFactory.genericDialog(getController(),
                                    Translation.getTranslation("preferences.dialog.save_error.title"),
                                    Translation.getTranslation("preferences.dialog.save_error.message"),
                                    GenericDialogType.ERROR);
                        } finally {
                            okButton.setEnabled(true);
                        }
                    }
                };
                worker.execute();
            }
        });
    }

    private JButton createCancelButton() {
        return createCancelButton(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                close();
                undoChanges();
            }
        });

    }

    /**
     * Asks user about restart and executes that if requested
     */
    private void handleRestartRequest() {
        int result = DialogFactory.genericDialog(getController(),
                Translation.getTranslation("preferences.dialog.restart.title"),
                Translation.getTranslation("preferences.dialog.restart.text"),
                new String[] { Translation.getTranslation("preferences.dialog.restart.restart") }, 0,
                GenericDialogType.INFO); // Default is restart

        if (result == 0) { // Restart
            getController().shutdownAndRequestRestart();
        }
    }

    protected Component getButtonBar() {
        if (helpButton != null) {
            return ButtonBarFactory.buildCenteredBar(helpButton, okButton, cancelButton);
        } else {
            return ButtonBarFactory.buildCenteredBar(okButton, cancelButton);
        }
    }

    protected JButton getDefaultButton() {
        return okButton;
    }

    private void saveSettings() {
        for (PreferenceTab tab : preferenceTabs) {
            tab.save();
        }
        getController().saveConfig();
    }

    /**
     * call undoChanges on all tabs, those changes that where done immediately
     * like laf change
     */
    private void undoChanges() {
        for (PreferenceTab tab : preferenceTabs) {
            tab.undoChanges();
        }
    }

    /**
     * Validates the settings before saving them persistently
     */
    private boolean validateSettings() {
        for (PreferenceTab tab : preferenceTabs) {
            boolean success = tab.validate();
            if (!success) {
                return false;
            }
        }
        return true;
    }

    private boolean needsRestart() {
        for (PreferenceTab tab : preferenceTabs) {
            if (tab.needsRestart()) {
                return true;
            }
        }
        return false;
    }

    public void helpAction() {
        Component component = tabbedPane.getSelectedComponent();
        String article = "";
        if (generalSettingsTab != null && component == generalSettingsTab.getUIPanel()) {
            article = WikiLinks.SETTINGS_GENERAL;
        } else if (advancedSettingsTab != null && component == advancedSettingsTab.getUIPanel()) {
            article = WikiLinks.SETTINGS_UI;
        } else if (networkSettingsTab != null && component == networkSettingsTab.getUIPanel()) {
            article = WikiLinks.SETTINGS_NETWORK;
        } else if (warningsNotificationsSettingsTab != null
                && component == warningsNotificationsSettingsTab.getUIPanel()) {
            article = WikiLinks.SETTINGS_DIALOG;
        } else if (dynDnsSettingsTab != null && component == dynDnsSettingsTab.getUIPanel()) {
            article = WikiLinks.SETTINGS_DYN_DNS;
        } else if (expertSettingsTab != null && component == expertSettingsTab.getUIPanel()) {
            article = WikiLinks.SETTINGS_EXPERT;
        } else if (pluginSettingsTab != null && component == pluginSettingsTab.getUIPanel()) {
            article = WikiLinks.SETTINGS_PLUGIN;
        } else if (informationTab != null && component == informationTab.getUIPanel()) {
            article = WikiLinks.SETTINGS_PLUGIN;
        }

        String wikiArticleURL = Help.getWikiArticleURL(getController(), article);
        BrowserLauncher.openURL(getController(), wikiArticleURL);
    }
}