/* ***********************************************************
	CHAPTER 7 EXTENDED EXAMPLE
	
This applet simulates the action of an automatic teller machine,
consisting of a keypad, a collection of control buttons, a 
numeric display field, and a text area for instructions.
************************************************************* */

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class ATM extends Applet
		 implements ActionListener
{
    private final int	START_MODE = 0,
			DEPOSIT_MODE = 1,
			WITHDRAW_MODE = 2;

    private int mode;
    
    private NumField	display = new NumField();
    private Keypad	pad;
    private Button	clear = new Button("Clear"),
			enter = new Button("Enter"),
			deposit = new Button("Deposit"),
			withdraw = new Button("Withdraw");
    private TextArea	help = new TextArea(6, 30);
    
    public void init()
    {
	Panel p1 = new Panel();
	p1.setLayout(new GridLayout(4, 1, 0, 3));
	p1.add(clear);
	p1.add(enter);
	p1.add(deposit);
	p1.add(withdraw);
	
	Panel p2 = new Panel();
	p2.setLayout(new BorderLayout(3,0));
	pad = new Keypad(this);
	p2.add("Center", pad);
	p2.add("East", p1);
	
	Panel p3 = new Panel();
	p3.setLayout(new BorderLayout());
	p3.add("North", display);
	p3.add("Center", p2);
	
	this.setLayout(new BorderLayout(5,5));
	this.add("Center",p3);
	this.add("East", help);
	help.setEditable(false);
	this.setBackground(Color.lightGray);
	this.setSize(400,150);
	deposit.addActionListener(this);
	withdraw.addActionListener(this);
	clear.addActionListener(this);
	enter.addActionListener(this);

	introStart();
    }
    
    public void actionPerformed(ActionEvent e)
    {
	String command = e.getActionCommand();
	switch (mode)
	{
	case START_MODE:    
	    if (command.equals("Deposit"))
		introDeposit();
	    else if (command.equals("Withdraw"))
		introWithdraw();
	    else if (command.equals("Clear"))
		doQuit();
	    else if (command.equals("Enter"))
		introStart();
	    return;
	    
	case DEPOSIT_MODE:
	    if (command.equals("Enter"))
		handleDeposit();
	    else if (command.equals("Clear"))
		display.clear();
	    else if (command.equals("pad")) {
		Button b = (Button)e.getSource();
		display.append(b.getLabel());
	    }
	    return;
	    
	case WITHDRAW_MODE:
	    if (command.equals("Enter"))
		handleWithdrawl();
	    else if (command.equals("Clear"))
		display.clear();
	    else if (command.equals("pad")) {
		Button b = (Button)e.getSource();
		display.append(b.getLabel());
	    }
	    return;
	}
	return;
    }
    
    private void introStart()
    {
	help.setText("      W E L C O M E\n\n");
	help.append("Press the Deposit or Withdraw\n");
	help.append("buttons to make a transaction.\n\n");
	help.append("Press Clear to end this session.");
	
	mode = START_MODE;
	display.clear();
	clear.setEnabled(true);
	enter.setEnabled(false);
	deposit.setEnabled(true);
	withdraw.setEnabled(true);
    }
    
    private void introDeposit()
    {
	help.setText("     D E P O S I T\n\n");
	help.append("Key in the amount of your deposit\n");
	showGeneralMessage();
	
	mode = DEPOSIT_MODE;
	display.clear();
	clear.setEnabled(true);
	enter.setEnabled(true);
	deposit.setEnabled(false);
	withdraw.setEnabled(false);
    }
    
     private void introWithdraw()
    {
	help.setText("     W I T H D R A W A L\n\n");
	help.append("Key in the amount of your withdrawl\n");
	showGeneralMessage();
	
	mode = WITHDRAW_MODE;
	display.clear();
	clear.setEnabled(true);
	enter.setEnabled(true);
	deposit.setEnabled(false);
	withdraw.setEnabled(false);
    }
    
    private void handleDeposit()
    // A deposit request has been made.  Check whether the amount
    // in display is nonzero.  If so, just go back to start mode.
    // If not, display a help message.
    {
	if (display.getValue() == 0.0)
	{
	    help.setText("*** oops! The amount can't be ");
	    help.append("zero\n\n");
	    help.append("Key in the amount of your ");
	    help.append("deposit\n");
	    showGeneralMessage();
	}
	else
	    introStart();
    }
    
    private void handleWithdrawl()
    // A withdrawl request has been made.  Check whether the amount
    // in display is nonzero.  If so, just go back to start mode.
    // If not, display a help message.
    {
	if (display.getValue() == 0.0)
	{
	    help.setText("*** oops! The amount can't be ");
	    help.append("zero\n\n");
	    help.append("Key in the amount of your ");
	    help.append("withdrawl\n");
	    showGeneralMessage();
	}
	else
	    introStart();
    }      
    
    private void doQuit()
    {
	help.setText("Thank you for your business.\n\n");
	help.append("Have a nice day.\n\n\n");
	help.append("Press the Enter button to start.");
	
	display.clear();
	clear.setEnabled(false);
	enter.setEnabled(true);
	deposit.setEnabled(false);
	withdraw.setEnabled(false);
    }
    
    private void showGeneralMessage()
    {
	help.append("and then press Enter to finish.\n\n");
	help.append("If you make a mistake, press Clear,\n");
	help.append("key in your amount again,\n");
	help.append("and then press Enter. ");
    }
}