Browse Source

Calculator: got basic math working.

pull/1645/head
brianlagunas_cp 15 years ago
parent
commit
67b8175d62
  1. 104
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs
  2. 22
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs

104
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs

@ -16,6 +16,11 @@ namespace Microsoft.Windows.Controls
private readonly DispatcherTimer _timer; private readonly DispatcherTimer _timer;
private Button _calculatorButton; private Button _calculatorButton;
bool _showNewNumber = true;
decimal _previousValue;
CalculatorButtonType _lastButtonPressed;
Operation _lastOperation = Operation.None;
#endregion //Members #endregion //Members
#region Enumerations #region Enumerations
@ -53,6 +58,15 @@ namespace Microsoft.Windows.Controls
Zero Zero
} }
public enum Operation
{
Add,
Subtract,
Divide,
Multiply,
None
}
#endregion //Enumerations #endregion //Enumerations
#region Properties #region Properties
@ -124,7 +138,7 @@ namespace Microsoft.Windows.Controls
protected virtual void OnValueChanged(decimal oldValue, decimal newValue) 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 #endregion //Value
@ -193,7 +207,7 @@ namespace Microsoft.Windows.Controls
_calculatorButton = CalculatorUtilities.FindButtonByCalculatorButtonType(_buttonPanel, buttonType); _calculatorButton = CalculatorUtilities.FindButtonByCalculatorButtonType(_buttonPanel, buttonType);
VisualStateManager.GoToState(_calculatorButton, "Pressed", true); VisualStateManager.GoToState(_calculatorButton, "Pressed", true);
_timer.Start(); _timer.Start();
} }
private void ProcessCalculatorButton(CalculatorButtonType buttonType) private void ProcessCalculatorButton(CalculatorButtonType buttonType)
{ {
@ -203,43 +217,99 @@ namespace Microsoft.Windows.Controls
ProcessOperation(buttonType); ProcessOperation(buttonType);
else else
ProcessMisc(buttonType); 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) 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; Operation operation = Operation.None;
case CalculatorButtonType.Multiply:
switch (buttonType)
break; {
case CalculatorButtonType.Divide: 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; break;
case CalculatorButtonType.Percent: case CalculatorButtonType.Equal:
Calculate();
_lastOperation = Operation.None;
_showNewNumber = true;
break; 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 #endregion //Methods

22
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 "\b": return Calculator.CalculatorButtonType.Back;
case "\r": case "\r":
case "=": return Calculator.CalculatorButtonType.Equal; case "=": return Calculator.CalculatorButtonType.Equal;
case ".": return Calculator.CalculatorButtonType.Decimal;
} }
//check for the escape key //check for the escape key
@ -170,6 +171,7 @@ namespace Microsoft.Windows.Controls.Core.Utilities
case Calculator.CalculatorButtonType.Seven: case Calculator.CalculatorButtonType.Seven:
case Calculator.CalculatorButtonType.Eight: case Calculator.CalculatorButtonType.Eight:
case Calculator.CalculatorButtonType.Nine: case Calculator.CalculatorButtonType.Nine:
case Calculator.CalculatorButtonType.Decimal:
return true; return true;
default: default:
return false; return false;
@ -190,5 +192,25 @@ namespace Microsoft.Windows.Controls.Core.Utilities
return false; 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;
}
} }
} }

Loading…
Cancel
Save