| File: System\Windows\Forms\Internals\ClientUtils.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms.Primitives\src\System.Windows.Forms.Primitives.csproj (System.Windows.Forms.Primitives) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Globalization; namespace System.Windows.Forms; internal static class ClientUtils { private enum CharType { None, Word, NonWord } /// <summary> /// Imitates the backwards word selection logic of the native SHAutoComplete Ctrl+Backspace handler. /// The selection will consist of any run of word characters and any run of non-word characters at the end of that word. /// If the selection reaches the second character in the input, and the first character is non-word, it is also selected. /// Here, word characters are equivalent to the "\w" regex class but with UnicodeCategory.ConnectorPunctuation excluded. /// </summary> public static int GetWordBoundaryStart(string text, int endIndex) { bool seenWord = false; CharType lastSeen = CharType.None; int index = endIndex - 1; for (; index >= 0; index--) { char character = text[index]; if (char.IsSurrogate(character)) { break; } bool isWord = char.IsLetterOrDigit(character) || CharUnicodeInfo.GetUnicodeCategory(character) == UnicodeCategory.NonSpacingMark; if ((isWord && lastSeen == CharType.NonWord && seenWord) || (!isWord && lastSeen == CharType.Word && index != 0)) { break; } seenWord |= isWord; lastSeen = isWord ? CharType.Word : CharType.NonWord; } return index + 1; } }