aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Touch/Controls/TouchNumericTextBox.cs
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2018-06-25 18:03:20 +0300
committerRoy Ben-Shabat <Roy@Twine-s.com>2018-06-25 18:03:20 +0300
commit50eb2f5147af4387f807872ae81dd50dfedbb86e (patch)
treec731631d80bfd0b8a8eeb7a4546f5648b9634a9f /Software/Visual_Studio/Tango.Touch/Controls/TouchNumericTextBox.cs
parentc8890c60c3ee1d9f33606d272fdc45e6f7f5ef3f (diff)
downloadTango-50eb2f5147af4387f807872ae81dd50dfedbb86e.tar.gz
Tango-50eb2f5147af4387f807872ae81dd50dfedbb86e.zip
Working on PPC!!!
Diffstat (limited to 'Software/Visual_Studio/Tango.Touch/Controls/TouchNumericTextBox.cs')
-rw-r--r--Software/Visual_Studio/Tango.Touch/Controls/TouchNumericTextBox.cs220
1 files changed, 220 insertions, 0 deletions
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)));
+ }
+ }
+}