Browse Source

Working on Calculator

pull/1645/head
brianlagunas_cp 15 years ago
parent
commit
7d6b612fff
  1. 293
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs
  2. 14
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/CalculatorCommands.cs
  3. 13
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml
  4. 194
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Core/Utilities/CalculatorUtilities.cs
  5. 2
      ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj

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

@ -4,24 +4,57 @@ using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using Microsoft.Windows.Controls.Core.Utilities;
namespace Microsoft.Windows.Controls
{
public static class CalculatorCommands
{
private static RoutedCommand _calculatorButtonClickCommand = new RoutedCommand();
public static RoutedCommand CalculatorButtonClick
{
get { return _calculatorButtonClickCommand; }
}
}
public class Calculator : Control
{
#region Members
private ContentControl _buttonPanel;
private readonly DispatcherTimer _timer;
private Button _calculatorButton;
#endregion //Members
#region Enumerations
public enum CalculatorButtonType
{
Add,
Back,
Cancel,
Clear,
Decimal,
Divide,
Eight,
Equal,
Five,
Four,
Fract,
MAdd,
MC,
MR,
MS,
MSub,
Multiply,
Nine,
None,
One,
Percent,
Seven,
Sign,
Six,
Sqrt,
Subtract,
Three,
Two,
Zero
}
#endregion //Enumerations
#region Properties
public ICommand CalculaterButtonClickCommand { get; private set; }
@ -45,12 +78,33 @@ namespace Microsoft.Windows.Controls
{
Button button = o as Button;
button.CommandParameter = newValue;
button.Content = GetCalculatorButtonContent(newValue);
button.Content = CalculatorUtilities.GetCalculatorButtonContent(newValue);
}
#endregion //CalculatorButtonType
#region DisplayText
public static readonly DependencyProperty DisplayTextProperty = DependencyProperty.Register("DisplayText", typeof(string), typeof(Calculator), new UIPropertyMetadata("0", OnDisplayTextChanged));
public string DisplayText
{
get { return (string)GetValue(DisplayTextProperty); }
set { SetValue(DisplayTextProperty, value); }
}
private static void OnDisplayTextChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
Calculator calculator = o as Calculator;
if (calculator != null)
calculator.OnDisplayTextChanged((string)e.OldValue, (string)e.NewValue);
}
protected virtual void OnDisplayTextChanged(string oldValue, string newValue)
{
// TODO: Add your property changed side-effects. Descendants can override as well.
}
#endregion //DisplayText
#region Value
@ -107,54 +161,14 @@ namespace Microsoft.Windows.Controls
protected override void OnTextInput(TextCompositionEventArgs e)
{
var buttonType = GetCalculatorButtonTypeFromText(e.Text);
AnimateCalculatorButtonClick(buttonType);
}
private void AnimateCalculatorButtonClick(CalculatorButtonType buttonType)
{
_calculatorButton = FindButtonByCalculatorButtonType(_buttonPanel, buttonType);
if (_calculatorButton != null)
var buttonType = CalculatorUtilities.GetCalculatorButtonTypeFromText(e.Text);
if (buttonType != CalculatorButtonType.None)
{
VisualStateManager.GoToState(_calculatorButton, "Pressed", true);
_timer.Start();
AnimateCalculatorButtonClick(buttonType);
ProcessCalculatorButton(buttonType);
}
}
private CalculatorButtonType GetCalculatorButtonTypeFromText(string text)
{
switch (text)
{
case "0": return CalculatorButtonType.Zero;
case "1": return CalculatorButtonType.One;
case "2": return CalculatorButtonType.Two;
case "3": return CalculatorButtonType.Three;
case "4": return CalculatorButtonType.Four;
case "5": return CalculatorButtonType.Five;
case "6": return CalculatorButtonType.Six;
case "7": return CalculatorButtonType.Seven;
case "8": return CalculatorButtonType.Eight;
case "9": return CalculatorButtonType.Nine;
case "%": return CalculatorButtonType.Percent;
case "+": return CalculatorButtonType.Add;
case "-": return CalculatorButtonType.Subtract;
case "*": return CalculatorButtonType.Mul;
case "/":
case ":": return CalculatorButtonType.Div;
case " ":
case "\r":
case "=": return CalculatorButtonType.Equal;
case "\b": return CalculatorButtonType.Back;
}
//check for the escape key
if (text == ((char)27).ToString())
return CalculatorButtonType.Clear;
return CalculatorButtonType.None;
}
#endregion //Base Class Overrides
#region Event Handlers
@ -174,167 +188,70 @@ namespace Microsoft.Windows.Controls
#region Methods
public static Button FindButtonByCalculatorButtonType(DependencyObject parent, CalculatorButtonType type)
private void AnimateCalculatorButtonClick(CalculatorButtonType buttonType)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
_calculatorButton = CalculatorUtilities.FindButtonByCalculatorButtonType(_buttonPanel, buttonType);
VisualStateManager.GoToState(_calculatorButton, "Pressed", true);
_timer.Start();
}
object buttonType = child.GetValue(Button.CommandParameterProperty);
private void ProcessCalculatorButton(CalculatorButtonType buttonType)
{
if (CalculatorUtilities.IsDigit(buttonType))
ProcessDigit(buttonType);
else if (CalculatorUtilities.IsOperation(buttonType))
ProcessOperation(buttonType);
else
ProcessMisc(buttonType);
}
if (buttonType != null && (CalculatorButtonType)buttonType == type)
{
return child as Button;
}
else
{
var result = FindButtonByCalculatorButtonType(child, type);
private void ProcessDigit(CalculatorButtonType butonType)
{
if (result != null)
return result;
}
}
return null;
}
private static string GetCalculatorButtonContent(CalculatorButtonType type)
private void ProcessOperation(CalculatorButtonType buttonType)
{
string content = string.Empty;
switch (type)
switch (buttonType)
{
case CalculatorButtonType.Add:
content = "+";
break;
case CalculatorButtonType.Back:
content = "Back";
break;
case CalculatorButtonType.Cancel:
content = "CE";
break;
case CalculatorButtonType.Clear:
content = "C";
break;
case CalculatorButtonType.Decimal:
content = ".";
break;
case CalculatorButtonType.Div:
content = "/";
break;
case CalculatorButtonType.Eight:
content = "8";
break;
case CalculatorButtonType.Equal:
content = "=";
break;
case CalculatorButtonType.Five:
content = "5";
break;
case CalculatorButtonType.Four:
content = "4";
break;
case CalculatorButtonType.Fract:
content = "1/x";
break;
case CalculatorButtonType.MAdd:
content = "M+";
break;
case CalculatorButtonType.MC:
content = "MC";
break;
case CalculatorButtonType.MR:
content = "MR";
break;
case CalculatorButtonType.MS:
content = "MS";
break;
case CalculatorButtonType.MSub:
content = "M-";
break;
case CalculatorButtonType.Mul:
content = "*";
break;
case CalculatorButtonType.Nine:
content = "9";
break;
case CalculatorButtonType.None:
break;
case CalculatorButtonType.One:
content = "1";
break;
case CalculatorButtonType.Percent:
content = "%";
break;
case CalculatorButtonType.Seven:
content = "7";
break;
case CalculatorButtonType.Sign:
content = "+/-";
break;
case CalculatorButtonType.Six:
content = "6";
break;
case CalculatorButtonType.Sqrt:
content = "Sqrt";
break;
case CalculatorButtonType.Subtract:
content = "-";
break;
case CalculatorButtonType.Three:
content = "3";
case CalculatorButtonType.Multiply:
break;
case CalculatorButtonType.Two:
content = "2";
case CalculatorButtonType.Divide:
break;
case CalculatorButtonType.Zero:
content = "0";
case CalculatorButtonType.Percent:
break;
}
return content;
}
#endregion //Methods
private void ProcessMisc(CalculatorButtonType buttonType)
{
#region Commands
}
private void ExecuteCalculatorButtonClick(object sender, ExecutedRoutedEventArgs e)
private void CalculateValue()
{
}
#endregion //Commands
#endregion //Methods
#region Commands
public enum CalculatorButtonType
private void ExecuteCalculatorButtonClick(object sender, ExecutedRoutedEventArgs e)
{
Add,
Back,
Cancel,
Clear,
Decimal,
Div,
Eight,
Equal,
Five,
Four,
Fract,
MAdd,
MC,
MR,
MS,
MSub,
Mul,
Nine,
None,
One,
Percent,
Seven,
Sign,
Six,
Sqrt,
Subtract,
Three,
Two,
Zero
var buttonType = (CalculatorButtonType)e.Parameter;
ProcessCalculatorButton(buttonType);
}
#endregion //Commands
}
}

14
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/CalculatorCommands.cs

@ -0,0 +1,14 @@
using System;
using System.Windows.Input;
namespace Microsoft.Windows.Controls
{
public static class CalculatorCommands
{
private static RoutedCommand _calculatorButtonClickCommand = new RoutedCommand();
public static RoutedCommand CalculatorButtonClick
{
get { return _calculatorButtonClickCommand; }
}
}
}

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

@ -364,7 +364,7 @@
Style="{StaticResource CalculatorDigitButtonStyle}"/>
<Button Grid.Column="6" Grid.Row="4" MinWidth="28" MinHeight="26"
local:Calculator.CalculatorButtonType="Div"
local:Calculator.CalculatorButtonType="Divide"
Command="local:CalculatorCommands.CalculatorButtonClick"
Style="{StaticResource CalculatorOperatorButtonStyle}"/>
@ -389,7 +389,7 @@
Style="{StaticResource CalculatorDigitButtonStyle}"/>
<Button Grid.Column="6" Grid.Row="6" MinWidth="28" MinHeight="26"
local:Calculator.CalculatorButtonType="Mul"
local:Calculator.CalculatorButtonType="Multiply"
Command="local:CalculatorCommands.CalculatorButtonClick"
Style="{StaticResource CalculatorOperatorButtonStyle}"/>
@ -464,15 +464,20 @@
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Border Margin="0,0,0,10" Background="White" BorderBrush="#FF949494" BorderThickness="1">
<Border x:Name="PART_Display" Margin="0,0,0,10" Background="White" BorderBrush="#FF949494" BorderThickness="1">
<TextBlock FontSize="16"
HorizontalAlignment="Right"
Margin="2"
Text="{Binding Value, RelativeSource={RelativeSource TemplatedParent}}" />
Text="{Binding DisplayText, RelativeSource={RelativeSource TemplatedParent}}" />
</Border>
<ContentControl x:Name="PART_CalculatorButtonPanel" Grid.Row="1" Template="{StaticResource CalculatorButtonPanel}" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" />
</Grid>
</Border>
<!--<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter TargetName="PART_Display" Property="Background" Value="#E7F5FF" />
</Trigger>
</ControlTemplate.Triggers>-->
</ControlTemplate>
</Setter.Value>
</Setter>

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

@ -0,0 +1,194 @@
using System;
using System.Windows.Controls;
using System.Windows;
using System.Windows.Media;
namespace Microsoft.Windows.Controls.Core.Utilities
{
static class CalculatorUtilities
{
public static Calculator.CalculatorButtonType GetCalculatorButtonTypeFromText(string text)
{
switch (text)
{
case "0": return Calculator.CalculatorButtonType.Zero;
case "1": return Calculator.CalculatorButtonType.One;
case "2": return Calculator.CalculatorButtonType.Two;
case "3": return Calculator.CalculatorButtonType.Three;
case "4": return Calculator.CalculatorButtonType.Four;
case "5": return Calculator.CalculatorButtonType.Five;
case "6": return Calculator.CalculatorButtonType.Six;
case "7": return Calculator.CalculatorButtonType.Seven;
case "8": return Calculator.CalculatorButtonType.Eight;
case "9": return Calculator.CalculatorButtonType.Nine;
case "+": return Calculator.CalculatorButtonType.Add;
case "-": return Calculator.CalculatorButtonType.Subtract;
case "*": return Calculator.CalculatorButtonType.Multiply;
case "/": return Calculator.CalculatorButtonType.Divide;
case "%": return Calculator.CalculatorButtonType.Percent;
case "\b": return Calculator.CalculatorButtonType.Back;
case "\r":
case "=": return Calculator.CalculatorButtonType.Equal;
}
//check for the escape key
if (text == ((char)27).ToString())
return Calculator.CalculatorButtonType.Clear;
return Calculator.CalculatorButtonType.None;
}
public static Button FindButtonByCalculatorButtonType(DependencyObject parent, Calculator.CalculatorButtonType type)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
object buttonType = child.GetValue(Button.CommandParameterProperty);
if (buttonType != null && (Calculator.CalculatorButtonType)buttonType == type)
{
return child as Button;
}
else
{
var result = FindButtonByCalculatorButtonType(child, type);
if (result != null)
return result;
}
}
return null;
}
public static string GetCalculatorButtonContent(Calculator.CalculatorButtonType type)
{
string content = string.Empty;
switch (type)
{
case Calculator.CalculatorButtonType.Add:
content = "+";
break;
case Calculator.CalculatorButtonType.Back:
content = "Back";
break;
case Calculator.CalculatorButtonType.Cancel:
content = "CE";
break;
case Calculator.CalculatorButtonType.Clear:
content = "C";
break;
case Calculator.CalculatorButtonType.Decimal:
content = ".";
break;
case Calculator.CalculatorButtonType.Divide:
content = "/";
break;
case Calculator.CalculatorButtonType.Eight:
content = "8";
break;
case Calculator.CalculatorButtonType.Equal:
content = "=";
break;
case Calculator.CalculatorButtonType.Five:
content = "5";
break;
case Calculator.CalculatorButtonType.Four:
content = "4";
break;
case Calculator.CalculatorButtonType.Fract:
content = "1/x";
break;
case Calculator.CalculatorButtonType.MAdd:
content = "M+";
break;
case Calculator.CalculatorButtonType.MC:
content = "MC";
break;
case Calculator.CalculatorButtonType.MR:
content = "MR";
break;
case Calculator.CalculatorButtonType.MS:
content = "MS";
break;
case Calculator.CalculatorButtonType.MSub:
content = "M-";
break;
case Calculator.CalculatorButtonType.Multiply:
content = "*";
break;
case Calculator.CalculatorButtonType.Nine:
content = "9";
break;
case Calculator.CalculatorButtonType.None:
break;
case Calculator.CalculatorButtonType.One:
content = "1";
break;
case Calculator.CalculatorButtonType.Percent:
content = "%";
break;
case Calculator.CalculatorButtonType.Seven:
content = "7";
break;
case Calculator.CalculatorButtonType.Sign:
content = "+/-";
break;
case Calculator.CalculatorButtonType.Six:
content = "6";
break;
case Calculator.CalculatorButtonType.Sqrt:
content = "Sqrt";
break;
case Calculator.CalculatorButtonType.Subtract:
content = "-";
break;
case Calculator.CalculatorButtonType.Three:
content = "3";
break;
case Calculator.CalculatorButtonType.Two:
content = "2";
break;
case Calculator.CalculatorButtonType.Zero:
content = "0";
break;
}
return content;
}
public static bool IsDigit(Calculator.CalculatorButtonType buttonType)
{
switch (buttonType)
{
case Calculator.CalculatorButtonType.Zero:
case Calculator.CalculatorButtonType.One:
case Calculator.CalculatorButtonType.Two:
case Calculator.CalculatorButtonType.Three:
case Calculator.CalculatorButtonType.Four:
case Calculator.CalculatorButtonType.Five:
case Calculator.CalculatorButtonType.Six:
case Calculator.CalculatorButtonType.Seven:
case Calculator.CalculatorButtonType.Eight:
case Calculator.CalculatorButtonType.Nine:
return true;
default:
return false;
}
}
public static bool IsOperation(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:
return true;
default:
return false;
}
}
}
}

2
ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/WPFToolkit.Extended.csproj

@ -144,6 +144,7 @@
<Compile Include="BusyIndicator\Implementation\BusyIndicator.cs" />
<Compile Include="ButtonSpinner\Implementation\ButtonSpinner.cs" />
<Compile Include="Calculator\Implementation\Calculator.cs" />
<Compile Include="Calculator\Implementation\CalculatorCommands.cs" />
<Compile Include="ChildWindow\Implementation\ChildWindow.cs" />
<Compile Include="ChildWindow\Implementation\WindowStartupLocation.cs" />
<Compile Include="ChildWindow\Implementation\WindowState.cs" />
@ -157,6 +158,7 @@
<Compile Include="Core\Primitives\HsvColor.cs" />
<Compile Include="ColorPicker\Implementation\ColorItem.cs" />
<Compile Include="ColorPicker\Implementation\ColorPicker.cs" />
<Compile Include="Core\Utilities\CalculatorUtilities.cs" />
<Compile Include="Core\Utilities\ColorUtilities.cs" />
<Compile Include="ColorCanvas\Implementation\ColorSpectrumSlider.cs" />
<Compile Include="Core\Converters\ColorToSolidColorBrushConverter.cs" />

Loading…
Cancel
Save