package gui.models; import java.text.DateFormat; import java.util.Date; import java.util.Observable; import java.util.Observer; import controller.Controller; import database.SortableList; import database.TransactionMap; import qora.transaction.Transaction; import utils.ObserverMessage; @SuppressWarnings("serial") public class TransactionsTableModel extends QoraTableModel<byte[], Transaction> implements Observer { public static final int COLUMN_TIMESTAMP = 0; public static final int COLUMN_TYPE = 1; public static final int COLUMN_FEE = 2; private SortableList<byte[], Transaction> transactions; private String[] columnNames = {"Timestamp", "Type", "Fee"}; 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 TransactionsTableModel() { Controller.getInstance().addObserver(this); } @Override public SortableList<byte[], 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; } Transaction transaction = this.transactions.get(row).getB(); switch(column) { 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_FEE: return transaction.getFee().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<byte[], 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(); } } public void removeObservers() { this.transactions.removeObserver(); Controller.getInstance().deleteObserver(this); } }