package com.dgex.offspring.ui; import nxt.Asset; import nxt.Constants; import nxt.NxtException.ValidationException; import nxt.Transaction; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; 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 IssueAssetWizard extends GenericTransactionWizard { final IGenericTransactionField fieldName = new IGenericTransactionField() { private Text textName; private Text textNameReadonly; @Override public String getLabel() { return "Name"; } @Override public Object getValue() { return textName.getText().trim(); } @Override public Control createControl(Composite parent) { textName = new Text(parent, SWT.BORDER); textName.setText(""); textName.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { requestVerification(); } }); return textName; } @Override public Control createReadonlyControl(Composite parent) { textNameReadonly = new Text(parent, SWT.BORDER); textNameReadonly.setText(""); textNameReadonly.setEditable(false); return textNameReadonly; } @Override public boolean verify(String[] message) { String name = textName.getText().trim(); if (name.length() < 3 || name.length() > 10) { message[0] = "Length must be between 3 and 10 characters"; return false; } String normalizedName = name.toLowerCase(); for (int i = 0; i < normalizedName.length(); i++) { if (Constants.ALPHABET.indexOf(normalizedName.charAt(i)) < 0) { message[0] = "Incorrect asset name"; return false; } } try { if (Asset.getAssets(normalizedName) != null) { message[0] = "Asset name already used"; return false; } } catch (NullPointerException e) {} textNameReadonly.setText(name); return true; } }; final IGenericTransactionField fieldDescription = new IGenericTransactionField() { private Text textDescr; private Text textDescrReadonly; @Override public String getLabel() { return "Description"; } @Override public Object getValue() { return textDescr.getText().trim(); } @Override public Control createControl(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(1).applyTo(comp); textDescr = new Text(comp, SWT.BORDER | SWT.MULTI); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true) .hint(SWT.DEFAULT, 100).applyTo(textDescr); textDescr.setText(""); textDescr.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { requestVerification(); } }); return comp; } @Override public Control createReadonlyControl(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(1).applyTo(comp); textDescrReadonly = new Text(comp, SWT.BORDER | SWT.MULTI); textDescrReadonly.setEditable(false); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true) .hint(SWT.DEFAULT, 100).applyTo(textDescrReadonly); return comp; } @Override public boolean verify(String[] message) { String description = textDescr.getText().trim(); if (description.length() > 1000) { message[0] = "Description must be between 0 and 1000 characters"; return false; } textDescrReadonly.setText(description); return true; } }; final IGenericTransactionField fieldQuantity = new IGenericTransactionField() { private Text textQuantity; private Text textQuantityReadonly; @Override public String getLabel() { return "Quantity"; } @Override public Object getValue() { return Integer.parseInt(textQuantity.getText().trim()); } @Override public Control createControl(Composite parent) { textQuantity = new Text(parent, SWT.BORDER); textQuantity.setText("0"); textQuantity.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { requestVerification(); } }); return textQuantity; } @Override public Control createReadonlyControl(Composite parent) { textQuantityReadonly = new Text(parent, SWT.BORDER); textQuantityReadonly.setEditable(false); return textQuantityReadonly; } @Override public boolean verify(String[] message) { String quantityValue = textQuantity.getText().trim(); int quantity; try { quantity = Integer.parseInt(quantityValue); if (quantity <= 0 || quantity > Constants.MAX_ASSET_QUANTITY) { message[0] = "Incorect asset quantity"; return false; } } catch (NumberFormatException e) { message[0] = "Value must be numeric"; return false; } textQuantityReadonly.setText(quantityValue); return true; } }; public IssueAssetWizard(final IUserService userService, final INxtService nxt) { super(userService); setWindowTitle("Issue Asset"); setTransaction(new IGenericTransaction() { @Override public String sendTransaction(String[] message) { IAccount sender = user.getAccount(); String name = (String) fieldName.getValue(); String description = (String) fieldDescription.getValue(); int quantity = (Integer) fieldQuantity.getValue(); PromptFeeDeadline dialog = new PromptFeeDeadline(getShell()); dialog.setMinimumFee(1000); dialog.setFee(1000); 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.createIssueAssetTransaction(sender, name, description, quantity, deadline, fee, null); 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, fieldName, fieldDescription, fieldQuantity }; } @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() <= 1000) { message[0] = "Insufficient balance"; return false; } return true; } }); } }