import java.awt.*;
import java.awt.event.*;

public class MiniCalc extends Panel implements ActionListener {
    char operator = 0;
    float storedValue = 0;
    boolean clearNext = false;

    TextField display = new TextField(20);
    Button key1 = new Button("1");
    Button key2 = new Button("2");
    Button key3 = new Button("3");
    Button key4 = new Button("4");
    Button key5 = new Button("5");
    Button key6 = new Button("6");
    Button key7 = new Button("7");
    Button key8 = new Button("8");
    Button key9 = new Button("9");
    Button key0 = new Button("0");
    Button add = new Button("+");
    Button subtract = new Button("-");
    Button multiply = new Button("*");
    Button divide = new Button("/");
    Button equal = new Button("=");
    Button decimal = new Button(".");
    Button plusminus = new Button("+/-");
    Button clear = new Button("C");
    Canvas empty = new Canvas();
    Panel row1 = new Panel();
    Panel row2 = new Panel();
    Panel row3 = new Panel();
    Panel row4 = new Panel();
    Panel row5 = new Panel();
    Panel row6 = new Panel();

    public MiniCalc() {
        Font typeface = new Font("Helvetica", Font.BOLD, 15);
        setFont(typeface);
        setBackground(Color.gray);

        GridLayout layout = new GridLayout(6, 1, 5, 5);
        this.setLayout(layout);
        GridLayout grid = new GridLayout(1, 4, 5, 5);

        row1.setLayout(grid);
        display.setBackground(Color.white);
        display.addActionListener(this);
        row1.add(display);
        this.add(row1);

        row2.setLayout(grid);
        key7.addActionListener(this);
        row2.add(key7);
        key8.addActionListener(this);
        row2.add(key8);
        key9.addActionListener(this);
        row2.add(key9);
        divide.addActionListener(this);
        row2.add(divide);
        this.add(row2);

        row3.setLayout(grid);
        key4.addActionListener(this);
        row3.add(key4);
        key5.addActionListener(this);
        row3.add(key5);
        key6.addActionListener(this);
        row3.add(key6);
        multiply.addActionListener(this);
        row3.add(multiply);
        this.add(row3);

        row4.setLayout(grid);
        key1.addActionListener(this);
        row4.add(key1);
        key2.addActionListener(this);
        row4.add(key2);
        key3.addActionListener(this);
        row4.add(key3);
        subtract.addActionListener(this);
        row4.add(subtract);
        this.add(row4);

        row5.setLayout(grid);
        key0.addActionListener(this);
        row5.add(key0);
        plusminus.addActionListener(this);
        row5.add(plusminus);
        decimal.addActionListener(this);
        row5.add(decimal);
        add.addActionListener(this);
        row5.add(add);
        this.add(row5);

        row6.setLayout(grid);
        clear.addActionListener(this);
        row6.add(clear);
        row6.add(empty);
        row6.add(empty);
        equal.setEnabled(false);
        equal.addActionListener(this);
        row6.add(equal);
        this.add(row6);
    }

public void actionPerformed(ActionEvent event) {
        String keyHit = event.getActionCommand();
        if (keyHit == "+/-") {
            float value = getValue(display.getText());
            value *= -1;
            clearDisplay();
            addToDisplay("" + value);
        }
        else switch ( keyHit.charAt(0) ) {
            case '+':
            case '-':
            case '*':
            case '/':
                equal.setEnabled(true);
                add.setEnabled(false);
                subtract.setEnabled(false);
                multiply.setEnabled(false);
                divide.setEnabled(false);
                storedValue = getValue(display.getText());
                operator = keyHit.charAt(0);
                clearNext = true;
                break;
            case '=':
                equal.setEnabled(false);
                add.setEnabled(true);
                subtract.setEnabled(true);
                multiply.setEnabled(true);
                divide.setEnabled(true);
                solveProblem();
                storedValue = getValue(display.getText());
                operator = 0;
                clearNext = true;
                break;
            case 'C':
                clearDisplay();
                operator = 0;
                storedValue = (float) 0;
                break;
            default:
                if (clearNext) {
                    clearDisplay();
                    clearNext = false;
                }
                addToDisplay(keyHit);
        }
    }

    public void solveProblem() {
        float currentValue = getValue(display.getText());
        switch (operator) {
            case '+':
                storedValue += currentValue;
                break;
            case '-':
                storedValue -= currentValue;
                break;
            case '*':
                storedValue *= currentValue;
                break;
            case '/':
                if (currentValue != 0)
                    storedValue /= currentValue;
                else
                    storedValue = 0;
                    break;
        }
        clearDisplay();
        addToDisplay("" + storedValue);
        clearNext = true;
    }

    public void addToDisplay(String keyHit) {
        String newText = display.getText();
        if (keyHit == ".") {
            if (newText.indexOf(".") == -1)
                newText += ".";
        } else
            newText += keyHit;
        int newLength = newText.length();
             display.setText(newText);
    }

    public void clearDisplay() {
        display.setText("");
    }

    public float getValue(String argument) {
        if (argument.equals("."))
            argument = "0";
        Float f1 = Float.valueOf(argument);
        return f1.floatValue();
    }
}

