2023-04-12 11:00:11 +02:00

123 lines
4.2 KiB
VB.net

Imports DigitalData.Modules.Base
Imports DigitalData.Modules.Logging
Imports GdPicture14
Public Class Search
Inherits BaseClass
Public Sub New(pLogConfig As LogConfig, pGDViewer As GdViewer)
MyBase.New(pLogConfig)
_Viewer = pGDViewer
_Viewer.MouseMode = ViewerMouseMode.MouseModeDefault
AddHandler _Viewer.PageDisplayed, AddressOf Viewer_PageDisplayed
End Sub
Public Property SearchQuery As String = ""
Public Property CaseSensitive As Boolean = False
Public Property WholeWords As Boolean = False
Private _Viewer As GdViewer = Nothing
Private _CurrentPage As Integer = 0
Private _CurrentQuery As String = ""
Private _CurrentOccurrenceCount = 0
Private _CurrentSelectedOccurrence = 0
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()
_Viewer.SearchText(_CurrentQuery, 0, CaseSensitive, WholeWords)
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
_Viewer.DisplayNextPage()
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
_Viewer.DisplayPreviousPage()
End While
If _CurrentOccurrenceCount > 0 Then
SelectHighlight(_CurrentOccurrenceCount)
End If
Else
' Otherwise just select the previous occurrence
SelectHighlight(_CurrentSelectedOccurrence - 1)
End If
'' If no occurrence found on the current page,
'' skip to the *previous* page to look there
'If _CurrentOccurrenceCount = 0 Then
' While _CurrentOccurrenceCount = 0 And _CurrentPage > 1
' _Viewer.DisplayPreviousPage()
' End While
'ElseIf _CurrentSelectedOccurrence = 1 Then
' ' Need to switch to the previous *page*
' ' and highlight the last occurrence there
' If _CurrentPage > 1 Then
' _Viewer.DisplayPreviousPage()
' 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
_Viewer.SearchText(_CurrentQuery, 0, CaseSensitive, WholeWords)
_CurrentOccurrenceCount = _Viewer.GetTextOccurrenceCount(_CurrentPage, _CurrentQuery, CaseSensitive, WholeWords)
_CurrentSelectedOccurrence = 0
End If
End If
End Sub
End Class