//Author: ^-^Veerle^-^ public class calc2Engine { private calculatorCalculations ALU = new calculatorCalculations(); protected String strDisplay = "0."; private String strCurrentNumber = ""; private double memory = 0D; private double doubleOperationNum = 0D; private char currentOperation = '+'; private char previousOperation = '+'; private char doubleOperation = '='; //Used for double operations, e.g. ++, ** private boolean equalsButtonPressed = false; //When true, if next button pressed is a number, everything is reset and treated as a new sum private boolean zeroNumPressed = false; //When true the chop method will not remove trailing 0's public void objCalculator () { } public void setCurrentNum (String strNum) { strCurrentNumber = strNum; updateDisplayString(); } public String getCurrentNum () { return strCurrentNumber; } private double getCurrentNumber () { if (strCurrentNumber.equals("")) { return 0; } return Double.parseDouble(strCurrentNumber); } protected void handleMemory (String strMemoryAction) { if (strMemoryAction.equalsIgnoreCase("MS")) //Memory save { memory = getCurrentNumber(); } else if (strMemoryAction.equalsIgnoreCase("MR")) //Memory call { strCurrentNumber = Double.toString(memory); updateDisplayString(); } else if (strMemoryAction.equalsIgnoreCase("M+")) //Memory add { if (memory == 0) { memory = getCurrentNumber(); } else { memory += getCurrentNumber(); } } else //Memory clear { memory = 0d; } } protected void processNumber (char enteredNumber) { if (equalsButtonPressed) //If equals button was last pressed, treat this as a new calculation { resetEverything(); } if (!(enteredNumber == '0' && strCurrentNumber.equals(""))) //Do not allow 0 as the first number { strCurrentNumber += enteredNumber; if (enteredNumber == '0') { zeroNumPressed = true; //Stops the chop method removing the current 0 from the display } updateDisplayString(); } } protected void processOperation (char operation) { equalsButtonPressed = false; doubleOperation = '='; //Resets double operation previousOperation = currentOperation; currentOperation = operation; switch (operation) { case '+': case '-': case '*': case '/': processNormalOperation(); break; case '^': case 'v': processSpecialOperation(); break; case '%': processPercentOperation(); break; } strCurrentNumber = ALU.toString(); //Put total answer in strCurrentNumber so it can be displayed updateDisplayString(); strCurrentNumber = ""; //Reset strCurrentNumber so a new number can be entered } private void processNormalOperation () { if (!(strCurrentNumber.equals("") && ALU.isBlank())) { if (strCurrentNumber.equals("") && previousOperation != currentOperation) { previousOperation = currentOperation; //Allow operation changing } else if (strCurrentNumber.equals("") && currentOperation == previousOperation) { doubleOperation = currentOperation; //Allow the ++, -- etc doubleOperationNum = ALU.getTotalNum(); } else { ALU.performNormalCalculation(getCurrentNumber(), previousOperation); } } } private void processSpecialOperation () { if (!strCurrentNumber.equals("")) { ALU.performSpecialCalculation(getCurrentNumber(), currentOperation); } currentOperation = '='; } private void processPercentOperation () { if (!strCurrentNumber.equals("")) { ALU.performNormalCalculation(getCurrentNumber(), currentOperation); } } protected void processDecimalPlace () { if (equalsButtonPressed) { resetEverything(); } if (strCurrentNumber.indexOf('.') == -1) { if (getCurrentNumber() == 0D) //Imitate window's calculator with 0. if the number is empty { strCurrentNumber += "0."; } else { strCurrentNumber += "."; } updateDisplayString(); } } protected void processEqualsOperation () { if (!ALU.isBlank() && (currentOperation != '=' || doubleOperation != '=')) { if (currentOperation == '%') { ALU.performPercentCalculation(previousOperation); } else if (doubleOperation != '=') { ALU.performNormalCalculation(doubleOperationNum, doubleOperation); } else if (!strCurrentNumber.equals("")) { ALU.performNormalCalculation(getCurrentNumber(), currentOperation); } strCurrentNumber = ALU.toString(); equalsButtonPressed = true; currentOperation = '='; //Prevents error if you pressed the (+) next, it would count as a double operation updateDisplayString(); } } protected void resetEverything () { ALU.reset(); doubleOperationNum = 0D; equalsButtonPressed = zeroNumPressed = false; currentOperation = previousOperation = '+'; strCurrentNumber = ""; doubleOperation = '='; updateDisplayString(); } protected void deleteLastChar () { if (!(strCurrentNumber.equals("") || equalsButtonPressed)) { strCurrentNumber = strCurrentNumber.substring(0, strCurrentNumber.length() - 1); updateDisplayString(); } } private void updateDisplayString () { strDisplay = strCurrentNumber; if (strDisplay.equals("")) { strDisplay = "0."; } else if (strDisplay.indexOf('.') == -1) //If the number doesn't have a decimal place in it { strDisplay += "."; } chopDisplayString(); } private void chopDisplayString () { if (!zeroNumPressed) { //Removes trailing 0 padding for (int i = strDisplay.length(); i != 0; i--) { if (strDisplay.charAt(i - 1) == '0') { strDisplay = strDisplay.substring(0, (i - 1)); } else { break; } } } zeroNumPressed = false; if (strDisplay.length() >= 15) { strDisplay.substring(0, 14); } } }