blob: 612a4f9fa3375d8f94f3dea3b0667059692e5b22 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2010, Matthias Sohn <matthias.sohn@sap.com>
* Copyright (C) 2010, Stefan Lay <stefan.lay@sap.com>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.example.calc.internal;
import org.eclipse.example.calc.BinaryOperation;
import org.eclipse.example.calc.Operation;
import org.eclipse.example.calc.Operations;
import org.eclipse.example.calc.UnaryOperation;
import org.eclipse.example.calc.internal.operations.Equals;
import org.eclipse.example.calc.internal.operations.Minus;
import org.eclipse.example.calc.internal.operations.Plus;
import org.eclipse.example.calc.internal.operations.Square;
public class Calculator {
private TextProvider textProvider;
private String cmd;
private boolean clearText;
private float value;
public static String NAME = "Simple Calculator";
public Calculator(TextProvider textProvider) {
this.textProvider = textProvider;
setupDefaultOperations();
}
private void setupDefaultOperations() {
new Equals();
new Minus();
new Plus();
new Divide();
new Square();
}
private void calculate(String cmdName) {
float curValue;
float newValue = 0;
// get current value of display
curValue = Float.parseFloat(textProvider.getDisplayText());
Operation currentOp = Operations.INSTANCE.getOperation(cmdName);
if ((currentOp instanceof BinaryOperation) && (cmd == null)) {
// if last clicked operation was binary and there is no saved
// operation, store it
cmd = cmdName;
setClearText(true);
} else {
// if saved command is binary perform it
Operation savedOp = Operations.INSTANCE.getOperation(cmd);
if (savedOp instanceof BinaryOperation) {
BinaryOperation bop = (BinaryOperation) savedOp;
newValue = bop.perform(value, curValue);
} // if current operation is unary perform it
else if (currentOp instanceof UnaryOperation) {
UnaryOperation uop = (UnaryOperation) currentOp;
newValue = uop.perform(curValue);
}
// display the result and prepare clear on next button
textProvider.setDisplayText("" + newValue);
setClearText(true);
if (currentOp instanceof Equals) {
// do not save "=" command
cmd = null;
} else if (currentOp instanceof BinaryOperation) {
// save binary commands as they are executed on next operation
cmd = cmdName;
} else {
// clear saved command
cmd = null;
}
}
}
private boolean isCommand(String name) {
return (Operations.INSTANCE.getOperation(name) != null);
}
public void handleButtonClick(String str) {
if (isCommand(str)) {
calculate(str);
} else {
char digit = (str.toCharArray())[0];
if (Character.isDigit(digit) || digit == '.') {
if (clearText) {
// save current value and clear the display
value = Float.parseFloat(textProvider.getDisplayText());
textProvider.setDisplayText("");
setClearText(false);
}
// add new digit to display
textProvider.setDisplayText(textProvider.getDisplayText() + digit);
}
}
}
public void setClearText(boolean clearText) {
this.clearText = clearText;
}
}