package org.ripple.power.ui; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.math.BigDecimal; import java.util.ArrayList; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.KeyStroke; import org.json.JSONObject; import org.ripple.power.config.LSystem; import org.ripple.power.txns.AccountFind; import org.ripple.power.txns.CurrencyUtils; import org.ripple.power.txns.NameFind; import org.ripple.power.txns.Payment; import org.ripple.power.txns.Rollback; import org.ripple.power.ui.graphics.LColor; import org.ripple.power.ui.view.RPJSonLog; import org.ripple.power.ui.view.WaitDialog; import org.ripple.power.utils.MathUtils; import org.ripple.power.utils.StringUtils; import org.ripple.power.wallet.WalletCache; import org.ripple.power.wallet.WalletItem; public class RPSendXRPDialog extends JPanel implements WindowListener{ /** * */ private static final long serialVersionUID = 1L; private final JTextField _addressText; private final JTextField _amountText; private final JTextField _feeText; private static RPSendXRPDialog lock = null; private ArrayList<WaitDialog> _waitDialogs = new ArrayList<WaitDialog>(10); private RPDialogTool tool; public static RPSendXRPDialog showDialog(String text, Window parent, WalletItem item, String address, String amount, String fee, boolean show) { if (show) { synchronized (RPSendXRPDialog.class) { if (lock == null) { return (lock = new RPSendXRPDialog(text, parent, item, address, amount, fee)); } else { if (lock != null) { lock.closeDialog(); lock = new RPSendXRPDialog(text, parent, item, address, amount, fee); } return lock; } } } return null; } public static RPSendXRPDialog showDialog(String text, Window parent, WalletItem item, String address, String amount, String fee) { return showDialog(text, parent, item, address, amount, fee, true); } public static RPSendXRPDialog showDialog(String name, JFrame parent, WalletItem item) { return new RPSendXRPDialog(name, parent, item, "", LSystem.getMinSend(), LSystem.getFee()); } public RPDialogTool get() { return tool; } public void closeDialog() { synchronized (WaitDialog.class) { tool.close(); lock = null; } } public RPSendXRPDialog(String text, Window parent, final WalletItem item, String address, String amount, String fee) { Dimension dim = new Dimension(500, 215); setPreferredSize(dim); setSize(dim); final String esc = "ESCAPE"; KeyStroke stroke = KeyStroke.getKeyStroke(esc); Action actionListener = new AbstractAction() { /** * */ private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent actionEvent) { closeDialog(); } }; InputMap inputMap = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); inputMap.put(stroke, esc); this.getActionMap().put(esc, actionListener); _addressText = new JTextField(34); _addressText.setText(address); UIRes.addStyle(_addressText, "Pay to: ", false); _amountText = new JTextField(18); _amountText.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { String amount = _amountText.getText().trim(); _feeText.setText(CurrencyUtils.toFee(amount)); } @Override public void keyPressed(KeyEvent e) { } }); UIRes.addStyle(_amountText, "Amount: "); _feeText = new JTextField(5); UIRes.addStyle(_feeText, "Fee: "); setBackground(LColor.white); setLayout(null); _addressText.setBounds(70, 30, 350, 45); add(_addressText); _amountText.setBounds(70, 80, 250, 45); add(_amountText); _feeText.setBounds(330, 80, 90, 45); add(_feeText); JLabel exitLabel = new JLabel(UIRes.exitIcon); exitLabel.setToolTipText("Cancel"); exitLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); exitLabel.setBounds(260, 145, 45, 45); add(exitLabel); exitLabel.setVisible(true); exitLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { closeDialog(); } }); JLabel submitLabel = new JLabel(UIRes.postIcon); submitLabel.setToolTipText("Submit transaction"); submitLabel.setCursor(new Cursor(Cursor.HAND_CURSOR)); submitLabel.setBounds(200, 145, 45, 45); add(submitLabel); submitLabel.setVisible(true); submitLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { try { String address = _addressText.getText().trim(); String amountValue = _amountText.getText().trim(); String feeValue = _feeText.getText().trim(); if (!MathUtils.isNan(amountValue)) { UIMessage.alertMessage(get().getDialog(), UIMessage.errMoney); return; } if (!MathUtils.isNan(feeValue)) { UIMessage.alertMessage(get().getDialog(), UIMessage.errFee); return; } if (!AccountFind.isRippleAddress(address)) { try { address = NameFind.getAddress(address); } catch (Exception ex) { UIMessage.alertMessage(get().getDialog(), UIMessage.errNotAddress); return; } if (StringUtils.isEmpty(address) || !AccountFind.isRippleAddress(address)) { UIMessage.alertMessage(get().getDialog(), UIMessage.errNotAddress); return; } } BigDecimal number = new BigDecimal(amountValue); BigDecimal maxSend = new BigDecimal(item.getAmount()); if (number.longValue() >= (maxSend.longValue() - 20)) { UIMessage.alertMessage(get().getDialog(), UIMessage.errNotMoney); return; } final WaitDialog dialog = WaitDialog.showDialog(get() .getDialog()); _waitDialogs.add(dialog); Payment.sendXRP(item.getSeed(), address, amountValue, feeValue, new Rollback() { @Override public void success(JSONObject res) { dialog.closeDialog(); RPJSonLog.get().println(res, false); WalletCache.get().reset(); UIMessage.infoMessage(get().getDialog(), UIMessage.completed); } @Override public void error(JSONObject res) { dialog.closeDialog(); RPJSonLog.get().println(res); } }); } catch (Throwable ex) { ex.printStackTrace(); } } }); _feeText.setText(fee); _amountText.setText(amount); this.tool = RPDialogTool.show(parent, text, this, -1, -1, false, LSystem.MINUTE); revalidate(); repaint(); } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowClosing(WindowEvent e) { if (_waitDialogs != null) { for (WaitDialog wait : _waitDialogs) { if (wait != null) { wait.closeDialog(); } } } } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub } }