protected void FinishGeneration()
        {
            if (InvokeRequired) {
                Invoke(new Action(FinishGeneration), new object[] {});
                return;
            }

            mapHtmlPath = Path.Combine(options.OutputDirectory, "Map.html");

            workerThread = null;
            progressHandler = null;
            options = null;

            elapsedTimer.Enabled = false;

            cancelButton.Visible = false;
            closeButton.Visible = true;
            openMapButton.Visible = true;

            overallProgressBar.Value = overallProgressBar.Maximum;
            subTaskProgressBar.Value = subTaskProgressBar.Maximum;
            subTaskLabel.Text = "Done";

            SystemSounds.Beep.Play();

            OnGenerationDone(EventArgs.Empty);
        }
        public void Generate(MapGeneratorOptions options)
        {
            if (workerThread != null) {
                throw new InvalidOperationException("Map generation already in progress.");
            }

            if (options == null) {
                throw new ArgumentNullException("options");
            }

            this.options = options;
            this.startTime = DateTime.Now;

            elapsedTimer.Enabled = true;

            progressHandler = new GuiMapGeneratorProgressHandler(this);

            workerThread = new Thread(new ThreadStart(GenerateWorker));
            workerThread.Start();
        }