package gui.models;
import java.math.BigDecimal;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import javax.swing.table.AbstractTableModel;
import qora.account.Account;
import qora.assets.Asset;
import utils.ObserverMessage;
import controller.Controller;
@SuppressWarnings("serial")
public class AccountsTableModel extends AbstractTableModel implements Observer
{
private static final int COLUMN_ADDRESS = 0;
public static final int COLUMN_BALANCE = 1;
public static final int COLUMN_CONFIRMED_BALANCE = 2;
public static final int COLUMN_GENERATING_BALANCE = 3;
private String[] columnNames = {"Address", "Balance", "Confirmed Balance", "Generating Balance"};
private List<Account> accounts;
private Asset asset = null;
public AccountsTableModel()
{
this.accounts = Controller.getInstance().getAccounts();
Controller.getInstance().addWalletListener(this);
Controller.getInstance().addObserver(this);
}
public Account getAccount(int row)
{
return accounts.get(row);
}
public void setAsset(Asset asset)
{
this.asset = asset;
this.fireTableDataChanged();
}
@Override
public int getColumnCount()
{
return columnNames.length;
}
@Override
public String getColumnName(int index)
{
return columnNames[index];
}
@Override
public int getRowCount()
{
return this.accounts.size();
}
@Override
public Object getValueAt(int row, int column)
{
if(this.accounts == null || row > this.accounts.size() - 1 )
{
return null;
}
Account account = this.accounts.get(row);
switch(column)
{
case COLUMN_ADDRESS:
return account.getAddress();
case COLUMN_BALANCE:
if(this.asset == null || this.asset.getKey() == 0l)
{
return account.getBalance(0).toPlainString();
}
else
{
return account.getConfirmedBalance(this.asset.getKey()).toPlainString();
}
case COLUMN_CONFIRMED_BALANCE:
if(this.asset == null || this.asset.getKey() == 0l)
{
return account.getConfirmedBalance().toPlainString();
}
else
{
return account.getConfirmedBalance(this.asset.getKey()).toPlainString();
}
case COLUMN_GENERATING_BALANCE:
if(this.asset == null || this.asset.getKey() == 0l)
{
return account.getGeneratingBalance().toPlainString();
}
else
{
return BigDecimal.ZERO.setScale(8).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;
if(message.getType() == ObserverMessage.ADD_BLOCK_TYPE || message.getType() == ObserverMessage.REMOVE_BLOCK_TYPE || message.getType() == ObserverMessage.ADD_TRANSACTION_TYPE || message.getType() == ObserverMessage.REMOVE_TRANSACTION_TYPE || message.getType() == ObserverMessage.ADD_ACCOUNT_TYPE || message.getType() == ObserverMessage.REMOVE_ACCOUNT_TYPE)
{
this.accounts = Controller.getInstance().getAccounts();
this.fireTableDataChanged();
}
}
public BigDecimal getTotalBalance()
{
BigDecimal totalBalance = BigDecimal.ZERO.setScale(8);
for(Account account: this.accounts)
{
if(this.asset == null || this.asset.getKey() == 0l)
{
totalBalance = totalBalance.add(account.getConfirmedBalance());
}
else
{
totalBalance = totalBalance.add(account.getConfirmedBalance(this.asset.getKey()));
}
}
return totalBalance;
}
}