From a78bf7baae79ff6c433c06c2e696bd283229097b Mon Sep 17 00:00:00 2001 From: brianlagunas_cp Date: Fri, 25 Mar 2011 20:02:59 +0000 Subject: [PATCH] Calculator: implemented memory functions --- .../Calculator/Implementation/Calculator.cs | 205 ++++++++++++------ .../Calculator/Themes/Generic.xaml | 18 +- .../CalculatorMemoryToVisibilityConverter.cs | 19 ++ .../Core/Utilities/CalculatorUtilities.cs | 14 +- .../WPFToolkit.Extended.csproj | 1 + 5 files changed, 179 insertions(+), 78 deletions(-) create mode 100644 ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Converters/CalculatorMemoryToVisibilityConverter.cs diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs index 8ded816c..a3a78a27 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs @@ -18,6 +18,7 @@ namespace Microsoft.Windows.Controls private bool _showNewNumber = true; private decimal _previousValue; private Operation _lastOperation = Operation.None; + private CalculatorButtonType _lastButtonPressed; #endregion //Members @@ -123,6 +124,29 @@ namespace Microsoft.Windows.Controls #endregion //DisplayText + #region Memory + + public static readonly DependencyProperty MemoryProperty = DependencyProperty.Register("Memory", typeof(decimal), typeof(Calculator), new UIPropertyMetadata(default(decimal), OnMemoryChanged)); + public decimal Memory + { + get { return (decimal)GetValue(MemoryProperty); } + set { SetValue(MemoryProperty, value); } + } + + private static void OnMemoryChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) + { + Calculator calculator = o as Calculator; + if (calculator != null) + calculator.OnMemoryChanged((decimal)e.OldValue, (decimal)e.NewValue); + } + + protected virtual void OnMemoryChanged(decimal oldValue, decimal newValue) + { + // TODO: Add your property changed side-effects. Descendants can override as well. + } + + #endregion //Memory + #region Value public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(decimal), typeof(Calculator), new UIPropertyMetadata(default(decimal), OnValueChanged)); @@ -205,72 +229,6 @@ namespace Microsoft.Windows.Controls #region Methods - private void ProcessCalculatorButton(CalculatorButtonType buttonType) - { - if (CalculatorUtilities.IsDigit(buttonType)) - ProcessDigit(buttonType); - else - ProcessOperation(buttonType); - } - - 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) - { - case CalculatorButtonType.Add: - Calculate(Operation.Add); - break; - case CalculatorButtonType.Subtract: - Calculate(Operation.Subtract); - break; - case CalculatorButtonType.Multiply: - Calculate(Operation.Multiply); - break; - case CalculatorButtonType.Divide: - Calculate(Operation.Divide); - break; - case CalculatorButtonType.Percent: - Calculate(Operation.Percent); - break; - case CalculatorButtonType.Sqrt: - Calculate(Operation.Sqrt, Operation.None); - break; - case CalculatorButtonType.Fraction: - Calculate(Operation.Fraction, Operation.None); - break; - case CalculatorButtonType.Negate: - Calculate(Operation.Negate, Operation.None); - break; - case CalculatorButtonType.Equal: - Calculate(Operation.None); - break; - case CalculatorButtonType.Clear: - Calculate(Operation.Clear, Operation.None); - DisplayText = Value.ToString(); - break; - case CalculatorButtonType.Cancel: - DisplayText = _previousValue.ToString(); - _lastOperation = Operation.None; - _showNewNumber = true; - return; - default: - break; - } - - _previousValue = Decimal.Parse(DisplayText); - _showNewNumber = true; - } - private void Calculate() { if (_lastOperation == Operation.None) @@ -333,6 +291,121 @@ namespace Microsoft.Windows.Controls return newValue; } + void ProcessBackKey() + { + string displayText; + if (DisplayText.Length > 1 && !(DisplayText.Length == 2 && DisplayText[0] == '-')) + { + displayText = DisplayText.Remove(DisplayText.Length - 1, 1); + } + else + { + displayText = "0"; + _showNewNumber = true; + } + + DisplayText = displayText; + } + + private void ProcessCalculatorButton(CalculatorButtonType buttonType) + { + if (CalculatorUtilities.IsDigit(buttonType)) + ProcessDigitKey(buttonType); + else if ((CalculatorUtilities.IsMemory(buttonType))) + ProcessMemoryKey(buttonType); + else + ProcessOperationKey(buttonType); + + _lastButtonPressed = buttonType; + } + + private void ProcessDigitKey(CalculatorButtonType buttonType) + { + if (_showNewNumber) + DisplayText = CalculatorUtilities.GetCalculatorButtonContent(buttonType); + else + DisplayText += CalculatorUtilities.GetCalculatorButtonContent(buttonType); + + _showNewNumber = false; + } + + private void ProcessMemoryKey(Calculator.CalculatorButtonType buttonType) + { + switch (buttonType) + { + case Calculator.CalculatorButtonType.MAdd: + Memory += Decimal.Parse(DisplayText); + break; + case Calculator.CalculatorButtonType.MC: + Memory = decimal.Zero; + break; + case Calculator.CalculatorButtonType.MR: + DisplayText = Memory.ToString(); + break; + case Calculator.CalculatorButtonType.MS: + Memory = Decimal.Parse(DisplayText); + break; + case Calculator.CalculatorButtonType.MSub: + Memory -= Decimal.Parse(DisplayText); + break; + default: + break; + } + + _showNewNumber = true; + } + + private void ProcessOperationKey(CalculatorButtonType buttonType) + { + switch (buttonType) + { + case CalculatorButtonType.Add: + Calculate(Operation.Add); + break; + case CalculatorButtonType.Subtract: + Calculate(Operation.Subtract); + break; + case CalculatorButtonType.Multiply: + Calculate(Operation.Multiply); + break; + case CalculatorButtonType.Divide: + Calculate(Operation.Divide); + break; + case CalculatorButtonType.Percent: + Calculate(Operation.Percent); + break; + case CalculatorButtonType.Sqrt: + Calculate(Operation.Sqrt, Operation.None); + break; + case CalculatorButtonType.Fraction: + Calculate(Operation.Fraction, Operation.None); + break; + case CalculatorButtonType.Negate: + Calculate(Operation.Negate, Operation.None); + break; + case CalculatorButtonType.Equal: + Calculate(Operation.None); + break; + case CalculatorButtonType.Clear: + Calculate(Operation.Clear, Operation.None); + DisplayText = Value.ToString(); + break; + case CalculatorButtonType.Cancel: + DisplayText = _previousValue.ToString(); + _lastOperation = Operation.None; + _showNewNumber = true; + return; + case CalculatorButtonType.Back: + ProcessBackKey(); + return; + default: + break; + } + + _previousValue = Decimal.Parse(DisplayText); + _showNewNumber = true; + } + private void SimulateCalculatorButtonClick(CalculatorButtonType buttonType) { _calculatorButton = CalculatorUtilities.FindButtonByCalculatorButtonType(_buttonPanel, buttonType); diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml index 89b4969c..91f6dc36 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml @@ -1,6 +1,9 @@  + xmlns:local="clr-namespace:Microsoft.Windows.Controls" + xmlns:coreConverters="clr-namespace:Microsoft.Windows.Controls.Core.Converters" > + +