package com.dgex.offspring.ui.controls;
import java.util.ArrayList;
import java.util.List;
import nxt.Account;
import nxt.Asset;
import nxt.util.Convert;
import org.apache.log4j.Logger;
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.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.InspectAccountDialog;
import com.dgex.offspring.user.service.IUserService;
public class AssetsViewer extends GenerericTableViewer {
static final String EMPTY_STRING = "";
static Logger logger = Logger.getLogger(AssetsViewer.class);
final IGenericTableColumn columnName = new GenericTableColumnBuilder("Name")
.align(SWT.LEFT).textExtent("#########")
.provider(new ICellDataProvider() {
@Override
public Object getCellValue(Object element) {
Long id = (Long) element;
Asset asset = Asset.getAsset(id);
if (asset != null)
return asset.getName();
return EMPTY_STRING;
}
@Override
public void getCellData(Object element, Object[] data) {
data[ICellDataProvider.TEXT] = getCellValue(element);
}
@Override
public int compare(Object v1, Object v2) {
return CompareMe.compare((String) v1, (String) v2);
}
}).build();
final IGenericTableColumn columnBalance = new GenericTableColumnBuilder(
"Balance").align(SWT.RIGHT).textExtent("00000000000")
.provider(new ICellDataProvider() {
@Override
public Object getCellValue(Object element) {
Long id = (Long) element;
if (account.getAssetBalances() != null)
return Integer.valueOf(account.getAssetBalances().get(id));
return Long.valueOf(0l);
}
@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 columnQuantity = new GenericTableColumnBuilder(
"Quantity").align(SWT.RIGHT).textExtent("00000000000")
.provider(new ICellDataProvider() {
@Override
public Object getCellValue(Object element) {
Long id = (Long) element;
Asset asset = Asset.getAsset(id);
if (asset != null)
return Integer.valueOf(asset.getQuantity());
return Long.valueOf(0l);
}
@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 columnIssuer = new GenericTableColumnBuilder(
"Issuer").align(SWT.LEFT).textExtent("12345678901234567890123")
.activate(new ICellActivateHandler() {
@Override
public void activate(Object element) {
Long id = (Long) element;
Asset asset = Asset.getAsset(id);
if (asset != null) {
Long accountId = asset.getAccountId();
if (accountId != null) {
InspectAccountDialog.show(accountId, nxt, engine, userService,
sync, contactsService);
}
}
}
}).provider(new ICellDataProvider() {
@Override
public Object getCellValue(Object element) {
Long id = (Long) element;
Asset asset = Asset.getAsset(id);
if (asset != null)
return asset.getAccountId();
return Long.valueOf(0l);
}
@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 columnDescription = new GenericTableColumnBuilder(
"Description").align(SWT.LEFT)
.textExtent("#####################################")
.provider(new ICellDataProvider() {
@Override
public Object getCellValue(Object element) {
Long id = (Long) element;
Asset asset = Asset.getAsset(id);
if (asset != null)
return asset.getDescription();
return EMPTY_STRING;
}
@Override
public void getCellData(Object element, Object[] data) {
data[ICellDataProvider.TEXT] = getCellValue(element);
}
@Override
public int compare(Object v1, Object v2) {
return CompareMe.compare((String) v1, (String) v2);
}
}).build();
final IStructuredContentProvider contentProvider = new IStructuredContentProvider() {
@Override
public void dispose() {}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
logger.info("inputChanged");
accountId = (Long) newInput;
if (accountId != null)
account = Account.getAccount(accountId);
else
account = null;
}
@Override
public Object[] getElements(Object inputElement) {
if (account == null) {
return new Object[0];
}
logger.info("getElements");
/*
* We retrieve our own issued assets from the DB and then ask
* account.getAssetBalances() for the rest
*/
// Set<Long> assets = new TreeSet<Long>();
// int timestamp = 0;
// Boolean orderAscending = Boolean.FALSE;
// TransactionType[] recipientTypes = {};
// TransactionType[] senderTypes = {
// TransactionType.ColoredCoins.ASSET_ISSUANCE };
//
// LazyList list = TransactionDB.getTransactions(accountId,
// recipientTypes,
// senderTypes, timestamp, orderAscending, nxt);
// list.ensureCapacity(list.available());
//
// List<Long> elements = new ArrayList<Long>();
// for (ITransaction transaction : list.getList()) {
// Transaction t = transaction.getNative();
// elements.add(t.getId());
// }
List<Long> elements = new ArrayList<Long>(account.getAssetBalances()
.keySet());
return elements.toArray(new Object[elements.size()]);
}
};
private INxtService nxt;
private Long accountId;
private IUserService userService;
private IContactsService contactsService;
private UISynchronize sync;
private Account account;
private IStylingEngine engine;
public AssetsViewer(Composite parent, Long accountId, INxtService nxt,
IUserService userService, IContactsService contactsService,
UISynchronize sync, IStylingEngine engine) {
super(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE
| SWT.BORDER);
this.nxt = nxt;
this.accountId = accountId;
this.userService = userService;
this.contactsService = contactsService;
this.sync = sync;
this.account = Account.getAccount(accountId);
this.engine = engine;
setGenericTable(new IGenericTable() {
@Override
public int getDefaultSortDirection() {
return GenericComparator.DESCENDING;
}
@Override
public IGenericTableColumn getDefaultSortColumn() {
return columnName;
}
@Override
public IStructuredContentProvider getContentProvider() {
return contentProvider;
}
@Override
public IGenericTableColumn[] getColumns() {
return new IGenericTableColumn[] { columnName, columnBalance,
columnQuantity, columnIssuer, columnDescription };
}
});
setInput(accountId);
}
}