package fucoin.gui; import akka.actor.ActorSelection; import fucoin.wallet.AbstractWallet; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Enumeration; public class WalletGuiControlImpl implements WalletGuiControl { private DefaultListModel<LogMessage> log = new DefaultListModel<>(); private JFrame window = new JFrame("test"); private JPanel topPanel = new JPanel(); private JLabel lblMyAddress = new JLabel("My Address:"); private JTextField txtMyAddress = new JTextField("<MyAddress>"); private JLabel lblEmpty = new JLabel(""); private JLabel lblMyAmount = new JLabel("My FUCs:"); private JTextField txtMyAmount = new JTextField("<MyFUCs>"); private JPanel centerPanel = new JPanel(); private JLabel lblSendTo = new JLabel("Send to:"); private JComboBox<String> txtSendTo = new JComboBox<>(); private JLabel lblSendAmount = new JLabel("Amount:"); private JTextField txtSendAmount = new JTextField(""); private JButton btnSend = new JButton("Send"); private JButton btnSearch = new JButton("Search"); private JButton btnStore = new JButton("Store"); private JButton btnExit = new JButton("Exit"); private JPanel bottomPanel = new JPanel(); private JList<LogMessage> txtLog = new JList<>(log); private JScrollPane logPane = new JScrollPane(txtLog); private JCheckBox showDebug; public WalletGuiControlImpl(AbstractWallet wallet) { window.setSize(400, 600); window.setLayout(new GridLayout(3, 1)); topPanel.setLayout(new GridLayout(2, 1)); // Row 1 JPanel row1 = new JPanel(); row1.setLayout(new BoxLayout(row1, BoxLayout.PAGE_AXIS)); row1.add(lblMyAddress); row1.add(txtMyAddress); topPanel.add(row1); // Row 2 JPanel row2 = new JPanel(); row2.setLayout(new GridLayout(1, 3)); row2.add(lblMyAmount); row2.add(txtMyAmount); row2.add(lblEmpty); topPanel.add(row2); window.add(topPanel); //<hr> centerPanel.setLayout(new GridLayout(4, 1)); // Row 1 JPanel centerup = new JPanel(); centerup.setLayout(new BorderLayout()); centerup.add(lblSendTo, BorderLayout.WEST); centerup.add(txtSendTo, BorderLayout.CENTER); centerPanel.add(centerup); JPanel centerup2 = new JPanel(); centerup2.setLayout(new BorderLayout()); JTextField sendToNewEdt = new JTextField(); centerup2.add(sendToNewEdt, BorderLayout.CENTER); JButton addNewButton = new JButton("Add"); addNewButton.addActionListener(e -> { ActorSelection selection = wallet.getContext().actorSelection(sendToNewEdt.getText()); System.out.println(selection); //selection.tell("Hallo!", self()); //txtSendTo.addItem(); }); centerup2.add(addNewButton, BorderLayout.EAST); centerPanel.add(centerup2); // Row 2 JPanel centerdown = new JPanel(); centerdown.setLayout(new GridLayout(1, 3)); centerdown.add(lblSendAmount); centerdown.add(txtSendAmount); centerdown.add(btnSend); centerPanel.add(centerdown); //centerPanel.add(new JLabel("")); // Row 3 JPanel centerdown2 = new JPanel(); centerdown2.setLayout(new GridLayout(1, 3)); centerdown2.add(btnSearch); centerdown2.add(btnStore); centerdown2.add(btnExit); centerPanel.add(centerdown2); window.add(centerPanel); //<hr> bottomPanel.setLayout(new BorderLayout()); showDebug = new JCheckBox("Show debug messages in transaction log"); showDebug.addItemListener(e -> { if (e.getStateChange() == ItemEvent.SELECTED) { txtLog.setModel(log); } else { updateFilteredLog(); } }); bottomPanel.add(showDebug, BorderLayout.NORTH); bottomPanel.add(logPane, BorderLayout.CENTER); window.add(bottomPanel); window.setVisible(true); btnSend.addActionListener(e -> { wallet.send(txtSendTo.getSelectedItem().toString(), Integer.parseInt(txtSendAmount.getText())); }); btnStore.addActionListener(e -> { }); btnExit.addActionListener(e -> window.dispose()); window.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.out.println("window closing"); wallet.leave(); super.windowClosing(e); } @Override public void windowClosed(WindowEvent e) { System.out.println("window closing"); wallet.leave(); super.windowClosing(e); } }); } @Override public void setAddress(String address) { txtMyAddress.setText(address); window.setTitle(address); } @Override public void setAmount(int amount) { txtMyAmount.setText(String.valueOf(amount)); } @Override public void addKnownAddress(String address) { txtSendTo.addItem(address); } @Override public void addLogMsg(String msg) { log(new LogMessage(msg, false)); } @Override public void addTransactionLogMessage(String message) { log(new LogMessage(message, true)); } private void log(LogMessage logMessage) { SwingUtilities.invokeLater(() -> { log.addElement(logMessage); if (!showDebug.isSelected()) { updateFilteredLog(); } // auto scroll to the bottom txtLog.ensureIndexIsVisible(log.size() - 1); }); } private void updateFilteredLog() { DefaultListModel<LogMessage> filteredLog = new DefaultListModel<>(); Enumeration<LogMessage> elements = log.elements(); while (elements.hasMoreElements()) { LogMessage logMessage = elements.nextElement(); if (logMessage.isTransactionRelated()) { filteredLog.addElement(logMessage); } } txtLog.setModel(filteredLog); } }