package com.dgex.offspring.trader.trades; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import nxt.Block; import nxt.Nxt; import nxt.Trade; import nxt.util.Convert; import org.eclipse.e4.ui.di.UISynchronize; import org.eclipse.e4.ui.services.IStylingEngine; 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.config.IContactsService; import com.dgex.offspring.nxtCore.core.NXTTime; 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.ICellActivateHandler; 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.ui.InspectTransactionDialog; import com.dgex.offspring.user.service.IUserService; public class TradesViewer extends GenerericTableViewer { static String EXTENT_COLUMN_DATE = "dd MMM yy hh:mm:ss "; static String EXTENT_COLUMN_PRICE = "1000000000"; static String EXTENT_COLUMN_ID = "012345678901234567890"; static String EXTENT_COLUMN_QUANTITY = "1000000000"; static DecimalFormat formatDouble = new DecimalFormat("#.##"); final IGenericTableColumn columnDate = new GenericTableColumnBuilder("Date") .align(SWT.LEFT).textExtent(EXTENT_COLUMN_DATE) .provider(new ICellDataProvider() { private final SimpleDateFormat dateFormat = new SimpleDateFormat( "dd MMM yy hh:mm:ss"); @Override public Object getCellValue(Object element) { Trade trade = (Trade) element; Block block = Nxt.getBlockchain().getBlock(trade.getBlockId()); return Long.valueOf(NXTTime.convertTimestamp(block.getTimestamp())); } @Override public void getCellData(Object element, Object[] data) { data[ICellDataProvider.TEXT] = dateFormat.format(new Date( (Long) getCellValue(element))); } @Override public int compare(Object v1, Object v2) { return CompareMe.compare((Long) v1, (Long) v2); } }).build(); final IGenericTableColumn columnPrice = new GenericTableColumnBuilder("Price") .align(SWT.RIGHT).textExtent(EXTENT_COLUMN_PRICE) .provider(new ICellDataProvider() { @Override public Object getCellValue(Object element) { Trade trade = (Trade) element; return Double.valueOf((Long.valueOf(trade.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) { Trade trade = (Trade) element; return Integer.valueOf(trade.getQuantity()); } @Override public void getCellData(Object element, Object[] data) { data[ICellDataProvider.TEXT] = Integer .toString((Integer) getCellValue(element)); } @Override public int compare(Object v1, Object v2) { return CompareMe.compare((Integer) v1, (Integer) v2); } }).build(); final IGenericTableColumn columnAskOrder = new GenericTableColumnBuilder( "Ask Order").align(SWT.RIGHT).textExtent(EXTENT_COLUMN_ID) .activate(new ICellActivateHandler() { @Override public void activate(Object element) { Trade trade = (Trade) element; Long id = trade.getAskOrderId(); if (id != null) { InspectTransactionDialog.show(id, nxt, engine, userService, sync, contactsService); } } }).provider(new ICellDataProvider() { @Override public Object getCellValue(Object element) { Trade trade = (Trade) element; return trade.getAskOrderId(); } @Override public void getCellData(Object element, Object[] data) { data[ICellDataProvider.TEXT] = Convert .toUnsignedLong((Long) getCellValue(element)); } @Override public int compare(Object v1, Object v2) { return CompareMe.compare((Long) v1, (Long) v2); } }).build(); final IGenericTableColumn columnBidOrder = new GenericTableColumnBuilder( "Bid Order").align(SWT.RIGHT).textExtent(EXTENT_COLUMN_ID) .activate(new ICellActivateHandler() { @Override public void activate(Object element) { Trade trade = (Trade) element; Long id = trade.getBidOrderId(); if (id != null) { InspectTransactionDialog.show(id, nxt, engine, userService, sync, contactsService); } } }).provider(new ICellDataProvider() { @Override public Object getCellValue(Object element) { Trade trade = (Trade) element; return trade.getBidOrderId(); } @Override public void getCellData(Object element, Object[] data) { data[ICellDataProvider.TEXT] = Convert .toUnsignedLong((Long) getCellValue(element)); } @Override public int compare(Object v1, Object v2) { return CompareMe.compare((Long) v1, (Long) v2); } }).build(); final IStructuredContentProvider contentProvider = new IStructuredContentProvider() { private TradesViewer viewer; private Long assetId; @Override public void dispose() {} @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = (TradesViewer) viewer; this.assetId = (Long) newInput; } @Override public Object[] getElements(Object inputElement) { if (assetId == null) return new Object[0]; List<Trade> trades = viewer.nxt.getTrades(assetId); return trades.toArray(new Object[trades.size()]); } }; public INxtService nxt; private IContactsService contactsService; private IStylingEngine engine; private IUserService userService; private UISynchronize sync; public TradesViewer(Composite parent, INxtService nxt, IContactsService contactsService, IStylingEngine engine, IUserService userService, UISynchronize sync) { super(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE | SWT.BORDER); this.nxt = nxt; this.contactsService = contactsService; this.engine = engine; this.userService = userService; this.sync = sync; setGenericTable(new IGenericTable() { @Override public int getDefaultSortDirection() { return GenericComparator.DESCENDING; } @Override public IGenericTableColumn getDefaultSortColumn() { return columnPrice; } @Override public IStructuredContentProvider getContentProvider() { return contentProvider; } @Override public IGenericTableColumn[] getColumns() { return new IGenericTableColumn[] { columnDate, columnPrice, columnQuantity, columnAskOrder, columnBidOrder }; } }); refresh(); } }