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);
    _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){
    a.addAccountListener(this);
    refreshAccounts();
  }
  public void accountDeleted(  Account a){
    a.removeAccountListener(this);
    refreshAccounts();
  }
  public void accountChanged(){
    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));
    }
  }
}
