package com.dgex.offspring.trader.mysellorders;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
import nxt.Account;
import nxt.Asset;
import nxt.Attachment;
import nxt.Nxt;
import nxt.Order;
import nxt.Transaction;
import nxt.TransactionType;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import com.dgex.offspring.config.CompareMe;
import com.dgex.offspring.nxtCore.service.INxtService;
import com.dgex.offspring.swt.table.GenerericTableViewer;
import com.dgex.offspring.swt.table.GenericComparator;
import com.dgex.offspring.swt.table.GenericTableColumnBuilder;
import com.dgex.offspring.swt.table.ICellDataProvider;
import com.dgex.offspring.swt.table.IGenericTable;
import com.dgex.offspring.swt.table.IGenericTableColumn;
import com.dgex.offspring.trader.api.IAssetExchange;
import com.dgex.offspring.user.service.IUser;
import com.dgex.offspring.user.service.IUserService;
public class MySellOrdersViewer extends GenerericTableViewer {
static String EXTENT_COLUMN_PENDING = "##";
static String EXTENT_COLUMN_TOTAL = "000000";
static String EXTENT_COLUMN_PRICE = "000000";
static String EXTENT_COLUMN_QUANTITY = "000000";
static DecimalFormat formatDouble = new DecimalFormat("#.##");
final IGenericTableColumn columnPending = new GenericTableColumnBuilder("#")
.align(SWT.CENTER).textExtent(EXTENT_COLUMN_PENDING)
.provider(new ICellDataProvider() {
@Override
public Object getCellValue(Object element) {
OrderWrapper order = (OrderWrapper) element;
return Boolean.valueOf(Order.Ask.getAskOrder(order.getId()) == null);
}
@Override
public void getCellData(Object element, Object[] data) {
data[FONT] = JFaceResources.getFontRegistry().getBold("");
data[ICellDataProvider.TEXT] = (Boolean) getCellValue(element) ? "-"
: "+";
}
@Override
public int compare(Object v1, Object v2) {
return CompareMe.compare((Boolean) v1, (Boolean) v2);
}
}).build();
final IGenericTableColumn columnTotal = new GenericTableColumnBuilder("Total")
.align(SWT.RIGHT).textExtent(EXTENT_COLUMN_TOTAL)
.provider(new ICellDataProvider() {
@Override
public Object getCellValue(Object element) {
OrderWrapper order = (OrderWrapper) element;
Double price = Double.valueOf((Long.valueOf(order.getPrice())
.doubleValue() / 100));
return Double.valueOf(price * order.getQuantity());
}
@Override
public void getCellData(Object element, Object[] data) {
data[ICellDataProvider.TEXT] = formatDouble
.format(getCellValue(element));
}
@Override
public int compare(Object v1, Object v2) {
return CompareMe.compare((Double) v1, (Double) v2);
}
}).build();
final IGenericTableColumn columnPrice = new GenericTableColumnBuilder("Price")
.align(SWT.RIGHT).textExtent(EXTENT_COLUMN_PRICE)
.provider(new ICellDataProvider() {
@Override
public Object getCellValue(Object element) {
OrderWrapper order = (OrderWrapper) element;
return Double.valueOf((Long.valueOf(order.getPrice()).doubleValue() / 100));
}
@Override
public void getCellData(Object element, Object[] data) {
data[ICellDataProvider.TEXT] = formatDouble
.format(getCellValue(element));
}
@Override
public int compare(Object v1, Object v2) {
return CompareMe.compare((Double) v1, (Double) v2);
}
}).build();
final IGenericTableColumn columnQuantity = new GenericTableColumnBuilder(
"Quantity").align(SWT.RIGHT).textExtent(EXTENT_COLUMN_QUANTITY)
.provider(new ICellDataProvider() {
@Override
public Object getCellValue(Object element) {
OrderWrapper order = (OrderWrapper) element;
return Long.valueOf(order.getQuantity());
}
@Override
public void getCellData(Object element, Object[] data) {
data[ICellDataProvider.TEXT] = Long
.toString((Long) getCellValue(element));
}
@Override
public int compare(Object v1, Object v2) {
return CompareMe.compare((Long) v1, (Long) v2);
}
}).build();
final IStructuredContentProvider contentProvider = new IStructuredContentProvider() {
@Override
public void dispose() {}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
private int scanPendingTransactions(Long orderId) {
for (Transaction t : nxt.getPendingTransactions()) {
/* Order has a pending cancellation */
if (t.getType().equals(
TransactionType.ColoredCoins.ASK_ORDER_CANCELLATION)) {
Attachment.ColoredCoinsAskOrderCancellation attachment = (Attachment.ColoredCoinsAskOrderCancellation) t
.getAttachment();
if (attachment.getOrderId().equals(orderId)) {
return STATE_CANCELLED;
}
}
/* Order is in pending list */
else if (t.getType().equals(
TransactionType.ColoredCoins.ASK_ORDER_PLACEMENT)) {
if (t.getId().equals(orderId)) {
return STATE_PENDING;
}
}
}
return 0;
}
@Override
public Object[] getElements(Object inputElement) {
IUser user = userService.getActiveUser();
if (user == null) {
return new Object[0];
}
Account account = user.getAccount().getNative();
if (account == null) {
return new Object[0];
}
Asset asset = exchange.getSelectedAsset();
if (asset == null) {
return new Object[0];
}
List<OrderWrapper> elements = new ArrayList<OrderWrapper>();
/* Add all pending orders */
for (Transaction t : nxt.getPendingTransactions()) {
if (t.getType()
.equals(TransactionType.ColoredCoins.ASK_ORDER_PLACEMENT)) {
Attachment.ColoredCoinsAskOrderPlacement attachment = (Attachment.ColoredCoinsAskOrderPlacement) t
.getAttachment();
if (attachment.getAssetId().equals(asset.getId())) {
if (t.getSenderId().equals(account.getId())) {
elements.add(new OrderWrapper(t.getId(), attachment.getPrice(),
attachment.getQuantity()));
}
}
}
}
List<Transaction> remove = new ArrayList<Transaction>();
SortedSet<Order.Ask> asks = Order.Ask.getSortedOrders(asset.getId());
for (Order.Ask ask : asks) {
if (ask.getAccount().equals(account)) {
int state = scanPendingTransactions(ask.getId());
if (state == STATE_CANCELLED) {
continue;
}
else if (state == STATE_PENDING) {
remove.add(Nxt.getBlockchain().getTransaction(ask.getId()));
}
else {
elements.add(new OrderWrapper(ask));
}
}
}
/* Clean up pending transactions */
nxt.getPendingTransactions().removeAll(remove);
return elements.toArray(new Object[elements.size()]);
}
};
public INxtService nxt;
private IUserService userService;
private IAssetExchange exchange;
static int STATE_CANCELLED = 1;
static int STATE_PENDING = 2;
public MySellOrdersViewer(Composite parent, INxtService nxt,
IAssetExchange exchange, IUserService userService) {
super(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE
| SWT.BORDER);
this.nxt = nxt;
this.userService = userService;
this.exchange = exchange;
setGenericTable(new IGenericTable() {
@Override
public int getDefaultSortDirection() {
return GenericComparator.ASSCENDING;
}
@Override
public IGenericTableColumn getDefaultSortColumn() {
return columnPrice;
}
@Override
public IStructuredContentProvider getContentProvider() {
return contentProvider;
}
@Override
public IGenericTableColumn[] getColumns() {
return new IGenericTableColumn[] { columnPending, columnTotal,
columnPrice, columnQuantity };
}
});
setInput(1);
}
}