package org.ripple.power.ui.btc;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import org.ripple.power.txns.btc.BTCLoader;
import org.ripple.power.txns.btc.ECException;
import org.ripple.power.txns.btc.ECKey;
import org.ripple.power.ui.UIRes;
import org.ripple.power.ui.view.ButtonPane;
import org.ripple.power.ui.view.log.ErrorLog;
public class SignDialog extends JDialog implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private final JComboBox<Object> nameField;
private final JTextArea messageField;
private final JScrollPane scrollPane;
private final JTextField signatureField;
public SignDialog(JDialog parent) {
super(parent, "Sign Message", Dialog.ModalityType.DOCUMENT_MODAL);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
String[] keyLabels = new String[BTCLoader.keys.size()];
int index = 0;
for (ECKey key : BTCLoader.keys){
keyLabels[index++] = key.getLabel();
}
nameField = new JComboBox<Object>(keyLabels);
nameField.setPreferredSize(new Dimension(200, 25));
JPanel namePane = new JPanel();
namePane.add(new JLabel("Key ", JLabel.RIGHT));
namePane.add(nameField);
messageField = new JTextArea(10, 70);
messageField.setLineWrap(true);
messageField.setWrapStyleWord(true);
messageField.setFont(nameField.getFont());
scrollPane = new JScrollPane(messageField);
JPanel messagePane = new JPanel();
messagePane.add(new JLabel("Message ", JLabel.RIGHT));
messagePane.add(scrollPane);
signatureField = new JTextField("", 70);
signatureField.setEditable(false);
JPanel signaturePane = new JPanel();
signaturePane.add(new JLabel("Signature ", JLabel.RIGHT));
signaturePane.add(signatureField);
JPanel buttonPane = new ButtonPane(this, 10, new String[] {"Sign", "sign"},
new String[] {"Copy", "copy"},
new String[] {"Done", "done"});
JPanel contentPane = new JPanel();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
contentPane.setOpaque(true);
contentPane.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
contentPane.add(namePane);
contentPane.add(Box.createVerticalStrut(15));
contentPane.add(messagePane);
contentPane.add(Box.createVerticalStrut(15));
contentPane.add(signaturePane);
contentPane.add(Box.createVerticalStrut(15));
contentPane.add(buttonPane);
setContentPane(contentPane);
}
public static void showDialog(JDialog parent) {
try {
JDialog dialog = new SignDialog(parent);
dialog.pack();
dialog.setLocationRelativeTo(parent);
dialog.setVisible(true);
} catch (Exception exc) {
ErrorLog.get().logException("Exception while displaying dialog", exc);
}
}
@Override
public void actionPerformed(ActionEvent ae) {
try {
String action = ae.getActionCommand();
switch (action) {
case "sign":
String message = messageField.getText();
if (message.length() == 0) {
UIRes.showErrorMessage(this, "Error", "You must enter the message text to sign");
} else {
int index = nameField.getSelectedIndex();
ECKey key = BTCLoader.keys.get(index);
String signature = key.signMessage(message);
signatureField.setText(signature);
}
break;
case "copy":
String signature = signatureField.getText();
StringSelection sel = new StringSelection(signature);
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
cb.setContents(sel, null);
break;
case "done":
setVisible(false);
dispose();
break;
}
} catch (ECException exc) {
ErrorLog.get().logException("Unable to sign message", exc);
} catch (Exception exc) {
ErrorLog.get().logException("Exception while processing action event", exc);
}
}
}