package gui.models;
import java.text.DateFormat;
import java.util.Date;
import java.util.Observable;
import java.util.Observer;
import org.mapdb.Fun.Tuple2;
import controller.Controller;
import database.SortableList;
import database.wallet.TransactionMap;
import qora.account.Account;
import qora.transaction.Transaction;
import utils.ObserverMessage;
import utils.Pair;
@SuppressWarnings("serial")
public class WalletTransactionsTableModel extends QoraTableModel<Tuple2<String, String>, Transaction> implements Observer {
public static final int COLUMN_CONFIRMATIONS = 0;
public static final int COLUMN_TIMESTAMP = 1;
public static final int COLUMN_TYPE = 2;
public static final int COLUMN_ADDRESS = 3;
public static final int COLUMN_AMOUNT = 4;
private SortableList<Tuple2<String, String>, Transaction> transactions;
private String[] columnNames = {"Confirmations", "Timestamp", "Type", "Address", "Amount"};
private String[] transactionTypes = {"", "Genesis", "Payment", "Name Registration", "Name Update", "Name Sale", "Cancel Name Sale", "Name purchase", "Poll Creation", "Poll Vote", "Arbitrary Transaction", "Asset Issue", "Asset Transfer", "Order Creation", "Cancel Order", "Multi Payment"};
public WalletTransactionsTableModel()
{
Controller.getInstance().addWalletListener(this);
}
@Override
public SortableList<Tuple2<String, String>, Transaction> getSortableList() {
return this.transactions;
}
public Transaction getTransaction(int row)
{
return transactions.get(row).getB();
}
@Override
public int getColumnCount()
{
return columnNames.length;
}
@Override
public String getColumnName(int index)
{
return columnNames[index];
}
@Override
public int getRowCount()
{
if(this.transactions == null)
{
return 0;
}
return this.transactions.size();
}
@Override
public Object getValueAt(int row, int column)
{
if(this.transactions == null || this.transactions.size() -1 < row)
{
return null;
}
Pair<Tuple2<String, String>, Transaction> data = this.transactions.get(row);
Account account = new Account(data.getA().a);
Transaction transaction = data.getB();
switch(column)
{
case COLUMN_CONFIRMATIONS:
return transaction.getConfirmations();
case COLUMN_TIMESTAMP:
Date date = new Date(transaction.getTimestamp());
DateFormat format = DateFormat.getDateTimeInstance();
return format.format(date);
case COLUMN_TYPE:
return this.transactionTypes[transaction.getType()];
case COLUMN_ADDRESS:
return account.getAddress();
case COLUMN_AMOUNT:
return transaction.getAmount(account).toPlainString();
}
return null;
}
@Override
public void update(Observable o, Object arg)
{
try
{
this.syncUpdate(o, arg);
}
catch(Exception e)
{
//GUI ERROR
}
}
@SuppressWarnings("unchecked")
public synchronized void syncUpdate(Observable o, Object arg)
{
ObserverMessage message = (ObserverMessage) arg;
//CHECK IF NEW LIST
if(message.getType() == ObserverMessage.LIST_TRANSACTION_TYPE)
{
if(this.transactions == null)
{
this.transactions = (SortableList<Tuple2<String, String>, Transaction>) message.getValue();
this.transactions.registerObserver();
this.transactions.sort(TransactionMap.TIMESTAMP_INDEX, true);
}
this.fireTableDataChanged();
}
//CHECK IF LIST UPDATED
if(message.getType() == ObserverMessage.ADD_TRANSACTION_TYPE || message.getType() == ObserverMessage.REMOVE_TRANSACTION_TYPE)
{
this.fireTableDataChanged();
}
}
}