diff -r 000000000000 -r 1918ee327afb examples/script/calculator/calculator.js --- /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; +}