package org.prevayler.demos.demo2.gui; import org.prevayler.Prevayler; import org.prevayler.demos.demo2.business.*; import org.prevayler.demos.demo2.business.transactions.*; import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; class AllAccountsFrame extends JInternalFrame implements BankListener, AccountListener { private static final long serialVersionUID = -9182376858708585231L; private final Prevayler _prevayler; private final JList accountList; AllAccountsFrame(Prevayler prevayler, Container container) { super("All Accounts", true); //true means resizable. _prevayler = prevayler; accountList = new JList(); accountList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); bank().setBankListener(this); listenToAccounts(); refreshAccounts(); container.add(this); getContentPane().add(new JScrollPane(accountList), BorderLayout.CENTER); getContentPane().add(accountButtons(), BorderLayout.SOUTH); setBounds(10,10,330,240); show(); } private void listenToAccounts() { java.util.Iterator it = accounts().iterator(); while (it.hasNext()) { ((Account)it.next()).addAccountListener(this); } } private void refreshAccounts() { accountList.setListData(accounts().toArray()); } private java.util.List accounts() { return bank().accounts(); } private Bank bank() { return (Bank)_prevayler.prevalentSystem(); } public void accountCreated(Account a) { //Implements BankListener. a.addAccountListener(this); refreshAccounts(); } public void accountDeleted(Account a) { //Implements BankListener. a.removeAccountListener(this); refreshAccounts(); } public void accountChanged() { //Implements AccountListener. refreshAccounts(); } private JPanel accountButtons() { JPanel result = new JPanel(); result.add(new JButton(new AccountCreation())); result.add(new JButton(new AccountEditAction())); result.add(new JButton(new AccountDeleteAction())); return result; } class AccountCreation extends AbstractAction { private static final long serialVersionUID = 9182061237235826622L; AccountCreation() { super("Create"); } public void actionPerformed(ActionEvent e) { new NewAccountFrame(_prevayler, getDesktopPane()); } } abstract class SelectedAccountAction extends RobustAction implements ListSelectionListener { SelectedAccountAction(String name) { super(name); refreshEnabled(); accountList.addListSelectionListener(this); } private void refreshEnabled() { this.setEnabled(accountList.getSelectedValue() != null); } public void valueChanged(ListSelectionEvent event) { refreshEnabled(); } protected void action() throws Exception { action((Account)accountList.getSelectedValue()); } abstract void action(Account account) throws Exception; } class AccountEditAction extends SelectedAccountAction { private static final long serialVersionUID = 5901968097767524191L; AccountEditAction() { super("Edit"); } void action(Account account) { new AccountEditFrame(account, _prevayler, getDesktopPane()); } } class AccountDeleteAction extends SelectedAccountAction { private static final long serialVersionUID = -1320330350155595965L; AccountDeleteAction() { super("Delete"); } void action(Account account) throws Exception { int option = JOptionPane.showConfirmDialog(null, "Delete selected account?", "Account Deletion", JOptionPane.YES_NO_OPTION); if (option != JOptionPane.YES_OPTION) return; _prevayler.execute(new AccountDeletion(account)); } } }