Click here to Skip to main content
15,891,253 members
Articles / Desktop Programming / Windows Forms

i00 Spell Check and Control Extensions - No Third Party Components Required!

Rate me:
Please Sign up or sign in to vote.
4.95/5 (117 votes)
11 Jan 2014Ms-PL16 min read 1.3M   22   266  
Simple to use, open source Spell Checker for .NET
Imports i00SpellCheck

Partial Class Form1

    Const WM_SYSCOMMAND As Integer = &H112
    Const SC_KEYMENU As Integer = &HF100

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        Select Case m.Msg
            Case WM_SYSCOMMAND
                Select Case m.WParam.ToInt32
                    Case SC_KEYMENU
                        Static LastControl As Control
                        If tsbExamples.GetCurrentParent.Focused() Then
                            If LastControl IsNot Nothing Then
                                Try
                                    LastControl.Focus()
                                Catch ex As Exception

                                End Try
                            End If
                        Else
                            LastControl = Me.ActiveControl
                            tsbExamples.GetCurrentParent.Focus()
                            tsbExamples.Select()
                        End If
                    Case Else
                        MyBase.WndProc(m)
                End Select
            Case Else
                MyBase.WndProc(m)
        End Select

    End Sub

    Private Function ExtractIcon(ByVal file As String, ByVal Large As Boolean) As Bitmap
        Using icon As Icon = icon.ExtractAssociatedIcon(file)
            If Large Then
                Return icon.ToBitmap
            Else
                ExtractIcon = New Bitmap(16, 16)
                Using g = Graphics.FromImage(ExtractIcon)
                    g.InterpolationMode = Drawing2D.InterpolationMode.High
                    g.DrawIcon(icon, New Rectangle(0, 0, ExtractIcon.Width, ExtractIcon.Height))
                End Using
            End If
        End Using
    End Function

    Private Function GetSelectedTabsSpellCheckControl() As Control
        'find the current tabs spell check control by locating the property grid...
        Dim ctl As Control = tabSpellControls.SelectedTab
        Do Until ctl Is Nothing
            Dim PropertyGrid = TryCast(ctl, ControlExtPropGrid)
            If PropertyGrid IsNot Nothing Then
                Return PropertyGrid.SelectedObject
            End If
            ctl = tabSpellControls.SelectedTab.GetNextControl(ctl, True)
        Loop
        Return Nothing
    End Function

    Private Sub Form1_Load_2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim SpellCheckAssembly = System.Reflection.Assembly.Load("i00SpellCheck")
        If SpellCheckAssembly IsNot Nothing Then
            'qwertyuiop - should use something like: ... but it doesn't work for UNC's
            '... = System.Drawing.Icon.ExtractAssociatedIcon(Assembly)
            tsbAbout.ToolTipText = "About " & SpellCheckAssembly.GetName.Name & " " & SpellCheckAssembly.GetName.Version.ToString

            tsbAbout.Image = ExtractIcon(SpellCheckAssembly.Location, False)
            tsbSpellCheck.Image = tsbAbout.Image
            Me.Icon = Icon.ExtractAssociatedIcon(SpellCheckAssembly.Location)
        End If

        Dim ToolBoxIcon As New ToolboxBitmapAttribute(GetType(PropertyGrid))
        tsbProperties.Image = ToolBoxIcon.GetImage(GetType(PropertyGrid), False)

        Try
            tsbPerformanceMonitor.Image = IconExtraction.GetDefaultIcon(IO.Path.Combine(Environment.SystemDirectory, "perfmon.exe"), IconExtraction.IconSize.SmallIcon).ToBitmap
        Catch ex As Exception

        End Try


        Dim URLIcon = IconExtraction.GetDefaultIcon(".url", IconExtraction.IconSize.SmallIcon).ToBitmap
        tsbi00Productions.Image = URLIcon
        tsbVBForums.Image = URLIcon
        tsbCodeProject.Image = URLIcon
        tsbDonate.Image = URLIcon

        LoadFavicon("http://www.paypal.com/favicon.ico", tsbDonate)
        LoadFavicon("http://vbforums.com/favicon.ico", tsbVBForums)
        LoadFavicon("http://i00Productions.org/favicon.ico", tsbi00Productions)
        LoadFavicon("http://codeproject.com/favicon.ico", tsbCodeProject)

        For Each item In ShowIgnoredToolStripMenuItem.DropDownItems.OfType(Of ToolStripItem)()
            AddHandler item.Click, AddressOf ShowIgnoredToolStripMenuItem_Click
        Next

        tsiDrawStyle.SelectedIndex = 0

        'add any extra plugins as extra tabs...
        Dim SpellCheckControlBases = i00SpellCheck.PluginManager(Of i00SpellCheck.SpellCheckControlBase).GetPlugins
        Dim SpellControls As New List(Of Control) ' LoadSpellCheckPlugins.Controls()
        For Each item In SpellCheckControlBases
            For Each ControlType In item.ControlTypes
                Try
                    If ControlType.IsAbstract Then
                        'cannot create instance for eg TextBoxBase... lets go through everything and try to create a control that comes from this
                        SpellControls.AddRange(i00SpellCheck.PluginManager(Of Control).GetAllPluginsInReferencedAssemblies(item.GetType.Assembly, ControlType))
                    Else
                        Dim ctl = TryCast(ControlType.Module.Assembly.CreateInstance(ControlType.FullName), Control)
                        SpellControls.Add(ctl)
                    End If
                Catch ex As Exception

                End Try
            Next
        Next

        'remove the duplicate controls...
        SpellControls = (From xItem In (From xItem In SpellControls Group xItem By ControlType = xItem.GetType Into Group) Select xItem.Group.First).ToList

        For Each item In (From xItem In SpellControls Order By xItem.GetType.Name).ToList
            Dim InsertControl = item

            item.EnableControlExtensions()
            If ControlExtensions.LoadedControlExtensions.ContainsKey(item) Then
                For Each ControlExtension In ControlExtensions.LoadedControlExtensions.Item(item)
                    Dim iTestHarness = TryCast(ControlExtension, iTestHarness)

                    If iTestHarness IsNot Nothing Then
                        Dim ToBeInsertControl = iTestHarness.SetupControl(item)
                        If ToBeInsertControl IsNot item Then
                            InsertControl = ToBeInsertControl
                        End If
                        If InsertControl Is Nothing Then GoTo NextControl
                    End If
                Next
            End If

            Dim TabPage = New TabPage(item.GetType.Name)
            ToolBoxIcon = New ToolboxBitmapAttribute(item.GetType)
            ilTabSpellControls.Images.Add(item.GetType.FullName, ToolBoxIcon.GetImage(item.GetType, False))
            TabPage.ImageIndex = ilTabSpellControls.Images.IndexOfKey(item.GetType.FullName)
            tabSpellControls.TabPages.Add(TabPage)

            InsertControl.Dock = DockStyle.Fill
            Dim prop As New ControlExtPropGrid
            prop.Width = 250
            prop.SelectedObject = item
            prop.Dock = DockStyle.Right
            prop.Visible = False
            'If item IsNot Nothing Then
            TabPage.Controls.Add(InsertControl)
            TabPage.Controls.Add(prop)
            'End If
NextControl:
        Next

        If tabSpellControls.TabCount = 0 Then
            Dim TabPage = New TabPage("")
            tabSpellControls.TabPages.Add(TabPage)
            Dim lblNoPlugins As New Label
            lblNoPlugins.Text = "No plugins could be loaded"
            lblNoPlugins.AutoSize = False
            lblNoPlugins.Dock = DockStyle.Fill
            lblNoPlugins.TextAlign = ContentAlignment.MiddleCenter
            TabPage.Controls.Add(lblNoPlugins)
        End If

        UpdateEnabledCheck()
        tabSpellControls_SelectedIndexChanged(tabSpellControls, EventArgs.Empty)
    End Sub

    Private Class FavIconData
        Public URL As String
        Public tsi As ToolStripItem
        Public Sub New(ByVal URL As String, ByVal tsi As ToolStripItem)
            Me.URL = URL
            Me.tsi = tsi
        End Sub
    End Class

    Public Sub LoadFavicon(ByVal URL As String, ByVal tsi As ToolStripItem)
        Dim t As New System.Threading.Thread(AddressOf MT_DownloadImage)
        t.IsBackground = True
        t.Name = "Downloading " & URL
        t.Start(New FavIconData(URL, tsi))
    End Sub

    Public Sub MT_DownloadImage(ByVal oFavIconData As Object)
        Try
            Dim FavIconData = TryCast(oFavIconData, FavIconData)
            If FavIconData IsNot Nothing Then
                Dim request = System.Net.HttpWebRequest.Create(FavIconData.URL)
                Dim response = request.GetResponse()
                Dim Image As Image = Nothing
                'Try standard Image
                Using stream = response.GetResponseStream()
                    Try
                        Image = Image.FromStream(stream)
                    Catch ex As Exception
                    End Try
                End Using
                'Try icon
                If Image Is Nothing Then
                    Using stream = response.GetResponseStream()
                        Try
                            Using tempStream As New IO.MemoryStream
                                Const BUFFER_SIZE As Integer = 1024
                                Dim buffer(BUFFER_SIZE - 1) As Byte
                                Dim byteCount As Integer
                                Do
                                    byteCount = stream.Read(buffer, 0, BUFFER_SIZE)
                                    tempStream.Write(buffer, 0, byteCount)
                                Loop While byteCount = BUFFER_SIZE

                                tempStream.Seek(0, IO.SeekOrigin.Begin)
                                Image = New Icon(tempStream).ToBitmap
                            End Using
                        Catch ex As Exception
                        End Try
                    End Using
                End If
                If Image IsNot Nothing Then
                    FavIconData.tsi.Image = Image
                End If
            End If
        Catch ex As Exception

        End Try
    End Sub

    Private Sub tsbi00Productions_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbi00Productions.Click
        System.Diagnostics.Process.Start("http://i00Productions.org")
    End Sub

    Private Sub tsbVBForums_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbVBForums.Click
        System.Diagnostics.Process.Start("http://www.vbforums.com/showthread.php?p=4075093")
    End Sub

    Private Sub tsbCodeProject_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbCodeProject.Click
        System.Diagnostics.Process.Start("http://www.codeproject.com/KB/edit/i00VBNETSpellCheck.aspx")
    End Sub

    Private Sub tsbDonate_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles tsbDonate.Click
        System.Diagnostics.Process.Start("https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=6C7Y9ECSD2YPA")
    End Sub

    Private Sub tsbAbout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbAbout.Click
        Using frmAbout As New i00SpellCheck.AboutScreen
            frmAbout.ShowInTaskbar = False
            frmAbout.StartPosition = FormStartPosition.CenterParent
            frmAbout.ShowDialog(Me)
        End Using
    End Sub

    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
        Using frmSplash As New frmSplash
            If frmSplash.ShowDialog(Me) = False Then
                Close()
            End If
            
            Dim HTMLToolTip = New i00SpellCheck.HTMLToolTip With {.IsBalloon = True, .ToolTipTitle = "Thanks for downloading...", .ToolTipIcon = ToolTipIcon.Info}
            HTMLToolTip.ToolTipOrientation = i00SpellCheck.HTMLToolTip.ToolTipOrientations.TopLeft
            'add a bit more of a shadow to make it appear more 
            HTMLToolTip.BalloonShadowDepth = 8
            HTMLToolTip.BalloonShadowBlur = 8
            HTMLToolTip.ToolTipIcon = ToolTipIcon.None
            If Me.Icon IsNot Nothing Then HTMLToolTip.Image = Me.Icon.ToBitmap
            HTMLToolTip.ShowHTML("Please consider donating if you use i00 Spell Check in your project", tsbDonate.Owner, New Point(CInt(tsbDonate.Bounds.Left + (tsbDonate.Width / 2)), CInt(tsbDonate.Bounds.Top + (tsbDonate.Height / 2))), 10000)
        End Using
    End Sub

    Private WithEvents frmPerformanceMonitor As PrefMon.frmPerformanceMonitor
    Private Sub tsbPerformanceMonitor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbPerformanceMonitor.Click
        If frmPerformanceMonitor Is Nothing OrElse frmPerformanceMonitor.IsDisposed Then
            frmPerformanceMonitor = New PrefMon.frmPerformanceMonitor

            Dim ProcessPrefCounter = frmPerformanceMonitor.AddPerformanceCounter("Process", "% Processor Time", IO.Path.GetFileNameWithoutExtension(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName), Color.Lime, 60000)
            ProcessPrefCounter.GridData.DataStyle = PrefMon.clsGrid.GridSetProperty.DataStyles.Filled_Smoothed_Line
            ProcessPrefCounter.GridData.PenWidth = 0

            frmPerformanceMonitor.AddPerformanceCounter(i00SpellCheck.DictionaryPerformanceCounter.CatName, i00SpellCheck.DictionaryPerformanceCounter.WordCheckCounterName, "", Color.Red, 60000)
            frmPerformanceMonitor.AddPerformanceCounter(i00SpellCheck.DictionaryPerformanceCounter.CatName, i00SpellCheck.DictionaryPerformanceCounter.SuggestionLookupCounterName, "", Color.Aqua, 60000)

            frmPerformanceMonitor.AnimationPoint = Me.RectangleToScreen(tsbPerformanceMonitor.Bounds)
            frmPerformanceMonitor.Show(Me)
        Else
            frmPerformanceMonitor.BringToFront()
            frmPerformanceMonitor.Focus()
        End If
        tsbPerformanceMonitor.Checked = True
    End Sub

    Private Sub frmPerformanceMonitor_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles frmPerformanceMonitor.FormClosed
        tsbPerformanceMonitor.Checked = False
        frmPerformanceMonitor = Nothing
    End Sub

    Private Sub frmPerformanceMonitor_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles frmPerformanceMonitor.FormClosing
        frmPerformanceMonitor.AnimationPoint = Me.RectangleToScreen(tsbPerformanceMonitor.Bounds)
    End Sub

    'Private Sub prop_PropertyValueChanged(ByVal s As Object, ByVal e As System.Windows.Forms.PropertyValueChangedEventArgs) Handles propRichTextBox.PropertyValueChanged, propTextBox.PropertyValueChanged
    '    'If e.ChangedItem.Parent IsNot Nothing AndAlso TypeOf e.ChangedItem.Parent.Value Is TextBoxBase Then
    '    '    Dim UnSupportedDynamicPropertyNames As String() = {}
    '    '    If UnSupportedDynamicPropertyNames.Contains(e.ChangedItem.PropertyDescriptor.Name) Then
    '    '        MsgBox("i00 .Net Spell Check does not (currently) support DYNAMIC changing of the following properties:" & vbCrLf & vbCrLf & Join((From xItem In UnSupportedDynamicPropertyNames Select xItem Order By xItem).ToArray, ", ") & vbCrLf & vbCrLf & "These properties can however be set prior to initializing the spellcheck.", MsgBoxStyle.Exclamation)
    '    '    End If
    '    'End If
    'End Sub

End Class

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 Microsoft Public License (Ms-PL)


Written By
i00
Software Developer (Senior) i00 Productions
Australia Australia
I hope you enjoy my code. It's yours to use for free, but if you do wish to say thank you then a donation is always appreciated.
You can donate here.

Comments and Discussions