package gui.models; import java.math.BigDecimal; import java.util.Observable; import java.util.Observer; import javax.swing.table.AbstractTableModel; import org.mapdb.Fun.Tuple2; import qora.account.Account; import utils.ObserverMessage; import utils.Pair; import controller.Controller; import database.SortableList; @SuppressWarnings("serial") public class BalancesTableModel extends AbstractTableModel implements Observer { private static final int COLUMN_ADDRESS = 0; public static final int COLUMN_BALANCE = 1; private long key; private String[] columnNames = {"Address", "Balance"}; private SortableList<Tuple2<String, Long>, BigDecimal> balances; public BalancesTableModel(long key) { this.key = key; Controller.getInstance().addObserver(this); this.balances = Controller.getInstance().getBalances(key); this.balances.registerObserver(); } @Override public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int index) { return columnNames[index]; } @Override public int getRowCount() { return this.balances.size(); } @Override public Object getValueAt(int row, int column) { if(this.balances == null || row > this.balances.size() - 1 ) { return null; } Pair<Tuple2<String, Long>, BigDecimal> aRow = this.balances.get(row); Account account = new Account(aRow.getA().a); switch(column) { case COLUMN_ADDRESS: return account.getAddress(); case COLUMN_BALANCE: return account.getConfirmedBalance(this.key).toPlainString(); } return null; } @Override public void update(Observable o, Object arg) { try { this.syncUpdate(o, arg); } catch(Exception e) { //GUI ERROR } } public synchronized void syncUpdate(Observable o, Object arg) { ObserverMessage message = (ObserverMessage) arg; //CHECK IF LIST UPDATED if(message.getType() == ObserverMessage.ADD_BALANCE_TYPE || message.getType() == ObserverMessage.REMOVE_BALANCE_TYPE) { this.fireTableDataChanged(); } } public void removeObservers() { this.balances.removeObserver(); Controller.getInstance().deleteObserver(this); } }