From 50eb2f5147af4387f807872ae81dd50dfedbb86e Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Mon, 25 Jun 2018 18:03:20 +0300 Subject: Working on PPC!!! --- .../Tango.Touch/Controls/TouchNumericTextBox.cs | 220 +++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 Software/Visual_Studio/Tango.Touch/Controls/TouchNumericTextBox.cs (limited to 'Software/Visual_Studio/Tango.Touch/Controls/TouchNumericTextBox.cs') diff --git a/Software/Visual_Studio/Tango.Touch/Controls/TouchNumericTextBox.cs b/Software/Visual_Studio/Tango.Touch/Controls/TouchNumericTextBox.cs new file mode 100644 index 000000000..941cb392a --- /dev/null +++ b/Software/Visual_Studio/Tango.Touch/Controls/TouchNumericTextBox.cs @@ -0,0 +1,220 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.Touch.Controls +{ + public class TouchNumericTextBox : TouchInput, IValueControl + { + private TextBox _text_box; + private bool _prevent_text_change; + private TextBlock _text_block; + Regex regex_integer = new Regex(@"^[0-9]*(?:[0-9]*)?$"); + Regex regex_double = new Regex(@"^[0-9]*(?:\.[0-9]*)?$"); + + public double Value + { + get { return (double)GetValue(ValueProperty); } + set { SetValue(ValueProperty, value); } + } + public static readonly DependencyProperty ValueProperty = + DependencyProperty.Register("Value", typeof(double), typeof(TouchNumericTextBox), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, (d, e) => (d as TouchNumericTextBox).OnValueChanged(), (d, e) => (d as TouchNumericTextBox).CoerceValue(d, e), false, UpdateSourceTrigger.Explicit)); + + public String Watermark + { + get { return (String)GetValue(WatermarkProperty); } + set { SetValue(WatermarkProperty, value); } + } + public static readonly DependencyProperty WatermarkProperty = + DependencyProperty.Register("Watermark", typeof(String), typeof(TouchNumericTextBox), new PropertyMetadata(null)); + + public String StringFormat + { + get { return (String)GetValue(StringFormatProperty); } + set { SetValue(StringFormatProperty, value); } + } + public static readonly DependencyProperty StringFormatProperty = + DependencyProperty.Register("StringFormat", typeof(String), typeof(TouchNumericTextBox), new PropertyMetadata(null)); + + public bool HasDecimalPoint + { + get { return (bool)GetValue(HasDecimalPointProperty); } + set { SetValue(HasDecimalPointProperty, value); } + } + public static readonly DependencyProperty HasDecimalPointProperty = + DependencyProperty.Register("HasDecimalPoint", typeof(bool), typeof(TouchNumericTextBox), new PropertyMetadata(false)); + + public double Minimum + { + get { return (double)GetValue(MinimumProperty); } + set { SetValue(MinimumProperty, value); } + } + public static readonly DependencyProperty MinimumProperty = + DependencyProperty.Register("Minimum", typeof(double), typeof(TouchNumericTextBox), new PropertyMetadata(.0)); + + public double Maximum + { + get { return (double)GetValue(MaximumProperty); } + set { SetValue(MaximumProperty, value); } + } + public static readonly DependencyProperty MaximumProperty = + DependencyProperty.Register("Maximum", typeof(double), typeof(TouchNumericTextBox), new PropertyMetadata(100.0)); + + public double JoggingFactor + { + get { return (double)GetValue(JoggingFactorProperty); } + set { SetValue(JoggingFactorProperty, value); } + } + public static readonly DependencyProperty JoggingFactorProperty = + DependencyProperty.Register("JoggingFactor", typeof(double), typeof(TouchNumericTextBox), new PropertyMetadata(1.0)); + + public bool AutoCalculateJogStep + { + get { return (bool)GetValue(AutoCalculateJogStepProperty); } + set { SetValue(AutoCalculateJogStepProperty, value); } + } + public static readonly DependencyProperty AutoCalculateJogStepProperty = + DependencyProperty.Register("AutoCalculateJogStep", typeof(bool), typeof(TouchNumericTextBox), new PropertyMetadata(true)); + + public override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _text_box = GetTemplateChild("PART_TextBox") as TextBox; + _text_block = GetTemplateChild("PART_TextDisplay") as TextBlock; + _text_box.PreviewTextInput += _text_box_PreviewTextInput; + _text_box.PreviewKeyDown += _text_box_PreviewKeyDown; + _text_box.LostFocus += _text_box_LostFocus; + _text_box.GotFocus += _text_box_GotFocus; + _text_box.TextChanged += _text_box_TextChanged; + + OnValueChanged(); + } + + private async void _text_box_GotFocus(object sender, RoutedEventArgs e) + { + await Task.Delay(50); + + if (FocusSelectionMode == FocusSelectionMode.SelectAll) + { + _text_box.SelectAll(); + } + else if (FocusSelectionMode == FocusSelectionMode.ScrollToEnd) + { + _text_box.CaretIndex = _text_box.Text.Length; + } + } + + private object CoerceValue(DependencyObject d, object e) + { + double value = (double)e; + + if (!HasDecimalPoint) + { + value = Math.Round(value, 0); + } + + if (value < Minimum) + { + value = Minimum; + } + else if (value > Maximum) + { + value = Maximum; + } + + return value; + } + + private void _text_box_LostFocus(object sender, RoutedEventArgs e) + { + double d = 0.0; + + if (double.TryParse(_text_box.Text, out d)) + { + Value = d; + _text_box.Text = Value.ToString(); + } + + _text_block.Text = Value.ToString(StringFormat); + } + + private void _text_box_PreviewKeyDown(object sender, KeyEventArgs e) + { + if (e.Key == Key.Space) + { + e.Handled = true; + } + } + + private void OnValueChanged() + { + if (_text_box != null && !_prevent_text_change) + { + _text_box.Text = Value.ToString(); + + if (StringFormat != null) + { + _text_block.Text = Value.ToString(StringFormat); + } + else + { + _text_block.Text = Value.ToString(); + } + } + + BindingExpression b = GetBindingExpression(ValueProperty); + if (b != null) + { + b.UpdateSource(); + } + } + + private void _text_box_PreviewTextInput(object sender, TextCompositionEventArgs e) + { + if (e.Text == "." && _text_box.Text.Contains('.')) + { + e.Handled = true; + return; + } + + if (HasDecimalPoint) + { + e.Handled = !regex_double.IsMatch(e.Text); + } + else + { + e.Handled = !regex_integer.IsMatch(e.Text); + } + } + + private void _text_box_TextChanged(object sender, TextChangedEventArgs e) + { + double d = 0.0; + + if (double.TryParse(_text_box.Text, out d)) + { + _prevent_text_change = true; + Value = d; + _prevent_text_change = false; + } + } + + static TouchNumericTextBox() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(TouchNumericTextBox), new FrameworkPropertyMetadata(typeof(TouchNumericTextBox))); + } + } +} -- cgit v1.3.1