Browse Source

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

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

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

@ -339,7 +339,7 @@
Style="{StaticResource CalculatorOperatorButtonStyle}"/> Style="{StaticResource CalculatorOperatorButtonStyle}"/>
<Button Grid.Column="6" Grid.Row="2" MinWidth="28" MinHeight="26" <Button Grid.Column="6" Grid.Row="2" MinWidth="28" MinHeight="26"
local:Calculator.CalculatorButtonType="Sign" local:Calculator.CalculatorButtonType="Negate"
Command="local:CalculatorCommands.CalculatorButtonClick" Command="local:CalculatorCommands.CalculatorButtonClick"
Style="{StaticResource CalculatorOperatorButtonStyle}"/> Style="{StaticResource CalculatorOperatorButtonStyle}"/>
@ -394,7 +394,7 @@
Style="{StaticResource CalculatorOperatorButtonStyle}"/> Style="{StaticResource CalculatorOperatorButtonStyle}"/>
<Button Grid.Column="8" Grid.Row="6" MinWidth="28" MinHeight="26" <Button Grid.Column="8" Grid.Row="6" MinWidth="28" MinHeight="26"
local:Calculator.CalculatorButtonType="Fract" local:Calculator.CalculatorButtonType="Fraction"
Command="local:CalculatorCommands.CalculatorButtonClick" Command="local:CalculatorCommands.CalculatorButtonClick"
Style="{StaticResource CalculatorOperatorButtonStyle}"/> Style="{StaticResource CalculatorOperatorButtonStyle}"/>
@ -455,6 +455,10 @@
<Setter Property="Template"> <Setter Property="Template">
<Setter.Value> <Setter.Value>
<ControlTemplate TargetType="{x:Type local:Calculator}"> <ControlTemplate TargetType="{x:Type local:Calculator}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Border Background="{TemplateBinding Background}" <Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}" BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}" BorderThickness="{TemplateBinding BorderThickness}"
@ -473,6 +477,7 @@
<ContentControl x:Name="PART_CalculatorButtonPanel" Grid.Row="1" Template="{StaticResource CalculatorButtonPanel}" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" /> <ContentControl x:Name="PART_CalculatorButtonPanel" Grid.Row="1" Template="{StaticResource CalculatorButtonPanel}" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" />
</Grid> </Grid>
</Border> </Border>
</Grid>
<!--<ControlTemplate.Triggers> <!--<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True"> <Trigger Property="IsFocused" Value="True">
<Setter TargetName="PART_Display" Property="Background" Value="#E7F5FF" /> <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: case Calculator.CalculatorButtonType.Four:
content = "4"; content = "4";
break; break;
case Calculator.CalculatorButtonType.Fract: case Calculator.CalculatorButtonType.Fraction:
content = "1/x"; content = "1/x";
break; break;
case Calculator.CalculatorButtonType.MAdd: case Calculator.CalculatorButtonType.MAdd:
@ -132,7 +132,7 @@ namespace Microsoft.Windows.Controls.Core.Utilities
case Calculator.CalculatorButtonType.Seven: case Calculator.CalculatorButtonType.Seven:
content = "7"; content = "7";
break; break;
case Calculator.CalculatorButtonType.Sign: case Calculator.CalculatorButtonType.Negate:
content = "+/-"; content = "+/-";
break; break;
case Calculator.CalculatorButtonType.Six: case Calculator.CalculatorButtonType.Six:
@ -187,12 +187,16 @@ namespace Microsoft.Windows.Controls.Core.Utilities
case Calculator.CalculatorButtonType.Multiply: case Calculator.CalculatorButtonType.Multiply:
case Calculator.CalculatorButtonType.Divide: case Calculator.CalculatorButtonType.Divide:
case Calculator.CalculatorButtonType.Percent: case Calculator.CalculatorButtonType.Percent:
case Calculator.CalculatorButtonType.Sqrt:
case Calculator.CalculatorButtonType.Fraction:
return true; return true;
default: default:
return false; return false;
} }
} }
//TODO: add error handling
public static decimal Add(decimal firstNumber, decimal secondNumber) public static decimal Add(decimal firstNumber, decimal secondNumber)
{ {
return firstNumber + secondNumber; return firstNumber + secondNumber;
@ -212,5 +216,25 @@ namespace Microsoft.Windows.Controls.Core.Utilities
{ {
return firstNumber / secondNumber; 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