Browse Source

Calculator: got the rest of math functions working. Now I am moving on to the Memory functions.

pull/1645/head
brianlagunas_cp 15 years ago
parent
commit
87f7305430
  1. 164
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs
  2. 9
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml
  3. 28
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs

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

@ -2,7 +2,6 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using Microsoft.Windows.Controls.Core.Utilities;
@ -16,10 +15,9 @@ namespace Microsoft.Windows.Controls
private readonly DispatcherTimer _timer;
private Button _calculatorButton;
bool _showNewNumber = true;
decimal _previousValue;
CalculatorButtonType _lastButtonPressed;
Operation _lastOperation = Operation.None;
private bool _showNewNumber = true;
private decimal _previousValue;
private Operation _lastOperation = Operation.None;
#endregion //Members
@ -37,19 +35,19 @@ namespace Microsoft.Windows.Controls
Equal,
Five,
Four,
Fract,
Fraction,
MAdd,
MC,
MR,
MS,
MSub,
Multiply,
Negate,
Nine,
None,
One,
Percent,
Seven,
Sign,
Six,
Sqrt,
Subtract,
@ -64,7 +62,12 @@ namespace Microsoft.Windows.Controls
Subtract,
Divide,
Multiply,
None
Percent,
Sqrt,
Fraction,
None,
Clear,
Negate
}
#endregion //Enumerations
@ -178,7 +181,7 @@ namespace Microsoft.Windows.Controls
var buttonType = CalculatorUtilities.GetCalculatorButtonTypeFromText(e.Text);
if (buttonType != CalculatorButtonType.None)
{
AnimateCalculatorButtonClick(buttonType);
SimulateCalculatorButtonClick(buttonType);
ProcessCalculatorButton(buttonType);
}
}
@ -202,23 +205,12 @@ namespace Microsoft.Windows.Controls
#region Methods
private void AnimateCalculatorButtonClick(CalculatorButtonType buttonType)
{
_calculatorButton = CalculatorUtilities.FindButtonByCalculatorButtonType(_buttonPanel, buttonType);
VisualStateManager.GoToState(_calculatorButton, "Pressed", true);
_timer.Start();
}
private void ProcessCalculatorButton(CalculatorButtonType buttonType)
{
if (CalculatorUtilities.IsDigit(buttonType))
ProcessDigit(buttonType);
else if (CalculatorUtilities.IsOperation(buttonType))
ProcessOperation(buttonType);
else
ProcessMisc(buttonType);
_lastButtonPressed = buttonType;
ProcessOperation(buttonType);
}
private void ProcessDigit(CalculatorButtonType buttonType)
@ -232,57 +224,51 @@ namespace Microsoft.Windows.Controls
}
private void ProcessOperation(CalculatorButtonType buttonType)
{
if (_lastButtonPressed != CalculatorButtonType.Add &&
_lastButtonPressed != CalculatorButtonType.Subtract &&
_lastButtonPressed != CalculatorButtonType.Multiply &&
_lastButtonPressed != 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;
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();
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()
@ -293,23 +279,65 @@ namespace Microsoft.Windows.Controls
Value = CalculateValue(_lastOperation);
}
private void Calculate(Operation newOperation)
{
if (!_showNewNumber)
Calculate();
_lastOperation = newOperation;
}
private void Calculate(Operation currentOperation, Operation newOperation)
{
_lastOperation = currentOperation;
Calculate();
_lastOperation = newOperation;
}
private decimal CalculateValue(Operation operation)
{
decimal newValue = decimal.Zero;
decimal currentValue = Decimal.Parse(DisplayText);
switch (operation)
{
case Operation.Add:
return CalculatorUtilities.Add(_previousValue, currentValue);
newValue = CalculatorUtilities.Add(_previousValue, currentValue);
break;
case Operation.Subtract:
return CalculatorUtilities.Subtract(_previousValue, currentValue);
newValue = CalculatorUtilities.Subtract(_previousValue, currentValue);
break;
case Operation.Multiply:
return CalculatorUtilities.Multiply(_previousValue, currentValue);
newValue = CalculatorUtilities.Multiply(_previousValue, currentValue);
break;
case Operation.Divide:
return CalculatorUtilities.Divide(_previousValue, currentValue);
newValue = CalculatorUtilities.Divide(_previousValue, currentValue);
break;
case Operation.Percent:
newValue = CalculatorUtilities.Percent(_previousValue, currentValue);
break;
case Operation.Sqrt:
newValue = CalculatorUtilities.SquareRoot(currentValue);
break;
case Operation.Fraction:
newValue = CalculatorUtilities.Fraction(currentValue);
break;
case Operation.Negate:
newValue = CalculatorUtilities.Negate(currentValue);
break;
default:
return decimal.Zero;
newValue = decimal.Zero;
break;
}
return newValue;
}
private void SimulateCalculatorButtonClick(CalculatorButtonType buttonType)
{
_calculatorButton = CalculatorUtilities.FindButtonByCalculatorButtonType(_buttonPanel, buttonType);
VisualStateManager.GoToState(_calculatorButton, "Pressed", true);
_timer.Start();
}
#endregion //Methods

9
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml

@ -339,7 +339,7 @@
Style="{StaticResource CalculatorOperatorButtonStyle}"/>
<Button Grid.Column="6" Grid.Row="2" MinWidth="28" MinHeight="26"
local:Calculator.CalculatorButtonType="Sign"
local:Calculator.CalculatorButtonType="Negate"
Command="local:CalculatorCommands.CalculatorButtonClick"
Style="{StaticResource CalculatorOperatorButtonStyle}"/>
@ -394,7 +394,7 @@
Style="{StaticResource CalculatorOperatorButtonStyle}"/>
<Button Grid.Column="8" Grid.Row="6" MinWidth="28" MinHeight="26"
local:Calculator.CalculatorButtonType="Fract"
local:Calculator.CalculatorButtonType="Fraction"
Command="local:CalculatorCommands.CalculatorButtonClick"
Style="{StaticResource CalculatorOperatorButtonStyle}"/>
@ -455,6 +455,10 @@
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:Calculator}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
@ -473,6 +477,7 @@
<ContentControl x:Name="PART_CalculatorButtonPanel" Grid.Row="1" Template="{StaticResource CalculatorButtonPanel}" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" />
</Grid>
</Border>
</Grid>
<!--<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="PART_Display" Property="Background" Value="#E7F5FF" />

28
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs

@ -97,7 +97,7 @@ namespace Microsoft.Windows.Controls.Core.Utilities
case Calculator.CalculatorButtonType.Four:
content = "4";
break;
case Calculator.CalculatorButtonType.Fract:
case Calculator.CalculatorButtonType.Fraction:
content = "1/x";
break;
case Calculator.CalculatorButtonType.MAdd:
@ -132,7 +132,7 @@ namespace Microsoft.Windows.Controls.Core.Utilities
case Calculator.CalculatorButtonType.Seven:
content = "7";
break;
case Calculator.CalculatorButtonType.Sign:
case Calculator.CalculatorButtonType.Negate:
content = "+/-";
break;
case Calculator.CalculatorButtonType.Six:
@ -187,12 +187,16 @@ namespace Microsoft.Windows.Controls.Core.Utilities
case Calculator.CalculatorButtonType.Multiply:
case Calculator.CalculatorButtonType.Divide:
case Calculator.CalculatorButtonType.Percent:
case Calculator.CalculatorButtonType.Sqrt:
case Calculator.CalculatorButtonType.Fraction:
return true;
default:
return false;
}
}
//TODO: add error handling
public static decimal Add(decimal firstNumber, decimal secondNumber)
{
return firstNumber + secondNumber;
@ -212,5 +216,25 @@ namespace Microsoft.Windows.Controls.Core.Utilities
{
return firstNumber / secondNumber;
}
public static decimal Percent(decimal firstNumber, decimal secondNumber)
{
return firstNumber * secondNumber / 100M;
}
public static decimal SquareRoot(decimal operand)
{
return Convert.ToDecimal(Math.Sqrt(Convert.ToDouble(operand)));
}
public static decimal Fraction(decimal operand)
{
return 1 / operand;
}
public static decimal Negate(decimal operand)
{
return operand * -1M;
}
}
}

Loading…
Cancel
Save