private void timer1_Tick(object sender, EventArgs e) { lock (timer1) { if (resultQueue != null) { foreach (ResultItem item in resultQueue) { ListViewItem listItem = new ListViewItem(); listItem.Text = item.filename; occurrences += item.hits; DeltaInfo deltaInfo = DeltaInfo.Construct(item.before, item.after); if (deltaInfo != null) { if (deltaInfo.EndPosBefore - deltaInfo.StartPos > 0 && deltaInfo.EndPosAfter - deltaInfo.StartPos > 0) { listItem.SubItems.Add(item.before.Substring(deltaInfo.StartPos, deltaInfo.EndPosBefore - deltaInfo.StartPos).Trim()); listItem.SubItems.Add(item.after.Substring(deltaInfo.StartPos, deltaInfo.EndPosAfter - deltaInfo.StartPos).Trim()); } else { listItem.Text = "ERROR" + listItem.Text; } Result.Items.Add(listItem); } } } resultQueue = null; } if (endSignalReceived) { StatusText.Text = "Done"; Go.Text = "Go"; timer1.Stop(); } else { if (currentlyScanning != "") { StatusText.Text = currentlyScanning.Substring(Path.Text.Length); } else { StatusText.Text = "Preparing..."; } } ProgressText.Text = String.Format("{0} scanned; {1} found in {2} files. ", scanned, occurrences, Result.Items.Count); }
public static DeltaInfo Construct(string before, string after) { if (before == after) { return(null); } char[] beforeArray = before.ToCharArray(); char[] afterArray = after.ToCharArray(); int startPos = beforeArray.TakeWhile((x, i) => x == afterArray[i]).Count(); int endPosBefore = beforeArray.TakeWhile((x, i) => i <= startPos || x != '\n').Count(); int endPosAfter = afterArray.TakeWhile((x, i) => i <= startPos || x != '\n').Count(); DeltaInfo deltaInfo = new DeltaInfo(); deltaInfo.StartPos = startPos; deltaInfo.EndPosAfter = endPosAfter; deltaInfo.EndPosBefore = endPosBefore; return(deltaInfo); }