
import java.applet.Applet;
import java.awt.*;

class BadOperationException extends Exception
{
	String label;
	BadOperationException() 
	{
		label = "E";
	}
}

public class FourCalculator extends Applet
{
	Button add;
	Button subtract;
	Button multiply;
	Button divide;
	Button equals;
	Button clear;
	Button lastOperation;
	TextField result;
	float current = 0;
	public void init()
	{
		add = new Button("+");
		add(add);
		subtract = new Button("-");
		add(subtract);
		multiply = new Button("*");
		add(multiply);
		divide = new Button("/");
		add(divide);
		equals = new Button("=");
		add(equals);
		clear = new Button("Clear");
		add(clear);
		result = new TextField(20);
		add(result);
		lastOperation = null;
	}
	public boolean action(Event event, Object arg)
	{
		try {
			if ((event.target == add) ||
				(event.target == subtract) ||
				(event.target == multiply) ||
				(event.target == divide))
			{
				completeOperation();
				lastOperation = (Button) event.target;
				result.setText("");
				result.requestFocus();
			} else if (event.target == equals) {
				completeOperation();
				lastOperation = null;
				String text = Float.toString(current);
				result.setText(text);
				result.requestFocus();
			} else if (event.target == clear) {
				current = 0;
				lastOperation = null;
				result.setText("");
				result.requestFocus();
			}
		} catch (BadOperationException e) {
			lastOperation = null;
			result.setText(e.label);
		}		
		return true;
	}
	void completeOperation() throws BadOperationException {
		String text = result.getText();
		Float value;
		try {
			value = Float.valueOf(text);
		} catch (java.lang.NumberFormatException ne) {
			BadOperationException oe = new BadOperationException();
			throw oe;
		}
		float f = value.floatValue();
		if (lastOperation == add) {
			current += f;
		} else if (lastOperation == subtract) {
			current -= f;
		} else if (lastOperation == multiply) {
			current *= f;
		} else if (lastOperation == divide) {
			if (f == 0) {
				// Prevent division by zero
				BadOperationException oe = 
					new BadOperationException();
				throw oe;
			} else {
				current /= f;
			}
		} else if (lastOperation == null) {
			current = f;
		}
	}
}

