public static void AutoCompletion(Rect rect, SearchContext context, ISearchView view) { if (s_DiscardAutoComplete || controlID <= 0) { return; } if (s_AutoCompleting && Event.current.type == EventType.MouseDown && !s_AutoCompleteRect.Contains(Event.current.mousePosition)) { s_DiscardAutoComplete = true; s_AutoCompleting = false; return; } var te = GetTextEditor(); var cursorPosition = te.cursorIndex; if (cursorPosition == 0) { return; } var searchText = context.searchText; var lastTokenStartPos = searchText.LastIndexOf(' ', Math.Max(0, te.cursorIndex - 1)); var lastToken = lastTokenStartPos == -1 ? searchText : searchText.Substring(lastTokenStartPos + 1); var keywords = SearchService.GetKeywords(context, lastToken).Where(k => !k.Equals(lastToken, StringComparison.OrdinalIgnoreCase)).ToArray(); if (keywords.Length > 0) { const int maxAutoCompleteCount = 16; s_AutoCompleteMaxIndex = Math.Min(keywords.Length, maxAutoCompleteCount); if (!s_AutoCompleting) { s_AutoCompleteIndex = 0; } if (Event.current.type == EventType.Repaint) { var content = new GUIContent(context.searchText.Substring(0, context.searchText.Length - lastToken.Length)); var offset = Styles.searchField.CalcSize(content).x; s_AutoCompleteRect = rect; s_AutoCompleteRect.x += offset; s_AutoCompleteRect.y = rect.yMax; s_AutoCompleteRect.width = 250; s_AutoCompleteRect.x = Math.Min(rect.width - s_AutoCompleteRect.width - 25, s_AutoCompleteRect.x); } var lt = lastToken; var autoFill = DoAutoComplete(lastToken, keywords, maxAutoCompleteCount, 0.1f); if (autoFill == null) { // No more results s_AutoCompleting = false; s_AutoCompleteIndex = -1; } else if (autoFill != lastToken) { var regex = new Regex(Regex.Escape(lastToken), RegexOptions.IgnoreCase); autoFill = regex.Replace(autoFill, ""); view.SetSearchText(context.searchText.Insert(cursorPosition, autoFill)); } else { s_AutoCompleting = true; } } else { s_AutoCompleting = false; s_AutoCompleteIndex = -1; } }