public void RefreshSearchMarker () { if (textEditor.HighlightSearchPattern) { DisposeSearchPatternWorker (); SearchWorkerArguments args = new SearchWorkerArguments () { FirstLine = YToLine (textEditor.VAdjustment.Value), LastLine = YToLine (textEditor.Allocation.Height + textEditor.VAdjustment.Value), OldRegions = selectedRegions, Engine = textEditor.GetTextEditorData ().SearchEngine.Clone (), Text = textEditor.Text }; if (string.IsNullOrEmpty (textEditor.SearchPattern)) { if (selectedRegions.Count > 0) { UpdateRegions (selectedRegions, args); selectedRegions.Clear (); } return; } searchPatternWorker = new System.ComponentModel.BackgroundWorker (); searchPatternWorker.WorkerSupportsCancellation = true; searchPatternWorker.DoWork += SearchPatternWorkerDoWork; searchPatternWorker.RunWorkerAsync (args); } }
void UpdateRegions (IEnumerable<TextSegment> regions, SearchWorkerArguments args) { HashSet<int> updateLines = new HashSet<int> (); foreach (TextSegment region in regions) { int lineNumber = Document.OffsetToLineNumber (region.Offset); if (lineNumber > args.LastLine || lineNumber < args.FirstLine) continue; updateLines.Add (lineNumber); } foreach (int lineNumber in updateLines) { // RemoveCachedLine (Document.GetLine (lineNumber)); textEditor.Document.RequestUpdate (new LineUpdate (lineNumber)); } if (updateLines.Count > 0) textEditor.Document.CommitDocumentUpdate (); }
void UpdateRegions (List<ISegment> regions, SearchWorkerArguments args) { int oldLineNumber = -1; foreach (ISegment region in regions) { int lineNumber = Document.OffsetToLineNumber (region.Offset); if (oldLineNumber == lineNumber && lineNumber >= args.FirstLine) continue; if (lineNumber > args.LastLine) break; oldLineNumber = lineNumber; RemoveCachedLine (Document.GetLine (lineNumber)); textEditor.Document.RequestUpdate (new LineUpdate (lineNumber)); } if (oldLineNumber > 0) textEditor.Document.CommitDocumentUpdate (); }