using CefSharp.DevTools.Network; using DamnOverSharp.Renderers.WPF; using Microsoft.Win32; using System; using System.Diagnostics; using System.Linq; using System.Timers; using System.Windows.Controls; using System.Windows.Forms; using System.Windows.Forms.VisualStyles; using System.Windows.Input; using System.Windows.Media; using System.Windows.Threading; using static System.Net.Mime.MediaTypeNames; namespace DamnOverSharp.WPF.UiLibrary { /// /// Interaction logic for VirtualTextBox.xaml /// public partial class VirtualTextBox : VirtualControlBase { private DispatcherTimer CaretBlink = new DispatcherTimer(); private bool IsCaretBlinkInvisible = false; public VirtualTextBox() { InitializeComponent(); CaretBlink.Interval = TimeSpan.FromMilliseconds(600); CaretBlink.Tick += CaretBlink_Elapsed; } private void CaretBlink_Elapsed(object sender, EventArgs args) { IsCaretBlinkInvisible = !IsCaretBlinkInvisible; caret.Visibility = IsCaretBlinkInvisible ? System.Windows.Visibility.Visible : System.Windows.Visibility.Hidden; UpdateVisual(); } public override bool OnVirtualMouseDown() => true; public override bool OnVirtualMouseUp() => true; public override void OnGotVirtualFocus() { CaretIndex = CaretIndex; caret.Visibility = System.Windows.Visibility.Visible; CaretBlink.Interval = TimeSpan.FromMilliseconds(600); CaretBlink.Start(); border.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF569DE5")); base.OnGotVirtualFocus(); } public override void OnLostVirtualFocus() { caret.Visibility = System.Windows.Visibility.Hidden; CaretBlink.Stop(); border.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFABADB3")); base.OnLostVirtualFocus(); } public override void OnVirtualMouseEnter() { if (!VirtualFocused) { border.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF7EB4EA")); } base.OnVirtualMouseEnter(); } public override void OnVirtualMouseLeave() { if (VirtualFocused) { border.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF569DE5")); } else { border.BorderBrush = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFABADB3")); } base.OnVirtualMouseLeave(); } public override void OnVirtualKeyDown(Keys keyCode) { switch (keyCode) { case Keys.Back: Remove(1); break; case Keys.Left: CaretIndex = Math.Max(0, CaretIndex - 1); UpdateVisual(); break; case Keys.Right: CaretIndex = Math.Min(Text.Length, CaretIndex + 1); UpdateVisual(); break; case Keys.Space: Insert(" "); break; case Keys.Tab: Insert(" "); break; case Keys.Oemcomma: Insert(","); break; case Keys.OemPeriod: Insert("."); break; case Keys.Oemplus: Insert("+"); break; case Keys.OemMinus: Insert("-"); break; case Keys.Oemtilde: Insert("`"); break; case Keys.D0: Insert("0"); break; case Keys.D1: Insert("1"); break; case Keys.D2: Insert("2"); break; case Keys.D3: Insert("3"); break; case Keys.D4: Insert("4"); break; case Keys.D5: Insert("5"); break; case Keys.D6: Insert("6"); break; case Keys.D7: Insert("7"); break; case Keys.D8: Insert("8"); break; case Keys.D9: Insert("9"); break; case Keys.OemBackslash: Insert(@"\"); break; case Keys.OemPipe: Insert("|"); break; case Keys.LControlKey: case Keys.RControlKey: case Keys.LShiftKey: case Keys.RShiftKey: case Keys.LWin: case Keys.RWin: case Keys.Alt: case Keys.PrintScreen: case Keys.OemCloseBrackets: case Keys.OemOpenBrackets: break; default: if(keyCode.ToString().Length > 1) { Debug.WriteLine("Key not implemented: " + keyCode.ToString()); return; } if (WpfInteractionManager.IsShiftDown) { Insert(char.ToUpper(char.Parse(keyCode.ToString())).ToString()); } else { Insert(char.ToLower(char.Parse(keyCode.ToString())).ToString()); } break; } } public void Insert(string text) { _Text = Text.Insert(CaretIndex, text); characters.Children.Insert(CaretIndex, new TextBlock() { Text = text, Foreground = Brushes.Black }); CaretIndex += text.Length; UpdateVisual(); } public void Remove(int count) { if (CaretIndex == 0) { return; } count = Math.Min(Text.Length, count); _Text = Text.Remove(CaretIndex - count, count); characters.Children.RemoveRange(CaretIndex - count, count); CaretIndex -= count; UpdateVisual(); } private int _CaretIndex = 0; public int CaretIndex { get => _CaretIndex; set { if (VirtualFocused) { CaretBlink.Stop(); CaretBlink.Interval = TimeSpan.FromMilliseconds(600); CaretBlink.Start(); caret.Visibility = System.Windows.Visibility.Visible; } _CaretIndex = value; characters.UpdateLayout(); content.UpdateLayout(); caret.Margin = new System.Windows.Thickness(Math.Max(0, Math.Min(characters.ActualWidth - 1, characters.Children.OfType().ToList().GetRange(0, value).Sum(x => x.ActualWidth))), 0, 0, 0); if(characters.ActualWidth <= contentArea.ActualWidth) { content.Margin = new System.Windows.Thickness(0, 0, 0, 0); return; } else if (caret.Margin.Left > Math.Abs(content.Margin.Left) + contentArea.ActualWidth - 5) { content.Margin = new System.Windows.Thickness(Math.Min(0, -caret.Margin.Left + contentArea.ActualWidth - 5), 0, 0, 0); } else if (caret.Margin.Left < Math.Abs(content.Margin.Left) + 5) { content.Margin = new System.Windows.Thickness(Math.Min(0, -caret.Margin.Left + 5), 0, 0, 0); } content.Margin = new System.Windows.Thickness(Math.Max(content.Margin.Left, contentArea.ActualWidth - characters.ActualWidth), 0, 0, 0); } } private string _Text = ""; public string Text { get => _Text; set { _Text = value; characters.Children.Clear(); foreach (char c in _Text) { characters.Children.Add(new TextBlock() { Text = c.ToString(), Foreground = Brushes.Black }); } CaretIndex = value.Length; UpdateVisual(); } } } }