Package com.sk89q.skmcl.swing

Source Code of com.sk89q.skmcl.swing.LoginDialog

/*
* SK's Minecraft Launcher
* Copyright (C) 2010, 2011 Albert Pham <http://www.sk89q.com>
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/

package com.sk89q.skmcl.swing;

import com.sk89q.skmcl.session.Account;
import com.sk89q.skmcl.session.AccountList;
import com.sk89q.skmcl.util.Persistence;
import lombok.Getter;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import static com.sk89q.skmcl.util.SharedLocale._;

public abstract class LoginDialog extends JDialog {

    @Getter
    private final AccountList accounts;

    private JComboBox idCombo;
    private final JPasswordField passwordText = new JPasswordField();
    private final JCheckBox rememberIdCheck = new JCheckBox(_("loginDialog.rememberId"));
    private final JCheckBox rememberPassCheck = new JCheckBox(_("loginDialog.rememberPassword"));
    private final JButton loginButton = new JButton(_("loginDialog.login"));
    private final JButton forgotLogin = new JButton(_("loginDialog.forgotLogin"));
    private final JButton cancelButton = new JButton(_("button.cancel"));

    public LoginDialog(Window owner, AccountList accounts) {
        super(owner, ModalityType.DOCUMENT_MODAL);

        this.accounts = accounts;

        setTitle(_("loginDialog.title"));
        initComponents();
        bindListeners();
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setMinimumSize(new Dimension(420, 0));
        setResizable(false);
        pack();
        setLocationRelativeTo(owner);
    }

    private void initComponents() {
        idCombo = new JComboBox(getAccounts());
        updateSelection();

        FormPanel formPanel = new FormPanel();
        LinedBoxPanel buttonsPanel = new LinedBoxPanel(true);

        rememberIdCheck.setBorder(BorderFactory.createEmptyBorder());
        rememberPassCheck.setBorder(BorderFactory.createEmptyBorder());
        idCombo.setEditable(true);
        idCombo.getEditor().selectAll();

        formPanel.addRow(new JLabel(_("loginDialog.id")), idCombo);
        formPanel.addRow(new JLabel(_("loginDialog.password")), passwordText);
        formPanel.addRow(new JLabel(), rememberIdCheck);
        formPanel.addRow(new JLabel(), rememberPassCheck);
        buttonsPanel.setBorder(BorderFactory.createEmptyBorder(26, 13, 13, 13));

        buttonsPanel.addElement(forgotLogin);
        buttonsPanel.addGlue();
        buttonsPanel.addElement(loginButton);
        buttonsPanel.addElement(cancelButton);

        add(formPanel, BorderLayout.CENTER);
        add(buttonsPanel, BorderLayout.SOUTH);

        getRootPane().setDefaultButton(loginButton);
    }

    private void bindListeners() {
        idCombo.setComponentPopupMenu(TextFieldPopupMenu.INSTANCE);
        passwordText.setComponentPopupMenu(TextFieldPopupMenu.INSTANCE);

        idCombo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                updateSelection();
            }
        });

        forgotLogin.addActionListener(ActionListeners.openURL(forgotLogin, "https://minecraft.net/resetpassword"));

        loginButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                prepareLogin();
            }
        });

        cancelButton.addActionListener(ActionListeners.dispose(this));

        rememberPassCheck.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (rememberPassCheck.isSelected()) {
                    rememberIdCheck.setSelected(true);
                }
            }
        });

        rememberIdCheck.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!rememberIdCheck.isSelected()) {
                    rememberPassCheck.setSelected(false);
                }
            }
        });
    }

    private void updateSelection() {
        Object selected = idCombo.getSelectedItem();

        if (selected != null && selected instanceof Account) {
            Account account = (Account) selected;
            String password = account.getPassword();

            rememberIdCheck.setSelected(true);
            if (password != null) {
                rememberPassCheck.setSelected(true);
                passwordText.setText(password);
            } else {
                rememberPassCheck.setSelected(false);
                passwordText.setText("");
            }
        } else {
            passwordText.setText("");
            rememberIdCheck.setSelected(true);
            rememberPassCheck.setSelected(false);
        }
    }

    private void prepareLogin() {
        Object selected = idCombo.getSelectedItem();

        if (selected != null && selected instanceof Account) {
            Account account = (Account) selected;
            String password = passwordText.getText();

            if (password == null || password.isEmpty()) {
                SwingHelper.showErrorDialog(this, _("loginDialog.missingPassword"), _("errors.errorTitle"));
            } else {
                if (rememberPassCheck.isSelected()) {
                    account.setPassword(password);
                } else {
                    account.setPassword(null);
                }

                if (rememberIdCheck.isSelected()) {
                    accounts.add(account);
                } else {
                    accounts.remove(account);
                }

                account.setLastUsed(new Date());

                Persistence.commitAndForget(accounts);

                attemptLogin(account, password);
            }
        } else {
            SwingHelper.showErrorDialog(this, _("loginDialog.missingId"), _("errors.errorTitle"));
        }
    }

    protected abstract void attemptLogin(Account account, String password);

}
TOP

Related Classes of com.sk89q.skmcl.swing.LoginDialog

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.