/// <summary>
        /// Called when background worker RunWorkerAsynch task finishes,
        /// that is, when exiting Processing state and entering
        /// ShowingWork state.
        ///
        /// Update progress form and, if appropriate, update
        /// file list view, then set state to "ShowingWork,"
        /// leaving the progress form displayed.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bgworker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                if (e.Error != null)
                {
                    ProgressForm.AddMessage(
                        string.Format(Properties.Resources.VestaReportExceptionMsg,
                                      e.Error.Message)
                        );
                }
                else if (e.Cancelled)
                {
                    ProgressForm.AddMessage(
                        Properties.Resources.ProcessingCancelledMsg + Properties.Resources.OKToCloseMsg
                        );
                }
                else
                {
                    BGWorkerResult bgRes = (BGWorkerResult)e.Result;
                    string         msg   = null;
                    switch (bgRes.Type)
                    {
                    case ProcessingType.GENERATE:
                        msg = string.Format(Properties.Resources.FileAddingSuccessMsg, bgRes.FilesGeneratedCount);
                        break;

                    case ProcessingType.IMPORT:
                        msg = string.Format(Properties.Resources.VestaReportProcessingSuccessMsg, bgRes.ReportsReadCount);
                        break;

                    case ProcessingType.BOTH:
                        msg = string.Format(Properties.Resources.VestaReportProcessingSuccessMsg, bgRes.ReportsReadCount) +
                              Environment.NewLine + string.Format(Properties.Resources.FileAddingSuccessMsg, bgRes.FilesGeneratedCount);
                        break;
                    }
                    ProgressForm.AddMessage(Environment.NewLine + msg);
                    ProgressForm.AddMessage(Properties.Resources.OKToCloseMsg);
                    ProgressForm.AddMessage(Environment.NewLine);
                    if (bgRes.FilesGeneratedCount > 0)
                    {
                        UpdateView();
                    }
                }
            }
            finally
            {
                SetAppState(AppStates.ShowingWork);
            }
        }
        /// <summary>
        /// Launch the processing code in a separate thread.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bgworker_DoGenerateWork(object sender, DoWorkEventArgs e)
        {
            int[]            years = (int[])e.Argument;
            BackgroundWorker wk    = sender as BackgroundWorker;
            BGWorkerResult   bgRes = new BGWorkerResult();

            bgRes.Type = ProcessingType.GENERATE;
            bgRes.FilesGeneratedCount = DoOutputProcessing(wk, years);
            if (wk.CancellationPending)
            {
                e.Cancel = true;
            }
            else
            {
                e.Result = bgRes;
            }
        }
        /// <summary>
        /// Launch the processing code in a separate thread.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bgworker_DoImportWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker wk = sender as BackgroundWorker;

            string[]       args  = (string[])e.Argument;
            BGWorkerResult bgRes = new BGWorkerResult();

            bgRes.Type             = ProcessingType.IMPORT;
            bgRes.ReportsReadCount = DoImportProcessing(wk, args);
            if (wk.CancellationPending)
            {
                e.Cancel = true;
            }
            else
            {
                e.Result = bgRes;
            }
        }