package ru.denull.wire; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import ru.denull.mtproto.DataService; import ru.denull.mtproto.Server.RPCCallback; import ru.denull.wire.model.Config; import tl.auth.*; public class AuthDialog extends JDialog { private JTextField phoneNumberField; private JTextField phonePrefixField; private CardLayout pages; private JButton loginBtn; private JTextField codeField; private JButton doneBtn; private JTextField firstNameField; private JTextField lastNameField; private DataService service = DataService.getInstance(); private String phone; private SentCode code; private JButton backBtn; private JButton cancelBtn; private JCheckBox rememberCheck; /** * Create the dialog. */ public AuthDialog(Window window, ModalityType modality) { super(window, modality); setBounds(window.getX() + (window.getWidth() - 500) / 2, window.getY() + (window.getHeight() - 240) / 2, 500, 240); getContentPane().setLayout(new BorderLayout()); getRootPane().putClientProperty("apple.awt.documentModalSheet", "true"); setResizable(false); JLabel iconLabel = new JLabel(new ImageIcon(Utils.getImage("icon72.png"))); iconLabel.setVerticalAlignment(SwingConstants.TOP); iconLabel.setBorder(new EmptyBorder(20, 20, 20, 20)); getContentPane().add(iconLabel, BorderLayout.WEST); pages = new CardLayout(); final JPanel pagesPanel = new JPanel(); pagesPanel.setLayout(pages); getContentPane().add(pagesPanel, BorderLayout.CENTER); final JPanel phoneContent = new JPanel(); phoneContent.setLayout(new FlowLayout(FlowLayout.LEFT)); phoneContent.setBorder(new EmptyBorder(5, 0, 5, 5)); pagesPanel.add(phoneContent, "phone"); { JLabel infoLabel = new JLabel("<html>Чтобы выполнить вход, укажите ваш номер мобильного телефона.<br/><br/>На него будет отправлен авторизационный код, который необходимо ввести на следующем шаге.</html>"); infoLabel.setPreferredSize(new Dimension(370, 96)); phoneContent.add(infoLabel); JLabel countryLabel = new JLabel("Страна:", SwingConstants.LEFT); countryLabel.setPreferredSize(new Dimension(70, countryLabel.getPreferredSize().height)); phoneContent.add(countryLabel); JComboBox countryCombo = new JComboBox(Utils.getCountryNames()); countryCombo.setPreferredSize(new Dimension(290, countryCombo.getPreferredSize().height)); countryCombo.setSelectedIndex(172); phoneContent.add(countryCombo); JLabel phoneLabel = new JLabel("Телефон:", SwingConstants.LEFT); phoneLabel.setPreferredSize(new Dimension(71, phoneLabel.getPreferredSize().height)); phoneContent.add(phoneLabel); phonePrefixField = new JTextField("+7"); phonePrefixField.setHorizontalAlignment(JTextField.RIGHT); phonePrefixField.setPreferredSize(new Dimension(60, phonePrefixField.getPreferredSize().height)); phoneContent.add(phonePrefixField); phoneNumberField = new JTextField(); phoneNumberField.setPreferredSize(new Dimension(222, phoneNumberField.getPreferredSize().height)); phoneNumberField.getDocument().addDocumentListener(new DocumentListener() { public void removeUpdate(DocumentEvent e) { doneBtn.setEnabled(phoneNumberField.getText() != ""); } public void insertUpdate(DocumentEvent e) { doneBtn.setEnabled(phoneNumberField.getText() != ""); } public void changedUpdate(DocumentEvent e) { doneBtn.setEnabled(phoneNumberField.getText() != ""); } }); phoneContent.add(phoneNumberField); phoneNumberField.addAncestorListener( new RequestFocusListener() ); } JPanel waitContent = new JPanel(); waitContent.setLayout(new FlowLayout(FlowLayout.LEFT)); waitContent.setBorder(new EmptyBorder(5, 0, 5, 5)); pagesPanel.add(waitContent, "wait"); { JLabel infoLabel = new JLabel("<html>Подождите...</html>"); infoLabel.setPreferredSize(new Dimension(370, 96)); waitContent.add(infoLabel); JProgressBar progressBar = new JProgressBar(); progressBar.setIndeterminate(true); progressBar.setPreferredSize(new Dimension(350, progressBar.getPreferredSize().height)); waitContent.add(progressBar); } final JPanel codeContent = new JPanel(); codeContent.setLayout(new FlowLayout(FlowLayout.LEFT)); codeContent.setBorder(new EmptyBorder(5, 0, 5, 5)); pagesPanel.add(codeContent, "code"); { JLabel infoLabel = new JLabel("<html>На указанный номер отправлен авторизационный код. Введите его, чтобы войти.</html>"); infoLabel.setPreferredSize(new Dimension(370, 96)); codeContent.add(infoLabel); JLabel codeLabel = new JLabel("Код:", SwingConstants.LEFT); codeLabel.setPreferredSize(new Dimension(70, codeLabel.getPreferredSize().height)); codeContent.add(codeLabel); codeField = new JTextField(); codeField.setPreferredSize(new Dimension(290, codeField.getPreferredSize().height)); codeField.getDocument().addDocumentListener(new DocumentListener() { public void removeUpdate(DocumentEvent e) { doneBtn.setEnabled(codeField.getText() != ""); } public void insertUpdate(DocumentEvent e) { doneBtn.setEnabled(codeField.getText() != ""); } public void changedUpdate(DocumentEvent e) { doneBtn.setEnabled(codeField.getText() != ""); } }); codeContent.add(codeField); rememberCheck = new JCheckBox("Запомнить меня"); rememberCheck.setSelected(true); rememberCheck.setBorder(new EmptyBorder(0, 76, 0, 0)); rememberCheck.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { service.setStoragePolicy(rememberCheck.isSelected(), rememberCheck.isSelected(), rememberCheck.isSelected()); } }); codeContent.add(rememberCheck); } final JPanel registerContent = new JPanel(); registerContent.setLayout(new FlowLayout(FlowLayout.LEFT)); registerContent.setBorder(new EmptyBorder(5, 0, 5, 5)); pagesPanel.add(registerContent, "register"); { JLabel infoLabel = new JLabel("<html>Данный номер ещё не зарегистрирован.<br/><br/>Укажите свое имя, чтобы зарегистрироваться и начать использование Wire.</html>"); infoLabel.setPreferredSize(new Dimension(370, 96)); registerContent.add(infoLabel); JLabel firstNameLabel = new JLabel("Имя:", SwingConstants.LEFT); firstNameLabel.setPreferredSize(new Dimension(70, firstNameLabel.getPreferredSize().height)); registerContent.add(firstNameLabel); firstNameField = new JTextField(); firstNameField.setPreferredSize(new Dimension(290, firstNameField.getPreferredSize().height)); firstNameField.getDocument().addDocumentListener(new DocumentListener() { public void removeUpdate(DocumentEvent e) { doneBtn.setEnabled(!firstNameField.getText().isEmpty() && !lastNameField.getText().isEmpty()); } public void insertUpdate(DocumentEvent e) { doneBtn.setEnabled(!firstNameField.getText().isEmpty() && !lastNameField.getText().isEmpty()); } public void changedUpdate(DocumentEvent e) { doneBtn.setEnabled(!firstNameField.getText().isEmpty() && !lastNameField.getText().isEmpty()); } }); registerContent.add(firstNameField); JLabel lastNameLabel = new JLabel("Фамилия:", SwingConstants.LEFT); lastNameLabel.setPreferredSize(new Dimension(70, lastNameLabel.getPreferredSize().height)); registerContent.add(lastNameLabel); lastNameField = new JTextField(); lastNameField.setPreferredSize(new Dimension(290, lastNameField.getPreferredSize().height)); lastNameField.getDocument().addDocumentListener(new DocumentListener() { public void removeUpdate(DocumentEvent e) { doneBtn.setEnabled(!firstNameField.getText().isEmpty() && !lastNameField.getText().isEmpty()); } public void insertUpdate(DocumentEvent e) { doneBtn.setEnabled(!firstNameField.getText().isEmpty() && !lastNameField.getText().isEmpty()); } public void changedUpdate(DocumentEvent e) { doneBtn.setEnabled(!firstNameField.getText().isEmpty() && !lastNameField.getText().isEmpty()); } }); registerContent.add(lastNameField); } { JPanel buttonPane = new JPanel(); buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); getContentPane().add(buttonPane, BorderLayout.SOUTH); { backBtn = new JButton("« Назад"); backBtn.setActionCommand("Back"); backBtn.setVisible(false); backBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { backBtn.setVisible(false); doneBtn.setVisible(true); doneBtn.setEnabled(true); doneBtn.setText("Отправить код"); pages.show(pagesPanel, "phone"); phoneNumberField.requestFocusInWindow(); } }); buttonPane.add(backBtn); } { cancelBtn = new JButton("Отмена"); cancelBtn.setActionCommand("Cancel"); cancelBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { setVisible(false); System.exit(0); } }); buttonPane.add(cancelBtn); } { doneBtn = new JButton("Отправить код"); doneBtn.setActionCommand("OK"); doneBtn.setEnabled(false); doneBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { if (phoneContent.isVisible()) { // SEND CODE phone = phonePrefixField.getText() + phoneNumberField.getText(); if (service.mainServer == null) { //alert("Unable to connect to server"); return; } //progress = ProgressDialog.show(this, "Please wait...", "Connecting...", true); service.mainServer.call(new SendCode(phone, 0, Config.api_id, Config.api_hash, "ru"), new RPCCallback<SentCode>() { public void done(SentCode result) { System.out.println("Code sent!"); service.setPhone(phone); code = result; backBtn.setVisible(true); doneBtn.setVisible(true); doneBtn.setText(code.phone_registered ? "Войти" : "Продолжить"); doneBtn.setEnabled(false); codeField.setText(""); pages.show(pagesPanel, "code"); codeField.requestFocusInWindow(); } public void error(int code, final String message) { System.out.println("Error while trying to send code: " + message); backBtn.setVisible(false); doneBtn.setVisible(true); doneBtn.setEnabled(true); doneBtn.setText("Отправить код"); pages.show(pagesPanel, "phone"); phoneNumberField.requestFocusInWindow(); } }); backBtn.setVisible(false); doneBtn.setVisible(false); pages.show(pagesPanel, "wait"); } else if (codeContent.isVisible()) { // LOGIN / REGISTER if (code.phone_registered) { service.mainServer.call(new SignIn(phone, code.phone_code_hash, codeField.getText()), new RPCCallback<Authorization>() { public void done(Authorization result) { setVisible(false); Main.window.authorized(result.user); } public void error(int errorCode, final String message) { backBtn.setVisible(true); doneBtn.setVisible(true); doneBtn.setText("Войти"); doneBtn.setEnabled(false); codeField.setText(""); pages.show(pagesPanel, "code"); codeField.requestFocusInWindow(); } }); backBtn.setVisible(false); doneBtn.setVisible(false); pages.show(pagesPanel, "wait"); } else { backBtn.setVisible(true); doneBtn.setVisible(true); doneBtn.setText("Войти"); doneBtn.setEnabled(false); pages.show(pagesPanel, "register"); firstNameField.requestFocusInWindow(); } } else if (registerContent.isVisible()) { // REGISTER AND LOGIN service.mainServer.call(new SignUp(phone, code.phone_code_hash, codeField.getText(), firstNameField.getText(), lastNameField.getText()), new RPCCallback<Authorization>() { public void done(Authorization result) { setVisible(false); Main.window.authorized(result.user); } public void error(int errorCode, final String message) { firstNameField.requestFocusInWindow(); } }); backBtn.setVisible(false); doneBtn.setVisible(false); pages.show(pagesPanel, "wait"); } } }); buttonPane.add(doneBtn); getRootPane().setDefaultButton(doneBtn); } } } }