Browse Source

Calculator: implemented memory functions

pull/1645/head
brianlagunas_cp 15 years ago
parent
commit
a78bf7baae
  1. 205
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs
  2. 18
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml
  3. 19
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Converters/CalculatorMemoryToVisibilityConverter.cs
  4. 14
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs
  5. 1
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj

205
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);

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

@ -1,6 +1,9 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Microsoft.Windows.Controls">
xmlns:local="clr-namespace:Microsoft.Windows.Controls"
xmlns:coreConverters="clr-namespace:Microsoft.Windows.Controls.Core.Converters" >
<coreConverters:CalculatorMemoryToVisibilityConverter x:Key="CalculatorMemoryToVisibilityConverter" />
<Style x:Key="CalculatorOperatorButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Focusable" Value="False"/>
@ -469,11 +472,18 @@
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Border x:Name="PART_Display" Margin="0,0,0,10" Background="White" BorderBrush="#FF949494" BorderThickness="1">
<TextBlock FontSize="16"
<StackPanel>
<Path Stretch="Fill" Height="9" Width="9" Fill="DarkGray"
Data="F1 M 508.172,390L 506.031,390L 504.612,393.385C 504.174,394.477 503.788,395.533 503.453,396.555L 503.417,396.555C 503.334,395.528 503.206,394.471 503.035,393.385L 502.454,390L 500.301,390L 498.637,399L 500.226,399L 500.807,395.537C 500.903,394.973 501,394.379 501.099,393.756C 501.198,393.133 501.287,392.534 501.367,391.957L 501.402,391.957C 501.444,392.514 501.499,393.08 501.567,393.655C 501.635,394.231 501.712,394.776 501.8,395.292L 502.382,398.871L 503.7,398.871L 505.231,395.233C 505.445,394.724 505.663,394.187 505.884,393.622C 506.105,393.057 506.313,392.502 506.508,391.957L 506.543,391.957C 506.411,393.11 506.304,394.292 506.223,395.502L 505.979,399L 507.637,399L 508.172,390 Z "
HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="4,4,0,0"
Visibility="{Binding Memory, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource CalculatorMemoryToVisibilityConverter}}"/>
<TextBlock FontSize="18"
HorizontalAlignment="Right"
Margin="2"
Margin="0,0,4,0"
Text="{Binding DisplayText, RelativeSource={RelativeSource TemplatedParent}}" />
</Border>
</StackPanel>
</Border>
<ContentControl x:Name="PART_CalculatorButtonPanel" Grid.Row="1" Template="{StaticResource CalculatorButtonPanel}" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" />
</Grid>
</Border>

19
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Converters/CalculatorMemoryToVisibilityConverter.cs

@ -0,0 +1,19 @@
using System;
using System.Windows.Data;
using System.Windows;
namespace Microsoft.Windows.Controls.Core.Converters
{
public class CalculatorMemoryToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (decimal)value == decimal.Zero ? Visibility.Hidden : Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

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

@ -178,17 +178,15 @@ namespace Microsoft.Windows.Controls.Core.Utilities
}
}
public static bool IsOperation(Calculator.CalculatorButtonType buttonType)
public static bool IsMemory(Calculator.CalculatorButtonType buttonType)
{
switch (buttonType)
{
case Calculator.CalculatorButtonType.Add:
case Calculator.CalculatorButtonType.Subtract:
case Calculator.CalculatorButtonType.Multiply:
case Calculator.CalculatorButtonType.Divide:
case Calculator.CalculatorButtonType.Percent:
case Calculator.CalculatorButtonType.Sqrt:
case Calculator.CalculatorButtonType.Fraction:
case Calculator.CalculatorButtonType.MAdd:
case Calculator.CalculatorButtonType.MC:
case Calculator.CalculatorButtonType.MR:
case Calculator.CalculatorButtonType.MS:
case Calculator.CalculatorButtonType.MSub:
return true;
default:
return false;

1
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj

@ -154,6 +154,7 @@
<Compile Include="ButtonSpinner\Implementation\ValidSpinDirections.cs" />
<Compile Include="Chromes\Implementation\ButtonChrome.cs" />
<Compile Include="ColorCanvas\Implementation\ColorCanvas.cs" />
<Compile Include="Core\Converters\CalculatorMemoryToVisibilityConverter.cs" />
<Compile Include="Core\Converters\TimeFormatToDateTimeFormatConverter.cs" />
<Compile Include="Core\Primitives\HsvColor.cs" />
<Compile Include="ColorPicker\Implementation\ColorItem.cs" />

Loading…
Cancel
Save