package org.prevayler.demos.demo2.gui;
import java.awt.Container;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import org.prevayler.Prevayler;
import org.prevayler.demos.demo2.business.Account;
import org.prevayler.demos.demo2.business.AccountListener;
import org.prevayler.demos.demo2.business.transactions.Deposit;
import org.prevayler.demos.demo2.business.transactions.HolderChange;
import org.prevayler.demos.demo2.business.transactions.Withdrawal;
class AccountEditFrame extends AccountFrame implements AccountListener {
private static final long serialVersionUID = -1881757771183108518L;
private final Account account;
private JTextField balanceField;
private JList historyList;
AccountEditFrame(Account account, Prevayler prevayler, Container container) {
super("Account " + account.numberString(), prevayler, container);
this.account = account;
account.addAccountListener(this);
accountChanged();
holderField.addFocusListener(new HolderListener());
setBounds(50,50,306,300);
}
protected void addFields(Box fieldBox) {
super.addFields(fieldBox);
fieldBox.add(gap());
fieldBox.add(labelContainer("Transaction History"));
historyList = new JList();
historyList.setEnabled(false);
fieldBox.add(new JScrollPane(historyList));
fieldBox.add(gap());
fieldBox.add(labelContainer("Balance"));
balanceField = new JTextField();
balanceField.setEnabled(false);
fieldBox.add(balanceField);
}
protected void addButtons(JPanel buttonPanel) {
buttonPanel.add(new JButton(new DepositAction()));
buttonPanel.add(new JButton(new WithdrawAction()));
buttonPanel.add(new JButton(new TransferAction()));
}
private class DepositAction extends RobustAction {
private static final long serialVersionUID = 405949418924180386L;
DepositAction() {
super("Deposit...");
}
public void action() throws Exception {
Number amount = enterAmount("Deposit");
if (amount == null) return;
_prevayler.execute(new Deposit(account, amount.longValue()));
}
}
private class WithdrawAction extends RobustAction {
private static final long serialVersionUID = -3457941349394635348L;
WithdrawAction() {
super("Withdraw...");
}
public void action() throws Exception {
Number amount = enterAmount("Withdrawal");
if (amount == null) return;
_prevayler.execute(new Withdrawal(account, amount.longValue()));
}
}
private Number enterAmount(String operation) throws Exception {
String amountText = JOptionPane.showInputDialog(null,"Enter amount",operation,JOptionPane.PLAIN_MESSAGE);
if (amountText == null) return null;
return new Long(parse(amountText));
}
private class TransferAction extends RobustAction {
private static final long serialVersionUID = -5062849913422257492L;
TransferAction() {
super("Transfer...");
}
public void action() {
new TransferFrame(account, _prevayler, getDesktopPane());
}
}
public void accountChanged() { //Implements AccountListener.
holderField.setText(account.holder());
historyList.setListData(account.transactionHistory().toArray());
balanceField.setText(String.valueOf(account.balance()));
}
private class HolderListener extends FocusAdapter {
public void focusLost(FocusEvent e) {
if (holderText().equals(account.holder())) return;
try {
_prevayler.execute(new HolderChange(account, holderText()));
} catch (Exception exception) {
RobustAction.display(exception);
}
}
}
}