private void OnKeyboardEvent( AutocompleteSrcType src, KeyboardEvent <HTMLInputElement> ev) { Logger.Debug(GetType(), "autocomplete input={0} key={1} src={2}", _input.Value, ev.KeyCode, src); if (!ev.IsUserGenerated()) { return; } if (src == AutocompleteSrcType.KeyDown) { switch (ev.KeyCode) { case Magics.KeyCodeEnter: var changed = false; if (!_activeItemNo.HasValue) { if (_input.Value.Length <= 0) { _value = default(DataT); changed = true; } else if (_availOptions.Count == 1 && _isCompleteValue(_input.Value, _availOptions[0])) { _value = _availOptions[0]; changed = true; } } else { var act = _availOptions[_activeItemNo.Value]; if (_isCompleteValue(_input.Value, act)) { _value = act; changed = true; } } if (changed) { HideOptions(); Changed?.Invoke(Value, true); } break; case Magics.KeyCodeBackspace: ScheduleAutocomplete(); break; case Magics.KeyCodeArrowUp: if (!_activeItemNo.HasValue) { break; } DeactivateItem(_activeItemNo.Value); _activeItemNo--; if (_activeItemNo.Value < 0) { ChangeInputValueTo(_valueBeforeArrows); _activeItemNo = null; break; } if (_activeItemNo <= _options.ChildElementCount - 1) { ActivateItem(_activeItemNo.Value); ChangeInputValueTo(_options.ChildNodes[_activeItemNo.Value].TextContent); } break; case Magics.KeyCodeArrowDown: if (_activeItemNo.HasValue) { DeactivateItem(_activeItemNo.Value); } if (!_activeItemNo.HasValue) { if (_options.ChildElementCount < 0) { break; } _valueBeforeArrows = _input.Value; _activeItemNo = 0; } else if (_activeItemNo + 1 <= _options.ChildElementCount - 1) { _activeItemNo++; } ActivateItem(_activeItemNo.Value); ChangeInputValueTo(_options.ChildNodes[_activeItemNo.Value].TextContent); break; } return; } if (src == AutocompleteSrcType.KeyPressed) { ScheduleAutocomplete(); return; } }