void SearchPatternWorkerDoWork (object sender, System.ComponentModel.DoWorkEventArgs e)
{
SearchWorkerArguments args = (SearchWorkerArguments)e.Argument;
System.ComponentModel.BackgroundWorker worker = (System.ComponentModel.BackgroundWorker)sender;
List<TextSegment> newRegions = new List<TextSegment> ();
int offset = args.Engine.SearchRequest.SearchRegion.IsInvalid ? 0 : args.Engine.SearchRequest.SearchRegion.Offset;
do {
if (worker.CancellationPending)
return;
SearchResult result = null;
try {
result = args.Engine.SearchForward (worker, args, offset);
} catch (Exception ex) {
Console.WriteLine ("Got exception while search forward:" + ex);
break;
}
if (worker.CancellationPending)
return;
if (result == null || result.SearchWrapped)
break;
offset = result.EndOffset;
newRegions.Add (result.Segment);
} while (true);
HashSet<int> updateLines = null;
if (args.OldRegions.Count == newRegions.Count) {
updateLines = new HashSet<int> ();
for (int i = 0; i < newRegions.Count; i++) {
if (worker.CancellationPending)
return;
if (args.OldRegions [i].Offset != newRegions [i].Offset || args.OldRegions [i].Length != newRegions [i].Length) {
int lineNumber = Document.OffsetToLineNumber (args.OldRegions [i].Offset);
if (lineNumber > args.LastLine)
break;
if (lineNumber >= args.FirstLine)
updateLines.Add (lineNumber);
}
}
}
Application.Invoke (delegate {
this.selectedRegions = newRegions;
if (updateLines != null) {
var document = textEditor.Document;
if (document == null)
return;
foreach (int lineNumber in updateLines) {
// RemoveCachedLine (Document.GetLine (lineNumber));
document.RequestUpdate (new LineUpdate (lineNumber));
}
document.CommitDocumentUpdate ();
} else {
UpdateRegions (args.OldRegions.Concat (newRegions), args);
}
OnSearchRegionsUpdated (EventArgs.Empty);
});
}