Imports System.Text.RegularExpressions
Imports System.IO
Imports FastColoredTextBoxNS


''' <summary>
''' Note: this example is deprecated. See project Tester for newest code samples.
''' </summary>

Public Class PowerfulSample

    Dim lang As String = "VB"

    Dim BlueStyle As TextStyle = New TextStyle(Brushes.Blue, Nothing, FontStyle.Regular)
    Dim BoldStyle As TextStyle = New TextStyle(Nothing, Nothing, FontStyle.Bold Or FontStyle.Underline)
    Dim GrayStyle As TextStyle = New TextStyle(Brushes.Gray, Nothing, FontStyle.Regular)
    Dim MagentaStyle As TextStyle = New TextStyle(Brushes.Magenta, Nothing, FontStyle.Regular)
    Dim GreenStyle As TextStyle = New TextStyle(Brushes.Green, Nothing, FontStyle.Italic)
    Dim BrownStyle As TextStyle = New TextStyle(Brushes.Brown, Nothing, FontStyle.Italic)
    Dim MaroonStyle As TextStyle = New TextStyle(Brushes.Maroon, Nothing, FontStyle.Regular)
    Dim SameWordsStyle As MarkerStyle = New MarkerStyle(New SolidBrush(Color.FromArgb(40, Color.Gray)))

    Public Sub New()
        InitializeComponent()
        InitStylesPriority()
    End Sub


    Private Sub InitStylesPriority()
        FastColoredTextBox1.ClearStylesBuffer()
        'add this style explicitly for drawing under other styles
        FastColoredTextBox1.AddStyle(SameWordsStyle)
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        FastColoredTextBox1.Text = "" & vbCrLf &
"#Region ""Char""" & vbCrLf &
"   " & vbCrLf &
"   ''' <summary>" & vbCrLf &
"   ''' Char and style" & vbCrLf &
"   ''' </summary>" & vbCrLf &
"   Public Structure CharStyle" & vbCrLf &
"       Public c As Char" & vbCrLf &
"       Public style As StyleIndex" & vbCrLf &
"   " & vbCrLf &
"       Public Sub CharStyle(ByVal ch As Char)" & vbCrLf &
"           c = ch" & vbCrLf &
"           Style = StyleIndex.None" & vbCrLf &
"       End Sub" & vbCrLf &
"   " & vbCrLf &
"   End Structure" & vbCrLf &
"   " & vbCrLf &
"#End Region"
        'move caret to start text
        FastColoredTextBox1.Selection.Start = Place.Empty
        FastColoredTextBox1.DoCaretVisible()
        FastColoredTextBox1.IsChanged = False
        FastColoredTextBox1.ClearUndo()
    End Sub

    Private Sub FastColoredTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As FastColoredTextBoxNS.TextChangedEventArgs) Handles FastColoredTextBox1.TextChanged
        'For sample, we will highlight the syntax of C# manually, although could use built-in highlighter
        If lang = "CSharp" Then
            CSharpSyntaxHighlight(e)
        End If
    End Sub

    Private Sub CSharpSyntaxHighlight(ByVal e As TextChangedEventArgs)
        FastColoredTextBox1.LeftBracket = "("
        FastColoredTextBox1.RightBracket = ")"
        FastColoredTextBox1.LeftBracket2 = "\x0"
        FastColoredTextBox1.RightBracket2 = "\x0"
        'clear style of changed range
        e.ChangedRange.ClearStyle(BlueStyle, BoldStyle, GrayStyle, MagentaStyle, GreenStyle, BrownStyle)
        'string highlighting
        e.ChangedRange.SetStyle(BrownStyle, """.*?""|'.+?'")
        'comment highlighting
        e.ChangedRange.SetStyle(GreenStyle, "//.*$", RegexOptions.Multiline)
        e.ChangedRange.SetStyle(GreenStyle, "(/\*.*?\*/)|(/\*.*)", RegexOptions.Singleline)
        e.ChangedRange.SetStyle(GreenStyle, "(/\*.*?\*/)|(.*\*/)", RegexOptions.Singleline Or RegexOptions.RightToLeft)
        'number highlighting
        e.ChangedRange.SetStyle(MagentaStyle, "\b\d+[\.]?\d*([eE]\-?\d+)?[lLdDfF]?\b|\b0x[a-fA-F\d]+\b")
        'attribute highlighting
        e.ChangedRange.SetStyle(GrayStyle, "^\s*(?<range>\[.+?\])\s*$", RegexOptions.Multiline)
        'class name highlighting
        e.ChangedRange.SetStyle(BoldStyle, "\b(class|struct|enum|interface)\s+(?<range>\w+?)\b")
        'keyword highlighting
        e.ChangedRange.SetStyle(BlueStyle, "\b(abstract|as|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b|#region\b|#endregion\b")

        'clear folding markers
        e.ChangedRange.ClearFoldingMarkers()
        'set folding markers
        e.ChangedRange.SetFoldingMarkers("{", "}") 'allow to collapse brackets block
        e.ChangedRange.SetFoldingMarkers("#region\b", "#endregion\b") 'allow to collapse #region blocks
        e.ChangedRange.SetFoldingMarkers("/\*", "\*/") 'allow to collapse comment block
    End Sub

    Private Sub miCSharp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles miCSharp.Click, sQLToolStripMenuItem.Click, pHPToolStripMenuItem.Click, miVB.Click, hTMLToolStripMenuItem.Click, assemblyToolStripMenuItem.Click, batchToolStripMenuItem.Click
        'set language
        lang = CType(sender, ToolStripMenuItem).Text

        FastColoredTextBox1.ClearStylesBuffer()
        FastColoredTextBox1.Range.ClearStyle(StyleIndex.All)
        InitStylesPriority()

        Select Case lang
            Case "CSharp"
                FastColoredTextBox1.Language = Language.Custom
                FastColoredTextBox1.CommentPrefix = "//"
                'call OnTextChanged for refresh syntax highlighting
                FastColoredTextBox1.OnTextChanged()
            Case "VB" : FastColoredTextBox1.Language = Language.VB
            Case "HTML" : FastColoredTextBox1.Language = Language.HTML
            Case "SQL" : FastColoredTextBox1.Language = Language.SQL
            Case "PHP" : FastColoredTextBox1.Language = Language.PHP
            Case "Assembly" : FastColoredTextBox1.Language = Language.Assembly
            Case "Batch" : FastColoredTextBox1.Language = Language.Batch

        End Select

        FastColoredTextBox1.OnSyntaxHighlight(New TextChangedEventArgs(FastColoredTextBox1.Range))
    End Sub

    Private Sub miLanguage_DropDownOpening(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles miLanguage.DropDownOpening
        For Each mi As ToolStripMenuItem In miLanguage.DropDownItems
            mi.Checked = (mi.Text = lang)
        Next
    End Sub

    Private Sub findToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles findToolStripMenuItem.Click
        FastColoredTextBox1.ShowFindDialog()
    End Sub

    Private Sub replaceToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles replaceToolStripMenuItem.Click
        FastColoredTextBox1.ShowReplaceDialog()
    End Sub

    Private Sub hTMLToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles hTMLToolStripMenuItem1.Click
        Dim sfd As SaveFileDialog = New SaveFileDialog()
        sfd.Filter = "HTML|*.html"
        If sfd.ShowDialog() = DialogResult.OK Then
            File.WriteAllText(sfd.FileName, FastColoredTextBox1.Html)
        End If

    End Sub
End Class
