Beispiel #1
0
        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;
            }
        }