mirror of
https://github.com/ZuneDev/MicrosoftIris.git
synced 2026-07-27 13:13:29 -07:00
225 lines
7.3 KiB
C#
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);
|
|
}
|
|
}
|