Click here to Skip to main content
15,887,596 members
Articles / Desktop Programming / Windows Forms

Fast Colored TextBox for Syntax Highlighting

Rate me:
Please Sign up or sign in to vote.
4.97/5 (878 votes)
24 Oct 2014LGPL323 min read 7.2M   104.2K   1.3K  
Custom text editor with syntax highlighting
Imports FastColoredTextBoxNS
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.IO
Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Windows.Forms

Namespace TesterVB

    Public Class LazyLoadingSample
        Inherits Form

        Private Const marging As Integer = 2000

        Private components As IContainer = Nothing

        Private fctb As FastColoredTextBox

        Private ofd As OpenFileDialog

        Private ms As MenuStrip

        Private fileToolStripMenuItem As ToolStripMenuItem

        Private miOpen As ToolStripMenuItem

        Private miSave As ToolStripMenuItem

        Private closeFileToolStripMenuItem As ToolStripMenuItem

        Private sfd As SaveFileDialog

        Private createTestFileToolStripMenuItem As ToolStripMenuItem

        Private label2 As Label

        Private editToolStripMenuItem As ToolStripMenuItem

        Private collapseAllFoldingBlocksToolStripMenuItem As ToolStripMenuItem

        Private expandAllCollapsedBlocksToolStripMenuItem As ToolStripMenuItem

        Private removeEmptyLinesToolStripMenuItem As ToolStripMenuItem

        Protected Overrides Sub Dispose(disposing As Boolean)
            If disposing AndAlso Me.components IsNot Nothing Then
                Me.components.Dispose()
            End If
            MyBase.Dispose(disposing)
        End Sub

        Private Sub InitializeComponent()
            Dim resources As ComponentResourceManager = New ComponentResourceManager(GetType(LazyLoadingSample))
            Me.ofd = New OpenFileDialog()
            Me.ms = New MenuStrip()
            Me.fileToolStripMenuItem = New ToolStripMenuItem()
            Me.miOpen = New ToolStripMenuItem()
            Me.miSave = New ToolStripMenuItem()
            Me.closeFileToolStripMenuItem = New ToolStripMenuItem()
            Me.editToolStripMenuItem = New ToolStripMenuItem()
            Me.collapseAllFoldingBlocksToolStripMenuItem = New ToolStripMenuItem()
            Me.expandAllCollapsedBlocksToolStripMenuItem = New ToolStripMenuItem()
            Me.removeEmptyLinesToolStripMenuItem = New ToolStripMenuItem()
            Me.createTestFileToolStripMenuItem = New ToolStripMenuItem()
            Me.sfd = New SaveFileDialog()
            Me.label2 = New Label()
            Me.fctb = New FastColoredTextBox()
            Me.ms.SuspendLayout()
            MyBase.SuspendLayout()
            Me.ofd.DefaultExt = "txt"
            Me.ofd.Filter = "Text file|*.txt|All files|*.*"
            Me.ms.Items.AddRange(New ToolStripItem() {Me.fileToolStripMenuItem, Me.editToolStripMenuItem, Me.createTestFileToolStripMenuItem})
            Me.ms.Location = New Point(0, 0)
            Me.ms.Name = "ms"
            Me.ms.Size = New Size(647, 24)
            Me.ms.TabIndex = 1
            Me.ms.Text = "menuStrip1"
            Me.fileToolStripMenuItem.DropDownItems.AddRange(New ToolStripItem() {Me.miOpen, Me.miSave, Me.closeFileToolStripMenuItem})
            Me.fileToolStripMenuItem.Name = "fileToolStripMenuItem"
            Me.fileToolStripMenuItem.Size = New Size(37, 20)
            Me.fileToolStripMenuItem.Text = "File"
            Me.miOpen.Name = "miOpen"
            Me.miOpen.Size = New Size(166, 22)
            Me.miOpen.Text = "Bind to file ..."
            AddHandler Me.miOpen.Click, New EventHandler(AddressOf Me.miOpen_Click)
            Me.miSave.Name = "miSave"
            Me.miSave.Size = New Size(166, 22)
            Me.miSave.Text = "Save to file ..."
            AddHandler Me.miSave.Click, New EventHandler(AddressOf Me.miSave_Click)
            Me.closeFileToolStripMenuItem.Name = "closeFileToolStripMenuItem"
            Me.closeFileToolStripMenuItem.Size = New Size(166, 22)
            Me.closeFileToolStripMenuItem.Text = "Close binding file"
            AddHandler Me.closeFileToolStripMenuItem.Click, New EventHandler(AddressOf Me.closeFileToolStripMenuItem_Click)
            Me.editToolStripMenuItem.DropDownItems.AddRange(New ToolStripItem() {Me.collapseAllFoldingBlocksToolStripMenuItem, Me.expandAllCollapsedBlocksToolStripMenuItem, Me.removeEmptyLinesToolStripMenuItem})
            Me.editToolStripMenuItem.Name = "editToolStripMenuItem"
            Me.editToolStripMenuItem.Size = New Size(39, 20)
            Me.editToolStripMenuItem.Text = "Edit"
            Me.collapseAllFoldingBlocksToolStripMenuItem.Name = "collapseAllFoldingBlocksToolStripMenuItem"
            Me.collapseAllFoldingBlocksToolStripMenuItem.Size = New Size(217, 22)
            Me.collapseAllFoldingBlocksToolStripMenuItem.Text = "Collapse all folding blocks"
            AddHandler Me.collapseAllFoldingBlocksToolStripMenuItem.Click, New EventHandler(AddressOf Me.collapseAllFoldingBlocksToolStripMenuItem_Click)
            Me.expandAllCollapsedBlocksToolStripMenuItem.Name = "expandAllCollapsedBlocksToolStripMenuItem"
            Me.expandAllCollapsedBlocksToolStripMenuItem.Size = New Size(217, 22)
            Me.expandAllCollapsedBlocksToolStripMenuItem.Text = "Expand all collapsed blocks"
            AddHandler Me.expandAllCollapsedBlocksToolStripMenuItem.Click, New EventHandler(AddressOf Me.expandAllCollapsedBlocksToolStripMenuItem_Click)
            Me.removeEmptyLinesToolStripMenuItem.Name = "removeEmptyLinesToolStripMenuItem"
            Me.removeEmptyLinesToolStripMenuItem.Size = New Size(217, 22)
            Me.removeEmptyLinesToolStripMenuItem.Text = "Remove empty lines"
            AddHandler Me.removeEmptyLinesToolStripMenuItem.Click, New EventHandler(AddressOf Me.removeEmptyLinesToolStripMenuItem_Click)
            Me.createTestFileToolStripMenuItem.Name = "createTestFileToolStripMenuItem"
            Me.createTestFileToolStripMenuItem.Size = New Size(94, 20)
            Me.createTestFileToolStripMenuItem.Text = "Create test file"
            AddHandler Me.createTestFileToolStripMenuItem.Click, New EventHandler(AddressOf Me.createTestFileToolStripMenuItem_Click)
            Me.sfd.DefaultExt = "txt"
            Me.sfd.Filter = "Text file|*.txt|All files|*.*"
            Me.label2.Dock = DockStyle.Top
            Me.label2.Font = New Font("Microsoft Sans Serif", 9.75F, FontStyle.Regular, GraphicsUnit.Point, 204)
            Me.label2.Location = New Point(0, 24)
            Me.label2.Name = "label2"
            Me.label2.Size = New Size(647, 62)
            Me.label2.TabIndex = 3
            Me.label2.Text = resources.GetString("label2.Text")
            Me.fctb.AutoScrollMinSize = New Size(480, 45)
            Me.fctb.BackBrush = Nothing
            Me.fctb.Cursor = Cursors.IBeam
            Me.fctb.DelayedEventsInterval = 300
            Me.fctb.DisabledColor = Color.FromArgb(100, 180, 180, 180)
            Me.fctb.Dock = DockStyle.Fill
            Me.fctb.Font = New Font("Consolas", 9.75F)
            Me.fctb.Location = New Point(0, 86)
            Me.fctb.Name = "fctb"
            Me.fctb.Paddings = New Padding(0)
            Me.fctb.SelectionColor = Color.FromArgb(50, 0, 0, 255)
            Me.fctb.Size = New Size(647, 251)
            Me.fctb.TabIndex = 0
            Me.fctb.Text = "Press ""Create test file"", select target directory and press Save." & vbCrLf & "Will be created large file (approx. 50mb). " & vbCrLf & "Then bind file to the control in menu File/Bind to file."
            AddHandler Me.fctb.TextChangedDelayed, New EventHandler(Of TextChangedEventArgs)(AddressOf Me.fctb_TextChangedDelayed)
            AddHandler Me.fctb.VisibleRangeChangedDelayed, New EventHandler(AddressOf Me.fctb_VisibleRangeChangedDelayed)
            MyBase.AutoScaleDimensions = New SizeF(6.0F, 13.0F)
            MyBase.AutoScaleMode = AutoScaleMode.Font
            MyBase.ClientSize = New Size(647, 337)
            MyBase.Controls.Add(Me.fctb)
            MyBase.Controls.Add(Me.label2)
            MyBase.Controls.Add(Me.ms)
            MyBase.MainMenuStrip = Me.ms
            MyBase.Name = "LazyLoadingSample"
            Me.Text = "LazyLoadingSample"
            AddHandler MyBase.FormClosing, New FormClosingEventHandler(AddressOf Me.LazyLoadingSample_FormClosing)
            Me.ms.ResumeLayout(False)
            Me.ms.PerformLayout()
            MyBase.ResumeLayout(False)
            MyBase.PerformLayout()
        End Sub

        Public Sub New()
            Me.InitializeComponent()
        End Sub

        Private Sub miOpen_Click(sender As Object, e As EventArgs)
            If Me.ofd.ShowDialog() = DialogResult.OK Then
                Me.fctb.OpenBindingFile(Me.ofd.FileName, Encoding.UTF8)
                Me.fctb.IsChanged = False
                Me.fctb.ClearUndo()
                GC.Collect()
                GC.GetTotalMemory(True)
            End If
        End Sub

        Private Sub fctb_VisibleRangeChangedDelayed(sender As Object, e As EventArgs)
            Me.HighlightVisibleRange()
        End Sub

        Private Sub fctb_TextChangedDelayed(sender As Object, e As TextChangedEventArgs)
            Me.HighlightVisibleRange()
        End Sub

        Private Sub HighlightVisibleRange()
            Dim startLine As Integer = Math.Max(0, Me.fctb.VisibleRange.Start.iLine - 2000)
            Dim endLine As Integer = Math.Min(Me.fctb.LinesCount - 1, Me.fctb.VisibleRange.[End].iLine + 2000)
            Dim range As Range = New Range(Me.fctb, 0, startLine, 0, endLine)
            range.ClearFoldingMarkers()
            range.SetFoldingMarkers("N\d\d00", "N\d\d99")
            range.ClearStyle(StyleIndex.All)
            range.SetStyle(Me.fctb.SyntaxHighlighter.BlueStyle, "N\d+")
            range.SetStyle(Me.fctb.SyntaxHighlighter.RedStyle, "[+\-]?[\d\.]+\d+")
        End Sub

        Private Sub closeFileToolStripMenuItem_Click(sender As Object, e As EventArgs)
            Me.fctb.CloseBindingFile()
        End Sub

        Private Sub LazyLoadingSample_FormClosing(sender As Object, e As FormClosingEventArgs)
            Me.fctb.CloseBindingFile()
        End Sub

        Private Sub miSave_Click(sender As Object, e As EventArgs)
            If Me.sfd.ShowDialog() = DialogResult.OK Then
                Me.fctb.SaveToFile(Me.sfd.FileName, Encoding.UTF8)
            End If
        End Sub

        Private Sub createTestFileToolStripMenuItem_Click(sender As Object, e As EventArgs)
            Dim rnd As Random = New Random()
            If Me.sfd.ShowDialog() = DialogResult.OK Then
                Using sw As StreamWriter = New StreamWriter(Me.sfd.FileName, False, Encoding.[Default])
                    For i As Integer = 0 To 130 - 1
                        sw.WriteLine(vbCrLf & "--====" & i & "=====--" & vbCrLf)
                        For j As Integer = 0 To 10000 - 1
                            sw.WriteLine(String.Format("N{0:0000} X{1} Y{2} Z{3}", New Object() {j, rnd.[Next](), rnd.[Next](), rnd.[Next]()}))
                        Next
                    Next
                End Using
            End If
        End Sub

        Private Sub collapseAllFoldingBlocksToolStripMenuItem_Click(sender As Object, e As EventArgs)
            Me.fctb.CollapseAllFoldingBlocks()
            Me.fctb.DoSelectionVisible()
        End Sub

        Private Sub expandAllCollapsedBlocksToolStripMenuItem_Click(sender As Object, e As EventArgs)
            Me.fctb.ExpandAllFoldingBlocks()
            Me.fctb.DoSelectionVisible()
        End Sub

        Private Sub removeEmptyLinesToolStripMenuItem_Click(sender As Object, e As EventArgs)
            Dim iLines As List(Of Integer) = Me.fctb.FindLines("^\s*$", RegexOptions.None)
            Me.fctb.RemoveLines(iLines)
        End Sub
    End Class
End Namespace

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)


Written By
Software Developer Freelancer
Ukraine Ukraine
I am Pavеl Tоrgаshоv, and I live in Kyiv, Ukraine.
I've been developing software since 1998.
Main activities: processing of large volumes of data, statistics, computer vision and graphics.

Comments and Discussions