131 lines
4.0 KiB
VB.net
131 lines
4.0 KiB
VB.net
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
|
|
' If there are no occurrences on the current page, got to the *next page*
|
|
While _CurrentOccurrenceCount = _CurrentSelectedOccurrence And _CurrentPage <= _Viewer.PageCount
|
|
If _CurrentPage = _Viewer.PageCount Then
|
|
_Viewer.DisplayFirstPage()
|
|
Else
|
|
_Viewer.DisplayNextPage()
|
|
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
|
|
|
|
While (_CurrentOccurrenceCount = 0 Or _CurrentSelectedOccurrence = 1) And _CurrentPage >= 1
|
|
If _CurrentPage = 1 Then
|
|
_Viewer.DisplayLastPage()
|
|
Else
|
|
_Viewer.DisplayPreviousPage()
|
|
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
|