public static void Export(DataTable data, string name)
        {
            SaveFileDialog dialog = new SaveFileDialog();
            dialog.Title = "Export " + name + " data to csv";
            dialog.Filter = "csv files (*.csv)|*.csv";
            dialog.AddExtension = true;
            dialog.DefaultExt = ".csv";
            dialog.OverwritePrompt = true;
            dialog.InitialDirectory = UserAccount.Settings.CSVExportDir;
            DialogResult result = dialog.ShowDialog();

            if (result == DialogResult.OK)
            {
                _filename = dialog.FileName;
                CSVExport expObj = new CSVExport();
                Thread t1 = new Thread(new ParameterizedThreadStart(expObj.DoExport));
                t1.TrySetApartmentState(ApartmentState.STA);
                ProgressDialog prgDialog = new ProgressDialog("Building " + name + " CSV file...", expObj);
                t1.Start(data);
                prgDialog.ShowDialog();
            }
        }
        private void RecalculateAutoCon()
        {
            SortedList<object, string> options = new SortedList<object, string>();
            List<CharCorpOption> charcorps = UserAccount.CurrentGroup.GetCharCorpOptions(APIDataType.Assets);
            charcorps.Sort();
            foreach (CharCorpOption opt in charcorps)
            {
                options.Add(opt.Corp ? opt.CharacterObj.CorpID : opt.CharacterObj.CharID, opt.Name);
            }
            OptionPicker picker = new OptionPicker("Select Owner", "Select a character or corporation to generate" +
                " courier contracts for.", options);
            if (picker.ShowDialog() == DialogResult.OK)
            {
                ProgressDialog progress = new ProgressDialog("Generating Contracts...", _autocon);
                object param = picker.SelectedItem;
                Thread t0 = new Thread(new ParameterizedThreadStart(AutoCon));
                t0.SetApartmentState(ApartmentState.STA);
                t0.Start(param);
                DialogResult result = progress.ShowDialog();
                if (result == DialogResult.OK)
                {
                    _contractsBindingSource.DataSource = _contracts;

                    Text = "Viewing " + _contractsBindingSource.Count + " contracts";
                }
                else if (result == DialogResult.Cancel)
                {
                    // Stop our worker thread if the user has cancelled out of the progress dialog.
                    t0.Abort();
                    t0.Join();

                    MessageBox.Show("Auto-contractor was cancelled, the contracts window will now close.",
                        "Notification", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.Close();
                }
            }
        }
        private void RepairDatabase()
        {
            VerifyDatabase verify = new VerifyDatabase();
            Thread t0 = new Thread(new ThreadStart(verify.Run));
            ProgressDialog dialog = new ProgressDialog("Verifying Data", verify);
            t0.Start();
            if (dialog.ShowDialog() == DialogResult.Cancel)
            {
                t0.Abort();
                t0.Join();

                MessageBox.Show("Data integrity check was cancelled.",
                    "Notification", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        private void btnOk_Click(object sender, EventArgs e)
        {
            this.Visible = false;

            if (rdbAPIXML.Checked)
            {
                System.Windows.Forms.OpenFileDialog dialog = new System.Windows.Forms.OpenFileDialog();
                dialog.Filter = "XML files|*.xml";
                dialog.Title = "Import EVE API Data";
                if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.Cancel)
                {
                    XmlDocument xml = new XmlDocument();
                    xml.Load(dialog.FileName);
                    APIDataType type = EveAPI.GetFileType(xml);
                    APICharacter character = UserAccount.CurrentGroup.Accounts[0].Chars[0];
                    int walletID = 0;
                    CharOrCorp corc = CharOrCorp.Char;
                    bool Cancel = false;

                    // Determine correct APICharacter instance to use when loading the data.
                    SortedList<object, string> options = new SortedList<object, string>();
                    List<CharCorpOption> charcorps = UserAccount.CurrentGroup.GetCharCorpOptions();
                    charcorps.Sort();
                    foreach (CharCorpOption opt in charcorps)
                    {
                        if (!options.ContainsKey(opt.Data.ID)) { options.Add(opt.Data.ID, opt.Name); }
                    }

                    OptionPicker picker = new OptionPicker("Select Char/Corp",
                        "Please select the character or corp to use when loading this " + type.ToString() +
                        " file into the database.", options);

                    if (picker.ShowDialog() != DialogResult.Cancel)
                    {
                        long chosenID = (long)picker.SelectedItem;
                        bool corp = false;
                        character = UserAccount.CurrentGroup.GetCharacter(chosenID, ref corp);
                        corc = corp ? CharOrCorp.Corp : CharOrCorp.Char;

                        if ((type == APIDataType.Journal || type == APIDataType.Transactions) &&
                            corc == CharOrCorp.Corp)
                        {
                            SortedList<object, string> options2 = new SortedList<object, string>();
                            foreach(EMMADataSet.WalletDivisionsRow wallet in character.WalletDivisions)
                            {
                                options2.Add(wallet.ID, wallet.Name + " (" + wallet.ID + ")");
                            }
                            OptionPicker picker2 = new OptionPicker("Select Wallet",
                                "Please select the corporate wallet to be used when loading this journal data.",
                                options2);
                            if (picker2.ShowDialog() == DialogResult.Cancel)
                            {
                                Cancel = true;
                            }
                            else
                            {
                                walletID = (int)picker2.SelectedItem;
                            }
                        }

                        if (!Cancel)
                        {
                            IProgressDialog prgDialog = null;

                            switch (type)
                            {
                                case APIDataType.Transactions:
                                    prgDialog = new ProgressDialog("Loading Transactions", character);
                                    character.ProcessTransactionsXML(xml, corc, (short)walletID);
                                    prgDialog.ShowDialog();
                                    break;
                                case APIDataType.Journal:
                                    prgDialog = new ProgressDialog("Loading Journal Data", character);
                                    character.ProcessJournalXML(xml, corc, (short)walletID);
                                    prgDialog.ShowDialog();
                                    break;
                                case APIDataType.Assets:
                                    prgDialog = new DetailProgressDialog("Loading Assets", character);
                                    character.ProcessAssetXML(xml, corc);
                                    prgDialog.ShowDialog();
                                    break;
                                case APIDataType.Orders:
                                    prgDialog = new ProgressDialog("Loading Orders", character);
                                    character.ProcessOrdersXML(xml, corc);
                                    prgDialog.ShowDialog();
                                    break;
                                case APIDataType.IndustryJobs:
                                    prgDialog = new ProgressDialog("Loading Industry Jobs", character);
                                    character.ProcessIndustryJobsXML(xml, corc);
                                    prgDialog.ShowDialog();
                                    break;
                                case APIDataType.Unknown:
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                }

            }
            else if (rdbEveIncome.Checked)
            {

            }
            else if (rdbEMMA.Checked)
            {
                System.Windows.Forms.OpenFileDialog dialog = new System.Windows.Forms.OpenFileDialog();
                dialog.Filter = "EMMA data files (*.DAT, *.CDAT)|*.dat;*.cdat";
                dialog.Title = "Import EMMA Data";
                if (dialog.ShowDialog() != System.Windows.Forms.DialogResult.Cancel)
                {
                    Thread t1 = new Thread(new ParameterizedThreadStart(LoadEMMAFile));
                    t1.SetApartmentState(ApartmentState.STA);
                    ProgressDialog progress = new ProgressDialog("Importing EMMA Data...", this);
                    t1.Start(dialog.FileName);
                    DialogResult result = progress.ShowDialog();
                    if (result == DialogResult.Cancel)
                    {
                        // Stop our worker thread if the user has cancelled out of the progress dialog.
                        t1.Abort();
                        t1.Join();

                        MessageBox.Show("Import was cancelled.\r\nAny data already committed to the " +
                            "database will still be there.", "Notification", MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
                    }
                }
            }

            this.Close();
        }
        private void btnOk_Click(object sender, EventArgs e)
        {
            if (useDataFrom.Count > 0)
            {
                parameters = new Dictionary<string, object>();
                List<FinanceAccessParams> finParams = new List<FinanceAccessParams>();
                List<AssetAccessParams> assetParams = new List<AssetAccessParams>();

                this.Visible = false;
                this.DialogResult = DialogResult.Cancel;

                ReportType thisType = (ReportType)cmbReportTypes.SelectedItem;

                if (thisType.NeedFinanceAccessParams || paramFormToRun.NeedFinanceParams)
                {
                    Dictionary<long, List<int>>.Enumerator enumerator = useDataFrom.GetEnumerator();
                    while (enumerator.MoveNext())
                    {
                        // If we are accessing all wallets for a corp then no need to bether with this
                        // as the default is to access everything when a blank list is supplied.
                        List<short> walletIDs = new List<short>();
                        if (enumerator.Current.Value.Count < 7)
                        {
                            foreach (short walletId in enumerator.Current.Value)
                            {
                                walletIDs.Add(walletId);
                            }
                        }

                        finParams.Add(new FinanceAccessParams(enumerator.Current.Key, walletIDs));
                    }
                    parameters.Add("FinanceAccessParams", finParams);
                    paramFormToRun.Parameters = parameters;
                    if (paramFormToRun.NeedFinanceParams) { paramFormToRun.FinanceParams = finParams; }
                }
                if (thisType.NeedAssetAccessParams || paramFormToRun.NeedAssetParams)
                {
                    foreach (object item in lstOwners.CheckedItems)
                    {
                        bool done = false;
                        CharCorpOption owner = (CharCorpOption)item;

                        foreach (AssetAccessParams character in assetParams)
                        {
                            if (character.OwnerID == owner.Data.ID)
                            {
                                done = true;
                            }
                        }

                        if (!done)
                        {
                            assetParams.Add(new AssetAccessParams(owner.Data.ID));
                        }
                    }
                    parameters.Add("AssetAccessParams", assetParams);
                    paramFormToRun.Parameters = parameters;
                    if (paramFormToRun.NeedAssetParams) { paramFormToRun.AssetParams = assetParams; }
                }

                // Go off to appropriate parameter form now.
                if (paramFormToRun.ShowDialog() != DialogResult.Cancel)
                {
                    parameters = paramFormToRun.Parameters;
                    reportToRun = paramFormToRun.Report;

                    Thread t1 = new Thread(BuildReport);
                    t1.SetApartmentState(ApartmentState.STA);
                    ProgressDialog prgDialog = new ProgressDialog("Building Report...", reportToRun);
                    Thread.Sleep(100);
                    t1.Start();
                    if (prgDialog.ShowDialog() == DialogResult.OK)
                    {
                        ShowReport(reportToRun, showAmountsIn);
                        this.DialogResult = DialogResult.OK;
                    }
                    else
                    {
                        // Stop our worker thread if the user has cancelled out of the progress dialog.
                        t1.Abort();
                        t1.Join();

                        MessageBox.Show("Report creation was cancelled.",
                            "Notification", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }

                this.Close();
            }
            else
            {
                MessageBox.Show("No characters or corporations selected", "Warning",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }