File: System\Windows\Forms\Internals\ClientUtils.cs
Web Access
Project: src\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;
    }
}