package gui; import gui.models.AccountsTableModel; import gui.models.AssetsComboBoxModel; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Point; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.border.EmptyBorder; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableRowSorter; import qora.account.Account; import qora.assets.Asset; import utils.BigDecimalStringComparator; import controller.Controller; @SuppressWarnings("serial") public class AccountsPanel extends JPanel implements ItemListener { private JComboBox<Asset> cbxFavorites; private AccountsTableModel tableModel; @SuppressWarnings("unchecked") public AccountsPanel() { this.setLayout(new GridBagLayout()); //PADDING this.setBorder(new EmptyBorder(10, 10, 10, 10)); //TABLE GBC GridBagConstraints tableGBC = new GridBagConstraints(); tableGBC.fill = GridBagConstraints.BOTH; tableGBC.anchor = GridBagConstraints.NORTHWEST; tableGBC.weightx = 1; tableGBC.weighty = 1; tableGBC.gridx = 1; tableGBC.gridy= 1; //BUTTON GBC GridBagConstraints buttonGBC = new GridBagConstraints(); buttonGBC.insets = new Insets(10, 0, 0, 0); buttonGBC.fill = GridBagConstraints.NONE; buttonGBC.anchor = GridBagConstraints.NORTHWEST; buttonGBC.gridx = 1; buttonGBC.gridy = 2; //FAVORITES GBC GridBagConstraints favoritesGBC = new GridBagConstraints(); favoritesGBC.insets = new Insets(10, 0, 10, 0); favoritesGBC.fill = GridBagConstraints.BOTH; favoritesGBC.anchor = GridBagConstraints.NORTHWEST; favoritesGBC.weightx = 1; favoritesGBC.gridx = 1; favoritesGBC.gridy = 0; //ASSET FAVORITES cbxFavorites = new JComboBox<Asset>(new AssetsComboBoxModel()); this.add(cbxFavorites, favoritesGBC); //TABLE tableModel = new AccountsTableModel(); final JTable table = Gui.createSortableTable(tableModel, 1); TableRowSorter<AccountsTableModel> sorter = (TableRowSorter<AccountsTableModel>) table.getRowSorter(); sorter.setComparator(AccountsTableModel.COLUMN_BALANCE, new BigDecimalStringComparator()); sorter.setComparator(AccountsTableModel.COLUMN_CONFIRMED_BALANCE, new BigDecimalStringComparator()); sorter.setComparator(AccountsTableModel.COLUMN_CONFIRMED_BALANCE, new BigDecimalStringComparator()); //ON FAVORITES CHANGE cbxFavorites.addItemListener(this); //MENU JPopupMenu menu = new JPopupMenu(); JMenuItem copyAddress = new JMenuItem("Copy Address"); copyAddress.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int row = table.getSelectedRow(); row = table.convertRowIndexToModel(row); Account account = tableModel.getAccount(row); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); StringSelection value = new StringSelection(account.getAddress()); clipboard.setContents(value, null); } }); menu.add(copyAddress); JMenuItem copyBalance = new JMenuItem("Copy Balance"); copyBalance.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int row = table.getSelectedRow(); row = table.convertRowIndexToModel(row); Account account = tableModel.getAccount(row); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); StringSelection value = new StringSelection(account.getUnconfirmedBalance().toPlainString()); clipboard.setContents(value, null); } }); menu.add(copyBalance); JMenuItem copyConfirmedBalance = new JMenuItem("Copy Confirmed Balance"); copyConfirmedBalance.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int row = table.getSelectedRow(); row = table.convertRowIndexToModel(row); Account account = tableModel.getAccount(row); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); StringSelection value = new StringSelection(account.getConfirmedBalance().toPlainString()); clipboard.setContents(value, null); } }); menu.add(copyConfirmedBalance); JMenuItem copyGeneratingBalance = new JMenuItem("Copy Generating Balance"); copyGeneratingBalance.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int row = table.getSelectedRow(); row = table.convertRowIndexToModel(row); Account account = tableModel.getAccount(row); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); StringSelection value = new StringSelection(account.getGeneratingBalance().toPlainString()); clipboard.setContents(value, null); } }); menu.add(copyGeneratingBalance); table.setComponentPopupMenu(menu); table.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { Point p = e.getPoint(); int row = table.rowAtPoint(p); table.setRowSelectionInterval(row, row); } }); //ADD ACCOUNTS TABLE this.add(new JScrollPane(table), tableGBC); //ADD TOTAL BALANCE final JLabel totalBalance = new JLabel("Confirmed Balance: " + tableModel.getTotalBalance().toPlainString()); this.add(totalBalance, buttonGBC); //ON TABLE CHANGE table.getModel().addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent arg0) { totalBalance.setText("Confirmed Balance: " + tableModel.getTotalBalance().toPlainString()); } }); //ADD NEW ACCOUNT BUTTON buttonGBC.gridy++; JButton newButton = new JButton("New account"); newButton.setPreferredSize(new Dimension(150, 25)); newButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onNewClick(); } }); this.add(newButton, buttonGBC); } public void onNewClick() { //CHECK IF WALLET UNLOCKED if(!Controller.getInstance().isWalletUnlocked()) { //ASK FOR PASSWORD String password = PasswordPane.showUnlockWalletDialog(); if(!Controller.getInstance().unlockWallet(password)) { //WRONG PASSWORD JOptionPane.showMessageDialog(null, "Invalid password", "Unlock Wallet", JOptionPane.ERROR_MESSAGE); return; } } //GENERATE NEW ACCOUNT Controller.getInstance().generateNewAccount(); } @Override public void itemStateChanged(ItemEvent e) { if(e.getStateChange() == ItemEvent.SELECTED) { Asset asset = (Asset) cbxFavorites.getSelectedItem(); tableModel.setAsset(asset); } } }