/// <summary> /// Called every frame before update. /// TextInput implement this function to get keyboard input and also to animate caret timer. /// </summary> override protected void DoBeforeUpdate() { // animate caret _caretAnim += (float)UserInterface.Active.CurrGameTime.ElapsedGameTime.TotalSeconds * CaretBlinkingSpeed; // if the element is not focused, return if (!IsFocused) { return; } // validate caret position FixCaretPosition(); // get user input char?currCharacterInput = KeyboardInput.GetTextInput(); Keys currCharacterInputKey = KeyboardInput.GetInputKey(); // if input char is invalid, return if (currCharacterInput == null) { return; } // if the input char is not supported, return if (currCharacterInput != '\0' && !TextParagraph.isCharacterSupported((char)currCharacterInput)) { return; } // init some values to handle user input string oldVal = _value; int oldCaret = _caret; int newCaretIndex = (_caret == -1 ? _value.Length : _caret); if (currCharacterInput != '\0') { // for normal character input, insert them in the text _value = _value.Insert(newCaretIndex++, currCharacterInput.ToString()); } else if (UserInterface.ControlKeys.Contains(currCharacterInputKey)) { newCaretIndex = HandleControlInputKeys(newCaretIndex, currCharacterInputKey); } // if carret move or text change, make it stay a little longer on screen before blinking again if (_caret != newCaretIndex || _value != oldVal) { PauseCaretBlink(); } // update caret position _caret = newCaretIndex; // if value changed: if (_value != oldVal) { // if new characters were added and input is now illegal, revert to previous value if (!ValidateInput(ref _value, oldVal)) { _value = oldVal; _caret = oldCaret; } // call change event if (_value != oldVal) { DoOnValueChange(); } // fix caret position FixCaretPosition(); } // when a key is pressed, recalculate scrollbas max value and scroll to caret calculateScrollBarMaxValue(); ScrollToCaret(); // call base do-before-update base.DoBeforeUpdate(); }