package gui.create;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import qora.crypto.Base58;
import controller.Controller;
@SuppressWarnings("serial")
public class RecoverWalletFrame extends JFrame
{
private NoWalletFrame parent;
private JTextField seedTxt;
private JTextField passwordTxt;
private JTextField amountTxt;
private JDialog waitDialog;
private JTextField confirmPasswordTxt;
public RecoverWalletFrame(NoWalletFrame parent)
{
super("Qora - Recover Wallet");
//ICON
List<Image> icons = new ArrayList<Image>();
icons.add(Toolkit.getDefaultToolkit().getImage("images/icons/icon16.png"));
icons.add(Toolkit.getDefaultToolkit().getImage("images/icons/icon32.png"));
icons.add(Toolkit.getDefaultToolkit().getImage("images/icons/icon64.png"));
icons.add(Toolkit.getDefaultToolkit().getImage("images/icons/icon128.png"));
this.setIconImages(icons);
//PARENT
this.parent = parent;
//LAYOUT
this.setLayout(new GridBagLayout());
//PADDING
((JComponent) this.getContentPane()).setBorder(new EmptyBorder(5, 5, 5, 5));
//LABEL GBC
GridBagConstraints labelGBC = new GridBagConstraints();
labelGBC.insets = new Insets(5,5,5,5);
labelGBC.fill = GridBagConstraints.HORIZONTAL;
labelGBC.anchor = GridBagConstraints.NORTHWEST;
labelGBC.weightx = 1;
labelGBC.gridwidth = 2;
labelGBC.gridx = 0;
//BUTTON GBC
GridBagConstraints buttonGBC = new GridBagConstraints();
buttonGBC.insets = new Insets(5,5,5,5);
buttonGBC.fill = GridBagConstraints.NONE;
buttonGBC.anchor = GridBagConstraints.NORTHWEST;
buttonGBC.gridwidth = 1;
buttonGBC.gridx = 0;
//LABEL
labelGBC.gridy = 0;
JLabel label1 = new JLabel("Please enter your wallet seed:");
this.add(label1, labelGBC);
//ADD TEXTBOX
labelGBC.gridy = 1;
this.seedTxt = new JTextField();
this.add(this.seedTxt, labelGBC);
//LABEL
labelGBC.gridy = 2;
labelGBC.insets.top = 00;
JLabel label2 = new JLabel("Make sure your seed is in base58 format.");
this.add(label2, labelGBC);
//LABEL
labelGBC.gridy = 3;
labelGBC.insets.top = 10;
JLabel label3 = new JLabel("Please enter your wallet password:");
this.add(label3, labelGBC);
//ADD TEXTBOX
labelGBC.gridy = 4;
labelGBC.insets.top = 5;
this.passwordTxt = new JPasswordField();
this.add(this.passwordTxt, labelGBC);
//LABEL
labelGBC.gridy = 5;
labelGBC.insets.top = 10;
JLabel label4 = new JLabel("Please confirm your password:");
this.add(label4, labelGBC);
//ADD TEXTBOX
labelGBC.gridy = 6;
labelGBC.insets.top = 5;
this.confirmPasswordTxt = new JPasswordField();
this.add(this.confirmPasswordTxt, labelGBC);
//LABEL
labelGBC.gridy = 7;
labelGBC.insets.top = 10;
JLabel label5 = new JLabel("Amount of accounts to recover:");
this.add(label5, labelGBC);
//ADD TEXTBOX
labelGBC.gridy = 8;
labelGBC.insets.top = 5;
this.amountTxt = new JTextField();
this.amountTxt.setText("10");
this.add(this.amountTxt, labelGBC);
//BUTTON confirm
buttonGBC.gridy = 9;
JButton confirmButton = new JButton("Confirm");
confirmButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
onConfirmClick();
}
});
confirmButton.setPreferredSize(new Dimension(80, 25));
this.add(confirmButton, buttonGBC);
//BUTTON BACK
buttonGBC.gridx = 1;
JButton backButton = new JButton("Back");
backButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
onBackClick();
}
});
backButton.setPreferredSize(new Dimension(80, 25));
this.add(backButton, buttonGBC);
//CLOSE NICELY
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
Controller.getInstance().stopAll();
System.exit(0);
}
});
//CALCULATE HEIGHT WIDTH
this.pack();
this.setSize(500, this.getHeight());
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
private void onConfirmClick() {
//CHECK IF SEEDS MATCH
byte[] seed = Base58.decode(this.seedTxt.getText());
if(seed == null || seed.length != 32)
{
//INVALID SEED
String message = "Invalid or incorrect seed!";
JOptionPane.showMessageDialog(new JFrame(), message, "Invalid seed", JOptionPane.ERROR_MESSAGE);
return;
}
String password = this.passwordTxt.getText();
if(password.length() == 0)
{
//PASSWORD CANNOT BE EMPTY
String message = "Password cannot be empty!";
JOptionPane.showMessageDialog(new JFrame(), message, "Invalid password", JOptionPane.ERROR_MESSAGE);
return;
}
if(!password.equals(this.confirmPasswordTxt.getText()))
{
//PASSWORDS DO NOT MATCH
String message = "Password do not match!";
JOptionPane.showMessageDialog(new JFrame(), message, "Invalid password", JOptionPane.ERROR_MESSAGE);
return;
}
String amountString = this.amountTxt.getText();
int amount = 0;
try
{
amount = Integer.parseInt(amountString);
}
catch(Exception e)
{
//INVALID AMOUNT
String message = "Invalid amount!";
JOptionPane.showMessageDialog(new JFrame(), message, "Invalid amount", JOptionPane.ERROR_MESSAGE);
return;
}
if(amount < 1 /*|| amount > 100*/)
{
//INVALID AMOUNT
String message = "Amount must be between 1-100!";
JOptionPane.showMessageDialog(new JFrame(), message, "Invalid amount", JOptionPane.ERROR_MESSAGE);
return;
}
//CREATE WAIT DIALOG
JOptionPane optionPane = new JOptionPane("Scanning blockchain please wait...", JOptionPane.INFORMATION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, new Object[]{}, null);
this.waitDialog = new JDialog();
List<Image> icons = new ArrayList<Image>();
icons.add(Toolkit.getDefaultToolkit().getImage("images/icons/icon16.png"));
icons.add(Toolkit.getDefaultToolkit().getImage("images/icons/icon32.png"));
icons.add(Toolkit.getDefaultToolkit().getImage("images/icons/icon64.png"));
icons.add(Toolkit.getDefaultToolkit().getImage("images/icons/icon128.png"));
this.waitDialog.setIconImages(icons);
this.waitDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
this.waitDialog.setTitle("Please Wait");
this.waitDialog.setContentPane(optionPane);
this.waitDialog.setModal(true);
this.waitDialog.pack();
this.waitDialog.setLocationRelativeTo(null);
//RUN WAIT DIALOG IN THREAD SO IT DOES NOT BLOCK MAIN THREAD
new Thread()
{
public void run()
{
waitDialog.setVisible(true);
}
}.start();
//RECOVER WALLET
Controller.getInstance().recoverWallet(seed, password, amount);
//CLOSE DIALOG
waitDialog.dispose();
//CALLBACK
this.parent.onWalletCreated();
//CLOSE THIS WINDOW
this.dispose();
}
private void onBackClick()
{
this.parent.setVisible(true);
this.dispose();
}
}