2023-04-14 11:55:06 +02:00

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