예제 #1
0
        /// <summary>
        /// Closes the SearchPanel.
        /// </summary>
        public void Close()
        {
            bool hasFocus = this.IsKeyboardFocusWithin;

            var layer = AdornerLayer.GetAdornerLayer(textArea);

            if (layer != null)
            {
                layer.Remove(adorner);
            }
            if (dropdownPopup != null)
            {
                dropdownPopup.IsOpen = false;
            }
            messageView.IsOpen = false;
            textArea.TextView.BackgroundRenderers.Remove(renderer);
            if (hasFocus)
            {
                textArea.Focus();
            }
            IsClosed = true;

            // Clear existing search results so that the segments don't have to be maintained
            renderer.CurrentResults.Clear();
            SearchResultsChanged?.Invoke(this, EventArgs.Empty);
        }
예제 #2
0
        void ISearchManager.SubmitSearch(SearchAllOptions options)
        {
            var positiveFilters = options.Filters.GetPositiveFilters();

            if (positiveFilters.Count == 0)
            {
                return;
            }

            var searchWorkers    = sources.Items.GetScopeSources(positiveFilters).Select(s => factory.CreateSearchWorker(s, options)).ToList();
            var newSearchResults = positiveFilters.Select(filter => factory.CreateSearchResults(this, options, filter, ++lastId, searchWorkers)).ToList();

            var currentTop = GetTopSearch();

            results.ForEach(r => r.Cancel());             // cancel all active searches, canceling of finished searches has no effect
            RemoveSameOlderSearches(newSearchResults);
            results = results.AddRange(newSearchResults);
            EnforceSearchesListLengthLimit(lastId - newSearchResults.Count + 1);

            if (currentTop != null && !currentTop.Pinned)
            {
                currentTop.Visible = false;
            }

            searchWorkers.ForEach(w => w.Start());

            SearchResultsChanged?.Invoke(this, EventArgs.Empty);
            changeNotification.Post();
        }
예제 #3
0
        void ISearchManager.Delete(ISearchResult rslt)
        {
            int?rsltIndex = results.IndexOf(r => r == rslt);

            if (rsltIndex == null)
            {
                return;
            }
            var rsltInternal = results[rsltIndex.Value];

            SearchResultsChanged?.Invoke(this, EventArgs.Empty);
            if (rsltInternal.HitsCount > 0)
            {
                combinedResultNeedsLazyUpdateFlag.Invalidate();
            }
            DisposeResults(new[] { rsltInternal }.ToHashSet());
        }
예제 #4
0
        private void OnSearchTimerTick(object sender, EventArgs e)
        {
            searchTimer?.Stop();

            var changeSelection = lastChangeSelection;

            renderer.CurrentResults.Clear();

            if (!string.IsNullOrEmpty(SearchPattern))
            {
                int offset = textArea.Caret.Offset;
                if (changeSelection)
                {
                    textArea.ClearSelection();
                }
                // We cast from ISearchResult to SearchResult; this is safe because we always use the built-in strategy
                foreach (SearchResult result in strategy.FindAll(textArea.Document, 0, textArea.Document.TextLength))
                {
                    if (changeSelection && result.StartOffset >= offset)
                    {
                        SelectResult(result);
                        changeSelection = false;
                    }
                    renderer.CurrentResults.Add(result);
                }
                if (!renderer.CurrentResults.Any())
                {
                    messageView.IsOpen          = true;
                    messageView.Content         = Localization.NoMatchesFoundText;
                    messageView.PlacementTarget = searchTextBox;
                }
                else
                {
                    messageView.IsOpen = false;
                }
            }
            textArea.TextView.InvalidateLayer(KnownLayer.Selection);
            SearchResultsChanged?.Invoke(this, EventArgs.Empty);
        }