You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

162 lines
7.6 KiB

Imports System.Drawing
Imports System.Text
Public Class RichTextBoxHS
Inherits Windows.Forms.RichTextBox
#Region " Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
'Add any initialization after the InitializeComponent() call
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
components = New System.ComponentModel.Container()
End Sub
#End Region
Public WriteOnly Property SelectionBackColor() As Color
Set(ByVal Value As Color)
'First, test SelectedText property NOT SelectedRTF property because
'...SelectedRTF will never be nothing, it will always have at least
'...the current default Font table
If Me.SelectedText Is Nothing Then Exit Property
Dim sb As New StringBuilder() 'use StringBuilder for speed and cleanliness
Dim SelText As String = Me.SelectedRtf 'move to local string for speed
Dim strTemp As String 'used twice for ease of calculating internal coordinates
Dim FontTableEnds As Integer 'end character of the rtf font table
Dim ColorTableBegins As Integer 'beginning of the rtf color table
Dim ColorTableEnds As Integer 'end of the rtf color table
Dim StartLooking As Integer 'used to walk a string appending chunks
Dim HighlightBlockStart As Integer 'used to find "\highlight#" block for stripping
Dim HighlightBlockEnd As Integer 'used to find "\highlight#" block for stripping
Dim cycl As Integer 'used in For/Next loops
Dim NewColorIndex As Integer = 0 'new color table index for incoming color
'find the end of the font table
FontTableEnds = InStr(1, SelText, "}}")
'add the header and font table to the string accumulator
sb.Append(Mid(SelText, 1, FontTableEnds + 1))
'find the color table start
ColorTableBegins = InStr(FontTableEnds, SelText, "{\colortbl")
If ColorTableBegins = 0 Then 'no color table exists
'add a color table header
sb.Append("{\colortbl ;")
'no color table so for later use make the ColorTableEnd the same as FontTableEnds
ColorTableEnds = FontTableEnds
'default our new color table index to 1 since it will be the only one
'remember Color table index 0 is reserved
NewColorIndex = 1
Else 'a color table already exists
'find the end of the color table
ColorTableEnds = InStr(ColorTableBegins, SelText, "}")
'backup one character so as to exclude the brace
ColorTableEnds -= 1
'need to count the quantity of semi;colons which will
'... determine what color table index number our new color will be
strTemp = Mid(SelText, FontTableEnds + 2, (ColorTableEnds - FontTableEnds) - 1)
For cycl = 1 To strTemp.Length
If Mid(strTemp, cycl, 1) = ";" Then NewColorIndex += 1
Next
'append the color table without end brace
sb.Append(strTemp)
End If
'append the color table entry for the highlight color
sb.Append("\red" & Trim(Value.R.ToString))
sb.Append("\green" & Trim(Value.G.ToString))
sb.Append("\blue" & Trim(Value.B.ToString))
'append the table entry terminator semi;colon
sb.Append(";")
'append the color table terminating brace
sb.Append("}")
'append the new highlight tag
sb.Append("\highlight" & Trim(NewColorIndex.ToString))
'Drop into a single string for easier manipulation
strTemp = Mid(SelText, ColorTableEnds + 2, (SelText.Length - ColorTableEnds) - 1)
'begin at first character
StartLooking = 1
'append everything remaining, but strip all remaing highlight tags
Do
'find a "\highlight" block
HighlightBlockStart = InStr(StartLooking, strTemp, "\highlight")
'if no "\highlight" block found
If HighlightBlockStart = 0 Then
'append everything remaining
sb.Append(Mid(strTemp, StartLooking, strTemp.Length - StartLooking))
'we done appending
Exit Do
End If
'calculate the end of the word "highlight"
HighlightBlockEnd = HighlightBlockStart + 9
'accomodate color tables with over 9 colors and thus multi-digit color indexes
'Plus, watch for (and discard) ONE space if it immediately follows the last digit
Do
'keep stepping past end
HighlightBlockEnd += 1
'watch for (and discard) ONE space if it immediately follows the last digit
If Mid(strTemp, HighlightBlockEnd + 1, 1) = " " Then
HighlightBlockEnd += 1
Exit Do
End If
'looking for the first non-numeric character
Loop While InStr(1, "0123456789", Mid(strTemp, HighlightBlockEnd + 1, 1))
'append this block
sb.Append(Mid(strTemp, StartLooking, (HighlightBlockStart - StartLooking)))
'move the start forward past the last "\highlight#" block
StartLooking = HighlightBlockEnd + 1
Loop
Me.SelectedRtf = sb.ToString
End Set
End Property
Public Sub FindHighlight(ByVal SearchText As String, ByVal HighlightColor As Color, ByVal MatchCase As Boolean, ByVal WholeWords As Boolean)
Me.SuspendLayout()
Dim StartLooking As Integer = 0
Dim FoundAt As Integer
Dim SearchLength As Integer
Dim RTBfinds As RichTextBoxFinds
If SearchText Is Nothing Then Exit Sub
Select Case True
Case MatchCase And WholeWords
RTBfinds = RichTextBoxFinds.MatchCase Or RichTextBoxFinds.WholeWord
Case MatchCase
RTBfinds = RichTextBoxFinds.MatchCase
Case WholeWords
RTBfinds = RichTextBoxFinds.WholeWord
Case Else
RTBfinds = RichTextBoxFinds.None
End Select
SearchLength = SearchText.Length
Do
FoundAt = Me.Find(SearchText, StartLooking, RTBfinds)
If FoundAt > -1 Then Me.SelectionBackColor = HighlightColor
StartLooking = StartLooking + SearchLength
Loop While FoundAt > -1
Me.ResumeLayout()
End Sub
Public Sub BackColorSetWhole(ByVal BackColorDefault As Color)
Me.SelectAll()
Me.SelectionBackColor = BackColorDefault
End Sub
End Class