Files
MicrosoftIris/UIX/Microsoft/Iris/InputHandlers/TypingHandler.cs
T
2022-03-03 08:14:05 -06:00

225 lines
7.3 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Microsoft.Iris.InputHandlers.TypingHandler
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
// Assembly location: C:\Program Files\Zune\UIX.dll
using Microsoft.Iris.Input;
using Microsoft.Iris.Markup;
using Microsoft.Iris.ModelItems;
using Microsoft.Iris.UI;
namespace Microsoft.Iris.InputHandlers
{
internal class TypingHandler : InputHandler
{
private EditableTextData _edit;
private bool _submitOnEnter;
private bool _treatEscapeAsBackspace;
private bool _handlingBackspaceFlag;
private bool _handlingDeleteFlag;
protected override void ConfigureInteractivity()
{
base.ConfigureInteractivity();
if (!HandleDirect)
return;
UI.MouseInteractive = true;
UI.KeyInteractive = true;
}
public bool SubmitOnEnter
{
get => _submitOnEnter;
set
{
if (_submitOnEnter == value)
return;
_submitOnEnter = value;
FireNotification(NotificationID.SubmitOnEnter);
}
}
public bool TreatEscapeAsBackspace
{
get => _treatEscapeAsBackspace;
set
{
if (_treatEscapeAsBackspace == value)
return;
_treatEscapeAsBackspace = value;
FireNotification(NotificationID.TreatEscapeAsBackspace);
}
}
private void FireTypingInputRejectedEvent() => FireNotification(NotificationID.TypingInputRejected);
public EditableTextData EditableTextData
{
get => _edit;
set
{
if (_edit == value)
return;
_edit = value;
FireNotification(NotificationID.EditableTextData);
}
}
protected override void OnKeyDown(UIClass ui, KeyStateInfo info)
{
if (ShouldIgnoreInput(info) || _edit == null)
return;
switch (info.Key)
{
case Keys.Back:
if (IsEditableTextEmpty() && !_handlingBackspaceFlag)
break;
info.MarkHandled();
break;
case Keys.Enter:
if (!_submitOnEnter)
break;
_edit.Submit();
info.MarkHandled();
break;
case Keys.Escape:
if (!_treatEscapeAsBackspace)
break;
goto case Keys.Back;
case Keys.Delete:
if (IsEditableTextEmpty())
break;
RemoveChar();
info.MarkHandled();
_handlingDeleteFlag = true;
break;
case Keys.NumPad0:
case Keys.NumPad1:
case Keys.NumPad2:
case Keys.NumPad3:
case Keys.NumPad4:
case Keys.NumPad5:
case Keys.NumPad6:
case Keys.NumPad7:
case Keys.NumPad8:
case Keys.NumPad9:
info.MarkHandled();
break;
}
}
protected override void OnKeyCharacter(UIClass ui, KeyCharacterInfo info)
{
if (ShouldIgnoreInput(info) || _edit == null)
return;
switch (info.Character)
{
case '\b':
if (!IsEditableTextEmpty())
{
RemoveChar();
info.MarkHandled();
_handlingBackspaceFlag = true;
break;
}
if (!_handlingBackspaceFlag)
break;
info.MarkHandled();
break;
case '\t':
break;
case '\r':
if (!_submitOnEnter)
break;
info.MarkHandled();
break;
case '\x001B':
if (!_treatEscapeAsBackspace)
break;
goto case '\b';
default:
InputChar(info.Character);
info.MarkHandled();
break;
}
}
protected override void OnKeyUp(UIClass ui, KeyStateInfo info)
{
if (ShouldIgnoreInput(info) || _edit == null)
return;
switch (info.Key)
{
case Keys.Back:
if (!_handlingBackspaceFlag)
break;
info.MarkHandled();
_handlingBackspaceFlag = false;
break;
case Keys.Enter:
if (!_submitOnEnter)
break;
info.MarkHandled();
break;
case Keys.Escape:
if (!_treatEscapeAsBackspace)
break;
goto case Keys.Back;
case Keys.Delete:
if (!_handlingDeleteFlag)
break;
info.MarkHandled();
_handlingDeleteFlag = false;
break;
case Keys.NumPad0:
case Keys.NumPad1:
case Keys.NumPad2:
case Keys.NumPad3:
case Keys.NumPad4:
case Keys.NumPad5:
case Keys.NumPad6:
case Keys.NumPad7:
case Keys.NumPad8:
case Keys.NumPad9:
info.MarkHandled();
break;
}
}
private void RemoveChar()
{
if (_edit == null || IsEditableTextEmpty())
return;
if (!_edit.ReadOnly)
_edit.Value = _edit.Value.Substring(0, _edit.Value.Length - 1);
else
FireTypingInputRejectedEvent();
}
private void Clear()
{
if (_edit == null || IsEditableTextEmpty())
return;
if (!_edit.ReadOnly)
_edit.Value = string.Empty;
else
FireTypingInputRejectedEvent();
}
private void InputChar(char ch)
{
if (_edit == null)
return;
if (!_edit.ReadOnly && (IsEditableTextEmpty() || _edit.Value.Length < _edit.MaxLength))
_edit.Value += (string)(object)ch;
else
FireTypingInputRejectedEvent();
}
private bool ShouldIgnoreInput(KeyActionInfo info) => (info.Modifiers & InputModifiers.ControlKey) == InputModifiers.ControlKey || (info.Modifiers & InputModifiers.AltKey) == InputModifiers.AltKey || (info.Modifiers & InputModifiers.WindowsKey) == InputModifiers.WindowsKey;
private bool IsEditableTextEmpty() => string.IsNullOrEmpty(_edit.Value);
}
}