Imports DigitalData.Modules.Base Imports DigitalData.Modules.Logging Imports GdPicture14 Public Class Search Inherits BaseClass Public Property SearchQuery As String = "" Public Property CaseSensitive As Boolean = False Public Property WholeWords As Boolean = False Private _Viewer As GdViewer = Nothing Private _AnnotationManager As New AnnotationManager() Private _CurrentPage As Integer = 0 Private _CurrentQuery As String = "" Private _CurrentOccurrenceCount = 0 Private _CurrentSelectedOccurrence = 0 Public Sub New(pLogConfig As LogConfig, pGDViewer As GdViewer) MyBase.New(pLogConfig) _Viewer = pGDViewer _AnnotationManager.InitFromGdViewer(pGDViewer) AddHandler _Viewer.PageDisplayed, AddressOf Viewer_PageDisplayed End Sub Public Sub SearchAll(pQuery As String) ' Exit, if query has not changed If _CurrentQuery = pQuery Then Exit Sub End If ' Save query _CurrentQuery = pQuery ' Reset previous highlights, then search for the new query _Viewer.RemoveAllRegions() DoSearchText() ' Select the next occurrence NextHighlight() End Sub Public Sub NextHighlight() ' This also applies when the page has *NO* occurrences, so 0 = 0 If _CurrentOccurrenceCount = _CurrentSelectedOccurrence Then Dim oCount = 0 ' If there are no occurrences on the current page, got to the *next page* While _CurrentOccurrenceCount = _CurrentSelectedOccurrence And _CurrentPage <= _Viewer.PageCount oCount += 1 If _CurrentPage = _Viewer.PageCount Then _Viewer.DisplayFirstPage() Else _Viewer.DisplayNextPage() End If If oCount > 333 Then Exit While End If End While ' Safeguard against selecting a non-existing occurrence on the last page If _CurrentOccurrenceCount > 0 Then SelectHighlight(1) Else ' Disable next button End If Else ' Otherwise just select the next occurrence SelectHighlight(_CurrentSelectedOccurrence + 1) End If End Sub Public Sub PrevHighlight() If _CurrentOccurrenceCount = 0 Or _CurrentSelectedOccurrence = 1 Then Dim oCount = 0 While (_CurrentOccurrenceCount = 0 Or _CurrentSelectedOccurrence = 1) And _CurrentPage >= 1 oCount += 1 If _CurrentPage = 1 Then _Viewer.DisplayLastPage() Else _Viewer.DisplayPreviousPage() End If If oCount > 333 Then Exit While End If End While If _CurrentOccurrenceCount > 0 Then SelectHighlight(_CurrentOccurrenceCount) End If Else ' Otherwise just select the previous occurrence SelectHighlight(_CurrentSelectedOccurrence - 1) End If End Sub Private Sub SelectHighlight(pOccurrence As Integer) Dim oFound = _Viewer.SearchText(_CurrentQuery, pOccurrence, CaseSensitive, WholeWords) If _Viewer.GetStat() = GdPictureStatus.OK And _Viewer.IsRect() Then _Viewer.RectIsEditable = False _Viewer.CenterOnRect() _CurrentSelectedOccurrence = pOccurrence Else _CurrentSelectedOccurrence = 0 End If End Sub Private Sub Viewer_PageDisplayed() If _CurrentPage <> _Viewer.CurrentPage Then _CurrentPage = _Viewer.CurrentPage If _CurrentQuery.Length > 0 Then DoSearchText() End If End If End Sub Private Sub DoSearchText() _Viewer.SearchText(_CurrentQuery, 0, CaseSensitive, WholeWords) Dim oRegionCount = _Viewer.RegionCount() For index = 1 To oRegionCount Dim oId = _Viewer.GetRegionID(index) _Viewer.SetRegionEditable(oId, False) Next _CurrentOccurrenceCount = _Viewer.GetTextOccurrenceCount(_CurrentPage, _CurrentQuery, CaseSensitive, WholeWords) _CurrentSelectedOccurrence = 0 End Sub End Class