package org.multibit.viewsystem.swing.view.panels;
import org.bitcoinj.wallet.Protos.Wallet.EncryptionType;
import org.multibit.controller.Controller;
import org.multibit.controller.bitcoin.BitcoinController;
import org.multibit.utils.ImageLoader;
import org.multibit.viewsystem.swing.action.CancelBackToParentAction;
import org.multibit.viewsystem.swing.action.CreateNewReceivingAddressSubmitAction;
import org.multibit.viewsystem.swing.view.components.MultiBitButton;
import org.multibit.viewsystem.swing.view.components.MultiBitLabel;
import org.multibit.viewsystem.swing.view.components.MultiBitTitledPanel;
import org.multibit.viewsystem.swing.view.dialogs.CreateNewReceivingAddressDialog;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* JPanel for creating new receiving addresses.
* (The JPanel is separated out of the JDialog to enable running tests headless on a server).
*
* @author jim
*
*/
public class CreateNewReceivingAddressPanel extends JPanel {
private static final long serialVersionUID = -1604698555807842464L;
private final Controller controller;
private final BitcoinController bitcoinController;
private ReceiveBitcoinPanel receiveBitcoinPanel;
private CreateNewReceivingAddressDialog createNewReceivingAddressDialog;
private MultiBitLabel messageText;
private CreateNewReceivingAddressSubmitAction createNewReceivingAddressSubmitAction;
private MultiBitButton createNewReceivingAddressSubmitButton;
private MultiBitButton cancelButton;
private JPasswordField walletPasswordField;
private MultiBitLabel walletPasswordPromptLabel;
private JComboBox numberOfAddresses;
private static final int STENT_WIDTH = 10;
public CreateNewReceivingAddressPanel(BitcoinController bitcoinController, ReceiveBitcoinPanel receiveBitcoinPanel,
CreateNewReceivingAddressDialog createNewReceivingAddressDialog) {
super();
this.bitcoinController = bitcoinController;
this.controller = this.bitcoinController;
this.receiveBitcoinPanel = receiveBitcoinPanel;
this.createNewReceivingAddressDialog = createNewReceivingAddressDialog;
setOpaque(false);
JPanel mainPanel = new JPanel();
mainPanel.setOpaque(false);
setLayout(new BorderLayout());
add(mainPanel, BorderLayout.CENTER);
mainPanel.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = 0;
constraints.gridy = 0;
constraints.weightx = 0.3;
constraints.weighty = 0.1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.anchor = GridBagConstraints.LINE_START;
mainPanel.add(MultiBitTitledPanel.createStent(STENT_WIDTH), constraints);
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = 7;
constraints.gridy = 1;
constraints.weightx = 0.3;
constraints.weighty = 0.1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.anchor = GridBagConstraints.LINE_START;
mainPanel.add(MultiBitTitledPanel.createStent(STENT_WIDTH), constraints);
MultiBitLabel explainLabel = new MultiBitLabel("");
explainLabel.setText(controller.getLocaliser().getString("createNewReceivingAddressDialog.message"));
constraints.fill = GridBagConstraints.NONE;
constraints.gridx = 3;
constraints.gridy = 1;
constraints.weightx = 0.8;
constraints.weighty = 1.0;
constraints.gridwidth = 3;
constraints.gridheight = 1;
constraints.anchor = GridBagConstraints.LINE_START;
mainPanel.add(explainLabel, constraints);
numberOfAddresses = new JComboBox();
numberOfAddresses.addItem(1);
numberOfAddresses.addItem(5);
numberOfAddresses.addItem(20);
numberOfAddresses.addItem(100);
//numberOfAddresses.addItem(new Integer(500));
constraints.fill = GridBagConstraints.NONE;
constraints.gridx = 5;
constraints.gridy = 1;
constraints.weightx = 0.3;
constraints.weighty = 0.3;
constraints.gridheight = 1;
constraints.gridwidth = 1;
constraints.anchor = GridBagConstraints.LINE_END;
mainPanel.add(numberOfAddresses, constraints);
// Add wallet password field.
walletPasswordPromptLabel = new MultiBitLabel(controller.getLocaliser().getString(
"showExportPrivateKeysPanel.walletPasswordPrompt"));
constraints.fill = GridBagConstraints.NONE;
constraints.gridx = 3;
constraints.gridy = 8;
constraints.weightx = 0.3;
constraints.weighty = 0.1;
constraints.gridheight = 1;
constraints.gridwidth = 1;
constraints.anchor = GridBagConstraints.LINE_START;
mainPanel.add(walletPasswordPromptLabel, constraints);
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridx = 4;
constraints.gridy = 7;
constraints.weightx = 0.05;
constraints.weighty = 0.1;
constraints.gridwidth = 1;
constraints.anchor = GridBagConstraints.CENTER;
mainPanel.add(MultiBitTitledPanel.createStent(MultiBitTitledPanel.SEPARATION_BETWEEN_NAME_VALUE_PAIRS), constraints);
JPanel filler4 = new JPanel();
filler4.setOpaque(false);
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = 3;
constraints.gridy = 7;
constraints.weightx = 0.3;
constraints.weighty = 0.01;
constraints.gridheight = 1;
constraints.gridwidth = 1;
constraints.anchor = GridBagConstraints.LINE_START;
mainPanel.add(filler4, constraints);
walletPasswordField = new JPasswordField(24);
walletPasswordField.setMinimumSize(new Dimension(200, 20));
constraints.fill = GridBagConstraints.NONE;
constraints.gridx = 5;
constraints.gridy = 8;
constraints.weightx = 0.3;
constraints.weighty = 0.1;
constraints.gridheight = 1;
constraints.gridwidth = 2;
constraints.anchor = GridBagConstraints.LINE_END;
mainPanel.add(walletPasswordField, constraints);
JPanel filler5 = new JPanel();
filler5.setOpaque(false);
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = 3;
constraints.gridy = 9;
constraints.weightx = 0.3;
constraints.weighty = 0.01;
constraints.gridheight = 1;
constraints.gridwidth = 1;
constraints.anchor = GridBagConstraints.LINE_START;
mainPanel.add(filler5, constraints);
if (this.bitcoinController.getModel().getActiveWallet() != null) {
if (this.bitcoinController.getModel().getActiveWallet().getEncryptionType() == EncryptionType.ENCRYPTED_SCRYPT_AES) {
// Need wallet password.
walletPasswordField.setEnabled(true);
walletPasswordPromptLabel.setEnabled(true);
} else {
// No wallet password required.
walletPasswordField.setEnabled(false);
walletPasswordPromptLabel.setEnabled(false);
}
}
JPanel buttonPanel = new JPanel();
buttonPanel.setOpaque(false);
constraints.fill = GridBagConstraints.NONE;
constraints.gridx = 3;
constraints.gridy = 10;
constraints.weightx = 0.8;
constraints.weighty = 0.1;
constraints.gridwidth = 4;
constraints.gridheight = 1;
constraints.anchor = GridBagConstraints.LINE_END;
mainPanel.add(buttonPanel, constraints);
CancelBackToParentAction cancelAction = new CancelBackToParentAction(controller,
ImageLoader.createImageIcon(ImageLoader.CROSS_ICON_FILE), createNewReceivingAddressDialog);
cancelButton = new MultiBitButton(cancelAction, controller);
cancelButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// Clear password.
if (walletPasswordField != null) {
walletPasswordField.setText("");
}
}});
if (createNewReceivingAddressDialog != null) {
createNewReceivingAddressDialog.addWindowListener(new WindowAdapter(){
@Override
public void windowClosed(WindowEvent arg0) {
if (walletPasswordField != null) {
walletPasswordField.setText("");
}
}
});
}
buttonPanel.add(cancelButton);
createNewReceivingAddressSubmitAction = new CreateNewReceivingAddressSubmitAction(this.bitcoinController,
createNewReceivingAddressDialog, this, walletPasswordField);
createNewReceivingAddressSubmitButton = new MultiBitButton(createNewReceivingAddressSubmitAction, controller);
buttonPanel.add(createNewReceivingAddressSubmitButton);
messageText = new MultiBitLabel("");
messageText.setText(" ");
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridx = 3;
constraints.gridy = 11;
constraints.weightx = 0.8;
constraints.weighty = 0.15;
constraints.gridwidth = 4;
constraints.anchor = GridBagConstraints.LINE_START;
mainPanel.add(messageText, constraints);
JLabel filler3 = new JLabel();
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridx = 7;
constraints.gridy = 11;
constraints.weightx = 0.05;
constraints.weighty = 0.1;
constraints.gridwidth = 1;
constraints.anchor = GridBagConstraints.LINE_START;
mainPanel.add(filler3, constraints);
JLabel filler6 = new JLabel();
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridx = 7;
constraints.gridy = 12;
constraints.weightx = 0.05;
constraints.weighty = 0.1;
constraints.gridwidth = 1;
constraints.anchor = GridBagConstraints.LINE_START;
mainPanel.add(filler6, constraints);
}
public void setMessageText(String message) {
messageText.setText(message);
}
public ReceiveBitcoinPanel getReceiveBitcoinPanel() {
return receiveBitcoinPanel;
}
public int getNumberOfAddressesToCreate() {
return ((Integer) numberOfAddresses.getSelectedItem()).intValue();
}
public JComboBox getNumberOfAddresses() {
return numberOfAddresses;
}
// Accessors used in testing.
public CreateNewReceivingAddressSubmitAction getCreateNewReceivingAddressSubmitAction() {
return createNewReceivingAddressSubmitAction;
}
public String getMessageText() {
return messageText.getText();
}
public void setWalletPassword(String walletPassword) {
walletPasswordField.setText(walletPassword);
}
public MultiBitButton getCancelButton() {
return cancelButton;
}
public boolean isWalletPasswordFieldEnabled() {
return walletPasswordField.isEnabled();
}
}