Contains the result of the analysis (a Dictionary containing the word [key] and the number of occurences [value], the number of words in the document, and a boolean indicating whether the result is to be displayed in the taskpane or saved to CSV.
        public void populateTable(ResultContainer results)
        {
            if (results != null)
            { //it will be null if the user cancelled the operation prematurely.

                if (this.totalwords.InvokeRequired)
                {
                    // It's on a different thread, so use Invoke.
                    ResultsCallback d = new ResultsCallback(ResultsDisplay);
                    this.Invoke(d, new object[] { results });
                }
                else
                {
                    // It's on the same thread, no need for Invoke
                    Dictionary<String, int> frequencies = results.Frequencies;
                    int wordcount = results.Wordcount;
                    //Related information
                    totalwords.Text = "Total Word Count: " + wordcount;
                    uniquewords.Text = "Unique Word Count: " + frequencies.Count;

                    var ordered_results = from k in frequencies.Keys orderby frequencies[k] descending select k;

                    double previous_frequency = 0;

                    foreach (string key in ordered_results)
                    {
                        double word_frequency = (frequencies[key] / (double)wordcount) * 100;

                        if (word_frequency == previous_frequency)
                        { //Don't display the same percentage over and over again. Just for the first time it appears.
                            resultsbox.Items.Add(key + "\t [" + frequencies[key] + "]");
                        }
                        else
                        {
                            resultsbox.Items.Add(key + "\t [" + frequencies[key] + ", " + word_frequency.ToString("#0.00") + "%]");
                            previous_frequency = word_frequency;
                        }
                    }

                    progressBar.Visible = false;
                    progressBar.Value = 0;
                    calcLabel.Visible = false;
                    totalwords.Visible = true;
                    uniquewords.Visible = true;
                    resultsbox.Visible = true;
                    recalculatebutton.Text = "Re-calculate";
                    calculating = false;
                }
            }
        }
        public void ResultsDisplay(ResultContainer results)
        {
            resultsbox.Items.Clear();

            // It's on the same thread, no need for Invoke
            Dictionary<String, int> frequencies = results.Frequencies;
            int wordcount = results.Wordcount;
            //Related information
            totalwords.Text = "Total Word Count: " + wordcount;
            uniquewords.Text = "Unique Word Count: " + frequencies.Count;

            var ordered_results = from k in frequencies.Keys orderby frequencies[k] descending select k;

            double previous_frequency = 0;

            foreach (string key in ordered_results)
            {
                double word_frequency = (frequencies[key] / (double)wordcount) * 100;

                if (word_frequency == previous_frequency)
                { //Don't display the same percentage over and over again. Just for the first time it appears.
                    resultsbox.Items.Add(key + "\t [" + frequencies[key] + "]");
                }
                else
                {
                    resultsbox.Items.Add(key + "\t [" + frequencies[key] + ", " + word_frequency.ToString("#0.00") + "%]");
                    previous_frequency = word_frequency;
                }
            }

            progressBar.Visible = false;
            progressBar.Value = 0;
            calcLabel.Visible = false;
            totalwords.Visible = true;
            uniquewords.Visible = true;
            resultsbox.Visible = true;
            recalculatebutton.Text = "Re-calculate";
            calculating = false;
        }
        public void saveToFile(ResultContainer results)
        {
            saveFileDialog1.Filter = "Comma Separated Value|*.csv";
            saveFileDialog1.Title = "Where to save the file?";
            saveFileDialog1.FileName = "Word Frequency";
            saveFileDialog1.ShowDialog();

            Dictionary<String, int> frequencies = results.Frequencies;
            int wordcount = results.Wordcount;
            double previous_frequency = 0;

            // If the file name is not an empty string open it for saving.
            if (saveFileDialog1.FileName != "")
            {
                // Saves the Image via a FileStream created by the OpenFile method.
                System.IO.FileStream fs =
                   (System.IO.FileStream)saveFileDialog1.OpenFile();

                var ordered_results = from k in frequencies.Keys orderby frequencies[k] descending select k;
                AddText(fs, "Word, Count, Frequency\n");
                foreach (string key in ordered_results)
                {
                    double word_frequency = (frequencies[key] / (double)wordcount) * 100;
                    AddText(fs, key + ", " + frequencies[key] + ", " + word_frequency.ToString("#0.00") + "%\n");
                    previous_frequency = word_frequency;
                }

                // close the stream
                fs.Close();

                progressBar.Visible = false;
                progressBar.Value = 0;
                calcLabel.Visible = false;
                totalwords.Visible = false;
                uniquewords.Visible = false;
                resultsbox.Visible = false;
                recalculatebutton.Text = "Re-calculate";
                calculating = false;
                // write a line of text to the file

                this.Visible = false;

            }
        }