Imports System.ComponentModel

Public Class frmProgress

    Public StatusBar As New ProgressStatus
    Private Shared form As frmProgress


    Private Sub bGWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bGWorker.DoWork
        Dim I As Integer
        For I = 1 To 100
            System.Threading.Thread.Sleep(10)
            bGWorker.ReportProgress(I)
        Next
    End Sub

    Private Delegate Sub ChangeProgressBarHandler(ByVal _
       percentage As Integer)

    Private Sub ChangeProgressBar(ByVal percentage As Integer)
        StatusBar.progressBar.Value = percentage
    End Sub

    Private Sub InitializeStatusBar()
        Dim info = New System.Windows.Forms.StatusBarPanel
        Dim progress = New System.Windows.Forms.StatusBarPanel


        info.Text = "Loading"
        info.Width = 100

        progress.AutoSize = _
           System.Windows.Forms.StatusBarPanelAutoSize.Spring

        With StatusBar
            .Panels.Add(info)
            .Panels.Add(progress)
            .ShowPanels = True
            .setProgressBar = 1
            .progressBar.Minimum = 0
            .progressBar.Maximum = 100
        End With

        Me.Controls.Add(StatusBar)
    End Sub

    Private Sub frmProgress_Load(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles MyBase.Load

        AddHandler bGWorker.DoWork, New _
              DoWorkEventHandler(AddressOf OnWork)
        AddHandler bGWorker.ProgressChanged, _
           New ProgressChangedEventHandler(AddressOf OnProgressChanged)

        InitializeStatusBar()
        StatusBar.progressBar.Value = 1

        bGWorker.RunWorkerAsync()

    End Sub

    Private Sub OnProgressChanged(ByVal sender As Object, _
       ByVal e As ProgressChangedEventArgs)
        Invoke(New ChangeProgressBarHandler( _
           AddressOf ChangeProgressBar), e.ProgressPercentage)
    End Sub

    Private Sub OnWork(ByVal sender As Object, _
                      ByVal e As DoWorkEventArgs)
        Dim I As Integer
        For I = 1 To 100
            System.Threading.Thread.Sleep(10)
            bGWorker.ReportProgress(I)
        Next
    End Sub

    Public Shared Sub UpdateProgress(ByVal percent As Integer)
        If (form Is Nothing) Then form = New frmProgress
        form.Show()
        form.ProgressUpdater(percent)
    End Sub

    Public Delegate Sub Updater(ByVal percent As Integer)

    Private Sub ProgressUpdater(ByVal percent As Integer)
        If (InvokeRequired) Then Invoke( _
         New Updater(AddressOf ProgressUpdater), percent)

        StatusBar.progressBar.Value = percent


    End Sub

    Public Shared Sub Finished()
        form.Close()
        form = Nothing
    End Sub

    Private Sub Progress_Load(ByVal sender As System.Object, _
     ByVal e As System.EventArgs) Handles MyBase.Load

        StatusBar.progressBar.Minimum = 1
        StatusBar.progressBar.Maximum = 100

    End Sub


End Class