examples/script/calculator/calculator.js
changeset 0 1918ee327afb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/script/calculator/calculator.js	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,281 @@
+Function.prototype.bind = function() {
+    var func = this;
+    var thisObject = arguments[0];
+    var args = Array.prototype.slice.call(arguments, 1);
+    return function() {
+        return func.apply(thisObject, args);
+    }
+}
+
+//! [0]
+function Calculator(ui)
+{
+    this.ui = ui;
+
+    this.pendingAdditiveOperator = Calculator.NO_OPERATOR;
+    this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR;
+    this.sumInMemory = 0;
+    this.sumSoFar = 0;
+    this.factorSoFar = 0;
+    this.waitingForOperand = true;
+
+    with (ui) {
+        display.text = "0";
+
+        zeroButton.clicked.connect(this.digitClicked.bind(this, 0));
+        oneButton.clicked.connect(this.digitClicked.bind(this, 1));
+        twoButton.clicked.connect(this.digitClicked.bind(this, 2));
+        threeButton.clicked.connect(this.digitClicked.bind(this, 3));
+        fourButton.clicked.connect(this.digitClicked.bind(this, 4));
+        fiveButton.clicked.connect(this.digitClicked.bind(this, 5));
+        sixButton.clicked.connect(this.digitClicked.bind(this, 6));
+        sevenButton.clicked.connect(this.digitClicked.bind(this, 7));
+        eightButton.clicked.connect(this.digitClicked.bind(this, 8));
+        nineButton.clicked.connect(this.digitClicked.bind(this, 9));
+
+        pointButton.clicked.connect(this, "pointClicked");
+        changeSignButton.clicked.connect(this, "changeSignClicked");
+
+        backspaceButton.clicked.connect(this, "backspaceClicked");
+        clearButton.clicked.connect(this, "clear");
+        clearAllButton.clicked.connect(this, "clearAll");
+
+        clearMemoryButton.clicked.connect(this, "clearMemory");
+        readMemoryButton.clicked.connect(this, "readMemory");
+        setMemoryButton.clicked.connect(this, "setMemory");
+        addToMemoryButton.clicked.connect(this, "addToMemory");
+  
+        divisionButton.clicked.connect(this.multiplicativeOperatorClicked.bind(this, Calculator.DIVISION_OPERATOR));
+        timesButton.clicked.connect(this.multiplicativeOperatorClicked.bind(this, Calculator.TIMES_OPERATOR));
+        minusButton.clicked.connect(this.additiveOperatorClicked.bind(this, Calculator.MINUS_OPERATOR));
+        plusButton.clicked.connect(this.additiveOperatorClicked.bind(this, Calculator.PLUS_OPERATOR));
+
+        squareRootButton.clicked.connect(this.unaryOperatorClicked.bind(this, Calculator.SQUARE_OPERATOR));
+        powerButton.clicked.connect(this.unaryOperatorClicked.bind(this, Calculator.POWER_OPERATOR));
+        reciprocalButton.clicked.connect(this.unaryOperatorClicked.bind(this, Calculator.RECIPROCAL_OPERATOR));
+        equalButton.clicked.connect(this, "equalClicked");
+    }
+}
+//! [0]
+
+Calculator.NO_OPERATOR = 0;
+Calculator.SQUARE_OPERATOR = 1;
+Calculator.POWER_OPERATOR = 2;
+Calculator.RECIPROCAL_OPERATOR = 3;
+Calculator.DIVISION_OPERATOR = 4;
+Calculator.TIMES_OPERATOR = 5;
+Calculator.MINUS_OPERATOR = 6;
+Calculator.PLUS_OPERATOR = 7;
+
+Calculator.prototype.abortOperation = function()
+{
+    this.clearAll();
+    this.ui.display.text = "####";
+}
+
+Calculator.prototype.calculate = function(rightOperand, pendingOperator)
+{
+    if (pendingOperator == Calculator.PLUS_OPERATOR) {
+        this.sumSoFar += rightOperand;
+    } else if (pendingOperator == Calculator.MINUS_OPERATOR) {
+        this.sumSoFar -= rightOperand;
+    } else if (pendingOperator == Calculator.TIMES_OPERATOR) {
+        this.factorSoFar *= rightOperand;
+    } else if (pendingOperator == Calculator.DIVISION_OPERATOR) {
+        if (rightOperand == 0)
+            return false;
+        this.factorSoFar /= rightOperand;
+    }
+    return true;
+}
+
+//! [1]
+Calculator.prototype.digitClicked = function(digitValue)
+{
+    if ((digitValue == 0) && (this.ui.display.text == "0"))
+        return;
+    if (this.waitingForOperand) {
+        this.ui.display.clear();
+        this.waitingForOperand = false;
+    }
+    this.ui.display.text += digitValue;
+}
+//! [1]
+
+Calculator.prototype.unaryOperatorClicked = function(op)
+{
+    var operand = this.ui.display.text - 0;
+    var result = 0;
+    if (op == Calculator.SQUARE_OPERATOR) {
+        if (operand < 0) {
+            this.abortOperation();
+            return;
+        }
+        result = Math.sqrt(operand);
+    } else if (op == Calculator.POWER_OPERATOR) {
+        result = Math.pow(operand, 2);
+    } else if (op == Calculator.RECIPROCAL_OPERATOR) {
+        if (operand == 0.0) {
+            this.abortOperation();
+            return;
+        }
+        result = 1 / operand;
+    }
+    this.ui.display.text = result + "";
+    this.waitingForOperand = true;
+}
+
+Calculator.prototype.additiveOperatorClicked = function(op)
+{
+    var operand = this.ui.display.text - 0;
+
+    if (this.pendingMultiplicativeOperator != Calculator.NO_OPERATOR) {
+        if (!this.calculate(operand, this.pendingMultiplicativeOperator)) {
+            this.abortOperation();
+            return;
+        }
+        this.ui.display.text = this.factorSoFar + "";
+        operand = this.factorSoFar;
+        this.factorSoFar = 0;
+        this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR;
+    }
+
+    if (this.pendingAdditiveOperator != Calculator.NO_OPERATOR) {
+        if (!this.calculate(operand, this.pendingAdditiveOperator)) {
+            this.abortOperation();
+            return;
+        }
+        this.ui.display.text = this.sumSoFar + "";
+    } else {
+        this.sumSoFar = operand;
+    }
+
+    this.pendingAdditiveOperator = op;
+    this.waitingForOperand = true;
+}
+
+Calculator.prototype.multiplicativeOperatorClicked = function(op)
+{
+    var operand = this.ui.display.text - 0;
+
+    if (this.pendingMultiplicativeOperator != Calculator.NO_OPERATOR) {
+        if (!this.calculate(operand, this.pendingMultiplicativeOperator)) {
+            this.abortOperation();
+            return;
+        }
+        this.ui.display.text = this.factorSoFar + "";
+    } else {
+        this.factorSoFar = operand;
+    }
+
+    this.pendingMultiplicativeOperator = op;
+    this.waitingForOperand = true;
+}
+
+Calculator.prototype.equalClicked = function()
+{
+    var operand = this.ui.display.text - 0;
+
+    if (this.pendingMultiplicativeOperator != Calculator.NO_OPERATOR) {
+        if (!this.calculate(operand, this.pendingMultiplicativeOperator)) {
+            this.abortOperation();
+            return;
+        }
+        operand = this.factorSoFar;
+        this.factorSoFar = 0.0;
+        this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR;
+    }
+    if (this.pendingAdditiveOperator != Calculator.NO_OPERATOR) {
+        if (!this.calculate(operand, this.pendingAdditiveOperator)) {
+            this.abortOperation();
+            return;
+        }
+        this.pendingAdditiveOperator = Calculator.NO_OPERATOR;
+    } else {
+        this.sumSoFar = operand;
+    }
+
+    this.ui.display.text = this.sumSoFar + "";
+    this.sumSoFar = 0.0;
+    this.waitingForOperand = true;
+}
+
+Calculator.prototype.pointClicked = function()
+{
+    if (this.waitingForOperand)
+        this.ui.display.text = "0";
+    if (this.ui.display.text.indexOf(".") == -1)
+        this.ui.display.text += ".";
+    this.waitingForOperand = false;
+}
+
+//! [2]
+Calculator.prototype.changeSignClicked = function()
+{
+    var text = this.ui.display.text;
+    var value = text - 0;
+
+    if (value > 0) {
+        text = "-" + text;
+    } else if (value < 0) {
+        text = text.slice(1);
+    }
+    this.ui.display.text = text;
+}
+//! [2]
+
+Calculator.prototype.backspaceClicked = function()
+{
+    if (this.waitingForOperand)
+        return;
+
+    var text = this.ui.display.text;
+    text = text.slice(0, -1);
+    if (text.length == 0) {
+        text = "0";
+        this.waitingForOperand = true;
+    }
+    this.ui.display.text = text;
+}
+
+Calculator.prototype.clear = function()
+{
+    if (this.waitingForOperand)
+        return;
+
+    this.ui.display.text = "0";
+    this.waitingForOperand = true;
+}
+
+Calculator.prototype.clearAll = function()
+{
+    this.sumSoFar = 0.0;
+    this.factorSoFar = 0.0;
+    this.pendingAdditiveOperator = Calculator.NO_OPERATOR;
+    this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR;
+    this.ui.display.text = "0";
+    this.waitingForOperand = true;
+}
+
+Calculator.prototype.clearMemory = function()
+{
+    this.sumInMemory = 0.0;
+}
+
+Calculator.prototype.readMemory = function()
+{
+    this.ui.display.text = this.sumInMemory + "";
+    this.waitingForOperand = true;
+}
+
+Calculator.prototype.setMemory = function()
+{
+    this.equalClicked();
+    this.sumInMemory = this.ui.display.text - 0;
+}
+
+Calculator.prototype.addToMemory = function()
+{
+    this.equalClicked();
+    this.sumInMemory += this.ui.display.text - 0;
+}