void FindNextCore(OurFindOptions options, HexBufferPoint? startingPosition, bool isIncrementalSearch) { CancelFindAsyncSearcher(); if (startingPosition == null) return; var searchOptions = new SearchOptions(wpfHexView.BufferLines.BufferSpan, startingPosition.Value, DataKind, SearchString, options, IsBigEndian); IAsyncSearcher findAsyncSearcherTmp = null; findAsyncSearcherTmp = FindAsync(searchOptions, (result, foundSpan) => { if (findAsyncSearcher != findAsyncSearcherTmp) return; CancelFindAsyncSearcher(); if (foundSpan != null) { try { isIncrementalSearchCaretMove = isIncrementalSearch; ShowSearchResult(foundSpan.Value); } finally { isIncrementalSearchCaretMove = false; } } }); findAsyncSearcher = findAsyncSearcherTmp; }
HexBufferPoint? GetStartingPosition(OurFindOptions options, bool restart) { if (wpfHexView.Selection.IsEmpty) return wpfHexView.Caret.Position.Position.ActivePosition.BufferPosition; if (restart) { if ((options & OurFindOptions.SearchReverse) == 0) return wpfHexView.Selection.Start; return wpfHexView.Selection.End; } var validSpan = wpfHexView.BufferLines.BufferSpan; if ((options & OurFindOptions.SearchReverse) != 0) { if (wpfHexView.Selection.End.Position >= validSpan.Start.Position + 2) return wpfHexView.Selection.End - 2; if ((options & OurFindOptions.Wrap) != 0) return validSpan.End; return null; } if (wpfHexView.Selection.Start < validSpan.End) return wpfHexView.Selection.Start + 1; if ((options & OurFindOptions.Wrap) != 0) return validSpan.Start; return null; }
static HexFindOptions ToHexFindOptions(OurFindOptions options) { var res = HexFindOptions.None; if ((options & OurFindOptions.SearchReverse) != 0) res |= HexFindOptions.SearchReverse; if ((options & OurFindOptions.Wrap) != 0) res |= HexFindOptions.Wrap; if ((options & OurFindOptions.NoOverlaps) != 0) res |= HexFindOptions.NoOverlaps; return res; }
HexBufferPoint? GetStartingPosition(SearchKind searchKind, OurFindOptions options, bool restart) { Debug.Assert(searchKind != SearchKind.None); switch (searchKind) { case SearchKind.Find: case SearchKind.Replace: return GetStartingPosition(options, restart); case SearchKind.IncrementalSearchBackward: case SearchKind.IncrementalSearchForward: return incrementalStartPosition; default: throw new ArgumentOutOfRangeException(nameof(searchKind)); } }
public SearchOptions(HexBufferSpan searchRange, HexBufferPoint startingPosition, HexDataKind dataKind, string searchString, OurFindOptions findOptions, bool isBigEndian) { SearchRange = searchRange; StartingPosition = startingPosition; DataKind = dataKind; SearchString = searchString; FindOptions = findOptions; IsBigEndian = isBigEndian; }