aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Touch/Controls/TouchTextBox.cs
blob: 6f8297a5e4b3b17809ed98710b15e0b8ca7022cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
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;
using Tango.Core.EventArguments;
using Tango.Touch.Keyboard;

namespace Tango.Touch.Controls
{
    public class TouchTextBox : TouchInput
    {
        private TextBox _text_box;
        private DateTime _lost_focus_time;

        public String Text
        {
            get { return (String)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(String), typeof(TouchTextBox), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

        public String Watermark
        {
            get { return (String)GetValue(WatermarkProperty); }
            set { SetValue(WatermarkProperty, value); }
        }
        public static readonly DependencyProperty WatermarkProperty =
            DependencyProperty.Register("Watermark", typeof(String), typeof(TouchTextBox), new PropertyMetadata(null));

        public bool IsPassword
        {
            get { return (bool)GetValue(IsPasswordProperty); }
            set { SetValue(IsPasswordProperty, value); }
        }
        public static readonly DependencyProperty IsPasswordProperty =
            DependencyProperty.Register("IsPassword", typeof(bool), typeof(TouchTextBox), new PropertyMetadata(false));

        public bool IsReadOnly
        {
            get { return (bool)GetValue(IsReadOnlyProperty); }
            set { SetValue(IsReadOnlyProperty, value); }
        }
        public static readonly DependencyProperty IsReadOnlyProperty =
            DependencyProperty.Register("IsReadOnly", typeof(bool), typeof(TouchTextBox), new PropertyMetadata(false));

        public ICommand TapCommand
        {
            get { return (ICommand)GetValue(TapCommandProperty); }
            set { SetValue(TapCommandProperty, value); }
        }
        public static readonly DependencyProperty TapCommandProperty =
            DependencyProperty.Register("TapCommand", typeof(ICommand), typeof(TouchTextBox), new PropertyMetadata(null));

        public Object TapCommandParameter
        {
            get { return (Object)GetValue(TapCommandParameterProperty); }
            set { SetValue(TapCommandParameterProperty, value); }
        }
        public static readonly DependencyProperty TapCommandParameterProperty =
            DependencyProperty.Register("TapCommandParameter", typeof(Object), typeof(TouchTextBox), new PropertyMetadata(null));


        static TouchTextBox()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(TouchTextBox), new FrameworkPropertyMetadata(typeof(TouchTextBox)));
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            _text_box = GetTemplateChild("PART_TextBox") as TextBox;

            _text_box.GotFocus += _text_box_GotFocus;
            _text_box.LostFocus += _text_box_LostFocus;


            this.RegisterForPreviewMouseOrTouchUp(OnMouseOrTouchUp);
        }

        private void _text_box_LostFocus(object sender, RoutedEventArgs e)
        {
            _lost_focus_time = DateTime.Now;
        }

        private void OnMouseOrTouchUp(object sender, MouseOrTouchEventArgs e)
        {
            if (TapCommand != null)
            {
                TapCommand.Execute(TapCommandParameter);
            }
        }

        private async void _text_box_GotFocus(object sender, RoutedEventArgs e)
        {
            if (DateTime.Now > _lost_focus_time.AddMilliseconds(200))
            {
                await Task.Delay(50);

                if (FocusSelectionMode == FocusSelectionMode.SelectAll)
                {
                    _text_box.SelectAll();
                }
                else if (FocusSelectionMode == FocusSelectionMode.ScrollToEnd)
                {
                    _text_box.CaretIndex = _text_box.Text.Length;
                }
            }
        }

        public new void Focus()
        {
            _text_box.Focus();
        }
    }
}