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

Java tutorial

Introduction

Here is the source code for de.dal33t.powerfolder.ui.preferences.DynDnsSettingsTab.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.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.security.Security;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import com.jgoodies.binding.adapter.BasicComponentFactory;
import com.jgoodies.binding.value.ValueModel;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.factories.Borders;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

import de.dal33t.powerfolder.ConfigurationEntry;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.PFComponent;
import de.dal33t.powerfolder.ui.util.Icons;
import de.dal33t.powerfolder.ui.util.SwingWorker;
import de.dal33t.powerfolder.util.StringUtils;
import de.dal33t.powerfolder.util.Translation;
import de.dal33t.powerfolder.ui.util.SimpleComponentFactory;

public class DynDnsSettingsTab extends PFComponent implements PreferenceTab {

    // disposition constants for status messages
    static final int DISP_INFO = 0; // just informing message
    static final int DISP_WARNING = 1; // warning
    static final int DISP_ERROR = 2; // error

    private static String password;
    private static String username;
    private static String newDyndns;
    private static String dyndnsSystem;

    private JTextField myDnsField;
    private JLabel myDnsLabel;

    private JPanel panel;
    private JTextField dyndnsUserField;
    private JPasswordField dyndnsPasswordField;
    private JLabel currentIPField;
    private JLabel updatedIPField;
    private JCheckBox cbAutoUpdate;
    private ValueModel mydnsndsModel;
    private JButton updateButton;

    public DynDnsSettingsTab(Controller controller, ValueModel mydnsndsModel) {
        super(controller);
        this.mydnsndsModel = mydnsndsModel;
        initComponents();
    }

    public String getTabName() {
        return Translation.getTranslation("exp.preferences.dyn_dns.title");
    }

    public boolean needsRestart() {
        return false;
    }

    public void undoChanges() {

    }

    public boolean validate() {
        if (mydnsndsModel.getValue() == null || ((String) mydnsndsModel.getValue()).trim().length() == 0) {
            return true;
        }
        if (!getController().getDynDnsManager().validateDynDns(mydnsndsModel.getValue().toString())) {
            // myDnsField.grabFocus();
            // myDnsField.selectAll();
            return false;
        }

        // all validations have passed
        return true;
    }

    /**
     * Saves the dyndns settings
     */
    public void save() {
        String theDyndnsHost = (String) mydnsndsModel.getValue();
        if (StringUtils.isBlank(theDyndnsHost)) {
            ConfigurationEntry.HOSTNAME.removeValue(getController());
        } else {
            ConfigurationEntry.HOSTNAME.setValue(getController(), theDyndnsHost);
        }

        if (!StringUtils.isBlank(theDyndnsHost)) {
            if (StringUtils.isBlank(dyndnsUserField.getText())) {
                ConfigurationEntry.DYNDNS_USERNAME.removeValue(getController());
            } else {
                ConfigurationEntry.DYNDNS_USERNAME.setValue(getController(), dyndnsUserField.getText());
            }

            String thePassword = new String(dyndnsPasswordField.getPassword());
            if (StringUtils.isBlank(thePassword)) {
                ConfigurationEntry.DYNDNS_PASSWORD.removeValue(getController());
            } else {
                ConfigurationEntry.DYNDNS_PASSWORD.setValue(getController(), thePassword);
            }
        }

        boolean b = cbAutoUpdate.isSelected();
        ConfigurationEntry.DYNDNS_AUTO_UPDATE.setValue(getController(), Boolean.valueOf(b).toString());

        // Let the DynDns manager check if he needs to do something.
        getController().getDynDnsManager().updateIfNessesary();
    }

    /*
     * Builds DynDns UI panel
     */
    public JPanel getUIPanel() {
        if (panel == null) {
            FormLayout layout = new FormLayout("right:pref, 3dlu, 140dlu, pref",
                    "pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, "
                            + "3dlu, pref, 3dlu, pref, 3dlu");

            PanelBuilder builder = new PanelBuilder(layout);
            builder.setBorder(Borders.createEmptyBorder("3dlu, 3dlu, 3dlu, 3dlu"));
            CellConstraints cc = new CellConstraints();

            int row = 1;
            builder.add(myDnsLabel, cc.xy(1, row));
            builder.add(myDnsField, cc.xy(3, row));

            row += 2;
            builder.add(cbAutoUpdate, cc.xy(3, row));

            row += 2;
            builder.addTitle(Translation.getTranslation("exp.preferences.dyn_dns.login_panel"), cc.xy(1, row));

            row += 2;
            builder.addLabel(Translation.getTranslation("exp.preferences.dyn_dns.user_name"), cc.xy(1, row));
            builder.add(dyndnsUserField, cc.xy(3, row));

            row += 2;
            dyndnsPasswordField.setEchoChar('*');
            builder.addLabel(Translation.getTranslation("exp.preferences.dyn_dns.password"), cc.xy(1, row));
            builder.add(dyndnsPasswordField, cc.xy(3, row));

            row += 4;
            builder.addLabel(Translation.getTranslation("exp.preferences.dyn_dns.current_ip"), cc.xy(1, row));
            builder.add(currentIPField, cc.xy(3, row));

            row += 2;
            builder.addLabel(Translation.getTranslation("exp.preferences.dyn_dns.updated_ip"), cc.xy(1, row));
            builder.add(updatedIPField, cc.xy(3, row));

            row += 2;
            builder.add(updateButton, cc.xy(3, row));

            panel = builder.getPanel();
        }
        return panel;
    }

    private void initComponents() {
        // DynDns
        myDnsField = BasicComponentFactory.createTextField(mydnsndsModel, false);
        myDnsField.addFocusListener(new FocusListener() {
            public void focusGained(FocusEvent e) {
            }

            public void focusLost(FocusEvent e) {
                updateDynDnsInfo();
            }
        });
        myDnsLabel = new JLabel(Translation.getTranslation("exp.preferences.dyn_dns_host_name"));

        if (ConfigurationEntry.DYNDNS_USERNAME.getValue(getController()) == null) {
            dyndnsUserField = new JTextField("");
        } else {
            dyndnsUserField = new JTextField(ConfigurationEntry.DYNDNS_USERNAME.getValue(getController()));
        }

        if (ConfigurationEntry.DYNDNS_PASSWORD.getValue(getController()) == null) {
            dyndnsPasswordField = new JPasswordField("");
        } else {
            dyndnsPasswordField = new JPasswordField(ConfigurationEntry.DYNDNS_PASSWORD.getValue(getController()));
        }

        currentIPField = new JLabel();
        updatedIPField = new JLabel();

        cbAutoUpdate = SimpleComponentFactory
                .createCheckBox(Translation.getTranslation("exp.preferences.dyn_dns.auto_update"));
        cbAutoUpdate.setSelected(isUpdateSelected());

        updateButton = createUpdateButton(new UpdateDynDnsAction());

        mydnsndsModel.addValueChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
                enableDisableComponents();
            }
        });
        cbAutoUpdate.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                enableDisableComponents();
            }
        });
        enableDisableComponents();
    }

    /**
     * Starts a worker which gathers the current dyndns stuff. e.g. own ip.
     */
    protected void updateDynDnsInfo() {
        logFine("Gathering dyndns infos. Cache: " + Security.getProperty("networkaddress.cache.ttl"));
        SwingWorker worker = new SwingWorker() {
            private String ownIP;
            private String dyndnsIP;

            @Override
            public Object construct() {
                ownIP = getController().getDynDnsManager().getIPviaHTTPCheckIP();
                // if (!isUpdateSelected()) {
                dyndnsIP = getController().getDynDnsManager().getHostIP((String) mydnsndsModel.getValue());
                // } else {
                // dyndnsIP = ConfigurationEntry.DYNDNS_LAST_UPDATED_IP
                // .getValue(getController());
                // }

                return null;
            }

            @Override
            public void finished() {
                currentIPField.setText(ownIP);
                updatedIPField.setText(dyndnsIP);
            }
        };
        worker.start();
    }

    private boolean isUpdateSelected() {
        return ConfigurationEntry.DYNDNS_AUTO_UPDATE.getValueBoolean(getController());
    }

    private JButton createUpdateButton(ActionListener listener) {
        updateButton = new JButton(Translation.getTranslation("exp.preferences.dyn_dns.update_button"));
        updateButton.addActionListener(listener);
        return updateButton;
    }

    private void enableDisableComponents() {
        boolean enable = !StringUtils.isBlank((String) mydnsndsModel.getValue()) && cbAutoUpdate.isSelected();
        updateButton.setEnabled(enable);
        dyndnsUserField.setEditable(enable);
        dyndnsPasswordField.setEditable(enable);
    }

    public static String getPassword() {
        return password;
    }

    public static void setPassword(String password) {
        DynDnsSettingsTab.password = password;
    }

    public static String getUsername() {
        return username;
    }

    public static void setUsername(String username) {
        DynDnsSettingsTab.username = username;
    }

    public static String getNewDyndns() {
        return newDyndns;
    }

    public static void setNewDyndns(String newDyndns) {
        DynDnsSettingsTab.newDyndns = newDyndns;
    }

    public static String getDyndnsSystem() {
        return dyndnsSystem;
    }

    public static void setDyndnsSystem(String dyndnsSystem) {
        DynDnsSettingsTab.dyndnsSystem = dyndnsSystem;
    }

    private class UpdateDynDnsAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            new Thread() {
                public void run() {
                    updateButton.setEnabled(false);

                    setUsername(dyndnsUserField.getText());
                    setPassword(new String(dyndnsPasswordField.getPassword()));
                    setNewDyndns((String) mydnsndsModel.getValue());
                    if (dyndnsUserField.getText().length() == 0) {
                        dyndnsUserField.grabFocus();
                    } else if (new String(dyndnsPasswordField.getPassword()).length() == 0) {
                        dyndnsPasswordField.grabFocus();
                    }

                    if (!StringUtils.isEmpty(getNewDyndns()) && dyndnsUserField.getText().length() != 0
                            && new String(dyndnsPasswordField.getPassword()).length() != 0) {
                        // update
                        getController().getDynDnsManager().forceUpdate();
                        updatedIPField.setText(ConfigurationEntry.DYNDNS_LAST_UPDATED_IP.getValue(getController()));
                    } else {
                        updateButton.setEnabled(false);
                        getController().getDynDnsManager().showPanelErrorMessage();
                    }
                    updateButton.setEnabled(true);
                }
            }.start();
        }
    }
}