package org.ripple.power.ui; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Font; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.ArrayList; import org.json.JSONObject; import org.ripple.power.blockchain.RippleMemoDecodes; import org.ripple.power.blockchain.RippleMemoEncode; import org.ripple.power.config.LSystem; import org.ripple.power.helper.HelperWindow; import org.ripple.power.i18n.LangConfig; import org.ripple.power.password.PasswordEasy; import org.ripple.power.txns.AccountFind; import org.ripple.power.txns.NameFind; import org.ripple.power.txns.Payment; import org.ripple.power.txns.Rollback; import org.ripple.power.txns.Updateable; import org.ripple.power.ui.view.ABaseDialog; import org.ripple.power.ui.view.HtmlRenderer; import org.ripple.power.ui.view.RPJSonLog; import org.ripple.power.ui.view.RPLabel; import org.ripple.power.ui.view.RPList; import org.ripple.power.ui.view.RPTextArea; import org.ripple.power.ui.view.RPTextBox; import org.ripple.power.ui.view.RPToast; import org.ripple.power.ui.view.WaitDialog; import org.ripple.power.ui.view.RPToast.Style; import org.ripple.power.utils.GraphicsUtils; import org.ripple.power.utils.StringUtils; import org.ripple.power.utils.SwingUtils; import org.ripple.power.wallet.WalletItem; import com.ripple.core.coretypes.Amount; public class RPRippledMemoDialog extends ABaseDialog implements WindowListener { /** * */ private static final long serialVersionUID = 1L; private Font font = UIRes.getFont(); private RPTextBox _amountText; private RPCheckBox _encodeCheckBox; private RPTextBox _feeAmount; private RPTextBox _passwordText; private RPLabel _recipientLabel; private RPCButton _exitButton; private RPCButton _submitButton; private RPCButton _resetButton; private RPLabel _historyLabel; private RPLabel _my_messageLabel; private RPLabel _passwordLabel; private RPLabel _feeLabel; private RPLabel _amountLabel; private RPList _messageList; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JSeparator jSeparator1; private RPTextArea _messageText; private RPTextBox _recipientText; private WalletItem _item; private String _address, _message; private ArrayList<WaitDialog> _waitDialogs = new ArrayList<WaitDialog>(10); public static void showDialog(String name, Window parent, String address, String message) { showDialog(name, parent, address, message, null); } public static void showDialog(String name, Window parent, WalletItem item) { showDialog(name, parent, null, null, item); } public static void showDialog(String name, Window parent, String address, String message, WalletItem item) { try { RPRippledMemoDialog dialog = new RPRippledMemoDialog(name, parent, address, message, item); dialog.pack(); dialog.setLocationRelativeTo(parent); dialog.setVisible(true); } catch (Exception exc) { exc.printStackTrace(); } } public RPRippledMemoDialog(String text, Window parent, String address, String message, WalletItem item) { super(parent, text + (item == null ? (address == null ? "" : "(" + address + ")") : "(" + item.getPublicKey() + ")"), Dialog.ModalityType.DOCUMENT_MODAL); if (item == null) { this._address = address; } else { this._address = item.getPublicKey(); } this._message = message; this._item = item; this.addWindowListener(HelperWindow.get()); setIconImage(UIRes.getIcon()); this.setResizable(false); Dimension dim = new Dimension(518, 580); this.setPreferredSize(dim); this.setSize(dim); this.initComponents(); } private void initComponents() { addWindowListener(HelperWindow.get()); jScrollPane1 = new javax.swing.JScrollPane(); _messageList = new RPList(); _historyLabel = new RPLabel(); _my_messageLabel = new RPLabel(); jScrollPane2 = new javax.swing.JScrollPane(); _messageText = new RPTextArea(); _messageText.setEditable(true); _messageText.setFont(GraphicsUtils.getFont(15)); _recipientLabel = new RPLabel(); _passwordText = new RPTextBox(); _passwordLabel = new RPLabel(); _feeAmount = new RPTextBox(); _encodeCheckBox = new RPCheckBox(); _encodeCheckBox.setBackground(UIConfig.dialogbackground); _encodeCheckBox.setFont(font); _feeLabel = new RPLabel(); _amountText = new RPTextBox(); jSeparator1 = new javax.swing.JSeparator(); _exitButton = new RPCButton(); _submitButton = new RPCButton(); _resetButton = new RPCButton(); _amountLabel = new RPLabel(); _recipientText = new RPTextBox(); getContentPane().setLayout(null); _messageList.setFont(GraphicsUtils.getFont(Font.SANS_SERIF, 0, 12)); _messageList.setCellRenderer(new HtmlRenderer()); _messageList.setAutoscrolls(true); jScrollPane1.setViewportView(_messageList); getContentPane().add(jScrollPane1); jScrollPane1.setBounds(10, 28, 494, 170); _historyLabel.setText(LangConfig.get(this, "history", "History")); getContentPane().add(_historyLabel); _historyLabel.setFont(font); _historyLabel.setBounds(10, 5, 150, 20); _my_messageLabel .setText(LangConfig.get(this, "mmessage", "My Message")); getContentPane().add(_my_messageLabel); _my_messageLabel.setFont(font); _my_messageLabel.setBounds(10, 208, 150, 20); _messageText.setColumns(20); _messageText.setRows(5); jScrollPane2.setViewportView(_messageText); if (_message != null) { _messageText.setText(_message); } else { _messageText.setText("Hello Rippled Message!"); } getContentPane().add(jScrollPane2); jScrollPane2.setBounds(10, 233, 494, 110); _recipientLabel.setFont(font); // NOI18N _recipientLabel.setText(LangConfig.get(this, "recipient", "Recipient")); getContentPane().add(_recipientLabel); _recipientLabel.setBounds(10, 360, 70, 20); getContentPane().add(_passwordText); _passwordText.setBounds(80, 440, 180, 20); _passwordLabel.setFont(font); // NOI18N _passwordLabel.setText(LangConfig.get(this, "password", "Password")); getContentPane().add(_passwordLabel); _passwordLabel.setBounds(10, 440, 70, 20); getContentPane().add(_feeAmount); _feeAmount.setBounds(340, 400, 160, 20); _feeAmount.setText(LSystem.getFee()); _encodeCheckBox.setText(LangConfig.get(this, "mpassword", "Message Password")); getContentPane().add(_encodeCheckBox); _encodeCheckBox.setBounds(285, 440, 210, 23); if (!_encodeCheckBox.isSelected()) { _passwordText.setEnabled(false); } _encodeCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (!_encodeCheckBox.isSelected()) { _passwordText.setText(""); _passwordText.setEnabled(false); } else { PasswordEasy easy = new PasswordEasy(); _passwordText.setText(easy.pass(12, 18)); _passwordText.setEnabled(true); } } }); _feeLabel.setFont(font); // NOI18N _feeLabel.setText(LangConfig.get(this, "fee", "Fee")); getContentPane().add(_feeLabel); _feeLabel.setBounds(290, 400, 50, 20); getContentPane().add(_amountText); _amountText.setBounds(80, 400, 180, 20); _amountText.setText(LSystem.getMinSend()); getContentPane().add(jSeparator1); jSeparator1.setBounds(0, 480, 520, 10); _exitButton.setText(UIMessage.exit); _exitButton.setFont(font); getContentPane().add(_exitButton); _exitButton.setBounds(420, 500, 81, 40); _exitButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SwingUtils.close(RPRippledMemoDialog.this); } }); _submitButton.setText(UIMessage.send); _submitButton.setFont(font); getContentPane().add(_submitButton); _submitButton.setBounds(320, 500, 81, 40); _submitButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (_item == null) { return; } String address = _recipientText.getText().trim(); if (address.startsWith("~")) { try { address = NameFind.getAddress(address); } catch (Exception ex) { UIRes.showWarningMessage(LSystem.applicationMain, UIMessage.warning, UIMessage.errNotAddress); return; } } if (AccountFind.isRippleAddress(address)) { String password = null; if (_encodeCheckBox.isSelected()) { password = _passwordText.getText(); if (password.length() == 0) { password = null; } } String context = _messageText.getText(); String amount = _amountText.getText().trim(); String fee = _feeAmount.getText().trim(); if (!StringUtils.isNumber(fee)) { RPToast.makeText(RPRippledMemoDialog.this, UIMessage.errFee, Style.ERROR).display(); return; } Amount amountValue = Amount.fromString(amount); if (StringUtils.isNumber(amountValue.valueText())) { RippleMemoEncode encode = null; if (password == null) { encode = new RippleMemoEncode( RippleMemoEncode.Mode.BASE64, "MESSAGE", context, password); } else { encode = new RippleMemoEncode( RippleMemoEncode.Mode.ENCODE, "MESSAGE", context, password); } final WaitDialog wait = WaitDialog .showDialog(RPRippledMemoDialog.this); _waitDialogs.add(wait); Payment.send(_item.getSeed(), amount, address, encode, fee, new Rollback() { @Override public void success(JSONObject res) { RPJSonLog.get().println(res); wait.closeDialog(); RPToast.makeText( RPRippledMemoDialog.this, UIMessage.completed, Style.SUCCESS).display(); } @Override public void error(JSONObject res) { RPJSonLog.get().println(res); wait.closeDialog(); } }); } else { RPToast.makeText(RPRippledMemoDialog.this, UIMessage.errMoney, Style.ERROR).display(); } } else { RPToast.makeText(RPRippledMemoDialog.this, UIMessage.errAddress, Style.ERROR).display(); } } }); _resetButton.setText(LangConfig.get(this, "reset", "Reset")); _resetButton.setFont(font); getContentPane().add(_resetButton); _resetButton.setBounds(10, 500, 81, 40); _resetButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (_address != null) { loadMessages(_address, -1, -1, 20); } } }); _amountLabel.setFont(font); // NOI18N _amountLabel.setText(LangConfig.get(this, "amount", "Amount")); getContentPane().add(_amountLabel); _amountLabel.setBounds(10, 400, 70, 20); getContentPane().add(_recipientText); _recipientText.setBounds(80, 360, 420, 21); getContentPane().setBackground(UIConfig.dialogbackground); if (_address != null) { loadMessages(_address, -1, -1, 200); } if (_item == null) { _submitButton.setEnabled(false); // _resetButton.setEnabled(false); } pack(); } private void loadMessages(final String address, final int min, final int max, final int limit) { Updateable update = new Updateable() { @Override public void action(Object o) { if (address != null && AccountFind.isRippleAddress(address)) { AccountFind find = new AccountFind(); String password = null; if (_encodeCheckBox.isSelected()) { password = _passwordText.getText(); if (password.length() == 0) { password = null; } } final WaitDialog wait = WaitDialog .showDialog(RPRippledMemoDialog.this); _waitDialogs.add(wait); find.message(address, password, min, max, limit, new Updateable() { @Override public void action(Object o) { if (o != null && o instanceof RippleMemoDecodes) { final RippleMemoDecodes decodes = (RippleMemoDecodes) o; if (decodes.size() > 0) { _messageList .setModel(new javax.swing.AbstractListModel<Object>() { private static final long serialVersionUID = 1L; public int getSize() { return decodes .size(); } public Object getElementAt( int i) { return decodes.get( i).toHTML(); } }); } } wait.closeDialog(); } }); } } }; LSystem.postThread(update); } @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 } }