/// <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); }
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(); }
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()); }
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); }