diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs index 5dd960fd..f7b3c6fa 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/Calculator.cs +++ b/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 } } diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/CalculatorCommands.cs b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Implementation/CalculatorCommands.cs new file mode 100644 index 00000000..47fbc8df --- /dev/null +++ b/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; } + } + } +} diff --git a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml index a11484f2..b07215ec 100644 --- a/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml +++ b/ExtendedWPFToolkitSolution/Src/WPFToolkit.Extended/Calculator/Themes/Generic.xaml @@ -364,7 +364,7 @@ Style="{StaticResource CalculatorDigitButtonStyle}"/>