From 67b8175d628afbb1cf59b7412664a89ebef36858 Mon Sep 17 00:00:00 2001 From: brianlagunas_cp Date: Fri, 25 Mar 2011 07:29:25 +0000 Subject: [PATCH] Calculator: got basic math working. --- .../Calculator/Implementation/Calculator.cs | 104 +++++++++++++++--- .../Core/Utilities/CalculatorUtilities.cs | 22 ++++ 2 files changed, 109 insertions(+), 17 deletions(-) diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs index f7b3c6fa..03701980 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs @@ -16,6 +16,11 @@ namespace Microsoft.Windows.Controls private readonly DispatcherTimer _timer; private Button _calculatorButton; + bool _showNewNumber = true; + decimal _previousValue; + CalculatorButtonType _lastButtonPressed; + Operation _lastOperation = Operation.None; + #endregion //Members #region Enumerations @@ -53,6 +58,15 @@ namespace Microsoft.Windows.Controls Zero } + public enum Operation + { + Add, + Subtract, + Divide, + Multiply, + None + } + #endregion //Enumerations #region Properties @@ -124,7 +138,7 @@ namespace Microsoft.Windows.Controls protected virtual void OnValueChanged(decimal oldValue, decimal newValue) { - // TODO: Add your property changed side-effects. Descendants can override as well. + DisplayText = newValue.ToString(); } #endregion //Value @@ -193,7 +207,7 @@ namespace Microsoft.Windows.Controls _calculatorButton = CalculatorUtilities.FindButtonByCalculatorButtonType(_buttonPanel, buttonType); VisualStateManager.GoToState(_calculatorButton, "Pressed", true); _timer.Start(); - } + } private void ProcessCalculatorButton(CalculatorButtonType buttonType) { @@ -203,43 +217,99 @@ namespace Microsoft.Windows.Controls ProcessOperation(buttonType); else ProcessMisc(buttonType); + + _lastButtonPressed = buttonType; } - private void ProcessDigit(CalculatorButtonType butonType) + private void ProcessDigit(CalculatorButtonType buttonType) { + if (_showNewNumber) + DisplayText = CalculatorUtilities.GetCalculatorButtonContent(buttonType); + else + DisplayText += CalculatorUtilities.GetCalculatorButtonContent(buttonType); + _showNewNumber = false; } private void ProcessOperation(CalculatorButtonType buttonType) { - switch (buttonType) + if (_lastButtonPressed != CalculatorButtonType.Add && + _lastButtonPressed != CalculatorButtonType.Subtract && + _lastButtonPressed != CalculatorButtonType.Multiply && + _lastButtonPressed != CalculatorButtonType.Divide) { - case CalculatorButtonType.Add: - - break; - case CalculatorButtonType.Subtract: - break; - case CalculatorButtonType.Multiply: - - break; - case CalculatorButtonType.Divide: + Operation operation = Operation.None; + + switch (buttonType) + { + case CalculatorButtonType.Add: + operation = Operation.Add; + break; + case CalculatorButtonType.Subtract: + operation = Operation.Subtract; + break; + case CalculatorButtonType.Multiply: + operation = Operation.Multiply; + break; + case CalculatorButtonType.Divide: + operation = Operation.Divide; + break; + default: + operation = Operation.None; + break; + } + + Calculate(); + + _previousValue = Decimal.Parse(DisplayText); + + _showNewNumber = true; + _lastOperation = operation; + } + } + private void ProcessMisc(CalculatorButtonType buttonType) + { + switch (buttonType) + { + case CalculatorButtonType.Clear: + Value = decimal.Zero; + _showNewNumber = true; break; - case CalculatorButtonType.Percent: - + case CalculatorButtonType.Equal: + Calculate(); + _lastOperation = Operation.None; + _showNewNumber = true; break; } } - private void ProcessMisc(CalculatorButtonType buttonType) + private void Calculate() { + if (_lastOperation == Operation.None) + return; + Value = CalculateValue(_lastOperation); } - private void CalculateValue() + private decimal CalculateValue(Operation operation) { + decimal currentValue = Decimal.Parse(DisplayText); + switch (operation) + { + case Operation.Add: + return CalculatorUtilities.Add(_previousValue, currentValue); + case Operation.Subtract: + return CalculatorUtilities.Subtract(_previousValue, currentValue); + case Operation.Multiply: + return CalculatorUtilities.Multiply(_previousValue, currentValue); + case Operation.Divide: + return CalculatorUtilities.Divide(_previousValue, currentValue); + default: + return decimal.Zero; + } } #endregion //Methods diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs index f84b89a6..d7575eb1 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs @@ -29,6 +29,7 @@ namespace Microsoft.Windows.Controls.Core.Utilities case "\b": return Calculator.CalculatorButtonType.Back; case "\r": case "=": return Calculator.CalculatorButtonType.Equal; + case ".": return Calculator.CalculatorButtonType.Decimal; } //check for the escape key @@ -170,6 +171,7 @@ namespace Microsoft.Windows.Controls.Core.Utilities case Calculator.CalculatorButtonType.Seven: case Calculator.CalculatorButtonType.Eight: case Calculator.CalculatorButtonType.Nine: + case Calculator.CalculatorButtonType.Decimal: return true; default: return false; @@ -190,5 +192,25 @@ namespace Microsoft.Windows.Controls.Core.Utilities return false; } } + + public static decimal Add(decimal firstNumber, decimal secondNumber) + { + return firstNumber + secondNumber; + } + + public static decimal Subtract(decimal firstNumber, decimal secondNumber) + { + return firstNumber - secondNumber; + } + + public static decimal Multiply(decimal firstNumber, decimal secondNumber) + { + return firstNumber * secondNumber; + } + + public static decimal Divide(decimal firstNumber, decimal secondNumber) + { + return firstNumber / secondNumber; + } } }