package org.calculator;
import java.awt.*;
import java.awt.event.*;
import java.text.DecimalFormat;
import javax.swing.*;
@SuppressWarnings("serial")
public class GUI extends JFrame {
//fonts
private static final Font ANSWER_FONT = new Font("monspaced", Font.PLAIN, 20);
private static final Font BUTTON_FONT = new Font("monspaced", Font.PLAIN, 13);
//numbers
private JButton b1;
private JButton b2;
private JButton b3;
private JButton b4;
private JButton b5;
private JButton b6;
private JButton b7;
private JButton b8;
private JButton b9;
private JButton b0;
//math operators
private JButton addBtn;
private JButton substractBtn;
private JButton multiplyBtn;
private JButton divideBtn;
//other operators
private JButton plusMinus;
private JButton dot;
private JButton backspace;
private JButton clear;
private JButton clearEntry;
private JButton equalsBtn;
//answer field
private JTextField answerField;
@SuppressWarnings("unused")
private JTextField sumField;
//panels
private JPanel buttonPanel;
private JPanel operatorPanel;
private JPanel content;
//HandlerClass variables
public static String inputString = "0";
public static String answer;
public double number1;
public double number2;
public int firstEntry = 0;
public boolean answerOnScreen = false;
public String lastOperator;
public String outputString;
public DecimalFormat outputFormat = new DecimalFormat("#.######");
//MainGUI constructor
public GUI() {
super("Calculator");
//answer field
answerField = new JTextField("0");
answerField.setFont(ANSWER_FONT);
answerField.setHorizontalAlignment(JTextField.RIGHT);
answerField.setBackground(Color.WHITE);
answerField.setEditable(false);
//ButtonPanel
buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(5, 3, 2, 2));
//- Clear, clear entry and backspace buttons
clear = new JButton("C");
clear.setFont(BUTTON_FONT);
buttonPanel.add(clear);
clearEntry = new JButton("CE");
clearEntry.setFont(BUTTON_FONT);
buttonPanel.add(clearEntry);
backspace = new JButton("<--");
backspace.setFont(BUTTON_FONT);
buttonPanel.add(backspace);
//- numeric buttons
b1 = new JButton("7");
b1.setFont(BUTTON_FONT);
buttonPanel.add(b1);
b2 = new JButton("8");
b2.setFont(BUTTON_FONT);
buttonPanel.add(b2);
b3 = new JButton("9");
b3.setFont(BUTTON_FONT);
buttonPanel.add(b3);
b4 = new JButton("4");
b4.setFont(BUTTON_FONT);
buttonPanel.add(b4);
b5 = new JButton("5");
b5.setFont(BUTTON_FONT);
buttonPanel.add(b5);
b6 = new JButton("6");
b6.setFont(BUTTON_FONT);
buttonPanel.add(b6);
b7 = new JButton("1");
b7.setFont(BUTTON_FONT);
buttonPanel.add(b7);
b8 = new JButton("2");
b8.setFont(BUTTON_FONT);
buttonPanel.add(b8);
b9 = new JButton("3");
b9.setFont(BUTTON_FONT);
buttonPanel.add(b9);
//period, negation and zero buttons
plusMinus = new JButton("+/-");
plusMinus.setActionCommand("plusMinus");
plusMinus.setFont(BUTTON_FONT);
buttonPanel.add(plusMinus);
b0 = new JButton("0");
b0.setFont(BUTTON_FONT);
buttonPanel.add(b0);
dot = new JButton(",");
dot.setActionCommand("dot");
// dot.setEnabled(false);
dot.setFont(BUTTON_FONT);
buttonPanel.add(dot);
//operation buttons (OperatorPanel)
operatorPanel = new JPanel();
operatorPanel.setLayout(new GridLayout(5, 1, 2, 2));
addBtn = new JButton("+");
b1.setFont(BUTTON_FONT);
operatorPanel.add(addBtn);
substractBtn = new JButton("-");
b1.setFont(BUTTON_FONT);
operatorPanel.add(substractBtn);
multiplyBtn = new JButton("x");
b1.setFont(BUTTON_FONT);
operatorPanel.add(multiplyBtn);
divideBtn = new JButton(":");
b1.setFont(BUTTON_FONT);
operatorPanel.add(divideBtn);
equalsBtn = new JButton("=");
b1.setFont(BUTTON_FONT);
operatorPanel.add(equalsBtn);
//content
content = new JPanel();
content.setLayout(new BorderLayout(5,5));
content.add(operatorPanel, BorderLayout.EAST);
content.add(answerField, BorderLayout.NORTH);
content.add(buttonPanel, BorderLayout.CENTER);
content.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
add(content);
//Event handler
//operatorHandler
OperatorHandler operatorHandler = new OperatorHandler();
addBtn.addActionListener(operatorHandler);
substractBtn.addActionListener(operatorHandler);
multiplyBtn.addActionListener(operatorHandler);
divideBtn.addActionListener(operatorHandler);
equalsBtn.addActionListener(operatorHandler);
//numberHandler
NumberHandler numberHandler = new NumberHandler();
b1.addActionListener(numberHandler);
b2.addActionListener(numberHandler);
b3.addActionListener(numberHandler);
b4.addActionListener(numberHandler);
b5.addActionListener(numberHandler);
b6.addActionListener(numberHandler);
b7.addActionListener(numberHandler);
b8.addActionListener(numberHandler);
b9.addActionListener(numberHandler);
b0.addActionListener(numberHandler);
//specialHandler
SpecialButtonsHandler specialButtonsHandler = new SpecialButtonsHandler();
plusMinus.addActionListener(specialButtonsHandler);
dot.addActionListener(specialButtonsHandler);
//clearHandler
ClearHandler clearHandler = new ClearHandler();
clear.addActionListener(clearHandler);
clearEntry.addActionListener(clearHandler);
backspace.addActionListener(clearHandler);
}
private class OperatorHandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (answerOnScreen == true) {
number1 = Double.valueOf(outputString);
firstEntry = 1;
lastOperator = event.getActionCommand();
}
if (firstEntry == 0 && event.getActionCommand() != "=") {
number1 = Double.valueOf(inputString);
lastOperator = event.getActionCommand();
firstEntry++;
inputString = "0";
dot.setEnabled(true);
} else if (event.getActionCommand().equals("=") && lastOperator != null) {
number2 = Double.valueOf(inputString);
if (lastOperator.equals("+")) {
number1 = number1 + number2;
} else if (lastOperator.equals("-")) {
number1 = number1 - number2;
} else if (lastOperator.equals("x")) {
number1 = number1 * number2;
} else if (lastOperator.equals(":")) {
number1 = number1 / number2;
}
outputString = outputFormat.format(number1);
number1 = 0;
number2 = 0;
firstEntry = 0;
answerOnScreen = true;
inputString = "0";
answerField.setText(outputString);
dot.setEnabled(true);
} else if (firstEntry >= 1) {
number2 = Double.valueOf(inputString);
if (lastOperator.equals("+")) {
number1 = number1 + number2;
} else if (lastOperator.equals("-")) {
number1 = number1 - number2;
} else if (lastOperator.equals("x")) {
number1 = number1 * number2;
} else if (lastOperator.equals(":")) {
try {
number1 = number1 / number2;
} catch (ArithmeticException e) {
///////////////////////////////
///[B][I][U]Hier moet de code stoppen[/U][/I][/B]///
///////////////////////////////
}
}
lastOperator = event.getActionCommand();
answerOnScreen = false;
inputString = "0";
outputString = outputFormat.format(number1);
answerField.setText(outputString);
dot.setEnabled(true);
}
}
}
private class NumberHandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
answerOnScreen = false;
if (event.getActionCommand().equals(".")) {
if (inputString != "0") {
inputString += event.getActionCommand();
try {
@SuppressWarnings("unused")
float testInputString = Float.valueOf(inputString);
} catch (NumberFormatException e) {
dot.setEnabled(false);
}
answerField.setText(inputString);
}
} else {
if (inputString == "0")
inputString = "";
inputString += event.getActionCommand();
answerField.setText(inputString);
}
}
}
private class SpecialButtonsHandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
if (event.getActionCommand() == "dot") {
if (inputString != "0") {
inputString += ".";
dot.setEnabled(false);
answerField.setText(inputString);
}
} else if (event.getActionCommand() == "plusMinus") {
if (inputString != "0") {
if (inputString.charAt(0) != '-') {
StringBuffer inputString_buffer = new StringBuffer();
inputString_buffer.append("-");
inputString_buffer.append(inputString);
inputString = inputString_buffer.toString();
} else {
StringBuffer inputString_buffer = new StringBuffer();
inputString_buffer.append(inputString);
inputString_buffer.deleteCharAt(0);
inputString = inputString_buffer.toString();
}
answerField.setText(inputString);
}
}
}
}
private class ClearHandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
//select which clear action is selected:
//Clear action
if (event.getActionCommand().equalsIgnoreCase("C")) {
//set inputString to 0, empty numberList (NumberPerformerClass) and enable dot button
lastOperator = "";
firstEntry = 0;
answerOnScreen = false;
inputString = "0";
answerField.setText(inputString);
dot.setEnabled(true);
}
//Clear Entry action
else if (event.getActionCommand().equalsIgnoreCase("CE")) {
//set inputString to 0, enable dot button
answerOnScreen = false;
inputString = "0";
answerField.setText(inputString);
dot.setEnabled(true);
}
//Backspace action
else if (event.getActionCommand().equals("<--")) {
//catch exception StringIndexOutOfBoundsException
try {
//create a new StringBuffer and add inputString to it
StringBuffer inputString_buffer = new StringBuffer();
inputString_buffer.append(inputString);
//if the stringBuffer's length minus 1 is 0 or below (it will never go below zero), which means that there is only one digit displayed, then set inputString to 0
if (inputString_buffer.length() - 1 == 0) {
inputString = "0";
} else {
//the length is greater than 0, it will remove the last char and set inputString to the new StringBuffer's value as long as the last character isn't '.'
if (inputString_buffer.charAt(inputString_buffer.length() - 1) != '.') {
inputString_buffer.deleteCharAt(inputString_buffer.length() - 1);
inputString = inputString_buffer.toString();
} else {
//last char is '.', it will enable the dot button again
dot.setEnabled(true);
inputString_buffer.deleteCharAt(inputString_buffer.length() - 1);
inputString = inputString_buffer.toString();
}
}
//set the answer display to the newly obtained inputString
answerField.setText(inputString);
}
//exception occurred, inputString = 0
catch (StringIndexOutOfBoundsException e) {
inputString = "0";
answerField.setText(inputString);
}
}
}
}
}