package com.dgex.offspring.ui; import nxt.Constants; import nxt.NxtException.ValidationException; import nxt.Transaction; import nxt.util.Convert; import org.apache.log4j.Logger; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Text; import com.dgex.offspring.nxtCore.service.IAccount; import com.dgex.offspring.nxtCore.service.INxtService; import com.dgex.offspring.nxtCore.service.TransactionException; import com.dgex.offspring.swt.wizard.GenericTransactionWizard; import com.dgex.offspring.swt.wizard.IGenericTransaction; import com.dgex.offspring.swt.wizard.IGenericTransactionField; import com.dgex.offspring.user.service.IUserService; public class SendMoneyWizard extends GenericTransactionWizard { static Logger logger = Logger.getLogger(SendMoneyWizard.class); final IGenericTransactionField fieldRecipient = new IGenericTransactionField() { private Text textRecipient; private Text textRecipientReadonly; @Override public String getLabel() { return "Recipient"; } @Override public Object getValue() { String recipientValue = textRecipient.getText().trim(); try { return Convert.parseUnsignedLong(recipientValue); } catch (RuntimeException e) { logger.error("Parse Recipient ID", e); } return null; } @Override public Control createControl(Composite parent) { textRecipient = new Text(parent, SWT.BORDER); if (accountId != null) textRecipient.setText(Convert.toUnsignedLong(accountId)); else textRecipient.setText(""); textRecipient.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { requestVerification(); } }); return textRecipient; } @Override public Control createReadonlyControl(Composite parent) { textRecipientReadonly = new Text(parent, SWT.BORDER); textRecipientReadonly.setText(""); textRecipientReadonly.setEditable(false); return textRecipientReadonly; } @Override public boolean verify(String[] message) { String recipientValue = textRecipient.getText().trim(); if ("0".equals(recipientValue)) { message[0] = "Missing recipient"; return false; } try { Convert.parseUnsignedLong(recipientValue); } catch (RuntimeException e) { message[0] = "Incorrect recipient"; return false; } textRecipientReadonly.setText(recipientValue); return true; } }; final IGenericTransactionField fieldAmount = new IGenericTransactionField() { private Text textAmount; private Text textAmountReadonly; @Override public String getLabel() { return "Amount"; } @Override public Object getValue() { return Integer.parseInt(textAmount.getText().trim()); } @Override public Control createControl(Composite parent) { textAmount = new Text(parent, SWT.BORDER); textAmount.setText("0"); textAmount.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { requestVerification(); } }); return textAmount; } @Override public Control createReadonlyControl(Composite parent) { textAmountReadonly = new Text(parent, SWT.BORDER); textAmountReadonly.setEditable(false); return textAmountReadonly; } @Override public boolean verify(String[] message) { String amountValue = textAmount.getText().trim(); try { int amount = Integer.parseInt(amountValue); if (amount <= 0 || amount >= Constants.MAX_BALANCE) { message[0] = "Incorrect amount"; return false; } } catch (NumberFormatException e) { message[0] = "Amount must be numeric"; return false; } textAmountReadonly.setText(amountValue); return true; } }; private Long accountId = null; public SendMoneyWizard(final IUserService userService, final INxtService nxt, Long accountId) { super(userService); this.accountId = accountId; setWindowTitle("Send Money"); setTransaction(new IGenericTransaction() { @Override public String sendTransaction(String[] message) { IAccount sender = user.getAccount(); Long recipient = (Long) fieldRecipient.getValue(); int amount = (Integer) fieldAmount.getValue(); PromptFeeDeadline dialog = new PromptFeeDeadline(getShell()); if (dialog.open() != Window.OK) { message[0] = "Invalid fee and deadline"; return null; } int fee = dialog.getFee(); short deadline = dialog.getDeadline(); try { Transaction t = nxt.createPaymentTransaction(sender, recipient, amount, deadline, fee, 0l); return t.getStringId(); } catch (TransactionException e) { message[0] = e.getMessage(); } catch (ValidationException e) { message[0] = e.getMessage(); } return null; } @Override public IGenericTransactionField[] getFields() { return new IGenericTransactionField[] { fieldSender, fieldRecipient, fieldAmount }; } @Override public boolean verifySender(String message[]) { if (user == null) { message[0] = "Invalid sender"; return false; } if (user.getAccount().isReadOnly()) { message[0] = "This is a readonly account"; return false; } if (user.getAccount().getBalance() < 1) { message[0] = "Insufficient balance"; return false; } return true; } }); } }