private void btnAutoDiv_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;

            try
            {
                DivUpdateInfo info = Dividends.UpdateFromJournal(false);
                string corpNames = "";
                foreach (string corp in info.missingCorps)
                {
                    corpNames = corpNames + (corpNames.Length == 0 ? "" : ", ") + corp;
                }
                MessageBox.Show("Dividends processing completed\r\n" + info.dividendsAdded + " dividends added" +
                    (info.dividendsNotAdded == 0 ? "" :
                    "\r\n" + info.dividendsNotAdded + " dividends could not be added because the corp " +
                    "is not defined\r\nList of undefined corp names: " + corpNames + "\r\n" +
                    "Create these corps and then run dividend auto add again."));
            }
            catch (Exception ex)
            {
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Error, "Problem creating dividend entries from" +
                        "journal data.", ex);
                }
                MessageBox.Show("Error trying to create new dividends: " + ex.Message, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                Cursor = Cursors.Default;
            }
        }
        void GroupLocationList_Load(object sender, EventArgs e)
        {
            try
            {
                _locations = GroupLocations.GetGroupLocationsData();
                _locationsBindingSource = new BindingSource();
                _locationsBindingSource.DataSource = _locations;

                locationsGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
                locationsGrid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

                locationsGrid.AutoGenerateColumns = false;
                locationsGrid.DataSource = _locationsBindingSource;
                NameColumn.DataPropertyName = "Name";
                DescriptionColumn.DataPropertyName = "Description";
            }
            catch (Exception ex)
            {
                // Creating new EMMAexception will cause error to be logged.
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Critical, "Error setting up group location form", ex);
                }
                MessageBox.Show("Problem setting up group location view.\r\nCheck " + Globals.AppDataDir + "Logging\\ExceptionLog.txt" +
                    " for details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        static void Main(string[] args)
        {
            bool checkForUpdates = true;
            for (int i = 0; i < args.Length; i++)
            {
                if (args[i].Equals("/u"))
                {
                    try
                    {
                        checkForUpdates = bool.Parse(args[i + 1]);
                    }
                    catch
                    {
                        checkForUpdates = true;
                    }
                }
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            try
            {
                Main main = new Main(checkForUpdates);
                if(!main.IsDisposed)
                {
                    Application.Run(main);
                }
            }
            catch (Exception ex)
            {
                // Creating new exception will cause error to be logged.
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Critical, "Unhandled exception", ex);
                }
                MessageBox.Show("An unexpected error has occured.\r\nCheck " + Globals.AppDataDir + "Logging\\ExceptionLog.txt" +
                    " for details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                try
                {
                    // Attempt to logout. This will save all settings, etc.
                    UserAccount.Logout();
                }
                catch (Exception ex2)
                {
                    EMMAException emmaex2 = ex2 as EMMAException;
                    if (emmaex2 == null)
                    {
                        emmaex2 = new EMMAException(ExceptionSeverity.Critical,
                            "Error during automatic log out", ex2);
                    }
                }

                // Close the application. In some cases it may still be able to continue but it's
                // much safer to just shut things down.
                Application.Exit();
            }
        }
        public void Run()
        {
            Thread.Sleep(500); // Wait for half a second to allow the calling thread to display the dialog...
            int checks = 2;

            try
            {
                UpdateStatus(0, checks, "Checking database", "", false);

                // Check 1 - Check for duplicated, dividend data.
                UpdateStatus(0, checks, "", "Checking for duplicated dividend entries", false);
                int total = Dividends.ClearDuplicates();
                if (total == 0)
                {
                    UpdateStatus(1, checks, "", "No duplicates found", false);
                }
                else
                {
                    UpdateStatus(1, checks, "", total + " duplicates found and removed.", false);
                }

                // Check 2 - Move assets/orders stored against character IDs to corp IDs.
                UpdateStatus(1, checks, "", "Checking for corporate assets stored by character ID", false);
                foreach (EVEAccount account in UserAccount.CurrentGroup.Accounts)
                {
                    foreach (APICharacter character in account.Chars)
                    {
                        UpdateStatus(1, checks, "", "Checking " + character.CharName + "...", false);
                        character.Settings.UpdatedOwnerIDToCorpID = false;
                        character.UpdateOwnerIDToCorpID();
                    }
                }

                UpdateStatus(checks, checks, "Checks complete", "", true);
            }
            catch (Exception ex)
            {
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Error, "Problem verifying data integrity", ex);
                }
                UpdateStatus(-1, -1, "Error", "Problem verifying data integrity: " + ex.Message, true);
            }
        }
        private void ItemValueHistory_Load(object sender, EventArgs e)
        {
            try
            {
                GraphPane pane = priceHistoryGraph.GraphPane;
                pane.Title.Text = "Item price history";

                _recentItems = UserAccount.CurrentGroup.Settings.RecentItems;
                _recentItems.Sort();
                AutoCompleteStringCollection items = new AutoCompleteStringCollection();
                items.AddRange(_recentItems.ToArray());
                txtItem.AutoCompleteCustomSource = items;
                txtItem.AutoCompleteSource = AutoCompleteSource.CustomSource;
                txtItem.AutoCompleteMode = AutoCompleteMode.Suggest;
                txtItem.Leave += new EventHandler(txtItem_Leave);
                txtItem.KeyDown += new KeyEventHandler(txtItem_KeyDown);
                txtItem.Tag = 0;
                txtItem.Text = "";

                EveDataSet.mapRegionsDataTable regions = Regions.GetAllRegions();
                EveDataSet.mapRegionsRow allRegions = regions.NewmapRegionsRow();
                allRegions.regionID = 0;
                allRegions.regionName = "Any Region";
                regions.AddmapRegionsRow(allRegions);
                cmbRegion.DataSource = regions;
                cmbRegion.ValueMember = "regionID";
                cmbRegion.DisplayMember = "regionName";
                cmbRegion.SelectedValue = 0;
                cmbRegion.SelectedValueChanged += new EventHandler(cmbRegion_SelectedValueChanged);
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Problem loading grid calculator: " +
                        ex.Message, ex);
                }
                MessageBox.Show("Problem loading grid calculator: " + ex.Message, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// Add journal entries from the supplied XML to the database.
        /// </summary>
        /// <param name="corc"></param>
        /// <param name="fileXML"></param>
        /// <returns>The number of rows added to the journal table.</returns>
        private int UpdateJournalFromXML(CharOrCorp corc, XmlDocument fileXML, short walletID)
        {
            int retVal = 0;
            int updatedEntries = 0;
            EMMADataSet.JournalDataTable journalData = new EMMADataSet.JournalDataTable();
            long highestIDSoFar = _apiSettings.GetHighestID(corc, APIDataType.Journal);
            long oldHighestID = _apiSettings.GetHighestID(corc, APIDataType.Journal);
            DateTime dataDate = DateTime.UtcNow;

            try
            {
                XmlNodeList journEntries = null;
                XmlDocument xml = new XmlDocument();

                UpdateStatus(0, 1, "Getting journal entries from file", "", false);
                journEntries = EveAPI.GetResults(fileXML);
                dataDate = EveAPI.GetDataTime(fileXML);
                UpdateStatus(1, 1, "", journEntries.Count + " entries found in file.", false);

                if (journEntries != null && journEntries.Count > 0)
                {
                    // Offset will always be the same since CCP switched over to 64 bit IDs
                    // (At least until we break the 64bit limit... As of mid 2010, we're using
                    // around 2 billion IDs a year so breaking the 64 bit limit will take around
                    // 9 billion years... Don't think it will be a problem :))
                    long offset = 2591720933;
                    int batchPrg = 0;

                    UpdateStatus(0, journEntries.Count, "Processing entries", "", false);

                    // Loop through the results returned from this call to the API and add the line
                    // to the data table.
                    foreach (XmlNode journEntry in journEntries)
                    {
                        bool tryUpdate = false;
                        long id = long.Parse(journEntry.SelectSingleNode("@refID").Value) + offset;
                        long recieverID = 0;
                        if (corc == CharOrCorp.Corp)
                        {
                            // This is a special case.
                            // When bounty prizes are received by the player, corp tax is applied.
                            // This corp tax does not appear as a seperate journal entry for the
                            // character. It is specified by the taxReceiverID and taxAmount fields
                            // on the bounty prize entry itself in the XML.
                            // On the corp side, there is a specifc entry for the tax but it has
                            // the same journalentryID and ownerID2 as the character entry.
                            // This means that EMMA does not differentiate between them and the
                            // corp tax part is lost.
                            // In order to resolve this we simply set receiver ID to be the corp
                            // instead of character in these cases.
                            // Note that 'BuildJournalEntry' has similar processing.
                            if (int.Parse(journEntry.SelectSingleNode("@refTypeID").Value) == 85)
                            {
                                recieverID = _corpID;
                            }
                        }
                        if (recieverID == 0)
                        {
                            recieverID = long.Parse(journEntry.SelectSingleNode("@ownerID2").Value);
                        }

                        //if (id - offset > oldHighestID)
                        //{
                        if (id - offset > highestIDSoFar) { highestIDSoFar = id - offset; }
                        if (Journal.EntryExists(journalData, id, recieverID))
                        {
                            tryUpdate = true;
                        }
                        else
                        {
                            EMMADataSet.JournalRow tmpRow = journalData.FindByIDRecieverID(id, recieverID);
                            if (tmpRow == null)
                            {
                                EMMADataSet.JournalRow newRow =
                                    BuildJournalEntry(journalData, journEntry, offset, walletID, corc);

                                journalData.AddJournalRow(newRow);
                                retVal++;

                                // This section searches the character and journal ref type tables
                                // for the values used in this new journal entry.
                                // If they are not present in the tables then they are added.
                                #region Check other tables and add values if needed.
                                SortedList<long, string> entityIDs = new SortedList<long, string>();
                                entityIDs.Add(newRow.SenderID, journEntry.SelectSingleNode("@ownerName1").Value);
                                if (!entityIDs.ContainsKey(newRow.RecieverID))
                                {
                                    entityIDs.Add(newRow.RecieverID, journEntry.SelectSingleNode("@ownerName2").Value);
                                }
                                foreach (KeyValuePair<long, string> checkName in entityIDs)
                                {
                                    Names.AddName(checkName.Key, checkName.Value);
                                }
                                #endregion
                            }
                            else
                            {
                                tryUpdate = true;
                            }
                        }

                        if (tryUpdate)
                        {
                            EMMADataSet.JournalRow newRow =
                                BuildJournalEntry(journalData, journEntry, offset, walletID, corc);
                            EMMADataSet.JournalRow oldRow = journalData.FindByIDRecieverID(newRow.ID,
                                    newRow.RecieverID);
                            bool updated = false;

                            if (oldRow != null)
                            {
                                if ((newRow.RBalance > 0 && oldRow.RBalance == 0) ||
                                    (newRow.RCorpID != 0 && oldRow.RCorpID == 0))
                                {
                                    oldRow.RBalance = newRow.RBalance;
                                    oldRow.RCorpID = newRow.RCorpID;
                                    oldRow.RArgID = newRow.RArgID;
                                    oldRow.RArgName = newRow.RArgName;
                                    oldRow.RWalletID = newRow.RWalletID;
                                    updated = true;
                                }
                                if ((newRow.SBalance > 0 && oldRow.SBalance == 0) ||
                                    (newRow.SCorpID != 0 && oldRow.SCorpID == 0))
                                {
                                    oldRow.SBalance = newRow.SBalance;
                                    oldRow.SCorpID = newRow.SCorpID;
                                    oldRow.SArgID = newRow.SArgID;
                                    oldRow.SArgName = newRow.SArgName;
                                    oldRow.SWalletID = newRow.SWalletID;
                                    updated = true;
                                }
                            }

                            if (updated)
                            {
                                updatedEntries++;
                            }
                        }

                        //}

                        batchPrg++;
                        UpdateStatus(batchPrg, journEntries.Count, "", "", false);
                    }

                    SetHighestID(corc, APIDataType.Journal, highestIDSoFar);
                }

                UpdateStatus(0, 0, retVal + " journal entries added to database.", "", false);
                UpdateStatus(0, 0, updatedEntries + " existing journal entries updated.", "", true);

                if (journalData.Count > 0)
                {
                    Journal.Store(journalData);
                }
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    // If we've caught a standard exception rather than an EMMA one then log
                    // it by creating a new exception.
                    // Note that we don't need to actually throw it..
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Error when adding journal data", ex);
                }

                SetLastAPIUpdateError(corc, APIDataType.Journal, ex.Message);
                UpdateStatus(-1, 0, "Error", ex.Message, true);
            }

            if (UpdateEvent != null)
            {
                UpdateEvent(this, new APIUpdateEventArgs(APIDataType.Journal,
                    corc == CharOrCorp.Char ? _charID : _corpID,
                    APIUpdateEventType.UpdateCompleted));
            }

            return retVal;
        }
        private void UpdateIndustryJobsFromXML(CharOrCorp corc, XmlDocument fileXML)
        {
            EMMADataSet.IndustryJobsDataTable jobsData = new EMMADataSet.IndustryJobsDataTable();

            try
            {
                XmlNodeList jobEntries = null;

                UpdateStatus(0, 1, "Getting industry jobs from file", "", false);
                jobEntries = EveAPI.GetResults(fileXML);
                UpdateStatus(1, 1, "", jobEntries.Count + " industry jobs found in file.", false);

                if (jobEntries != null && jobEntries.Count > 0)
                {
                    UpdateStatus(0, jobEntries.Count, "Processing jobs", "", false);

                    foreach (XmlNode jobEntry in jobEntries)
                    {
                        EMMADataSet.IndustryJobsRow jobRow = BuildIndustryJobRow(jobsData, jobEntry);
                        if (IndustryJobs.GetJob(jobsData, jobRow.ID))
                        {
                            // The job already exists in the database. Update if needed.
                            EMMADataSet.IndustryJobsRow oldJobRow = jobsData.FindByID(jobRow.ID);
                            if (oldJobRow.Completed != jobRow.Completed ||
                                oldJobRow.CompletedStatus != jobRow.CompletedStatus ||
                                oldJobRow.CompletedSuccessfully != jobRow.CompletedSuccessfully ||
                                oldJobRow.EndProductionTime.CompareTo(jobRow.EndProductionTime) != 0 ||
                                oldJobRow.PauseProductionTime.CompareTo(jobRow.PauseProductionTime) != 0)
                            {
                                oldJobRow.Completed = jobRow.Completed;
                                oldJobRow.CompletedStatus = jobRow.CompletedStatus;
                                oldJobRow.CompletedSuccessfully = jobRow.CompletedSuccessfully;
                                oldJobRow.EndProductionTime = jobRow.EndProductionTime;
                                oldJobRow.PauseProductionTime = jobRow.PauseProductionTime;
                            }
                            else
                            {
                                // No changes
                            }
                        }
                        else
                        {
                            // This is a new job. Add it to the database.
                            jobsData.AddIndustryJobsRow(jobRow);
                        }

                    }
                }

                if (jobsData != null && jobsData.Count > 0)
                {
                    IndustryJobs.Store(jobsData);
                }
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    // If we've caught a standard exception rather than an EMMA one then log it by creating a
                    // new exception.
                    // Note that we don't need to actually throw it..
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Error when adding industry jobs", ex);
                }

                SetLastAPIUpdateError(corc, APIDataType.IndustryJobs, ex.Message);
                UpdateStatus(-1, 0, "Error", ex.Message, true);
            }

            if (UpdateEvent != null)
            {
                UpdateEvent(this, new APIUpdateEventArgs(APIDataType.IndustryJobs,
                    corc == CharOrCorp.Char ? _charID : _corpID,
                    APIUpdateEventType.UpdateCompleted));
            }
        }
        private void UpdateAssetsFromXML(CharOrCorp corc, XmlDocument xml)
        {
            DateTime earliestUpdate = GetLastAPIUpdateTime(corc, APIDataType.Assets).AddHours(23);
            EMMADataSet.AssetsDataTable assetData = new EMMADataSet.AssetsDataTable();
            DateTime dataDate = DateTime.MinValue;

            try
            {
                XmlNodeList assetList = null;

                UpdateStatus(0, 1, "Getting asset data from file", "", false);

                dataDate = EveAPI.GetDataTime(xml);
                DateTime assetsEffectiveDate = corc == CharOrCorp.Char ?
                    Settings.CharAssetsEffectiveDate : Settings.CorpAssetsEffectiveDate;
                if (dataDate.CompareTo(assetsEffectiveDate) < 0)
                {
                    UpdateStatus(1, 1, "Error", "This data in this file is from " + dataDate.ToString() +
                        ". EMMA has already imported asset data dated " + assetsEffectiveDate + " therefore the" +
                        " database will not be updated.", true);
                    assetList = null;
                }
                else
                {
                    assetList = EveAPI.GetResults(xml);
                    UpdateStatus(1, 1, "", assetList.Count + " asset data lines found.", false);
                }

                if (assetList != null)
                {
                    // Set the 'processed' flag to false for all of this char/corp's assets.
                    Assets.SetProcessedFlag(corc == CharOrCorp.Corp ? _corpID : _charID, (int)AssetStatus.States.Normal, false);
                    Assets.SetProcessedFlag(corc == CharOrCorp.Corp ? _corpID : _charID, (int)AssetStatus.States.ForSaleViaMarket, false);
                    Assets.SetProcessedFlag(corc == CharOrCorp.Corp ? _corpID : _charID, (int)AssetStatus.States.ForSaleViaContract, false);
                    Assets.SetProcessedFlag(corc == CharOrCorp.Corp ? _corpID : _charID, (int)AssetStatus.States.InTransit, false);

                    AssetList changes = new AssetList();

                    // Create an in-memory datatable with all of the changes required to the assets
                    // database in order to reflect the data in the xml file.
                    UpdateAssets(assetData, assetList, 0, corc, 0, changes);
                    // Use the currently active sell order to account for assets that appear to be
                    // missing.
                    UpdateStatus(0, 0, "Processing active sell orders", "", false);
                    Assets.ProcessSellOrders(assetData, changes, corc == CharOrCorp.Corp ? _corpID : _charID);
                    UpdateStatus(0, 0, "", "Complete", false);
                    // Use transactions that occured after the effective date of the asset data file
                    // to ensure that the asset list is as up-to-date as possible.
                    UpdateStatus(0, 0, "Updating assets from transactions that occur after " +
                        "the asset file's effective date", "", false);
                    long maxID = Assets.UpdateFromTransactions(assetData, changes, _charID, _corpID,
                        corc == CharOrCorp.Corp, dataDate);
                    if (corc == CharOrCorp.Char) { Settings.CharAssetsTransUpdateID = maxID; }
                    else { Settings.CorpAssetsTransUpdateID = maxID; }
                    UpdateStatus(0, 0, "", "Complete", false);

                    AssetList gained = new AssetList();
                    AssetList lost = new AssetList();
                    if ((corc == CharOrCorp.Char && Settings.FirstUpdateDoneAssetsChar) ||
                        (corc == CharOrCorp.Corp && Settings.FirstUpdateDoneAssetsCorp))
                    {
                        UpdateStatus(0, 0, "Analysing changes to assets", "", false);
                        Assets.AnalyseChanges(assetData, corc == CharOrCorp.Corp ? _corpID : _charID,
                            changes, out gained, out lost);
                        UpdateStatus(0, 0, "", "Complete", false);
                    }
                    // If this is the first assets update then we want to try and assign sensible cost
                    // values to assets that we have not yet got a value for.
                    if ((corc == CharOrCorp.Char && !Settings.FirstUpdateDoneAssetsChar) ||
                        (corc == CharOrCorp.Corp && !Settings.FirstUpdateDoneAssetsCorp))
                    {
                        Assets.AssignApproxCosts(assetData, corc == CharOrCorp.Corp ? _corpID : _charID);
                    }

                    if (corc == CharOrCorp.Char)
                    {
                        _unacknowledgedGains = gained;
                        _unacknowledgedLosses = lost;
                    }
                    else
                    {
                        _corpUnacknowledgedGains = gained;
                        _corpUnacknowledgedLosses = lost;
                    }

                    UpdateStatus(0, 0, "Updating assets database", "", false);
                    Assets.UpdateDatabase(assetData);
                    UpdateStatus(0, 0, "", "Complete", false);

                    // Set all 'for sale via contract' and 'in transit' assets in the database to processed.
                    // These types of assets would not be expected to show up in either the XML from the
                    // API or the list of current market orders.
                    // Any assets of these types that have been moved to a different state (e.g. in transit
                    // items that have arrived or contracts that have expired) will have been updated already
                    // in this method or ProcessSellOrders.
                    // Therefore, the ones that are left are still in the same situation as before.
                    // i.e. either 'for sale via contract' or 'in transit'.
                    // We set them to processed to prevent them from being removed along with other
                    // unprocessed assets.
                    Assets.SetProcessedFlag(corc == CharOrCorp.Corp ? _corpID : _charID,
                        (int)AssetStatus.States.ForSaleViaContract, true);
                    Assets.SetProcessedFlag(corc == CharOrCorp.Corp ? _corpID : _charID,
                        (int)AssetStatus.States.InTransit, true);
                    // Clear any remaining assets that have not been processed.
                    Assets.ClearUnProcessed(corc == CharOrCorp.Corp ? _corpID : _charID, false);
                    Assets.SetProcessedFlag(corc == CharOrCorp.Corp ? _corpID : _charID, 0, false);

                    UpdateStatus(0, 0, assetData.Count + " asset database entries modified.", "", false);

                    // Update the assets effective date setting.
                    // Also set the 'FirstUpdateDone' flag
                    if (corc == CharOrCorp.Char)
                    {
                        Settings.CharAssetsEffectiveDate = dataDate;
                        Settings.FirstUpdateDoneAssetsChar = true;
                    }
                    else
                    {
                        Settings.CorpAssetsEffectiveDate = dataDate;
                        if (!Settings.FirstUpdateDoneAssetsCorp)
                        {
                            Settings.FirstUpdateDoneAssetsCorp = true;
                            foreach (EVEAccount account in UserAccount.CurrentGroup.Accounts)
                            {
                                foreach (APICharacter character in account.Chars)
                                {
                                    if (character.CharID != _charID && character.CorpID == _corpID)
                                    {
                                        Settings.FirstUpdateDoneAssetsCorp = true;
                                    }
                                }
                            }
                        }
                    }

                    UpdateStatus(1, 1, "", "Complete", true);
                }
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    // If we've caught a standard exception rather than an EMMA one then log it be creating a
                    // new exception.
                    // Note that we don't need to actually throw it..
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Error when processing assets data", ex);
                }

                UpdateStatus(-1, -1, "Error", ex.Message, true);
                SetLastAPIUpdateError(corc, APIDataType.Assets, ex.Message);
            }

            if (UpdateEvent != null)
            {
                if (_unacknowledgedLosses == null) { _unacknowledgedLosses = new AssetList(); }
                if (_unacknowledgedGains == null) { _unacknowledgedGains = new AssetList(); }
                if (_corpUnacknowledgedLosses == null) { _corpUnacknowledgedLosses = new AssetList(); }
                if (_corpUnacknowledgedGains == null) { _corpUnacknowledgedGains = new AssetList(); }

                if ((corc == CharOrCorp.Char && _unacknowledgedLosses.Count + _unacknowledgedGains.Count == 0) ||
                    (corc == CharOrCorp.Corp && _corpUnacknowledgedGains.Count + _corpUnacknowledgedLosses.Count == 0))
                {
                    UpdateEvent(this, new APIUpdateEventArgs(APIDataType.Assets,
                        corc == CharOrCorp.Char ? _charID : _corpID,
                        APIUpdateEventType.UpdateCompleted));
                }
                else
                {
                    SetLastAPIUpdateError(corc, APIDataType.Assets, "AWAITING ACKNOWLEDGEMENT");
                    UpdateEvent(this, new APIUpdateEventArgs(APIDataType.Assets,
                        corc == CharOrCorp.Char ? _charID : _corpID,
                        APIUpdateEventType.AssetsAwaitingAcknowledgement));
                }
            }
        }
        /// <summary>
        /// Download XML from the Eve API
        /// </summary>
        /// <param name="corc"></param>
        /// <param name="type"></param>
        private void RetrieveAPIXML(CharOrCorp corc, APIDataType type)
        {
            TimeSpan timeBetweenUpdates = UserAccount.Settings.GetAPIUpdatePeriod(type);
            DateTime earliestUpdate = GetLastAPIUpdateTime(corc, type).Add(timeBetweenUpdates);
            DateTime dataDate = DateTime.MinValue;

            short walletID = corc == CharOrCorp.Corp ? (short)1000 : (short)0;
            decimal beforeID = 0;
            bool finishedDownloading = false;
            bool walletExhausted = false;
            bool noData = true;
            bool abort = false;
            string xmlFile = "";
            int rowCount = 200;
            XmlDocument xml = null;

            long currentMaxID = 0;
            if (type == APIDataType.Transactions) { currentMaxID = _apiSettings.GetHighestID(corc, APIDataType.Transactions); }
            if (type == APIDataType.Journal) { currentMaxID = _apiSettings.GetHighestID(corc, APIDataType.Journal); }

            try
            {
                // Make sure we don't download if we've already done so recently.
                if (earliestUpdate.CompareTo(DateTime.UtcNow) > 0)
                {
                    throw new EMMAEveAPIException(ExceptionSeverity.Warning, 1000, "Cannot get " +
                        type.ToString() + " data so soon after the last update. Wait until at least " +
                        earliestUpdate.ToLongTimeString() + " before updating.");
                }

                while (!finishedDownloading)
                {
                    try
                    {
                        // Set parameters that will be passed to the API
                        #region Set parameters
                        StringBuilder parameters = new StringBuilder();
                        parameters.Append("keyID=");
                        parameters.Append(_userID);
                        parameters.Append("&vCode=");
                        parameters.Append(_apiKey);
                        parameters.Append("&characterID=");
                        parameters.Append(_charID);
                        if (type == APIDataType.Journal || type == APIDataType.Transactions)
                        {
                            parameters.Append("&rowCount=");
                            parameters.Append(rowCount);
                            if (walletID != 0)
                            {
                                parameters.Append("&accountKey=");
                                parameters.Append(walletID);
                            }
                            if (beforeID != 0)
                            {
                                parameters.Append("&fromID=");
                                parameters.Append(beforeID);
                            }
                        }
                        if (type == APIDataType.Assets || type == APIDataType.Orders)
                        {
                            parameters.Append("&version=2");
                        }
                        #endregion

                        xml = EveAPI.GetXml(EveAPI.URL_EveApiHTTPS + EveAPI.GetURL(corc, type),
                            parameters.ToString(), ref xmlFile);
                        XmlNodeList tmp = EveAPI.GetResults(xml);
                        if (xmlFile.Length > 0)
                        {
                            lock (_unprocessedXMLFiles) { _unprocessedXMLFiles.Enqueue(xmlFile); }
                            noData = false;
                        }
                        if (type == APIDataType.Journal || type == APIDataType.Transactions)
                        {
                            if (tmp.Count < rowCount) { walletExhausted = true; }
                        }

                        // Set the last update time based upon the 'cached until'
                        // time rather than the actual time the update occured
                        // Note we could modify the API update period timer instead but
                        // that would cause other issues. It's better for the user if
                        // we just do things this way.
                        if (type == APIDataType.Transactions)
                        {
                            // Transactions XML often gives a cache expiry date time that is too soon.
                            // If we try and update again when it says then it will fail so just wait
                            // for the usual 1 hour. (Or whatever the user has it set to)
                            SetLastAPIUpdateTime(corc, type, DateTime.UtcNow);
                        }
                        else
                        {
                            DateTime nextAllowed = EveAPI.GetCachedUntilTime(xml);
                            SetLastAPIUpdateTime(corc, type, nextAllowed.Subtract(
                                UserAccount.Settings.GetAPIUpdatePeriod(type)));
                        }

                        // If we've been successfull in getting data and this is a corporate data request
                        // then make sure we've got access set to true;
                        if (corc == CharOrCorp.Corp)
                        {
                            Settings.SetCorpAPIAccess(type, true);
                        }

                    }
                    catch (EMMAEveAPIException emmaApiEx)
                    {
                        #region API Error Handling
                        if (emmaApiEx.EveCode == 100)
                        {
                            // Error code 100 indicates that a 'beforeRefID' has been passed in when the
                            // api was not expecting it. If we know for sure that we've already called
                            // the api once then have to abandon the data we have got so far.
                            // (No idea why the API does this, it just happens from time to time)
                            if (!noData)
                            {
                                walletExhausted = true;
                                //SetLastAPIUpdateError(corc, type, "Eve API Error 100");
                            }
                            else
                            {
                                throw emmaApiEx;
                            }
                        }
                        else if (emmaApiEx.EveCode == 101 || emmaApiEx.EveCode == 102 ||
                            emmaApiEx.EveCode == 103 || emmaApiEx.EveCode == 116 || emmaApiEx.EveCode == 117)
                        {
                            // Data already retrieved
                            string err = emmaApiEx.EveDescription;

                            // If there is a cachedUntil tag, dont try and get data again until
                            // after it has expired.
                            DateTime nextAllowed = EveAPI.GetCachedUntilTime(xml);
                            SetLastAPIUpdateTime(corc, type, nextAllowed.Subtract(
                                UserAccount.Settings.GetAPIUpdatePeriod(type)));
                            if (noData)
                            {
                                SetLastAPIUpdateError(corc, type,
                                    "The Eve API reports that this data has already been retrieved, no update has occured.");
                            }
                            walletExhausted = true;
                        }
                        else if (emmaApiEx.EveCode == 200)
                        {
                            // Security level not high enough
                            SetLastAPIUpdateError(corc, type,
                                "You must enter your FULL api key to retrieve financial and asset data.\r\n" +
                                "Use the 'manage group' button to correct this.");
                            abort = true;
                        }
                        else if (emmaApiEx.EveCode == 206 || emmaApiEx.EveCode == 208 ||
                            emmaApiEx.EveCode == 209 || emmaApiEx.EveCode == 213)
                        {
                            // Character does not have required corporate role.
                            Settings.SetCorpAPIAccess(type, false);
                            SetAPIAutoUpdate(corc, type, false);
                            SetLastAPIUpdateError(corc, type, emmaApiEx.Message);
                            abort = true;
                        }
                        else
                        {
                            throw emmaApiEx;
                        }
                        #endregion
                    }

                    /// By default, we're now done..
                    finishedDownloading = true;

                    // However, for some update types, we'll want to go round a few more times
                    #region Determine if we should access API again with different variables
                    if (!abort)
                    {
                        if (type == APIDataType.Journal || type == APIDataType.Transactions)
                        {
                            //XmlNode lastRowNode = xml.SelectSingleNode(@"/eveapi/result/rowset/row[last()]");
                            XmlNodeList results = xml.SelectNodes(@"/eveapi/result/rowset/row");
                            long minID = long.MaxValue;
                            if (results != null)
                            {
                                foreach (XmlNode node in results)
                                {
                                    string idAttribName = "";
                                    if (type == APIDataType.Journal) { idAttribName = "@refID"; }
                                    if (type == APIDataType.Transactions) { idAttribName = "@transactionID"; }
                                    long val = long.Parse(node.SelectSingleNode(idAttribName).Value);
                                    if (val < minID) { minID = val; }
                                }
                            }

                            if (minID != long.MaxValue && minID > currentMaxID)
                            {
                                beforeID = minID;
                            }
                            else { walletExhausted = true; }
                            if (!walletExhausted) { finishedDownloading = false; }
                            if (walletExhausted && corc == CharOrCorp.Corp && walletID < 1006)
                            {
                                walletID++;
                                beforeID = 0;
                                finishedDownloading = false;
                            }
                        }
                    }
                    #endregion
                }

            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    // If we've caught a standard exception rather than an EMMA one then log it be creating a
                    // new exception.
                    // Note that we don't need to actually throw it..
                    emmaEx = new EMMAException(ExceptionSeverity.Error,
                        "Error when downloading " + type.ToString() + " from Eve API", ex);
                }

                SetLastAPIUpdateError(corc, type, ex.Message);
                noData = true;
            }

            // If we have not retrieved any data at all then mark the update as completed.
            if (noData)
            {
                if (UpdateEvent != null)
                {
                    UpdateEvent(this, new APIUpdateEventArgs(type,
                        corc == CharOrCorp.Char ? _charID : _corpID,
                        APIUpdateEventType.UpdateCompleted));
                }
            }
        }
        private bool SaveFilter()
        {
            bool done = false;

            if (txtLocationName.Text.Equals(""))
            {
                MessageBox.Show("You must enter a name for this location filter.", "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                try
                {
                    _filterDetail.Name = txtLocationName.Text;
                    _filterDetail.Range = OrderRange.GetRangeFromText(cmbRange.Items[cmbRange.SelectedIndex].ToString());
                    // If range is region wide then remove the station and just add it's region to the filter
                    if (_filterDetail.Range == OrderRange.GetRangeFromText("Region"))
                    {
                        int region = Stations.GetStation(_stations[0].stationID).regionID;
                        _stations.Clear();
                        for (int i = 0; i < chkRegions.Items.Count; i++)
                        {
                            chkRegions.SetSelected(i, true);
                            if (((MiniRegion)chkRegions.SelectedItem)._regionID == region)
                            {
                                chkRegions.SetItemChecked(i, true);
                            }
                        }
                    }
                    List<long> regionIDs = new List<long>();

                    foreach (object region in chkRegions.CheckedItems)
                    {
                        MiniRegion regionData = ((MiniRegion)region);
                        regionIDs.Add(regionData._regionID);
                    }
                    _filterDetail.Regions = regionIDs;

                    List<long> stationIDs = new List<long>();
                    if (_stations.Count > 1)
                    {
                        // If more than one station selected then simply add thier IDs to the filter
                        foreach (EveDataSet.staStationsRow station in _stations)
                        {
                            stationIDs.Add(station.stationID);
                        }
                        _filterDetail.Stations = stationIDs;
                        _filterDetail.StationID = 0;
                    }
                    else if (_stations.Count == 1)
                    {
                        // If only one station selected then we need to set the station ID list based upon
                        // the selected range.
                        _filterDetail.Stations = new List<long>();
                        _filterDetail.StationID = _stations[0].stationID;
                        int range = _filterDetail.Range;
                        List<long> systemIDs = new List<long>();
                        if (range > 0)
                        {
                            // If range is greater than 0 then find the IDs of any systems within range.
                            systemIDs = SolarSystemDistances.GetSystemsInRange(
                               Stations.GetStation(_filterDetail.StationID).solarSystemID, range);
                        }
                        if (range != -1)
                        {
                            // If range is anything except -1 then add the stations in all of the solar systems
                            // in range to the list of stations in the filter.
                            systemIDs.Add(Stations.GetStation(_filterDetail.StationID).solarSystemID);
                            foreach (long systemID in systemIDs)
                            {
                                stationIDs.AddRange(Stations.GetStationsInSystem(systemID));
                            }
                        }
                        else
                        {
                            // If the range is -1 then we just want the one station...
                            stationIDs.Add(_filterDetail.StationID);
                        }
                        _filterDetail.Stations = stationIDs;
                    }

                    GroupLocations.StoreLocation(_filterDetail);
                    done = true;
                }
                catch (Exception ex)
                {
                    EMMAException emmaEx = ex as EMMAException;
                    if (emmaEx == null)
                    {
                        emmaEx = new EMMAException(ExceptionSeverity.Error, "Problem storing custom location.", ex);
                    }
                    MessageBox.Show(emmaEx.Message + ": " + ex.Message, "Error",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            return done;
        }
        private void LoadOldEMMAData(object parameterData)
        {
            LoadOldDataParams parameters = (LoadOldDataParams)parameterData;
            string tmpLoadDir = parameters.dataDirectory;
            APICharacter character = parameters.character;
            CharOrCorp corc = parameters.corc;

            try
            {
                int maxStatus = 6;
                UpdateStatus(1, maxStatus, "Importing Data", "Loading Journal (" +
                    (new FileInfo(tmpLoadDir + "Journal.xml").Length / 1024).ToString() + " Kb)", false);
                Journal journ = new Journal();
                journ.StatusChange += new StatusChangeHandler(child_StatusChange);
                journ.LoadOldEmmaXML(tmpLoadDir + "Journal.xml", character.CharID,
                    corc == CharOrCorp.Corp ? character.CorpID : 0);
                UpdateStatus(2, maxStatus, "Importing Data", "Loading Transactions (" +
                    (new FileInfo(tmpLoadDir + "Transactions.xml").Length / 1024).ToString() + " Kb)", false);
                Transactions trans = new Transactions();
                trans.StatusChange += new StatusChangeHandler(child_StatusChange);
                trans.LoadOldEmmaXML(tmpLoadDir + "Transactions.xml", character.CharID,
                    corc == CharOrCorp.Corp ? character.CorpID : 0);
                UpdateStatus(3, maxStatus, "Importing Data", "Loading Contracts (" +
                    (new FileInfo(tmpLoadDir + "Contracts.xml").Length / 1024).ToString() + " Kb) and Contract " +
                    "Items (" + (new FileInfo(tmpLoadDir + "ContractItems.xml").Length / 1024).ToString() + " Kb)",
                    false);
                Contracts cont = new Contracts();
                cont.StatusChange += new StatusChangeHandler(child_StatusChange);
                cont.LoadOldEmmaXML(tmpLoadDir + "Contracts.xml", tmpLoadDir + "ContractItems.xml",
                    corc == CharOrCorp.Char ? character.CharID : character.CorpID);
                // Just need this 'if' for backwards compatibility...
                if (File.Exists(tmpLoadDir + "ShareTrans.xml"))
                {
                    UpdateStatus(4, maxStatus, "Importing Data", "Loading Share Transactions (" +
                        (new FileInfo(tmpLoadDir + "ShareTrans.xml").Length / 1024).ToString() + " Kb)", false);
                    ShareTransactions shareTrans = new ShareTransactions();
                    shareTrans.StatusChange += new StatusChangeHandler(child_StatusChange);
                    shareTrans.LoadOldEmmaXML(tmpLoadDir + "ShareTrans.xml", UserAccount.CurrentGroup.ID);

                    /*
                    UpdateStatus(5, maxStatus, "Importing Data", "Loading Characters (" +
                        (new FileInfo(tmpLoadDir + "APIKeyInfo.xml").Length / 1024).ToString() + " Kb)", false);
                    Names.LoadOldEmmaXML(tmpLoadDir + "APIKeyInfo.xml");
                    UpdateStatus(6, maxStatus, "Importing Data", "Loading Traded Items (" +
                        (new FileInfo(tmpLoadDir + "TradedItems.xml").Length / 1024).ToString() + " Kb)", false);
                    UserAccount.CurrentGroup.ItemsTraded.LoadOldEmmaXML(tmpLoadDir + "TradedItems.xml");
                    */
                }

                UpdateStatus(maxStatus - 1, maxStatus, "Tidying up", "", false);
                Directory.Delete(tmpLoadDir, true);
                UpdateStatus(maxStatus, maxStatus, "Import Complete", "", true);

            }
            catch (ThreadAbortException abortEx)
            {
                // User has closed the progress dialog so just throw the exception to the next level.
                throw abortEx;
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Problem importing old EMMA data", ex);
                }
                UpdateStatus(-1, -1, "Error", ex.Message, true);
            }
        }
        private void ViewUnacknowledgedOrders_Load(object sender, EventArgs e)
        {
            try
            {
                _orders = new OrdersList();
                //_ordersBindingSource = new BindingSource();
                //_ordersBindingSource.DataSource = _orders;

                DataGridViewCellStyle iskStyle = new DataGridViewCellStyle(PriceColumn.DefaultCellStyle);
                iskStyle.Format = IskAmount.FormatString();
                PriceColumn.DefaultCellStyle = iskStyle;
                DataGridViewCellStyle dayStyle = new DataGridViewCellStyle(DurationColumn.DefaultCellStyle);
                dayStyle.Format = "# Days;-# Days;# Days";
                DurationColumn.DefaultCellStyle = dayStyle;

                ordersGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
                ordersGrid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
                ordersGrid.AutoGenerateColumns = false;

                //ordersGrid.DataSource = _ordersBindingSource;
                DateTimeColmun.DataPropertyName = "Date";
                OwnerColumn.DataPropertyName = "Owner";
                ItemColumn.DataPropertyName = "Item";
                PriceColumn.DataPropertyName = "Price";
                StationColumn.DataPropertyName = "Station";
                TypeColumn.DataPropertyName = "Type";
                QuantityColumn.DataPropertyName = "TotalVol";
                RangeColumn.DataPropertyName = "RangeText";
                DurationColumn.DataPropertyName = "Duration";
                AcknowledgeColumn.Image = icons.Images["tick.gif"];
                ordersGrid.CellContentClick += new DataGridViewCellEventHandler(ordersGrid_CellContentClick);

                //ordersGrid.Sort(DateTimeColmun, ListSortDirection.Ascending);
                List<SortInfo> sort = new List<SortInfo>();
                sort.Add(new SortInfo(0, "Date"));
                ordersGrid.GridSortInfo = sort;

                UserAccount.Settings.GetColumnWidths(this.Name, ordersGrid);

                _lastNumberOfOrders = 0;
                this.FormClosing += new FormClosingEventHandler(ViewUnacknowledgedOrders_FormClosing);
                DisplayOrders();
            }
            catch (Exception ex)
            {
                // Creating new EMMAexception will cause error to be logged.
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Critical, "Error setting up orders form", ex);
                }
                MessageBox.Show("Problem setting up unacknowledged orders view.\r\nCheck " + Globals.AppDataDir + "Logging\\ExceptionLog.txt" +
                    " for details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void DoExport2(object datagridview)
        {
            // Just wait to make sure the progress dialog is displayed
            Thread.Sleep(100);
            DataGridView table = datagridview as DataGridView;

            try
            {
                string filename = _filename;
                string directory = filename.Remove(filename.LastIndexOf(Path.DirectorySeparatorChar));
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
                UserAccount.Settings.CSVExportDir = directory;
                if (File.Exists(filename))
                {
                    File.Delete(filename);
                }

                StringBuilder line = new StringBuilder();
                StreamWriter writer = File.CreateText(filename);
                try
                {
                    List<int> visibleColumns = new List<int>();

                    // Get column names..
                    UpdateStatus(0, table.Rows.Count + 1, "Writing column headers..", "", false);
                    for (int col = 0; col < table.Columns.Count; col++)
                    {
                        DataGridViewColumn column = table.Columns[col];
                        if (column.Visible)
                        {
                            if (line.Length > 0) { line.Append(","); }
                            line.Append(column.HeaderText);
                            visibleColumns.Add(col);
                        }
                    }
                    UpdateStatus(1, table.Rows.Count + 1, "Writing column headers..", "Done", false);
                    // ..then output the data.
                    for (int row = 0; row < table.Rows.Count; row++)
                    {
                        UpdateStatus(row + 1, table.Rows.Count + 1, "Writing data..", "", false);
                        line = new StringBuilder();
                        for (int i = 0; i < visibleColumns.Count; i++)
                        {
                            if (line.Length > 0) { line.Append(","); }
                            line.Append(table[visibleColumns[i], row].Value.ToString());
                        }
                        writer.WriteLine(line.ToString());
                    }
                    UpdateStatus(0, 0, "", "Done", false);
                }
                finally
                {
                    writer.Close();
                }

                UpdateStatus(0, 0, "CSV created successfully", "", true);
            }
            catch (Exception ex)
            {
                // Creating new EMMAexception will cause error to be logged.
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Error, "Error exporting to CSV", ex);
                }
                UpdateStatus(0, 0, "Error", "Problem exporting to CSV.\r\nCheck " + Globals.AppDataDir + "Logging\\ExceptionLog.txt" +
                    " for details.", true);
            }
        }
        private void ViewTrans_Load(object sender, EventArgs e)
        {
            try
            {
                _transactions = new TransactionList();
                _transBindingSource = new BindingSource();
                _transBindingSource.DataSource = _transactions;

                DataGridViewCellStyle style = new DataGridViewCellStyle(PriceColumn.DefaultCellStyle);
                style.Format = IskAmount.FormatString();
                PriceColumn.DefaultCellStyle = style;
                TotalValueColumn.DefaultCellStyle = style;
                UnitProfitColumn.DefaultCellStyle = style;

                transactionGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
                transactionGrid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

                transactionGrid.DataSource = _transBindingSource;
                IDColumn.DataPropertyName = "Id";
                DateTimeColumn.DataPropertyName = "Datetime";
                ItemColumn.DataPropertyName = "Item";
                PriceColumn.DataPropertyName = "Price";
                BuyerColumn.DataPropertyName = "Buyer";
                QuantityColumn.DataPropertyName = "Quantity";
                TotalValueColumn.DataPropertyName = "Total";
                SellerColumn.DataPropertyName = "Seller";
                BuyerCharacterColumn.DataPropertyName = "BuyerChar";
                SellerCharacterColumn.DataPropertyName = "SellerChar";
                StationColumn.DataPropertyName = "Station";
                RegionColumn.DataPropertyName = "Region";
                BuyerIDColumn.DataPropertyName = "BuyerID";
                SellerIDColumn.DataPropertyName = "SellerID";
                BuyerCharIDColumn.DataPropertyName = "BuyerCharID";
                SellerCharIDColumn.DataPropertyName = "SellerCharID";
                BuyerWalletColumn.DataPropertyName = "BuyerWallet";
                SellerWalletColumn.DataPropertyName = "SellerWallet";
                UnitProfitColumn.DataPropertyName = UserAccount.Settings.CalcProfitInTransView ?
                    "GrossUnitProfit" : "PureGrossUnitProfit";

                UserAccount.Settings.GetColumnWidths(this.Name, transactionGrid);

                dtpEndDate.Value = DateTime.Now;
                dtpStartDate.Value = DateTime.Now.AddDays(-2);

                dtpEndDate.DropDown+=new EventHandler(dtpEndDate_DropDown);
                dtpEndDate.CloseUp+=new EventHandler(dtpEndDate_CloseUp);
                dtpEndDate.KeyDown += new KeyEventHandler(dtpEndDate_KeyDown);
                dtpEndDate.Leave += new EventHandler(dtpEndDate_Leave);

                dtpStartDate.DropDown += new EventHandler(dtpStartDate_DropDown);
                dtpStartDate.CloseUp += new EventHandler(dtpStartDate_CloseUp);
                dtpStartDate.KeyDown += new KeyEventHandler(dtpStartDate_KeyDown);
                dtpStartDate.Leave += new EventHandler(dtpStartDate_Leave);

                List<CharCorpOption> charcorps = UserAccount.CurrentGroup.GetCharCorpOptions(
                    APIDataType.Transactions);
                _possibleOwners = new List<long>();
                foreach (CharCorpOption chop in charcorps)
                {
                    _possibleOwners.Add(chop.Corp ? chop.CharacterObj.CorpID : chop.CharacterObj.CharID);
                }
                cmbOwner.DisplayMember = "Name";
                cmbOwner.ValueMember = "Data";
                charcorps.Sort();
                cmbOwner.DataSource = charcorps;
                cmbOwner.SelectedValue = 0;
                cmbOwner.SelectedIndexChanged += new EventHandler(cmbOwner_SelectedIndexChanged);
                cmbOwner.Enabled = false;
                chkIngoreOwner.Checked = true;
                chkIngoreOwner.CheckedChanged += new EventHandler(chkIngoreOwner_CheckedChanged);

                cmbWallet.SelectedIndexChanged += new EventHandler(cmbWallet_SelectedIndexChanged);
                cmbType.SelectedIndexChanged += new EventHandler(cmbType_SelectedIndexChanged);

                _recentItems = UserAccount.CurrentGroup.Settings.RecentItems;
                _recentItems.Sort();
                cmbItem.Items.AddRange(_recentItems.ToArray());
                cmbItem.AutoCompleteSource = AutoCompleteSource.ListItems;
                cmbItem.AutoCompleteMode = AutoCompleteMode.Suggest;
                cmbItem.KeyDown += new KeyEventHandler(cmbItem_KeyDown);
                cmbItem.SelectedIndexChanged += new EventHandler(cmbItem_SelectedIndexChanged);
                cmbItem.Tag = 0;

                _recentStations = UserAccount.CurrentGroup.Settings.RecentStations;
                _recentStations.Sort();
                cmbStation.Items.AddRange(_recentStations.ToArray());
                cmbStation.AutoCompleteSource = AutoCompleteSource.ListItems;
                cmbStation.AutoCompleteMode = AutoCompleteMode.Suggest;
                cmbStation.KeyDown += new KeyEventHandler(cmbStation_KeyDown);
                cmbStation.SelectedIndexChanged += new EventHandler(cmbStation_SelectedIndexChanged);
                cmbStation.Tag = 0;

                chkCalcProfit.Checked = UserAccount.Settings.CalcProfitInTransView;
                chkCalcProfit.CheckedChanged += new EventHandler(chkCalcProfit_CheckedChanged);

                this.FormClosing += new FormClosingEventHandler(ViewTransactions_FormClosing);
                DisplayWallets();
                chkIgnoreWallet.CheckedChanged += new EventHandler(chkIgnoreWallet_CheckedChanged);
                DisplayTrans();
            }
            catch (Exception ex)
            {
                // Creating new EMMAexception will cause error to be logged.
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Critical, "Error setting up transactions form", ex);
                }
                MessageBox.Show("Problem setting up transactions view.\r\nCheck " + Globals.AppDataDir + "Logging\\ExceptionLog.txt" +
                    " for details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private bool StoreData()
        {
            bool retVal = true;

            try
            {
                _corpData.Name = txtName.Text;
                _corpData.Description = txtDescription.Text;
                _corpData.Ticker = txtTicker.Text;
                _corpData.NAVDate = dtpNavDate.Value.ToUniversalTime();
                _corpData.CEO = txtCEO.Text;
                _corpData.Bank = chkBank.Checked;
                _corpData.PayoutPeriod = (CorpPayoutPeriod)cmbPayoutPeriod.SelectedValue;
                _corpData.CorpRiskRating = (RiskRating)cmbRiskRating.SelectedValue;

                PublicCorps.StoreCorp(_corpData);

                if (_corpData.ShareValue != _oldShareVal)
                {
                    ShareValueHistory.SetShareValue(_corpData.ID, DateTime.UtcNow, _corpData.ShareValue);
                }
                if (_corpData.Bank && _corpData.ExpectedPayout != _oldInterestRate)
                {
                    if (MessageBox.Show("The interest rate has been changed.\r\nDo you wish to recalculate all " +
                        "historical interest payments using the new rate?", "Question",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        BankAccounts.ClearAllInterestPayments(_corpData.ID);
                    }
                }
            }
            catch (Exception ex)
            {
                EMMAException emmaex = ex as EMMAException;
                if(emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Error, "Problem storing public corp data", ex);
                }
                MessageBox.Show("Error storing corp data: " + ex.Message, "Error", MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                retVal = false;
            }

            return retVal;
        }
        private void MaintBankAccount_Load(object sender, EventArgs e)
        {
            try
            {
                if (_oldCorpData != null)
                {
                    cmbAccountCorp.Enabled = false;
                    if (_oldCorpData.OwnerID != 0)
                    {
                        cmbOwner.Enabled = false;
                    }
                }

                _corpData = PublicCorps.GetAll(true, false);
                _corpData.Sort("Name ASC");
                cmbAccountCorp.DisplayMember = "Name";
                cmbAccountCorp.ValueMember = "ID";
                cmbAccountCorp.DataSource = _corpData;
                if (_oldCorpData != null)
                {
                    cmbAccountCorp.SelectedValue = _oldCorp;
                }

                cmbAccountCorp.SelectedIndexChanged += new EventHandler(cmbAccountCorp_SelectedIndexChanged);
                cmbOwner.SelectedIndexChanged += new EventHandler(cmbOwner_SelectedIndexChanged);

                if (_corp == null)
                {
                    _corp = new PublicCorp();
                }
                CorpChanged();

                //DisplayOwners();
                //DisplayData();
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Problem loading " +
                        "bank account window", ex);
                }
                MessageBox.Show("Problem loading bank account window: " + ex.Message, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void DisplayData()
        {
            try
            {
                _accountExists = _oldCorpData != null;

                if (cmbOwner.SelectedValue != null && (_oldOwner == 0 || _oldCorpData == null))
                {
                    long newOwner = ((CharCorp)cmbOwner.SelectedValue).ID;
                    //if (_lastOwner > 0 && _lastOwner != newOwner && _lastCorp > 0)
                    //{
                    //    BankAccounts.DeleteAccount(_lastCorp, _lastOwner);
                    //}
                    _corp.OwnerID = newOwner;
                    //_corp.ReloadBankAccountDetails();
                }

                _lastOwner = _corp.OwnerID;

                if ((_oldCorpData == null || _oldOwner <= 0) && _corp.ID > 0 && _corp.OwnerID > 0)
                {
                    // Account does not exist, we must create it.
                    BankAccounts.StoreAccount(_corp, UserAccount.CurrentGroup.ID, _corp.OwnerID);
                    _accountExists = true;
                }

                if (_accountExists)
                {
                    btnDeposit.Enabled = true;
                    btnWithdraw.Enabled = true;
                    btnRecalcInterest.Enabled = true;
                    btnAdjust.Enabled = true;
                    btnDelete.Enabled = true;

                    lblBalance.Text = new IskAmount(_corp.AmountInAccount).ToString();
                    lblInterest.Text = new IskAmount(_corp.TotalInterest).ToString();

                    _trans = BankAccounts.GetAccountTransactions(_corp.BankAccountID);
                    _bindingSource.DataSource = _trans;
                    SetFilter();

                    DataGridViewCellStyle iskStyle = new DataGridViewCellStyle(AmountColumn.DefaultCellStyle);
                    iskStyle.Format = IskAmount.FormatString();
                    AmountColumn.DefaultCellStyle = iskStyle;

                    TransHistoryGrid.AutoGenerateColumns = false;
                    DateColumn.DataPropertyName = "Date";
                    AmountColumn.DataPropertyName = "Change";
                    TypeColumn.DataPropertyName = "TypeDescription";
                    TransHistoryGrid.DataSource = _bindingSource;

                    DataGridViewColumn sortColumn = DateColumn;
                    ListSortDirection sortDirection = ListSortDirection.Descending;
                    if (TransHistoryGrid.SortedColumn != null) { sortColumn = TransHistoryGrid.SortedColumn; }
                    if (TransHistoryGrid.SortOrder == SortOrder.Ascending)
                    {
                        sortDirection = ListSortDirection.Ascending;
                    }
                    TransHistoryGrid.Sort(sortColumn, sortDirection);
                }
                else
                {
                    btnDeposit.Enabled = false;
                    btnWithdraw.Enabled = false;
                    btnRecalcInterest.Enabled = false;
                    btnAdjust.Enabled = false;
                    btnDelete.Enabled = false;
                }
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Problem refreshing " +
                        "bank account window", ex);
                }
                MessageBox.Show("Problem refreshing bank account window: " + ex.Message, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.Close();
            }
        }
        private bool Store()
        {
            bool retVal = true ;

            try
            {
                _dividend.Date = dtpDate.Value;
                _dividend.CorpID = (int)cmbCorp.SelectedValue;
                Dividends.StoreDividend(_dividend);
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Problem storing dividend data", ex);
                }
                MessageBox.Show("Error storing dividend data: " + ex.Message, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
                retVal = false;
            }

            return retVal;
        }
        private void ViewAssets_Load(object sender, EventArgs e)
        {
            Diagnostics.ResetAllTimers();
            try
            {
                Diagnostics.StartTimer("ViewAssets");
                Diagnostics.StartTimer("ViewAssets.Part1");
                DataGridViewCellStyle style = new DataGridViewCellStyle(CostColumn.DefaultCellStyle);
                style.Format = IskAmount.FormatString();
                CostColumn.DefaultCellStyle = style;

                _assets = new AssetList();
                _assetsBindingSource = new BindingSource();
                _assetsBindingSource.DataSource = _assets;

                AssetsGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
                AssetsGrid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

                AssetsGrid.DataSource = _assetsBindingSource;
                OwnerColumn.DataPropertyName = "Owner";
                ItemColumn.DataPropertyName = "Item";
                LocationColumn.DataPropertyName = "Location";
                QuantityColumn.DataPropertyName = "Quantity";
                AutoConExcludeColumn.DataPropertyName = "AutoConExclude";
                ReprocessorExcludeColumn.DataPropertyName = "ReprocessorExclude";
                StatusColumn.DataPropertyName = "Status";
                CostColumn.DataPropertyName = UserAccount.Settings.CalcCostInAssetView ? "UnitBuyPrice" : "PureUnitBuyPrice";
                //_regularStyle = OwnerColumn.DefaultCellStyle.Clone();
                //_inTransitStyle = OwnerColumn.DefaultCellStyle.Clone();
                //_inTransitStyle.BackColor = Color.Yellow;

                UserAccount.Settings.GetColumnWidths(this.Name, AssetsGrid);

                _recentItems.Sort();
                cmbItem.Items.AddRange(_recentItems.ToArray());
                cmbItem.AutoCompleteSource = AutoCompleteSource.ListItems;
                cmbItem.AutoCompleteMode = AutoCompleteMode.Suggest;
                cmbItem.KeyDown += new KeyEventHandler(cmbItem_KeyDown);
                cmbItem.SelectedIndexChanged += new EventHandler(cmbItem_SelectedIndexChanged);
                cmbItem.Tag = 0;
                Diagnostics.StopTimer("ViewAssets.Part1");

                Diagnostics.StartTimer("ViewAssets.Part2");
                List<CharCorpOption> charcorps = UserAccount.CurrentGroup.GetCharCorpOptions(APIDataType.Assets);
                _corporateOwners = new List<long>();
                _personalOwners = new List<long>();
                foreach (CharCorpOption chop in charcorps)
                {
                    if (chop.Corp)
                    {
                        _corporateOwners.Add(chop.CharacterObj.CorpID);
                    }
                    else
                    {
                        _personalOwners.Add(chop.CharacterObj.CharID);
                    }
                }
                cmbOwner.DisplayMember = "Name";
                cmbOwner.ValueMember = "Data";
                charcorps.Sort();
                cmbOwner.DataSource = charcorps;
                cmbOwner.SelectedValue = 0;
                cmbOwner.Enabled = false;
                cmbOwner.SelectedIndexChanged += new EventHandler(cmbOwner_SelectedIndexChanged);
                chkIngoreOwner.Checked = true;
                chkIngoreOwner.CheckedChanged += new EventHandler(chkIngoreOwner_CheckedChanged);
                chkCalcCost.Checked = UserAccount.Settings.CalcCostInAssetView;
                chkCalcCost.CheckedChanged += new EventHandler(chkCalcCost_CheckedChanged);
                Diagnostics.StopTimer("ViewAssets.Part2");

                Diagnostics.StartTimer("ViewAssets.Part3");
                //DisplayAssets();
                BuildAccessList();
                DisplayTree();
                Diagnostics.StopTimer("ViewAssets.Part3");

                assetsTree.AfterExpand += new TreeViewEventHandler(assetsTree_AfterExpand);
                assetsTree.AfterSelect += new TreeViewEventHandler(assetsTree_AfterSelect);
                this.FormClosing += new FormClosingEventHandler(ViewAssets_FormClosing);

                Diagnostics.StopTimer("ViewAssets");
                Diagnostics.DisplayDiag("View assets setup time: " +
                    Diagnostics.GetRunningTime("ViewAssets").ToString() +
                    "\r\n  Initalise: " + Diagnostics.GetRunningTime("ViewAssets.Part1").ToString() +
                    "\r\n  Setup owners: " + Diagnostics.GetRunningTime("ViewAssets.Part2").ToString() +
                    "\r\n  Display Tree: " + Diagnostics.GetRunningTime("ViewAssets.Part3").ToString());
            }
            catch (Exception ex)
            {
                // Creating new EMMAexception will cause error to be logged.
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Critical, "Error setting up assets form", ex);
                }
                MessageBox.Show("Problem setting up assets view.\r\nCheck " + Globals.AppDataDir + "Logging\\ExceptionLog.txt" +
                    " for details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void UpdateOrdersFromXML(CharOrCorp corc, XmlDocument fileXML)
        {
            EMMADataSet.OrdersDataTable orderData = new EMMADataSet.OrdersDataTable();
            int added = 0;
            int updated = 0;

            try
            {

                Orders.SetProcessed(corc == CharOrCorp.Corp ? _corpID : _charID, false);

                XmlNodeList orderEntries = null;
                XmlDocument xml = new XmlDocument();

                UpdateStatus(0, 1, "Getting orders from file", "", false);
                orderEntries = EveAPI.GetResults(fileXML);
                UpdateStatus(1, 1, "", orderEntries.Count + " orders found in file.", false);

                if (orderEntries != null && orderEntries.Count > 0)
                {
                    UpdateStatus(0, orderEntries.Count, "Processing orders", "", false);

                    foreach (XmlNode orderEntry in orderEntries)
                    {
                        EMMADataSet.OrdersRow orderRow = BuildOrdersRow(orderData, orderEntry, corc);
                        int id = 0;

                        if (!Orders.Exists(orderData, orderRow, ref id, _corpID, _charID))
                        {
                            // Order does not exist in the database so add it.
                            orderData.AddOrdersRow(orderRow);
                            if (orderRow.OrderState == (short)OrderState.ExpiredOrFilled)
                            {
                                bool notify = false;
                                notify = UserAccount.CurrentGroup.Settings.OrdersNotifyEnabled &&
                                    ((UserAccount.CurrentGroup.Settings.OrdersNotifyBuy && orderRow.BuyOrder) ||
                                    (UserAccount.CurrentGroup.Settings.OrdersNotifySell && !orderRow.BuyOrder));
                                if (notify)
                                {
                                    orderRow.OrderState = (short)OrderState.ExpiredOrFilledAndUnacknowledged;
                                }
                                else
                                {
                                    orderRow.OrderState = (short)OrderState.ExpiredOrFilledAndAcknowledged;
                                }
                            }
                            added++;
                        }
                        else
                        {
                            EMMADataSet.OrdersRow oldRow = orderData.FindByID(id);

                            if (oldRow.TotalVol == orderRow.TotalVol &&
                                oldRow.RemainingVol == orderRow.RemainingVol &&
                                oldRow.MinVolume == orderRow.MinVolume && oldRow.Range == orderRow.Range &&
                                oldRow.Duration == orderRow.Duration && oldRow.Escrow == orderRow.Escrow &&
                                oldRow.Price == orderRow.Price && oldRow.OrderState == orderRow.OrderState &&
                                oldRow.EveOrderID == orderRow.EveOrderID)
                            {
                                // If the order from the XML exactly matches what we have in the database
                                // then just set the processed flag and remove it from the orderData table
                                // without setting it to be removed from the database.
                                //Orders.SetProcessedByID(oldRow.ID, true);
                                orderData.RemoveOrdersRow(oldRow);
                            }
                            else
                            {
                                // Set the row to processed right now.
                                oldRow.Processed = true;
                                // Accept the changes to the row (will only be the processed flag at
                                // this point) and set the processed flag on the database.
                                // This will prevent the row from being double matched with another
                                // order later.
                                // The 'accept changes' will prevent the concurency error that we
                                // would get if we only updated the processed flag on the database
                                // side.
                                oldRow.AcceptChanges();
                                //Orders.SetProcessedByID(oldRow.ID, true);

                                // If the order was active and is now completed/expired then flag it for
                                // the unacknowledged orders viewer to display.
                                bool notify = false;
                                notify = UserAccount.CurrentGroup.Settings.OrdersNotifyEnabled &&
                                    ((UserAccount.CurrentGroup.Settings.OrdersNotifyBuy && orderRow.BuyOrder) ||
                                    (UserAccount.CurrentGroup.Settings.OrdersNotifySell && !orderRow.BuyOrder));

                                if (/*orderRow.RemainingVol == 0 &&*/
                                    orderRow.OrderState == (short)OrderState.ExpiredOrFilled &&
                                    (oldRow.OrderState == (short)OrderState.Active ||
                                    oldRow.OrderState == (short)OrderState.ExpiredOrFilled))
                                {
                                    if (notify)
                                    {
                                        oldRow.OrderState = (short)OrderState.ExpiredOrFilledAndUnacknowledged;
                                        // No longer needed as the unacknowledged orders form is displayed/refreshed
                                        // as needed when refreshing the main form after an update is complete.
                                        //if (UpdateEvent != null)
                                        //{
                                        //    UpdateEvent(this, new APIUpdateEventArgs(APIDataType.Orders,
                                        //        corc == CharOrCorp.Corp ? _corpID : _charID,
                                        //        APIUpdateEventType.OrderHasExpiredOrCompleted));
                                        //}
                                    }
                                    else
                                    {
                                        oldRow.OrderState = (short)OrderState.ExpiredOrFilledAndAcknowledged;
                                    }
                                }
                                else if (orderRow.OrderState != (short)OrderState.ExpiredOrFilled)
                                {
                                    oldRow.OrderState = orderRow.OrderState;
                                }

                                if (oldRow.TotalVol != orderRow.TotalVol ||
                                    oldRow.RemainingVol != orderRow.RemainingVol ||
                                    oldRow.MinVolume != orderRow.MinVolume || oldRow.Range != orderRow.Range ||
                                    oldRow.Duration != orderRow.Duration || oldRow.Escrow != orderRow.Escrow ||
                                    oldRow.Price != orderRow.Price || oldRow.EveOrderID != orderRow.EveOrderID)
                                {
                                    oldRow.TotalVol = orderRow.TotalVol;
                                    oldRow.RemainingVol = orderRow.RemainingVol;
                                    oldRow.MinVolume = orderRow.MinVolume;
                                    oldRow.Range = orderRow.Range;
                                    oldRow.Duration = orderRow.Duration;
                                    oldRow.Escrow = orderRow.Escrow;
                                    oldRow.Price = orderRow.Price;
                                    oldRow.EveOrderID = orderRow.EveOrderID;
                                    // Note, only other fields are 'buyOrder' and 'issued'. Neither of which we want to change.
                                    updated++;
                                }
                            }
                        }

                        UpdateStatus(added + updated, orderEntries.Count, "", "", false);
                    }
                }

                UpdateStatus(0, 0, added + " orders added to database.", "", false);
                UpdateStatus(0, 0, updated + " orders updated.", "", true);

                if (orderData.Count > 0)
                {
                    Orders.Store(orderData);
                }

                Orders.FinishUnProcessed(corc == CharOrCorp.Corp ? _corpID : _charID);
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    // If we've caught a standard exception rather than an EMMA one then log it by creating a
                    // new exception.
                    // Note that we don't need to actually throw it..
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Error when adding market orders", ex);
                }

                SetLastAPIUpdateError(corc, APIDataType.Orders, ex.Message);
                UpdateStatus(-1, 0, "Error", ex.Message, true);
            }

            if (UpdateEvent != null)
            {
                UpdateEvent(this, new APIUpdateEventArgs(APIDataType.Orders,
                    corc == CharOrCorp.Char ? _charID : _corpID,
                    APIUpdateEventType.UpdateCompleted));
            }
        }
        /// <summary>
        /// Update the database transactions table from the specified XML.
        /// </summary>
        /// <param name="corc"></param>
        /// <param name="fileXML"></param>
        /// <returns></returns>
        private int UpdateTransactionsFromXML(CharOrCorp corc, XmlDocument fileXML, short walletID)
        {
            int retVal = 0;
            EMMADataSet.TransactionsDataTable transData = new EMMADataSet.TransactionsDataTable();
            long highestIDSoFar = _apiSettings.GetHighestID(corc, APIDataType.Transactions);
            long highestID = 0;
            DateTime ticker = DateTime.UtcNow.AddSeconds(-10);

            try
            {
                int updated = 0;

                XmlNodeList transEntries = null;
                XmlDocument xml = new XmlDocument();

                UpdateStatus(0, 1, "Getting transactions from file", "", false);
                transEntries = EveAPI.GetResults(fileXML);
                UpdateStatus(1, 1, "", transEntries.Count + " entries found in file.", false);

                if (transEntries != null && transEntries.Count > 0)
                {
                    int batchPrg = 0;
                    UpdateStatus(0, transEntries.Count, "Processing transactions", "", false);

                    XmlNode entryIDNode = transEntries[0].SelectSingleNode("@transactionID");
                    //long fileMaxID = long.Parse(entryIDNode.Value,
                    //    System.Globalization.CultureInfo.InvariantCulture.NumberFormat);

                    // Loop through the results returned from this call to the API and add the line to
                    // the data table if the transactionID is not already in the database.
                    foreach (XmlNode transEntry in transEntries)
                    {
                        XmlNode transIDNode = transEntry.SelectSingleNode("@transactionID");
                        long transID = long.Parse(transIDNode.Value,
                            System.Globalization.CultureInfo.InvariantCulture.NumberFormat);

                        if (transID > highestID) { highestID = transID; }

                        //if (transID > highestIDSoFar)
                        //{
                        if (!Transactions.TransactionExists(transData, transID) &&
                            transData.FindByID(transID) == null)
                        {
                            // Actually create the line and add it to the data table
                            SortedList<long, string> nameIDs = new SortedList<long, string>();
                            EMMADataSet.TransactionsRow newRow = BuildTransRow(transID, transData,
                                transEntry, walletID, nameIDs, false);

                            transData.AddTransactionsRow(newRow);
                            retVal++;

                            // This section searches the character, item and station ref type tables
                            // for the values used in this new transaction entry.
                            // If they are not present in the table then they are added.
                            #region Check other tables and add values if needed.
                            foreach (KeyValuePair<long, string> checkName in nameIDs)
                            {
                                Names.AddName(checkName.Key, checkName.Value);
                            }
                            Items.AddItem(newRow.ItemID, transEntry.SelectSingleNode("@typeName").Value);
                            #endregion
                        }
                        else
                        {
                            SortedList<long, string> nameIDs = new SortedList<long, string>();
                            // We've got a transaction that already exists in the database,
                            // update the row with additional data if available.
                            EMMADataSet.TransactionsRow newRow =
                                BuildTransRow(transID, transData, transEntry, walletID, nameIDs, true);
                            EMMADataSet.TransactionsRow oldRow = transData.FindByID(transID);
                            bool updateDone = false;

                            if (newRow.BuyerWalletID != oldRow.BuyerWalletID && newRow.BuyerWalletID != 0)
                            {
                                oldRow.BuyerWalletID = newRow.BuyerWalletID;
                                updateDone = true;
                            }
                            if (newRow.SellerWalletID != oldRow.SellerWalletID && newRow.SellerWalletID != 0)
                            {
                                oldRow.SellerWalletID = newRow.SellerWalletID;
                                updateDone = true;
                            }
                            // If a corp sells somthing to another corp (or itself) then we will get into
                            // the position of having the other party set as a character when in fact
                            // it is that character's corp.
                            // We check for this here and correct it if required.
                            if (oldRow.BuyerID == _charID && newRow.BuyerID == _corpID)
                            {
                                oldRow.BuyerID = newRow.BuyerID;
                                oldRow.BuyerCharacterID = newRow.BuyerCharacterID;
                                oldRow.BuyerWalletID = newRow.BuyerWalletID;
                                oldRow.BuyerForCorp = newRow.BuyerForCorp;
                                updateDone = true;
                            }
                            if (oldRow.SellerID == _charID && newRow.SellerID == _corpID)
                            {
                                oldRow.SellerID = newRow.SellerID;
                                oldRow.SellerCharacterID = newRow.SellerCharacterID;
                                oldRow.SellerWalletID = newRow.SellerWalletID;
                                oldRow.SellerForCorp = newRow.SellerForCorp;
                                updateDone = true;
                            }

                            if (updateDone)
                            {
                                updated++;
                            }
                        }
                        //}

                        batchPrg++;
                        UpdateStatus(batchPrg, transEntries.Count, "", "", false);
                    }
                }

                if (highestID > highestIDSoFar)
                {
                    SetHighestID(corc, APIDataType.Transactions, highestID);
                }

                UpdateStatus(0, 0, retVal + " transactions added to database.", "", false);
                UpdateStatus(0, 0, updated + " transactions updated.", "", false);

                if (transData.Count > 0)
                {
                    Transactions.Store(transData);

                    UpdateStatus(1, 1, "", "Complete", true);
                }

            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    // If we've caught a standard exception rather than an EMMA one then log it be creating a
                    // new exception.
                    // Note that we don't need to actually throw it..
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Error when adding transactions", ex);
                }

                SetLastAPIUpdateError(corc, APIDataType.Transactions, ex.Message);
                UpdateStatus(-1, 0, "Error", ex.Message, true);
            }

            if (UpdateEvent != null)
            {
                UpdateEvent(this, new APIUpdateEventArgs(APIDataType.Transactions,
                    corc == CharOrCorp.Char ? _charID : _corpID,
                    APIUpdateEventType.UpdateCompleted));
            }

            return retVal;
        }
Beispiel #22
0
        public Main(bool checkForUpdates)
        {
            Diagnostics.StartTimer("TotalStartupTimer");
            Diagnostics.StartTimer("DisplaySplash");
            splash = new SplashScreen(this);
            Thread t0 = new Thread(ShowSplash);
            t0.Start();
            Diagnostics.StopTimer("DisplaySplash");

            Diagnostics.StartTimer("InitGUI");
            InitializeComponent();
            this.FormClosing += new FormClosingEventHandler(Main_FormClosing);
            // Set main window start state/position/size
            this.StartPosition = FormStartPosition.Manual;
            this.WindowState = EveMarketMonitorApp.Properties.Settings.Default.WindowState;
            if (EveMarketMonitorApp.Properties.Settings.Default.WindowPos.X > 0 &&
                EveMarketMonitorApp.Properties.Settings.Default.WindowPos.X < Screen.PrimaryScreen.WorkingArea.Width &&
                EveMarketMonitorApp.Properties.Settings.Default.WindowPos.Y > 0 &&
                EveMarketMonitorApp.Properties.Settings.Default.WindowPos.Y < Screen.PrimaryScreen.WorkingArea.Height)
            {
                this.Location = EveMarketMonitorApp.Properties.Settings.Default.WindowPos;
            }
            else
            {
                this.Location = new Point(0, 0);
            }
            this.Size = EveMarketMonitorApp.Properties.Settings.Default.WindowSize;
            Diagnostics.StopTimer("InitGUI");

            try
            {
                //splash.ShowMessage("Test Message", "Test", MessageBoxButtons.OK, MessageBoxIcon.Information);
                DateTime start = DateTime.UtcNow;
                // DO ANY SETUP HERE.
                // The splash screen will be showing while these methods are executed.
                Diagnostics.StartTimer("Environment");
                UpdateStatus(0, 0, "Setting up environment", "", false);
                SetupEnvironment();
                Diagnostics.StopTimer("Environment");
                UpdateStatus(0, 0, "Checking Prerequesits", "", false);
                if (Prerequs())
                {
                    Diagnostics.StartTimer("PingChecks");
                    UpdateStatus(0, 0, "Checking remote servers", "", false);
                    PingServers();
                    Diagnostics.StopTimer("PingChecks");
                    Diagnostics.StartTimer("Updates");
                    // Update settings and user database if needed.
                    UpdateStatus(0, 0, "Initalising database", "", false);
                    //try
                    //{
                    checkForUpdates = checkForUpdates && EveMarketMonitorApp.Properties.Settings.Default.AutoUpdate;
                    if (checkForUpdates)
                    {
                        //DateTime lastCheck = Properties.Settings.Default.LastEMMAUpdateCheck;
                        //if (lastCheck.AddHours(5).CompareTo(DateTime.UtcNow) < 0)
                        //{
                        UpdateStatus(0, 0, "Checking for updates", "", false);
                        // Check for updates to EMMA components
                        AutoUpdate();
                        Properties.Settings.Default.LastEMMAUpdateCheck = DateTime.UtcNow;
                        Properties.Settings.Default.Save();
                        //}
                    }
                    Updater.Update();
                    //}
                    //catch (EMMAException)
                    //{
                    //UpdateStatus(0, 0, "Done", "", true);
                    //MessageBox.Show(splash, "Critical error updating EMMA database. For details, see " +
                    //    "\"Logging/ExceptionLog.txt\"", "Ciritcal error",
                    //    MessageBoxButtons.OK, MessageBoxIcon.Error);
                    //}
                    Updater.InitDBs();
                    CheckForDocumentation();
                    Diagnostics.StopTimer("Updates");
                    UpdateStatus(0, 0, "Checking License", "", false);
                    ValidateInstall(false, splash);

                    if (Globals.License != LicenseType.Full &&
                        Globals.License != LicenseType.Lite &&
                        Globals.License != LicenseType.Trial &&
                        Globals.License != LicenseType.Monthly)
                    {
                        this.Close();
                    }
                    else
                    {

                        Diagnostics.StartTimer("MapInit");
                        // Pre-load map data.
                        Map.InitaliseData();
                        UpdateStatus(0, 0, "Getting latest outpost data", "", false);
                        EveAPI.UpdateOutpostData();
                        Diagnostics.StopTimer("MapInit");
                        Diagnostics.StartTimer("AutoLogin");
                        // Log user in if they have auto login turned on
                        AutoLogin();
                        Diagnostics.StopTimer("AutoLogin");
                        //UpdateStatus(0, 0, "Starting program", "", false);

                        // make sure we show the splash screen for a minimum of one second.
                        // ... it looks wierd otherwise.
                        while (start.AddSeconds(1).CompareTo(DateTime.UtcNow) > 0) { }
                    }
                }
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    emmaEx = new EMMAException(ExceptionSeverity.Critical, "Error during startup", ex);
                }
                splash.ShowMessage("Problem during EMMA startup.\r\nCheck " + EMMAException.logFile +
                    " for details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                UpdateStatus(0, 0, "Done", "", true);
                this.Close();
            }
            finally
            {
                Diagnostics.StartTimer("LoadMainForm");
                UpdateStatus(0, 0, "Done", "", true);
                splash = null;
            }
        }
        private void LoadEMMAFile(object filenameData)
        {
            int maxStatus = 7;
            string filename = (string)filenameData;
            string tmpLoadDir = string.Format("{0}Temp{1}Load{1}",
                Globals.AppDataDir, Path.DirectorySeparatorChar);
            UpdateStatus(0, maxStatus, "", "Decompressing files", false);
            try
            {
                Directory.CreateDirectory(tmpLoadDir);
                float saveVersion = Compression.DecompressDirectory(filename, tmpLoadDir);

                if (saveVersion == 0)
                {
                    UpdateStatus(0, 0, "Error: File version is too old", "", true);
                }
                else if (saveVersion == 1)
                {
                    if (filename.ToUpper().EndsWith(".CDAT"))
                    {
                        Dictionary<int, int> IDChanges = new Dictionary<int, int>();
                        try
                        {
                            PublicCorps.LoadOldEmmaXML(tmpLoadDir + "CorpData.xml", ref IDChanges);
                            Dividends.LoadOldEmmaXML(tmpLoadDir + "Dividends.xml", IDChanges);
                            WebLinks.LoadOldEmmaXML(tmpLoadDir + "WebLinks.xml", IDChanges);
                            // Try to link journal entries to the dividends
                            Dividends.UpdateFromJournal(true);
                            UpdateStatus(1, 1, "Complete", "", true);
                        }
                        catch (ThreadAbortException abortEx)
                        {
                            // User has closed the progress dialog so just throw the exception to the next level.
                            throw abortEx;
                        }
                        catch (Exception ex)
                        {
                            EMMAException emmaEx = ex as EMMAException;
                            if (emmaEx == null)
                            {
                                emmaEx = new EMMAException(ExceptionSeverity.Error, "Problem importing old EMMA public corp data", ex);
                            }
                            UpdateStatus(-1, -1, "Error", ex.Message, true);
                        }
                    }
                    else
                    {
                        APICharacter character = UserAccount.CurrentGroup.Accounts[0].Chars[0];
                        CharOrCorp corc = CharOrCorp.Char;

                        // 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)
                        {
                            options.Add(opt.Data, opt.Name);
                        }

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

                        if (picker.ShowDialog() != DialogResult.Cancel)
                        {
                            CharCorp chosen = (CharCorp)picker.SelectedItem;
                            character = chosen.characterObj;
                            corc = chosen.corp ? CharOrCorp.Corp : CharOrCorp.Char;
                        }

                        LoadOldDataParams parameters = new LoadOldDataParams();
                        parameters.dataDirectory = tmpLoadDir;
                        parameters.corc = corc;
                        parameters.character = character;
                        LoadOldEMMAData(parameters);
                    }
                }
                else if (saveVersion == 2)
                {
                }
            }
            catch (ThreadAbortException)
            {
                // User has closed the progress dialog so just allow the execution to fall out of this loop.
            }
        }
        private void Contracts_Load(object sender, EventArgs e)
        {
            try
            {
                EMMADataSet.ContractTypeDataTable types = ContractTypes.GetAll();
                // Remove the 'Cargo' type.
                // This is used by the Delivery  planner and we don't want users either viewing
                // or creating that type of contract.
                /*DataRow[] cargoType = types.Select("ID = 3");
                if (cargoType != null && cargoType.Length > 0)
                {
                    types.RemoveContractTypeRow((EMMADataSet.ContractTypeRow)cargoType[0]);
                }*/
                cmbType.DisplayMember = "Description";
                cmbType.ValueMember = "ID";
                cmbType.DataSource = types;
                cmbType.SelectedValue = (short)ContractType.Courier;
                cmbType.SelectedIndexChanged += new EventHandler(cmbType_SelectedIndexChanged);

                _contracts = new ContractList();
                _contractsBindingSource = new BindingSource();
                _contractsBindingSource.DataSource = _contracts;

                DataGridViewCellStyle iskStyle = new DataGridViewCellStyle(RewardColumn.DefaultCellStyle);
                iskStyle.Format = IskAmount.FormatString();
                RewardColumn.DefaultCellStyle = iskStyle;
                CollateralColumn.DefaultCellStyle = iskStyle;
                ExpectedProfitColumn.DefaultCellStyle = iskStyle;

                contractsGrid.AutoGenerateColumns = false;
                contractsGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
                contractsGrid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

                contractsGrid.DataSource = _contractsBindingSource;
                ContractIDColumn.DataPropertyName = "ID";
                OwnerColumn.DataPropertyName = "Owner";
                IssueDateColumn.DataPropertyName = "IssueDate";
                PickupStationColumn.DataPropertyName = "PickupStation";
                DestinationStationColumn.DataPropertyName = "DestinationStation";
                RewardColumn.DataPropertyName = "Reward";
                CollateralColumn.DataPropertyName = "Collateral";
                ExpectedProfitColumn.DataPropertyName = "ExpectedProfit";
                StatusColumn.DataPropertyName = "Status";
                CompletedColumn.Image = icons.Images["tick.gif"];
                FailedColumn.Image = icons.Images["cross.gif"];
                ExpiredColumn.Image = icons.Images["expired.gif"];
                contractsGrid.CellClick += new DataGridViewCellEventHandler(contractsGrid_CellClick);
                contractsGrid.CellDoubleClick += new DataGridViewCellEventHandler(contractsGrid_CellDoubleClick);
                UserAccount.Settings.GetColumnWidths(this.Name, contractsGrid);

                List<CharCorpOption> charcorps = UserAccount.CurrentGroup.GetCharCorpOptions();
                _owners = new List<long>();
                foreach (CharCorpOption chop in charcorps)
                {
                    _owners.Add(chop.Corp ? chop.CharacterObj.CorpID : chop.CharacterObj.CharID);
                }
                cmbOwner.DisplayMember = "Name";
                cmbOwner.ValueMember = "Data";
                charcorps.Sort();
                cmbOwner.DataSource = charcorps;
                cmbOwner.SelectedValue = 0;
                cmbOwner.Enabled = false;
                cmbOwner.SelectedIndexChanged += new EventHandler(cmbOwner_SelectedIndexChanged);
                chkIngoreOwner.Checked = true;
                chkIngoreOwner.CheckedChanged += new EventHandler(chkIngoreOwner_CheckedChanged);

                _recentStations = UserAccount.CurrentGroup.Settings.RecentStations;
                _recentStations.Sort();
                cmbDestination.Tag = 0;
                cmbDestination.Items.AddRange(_recentStations.ToArray());
                cmbDestination.AutoCompleteSource = AutoCompleteSource.ListItems;
                cmbDestination.AutoCompleteMode = AutoCompleteMode.Suggest;
                cmbDestination.KeyDown += new KeyEventHandler(cmbDestination_KeyDown);
                cmbDestination.SelectedIndexChanged += new EventHandler(cmbDestination_SelectedIndexChanged);

                cmbPickup.Tag = 0;
                cmbPickup.Items.AddRange(_recentStations.ToArray());
                cmbPickup.AutoCompleteSource = AutoCompleteSource.ListItems;
                cmbPickup.AutoCompleteMode = AutoCompleteMode.Suggest;
                cmbPickup.KeyDown += new KeyEventHandler(cmbPickup_KeyDown);
                cmbPickup.SelectedIndexChanged += new EventHandler(cmbPickup_SelectedIndexChanged);

                EMMADataSet.ContractStatesDataTable states = ContractStatus.GetAll();
                BindingSource statusSource = new BindingSource();
                statusSource.DataSource = states;
                statusSource.Sort = "Description";
                cmbStatus.DisplayMember = "Description";
                cmbStatus.ValueMember = "ID";
                cmbStatus.DataSource = statusSource;
                cmbStatus.SelectedValue = 1;
                cmbStatus.SelectedIndexChanged += new EventHandler(cmbStatus_SelectedIndexChanged);

                this.FormClosing += new FormClosingEventHandler(ViewContracts_FormClosing);
                RefreshGUI();
                DisplayContracts();
            }
            catch (Exception ex)
            {
                // Creating new EMMAexception will cause error to be logged.
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Critical, "Error setting up contracts form", ex);
                }
                MessageBox.Show("Problem setting up contracts view.\r\nCheck " + Globals.AppDataDir + "Logging\\ExceptionLog.txt" +
                    " for details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Beispiel #25
0
        /// <summary>
        /// Update player-owned outpost data from the API.
        /// </summary>
        public static void UpdateOutpostData()
        {
            try
            {
                DateTime nextUpdate = Properties.Settings.Default.LastOutpostUpdate.AddDays(1);

                if (DateTime.UtcNow.CompareTo(nextUpdate) >= 0)
                {
                    XmlDocument xml = GetXml(URL_EveApiHTTPS + URL_OutpostListApi, "");
                    XmlNodeList results = GetResults(xml);

                    foreach (XmlNode outpost in results)
                    {
                        XmlNode stationIDNode = outpost.SelectSingleNode("@stationID");
                        XmlNode stationNameNode = outpost.SelectSingleNode("@stationName");
                        XmlNode solarSystemNode = outpost.SelectSingleNode("@solarSystemID");
                        XmlNode corpIDNode = outpost.SelectSingleNode("@corporationID");

                        long stationID = 0, solarSystemID = 0, corpID = 0;
                        string stationName = "";

                        stationID = long.Parse(stationIDNode.Value,
                            System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
                        stationName = stationNameNode.Value;
                        solarSystemID = long.Parse(solarSystemNode.Value,
                            System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
                        corpID = long.Parse(corpIDNode.Value,
                            System.Globalization.CultureInfo.InvariantCulture.NumberFormat);

                        Stations.AddStation(stationID, stationName, solarSystemID, corpID);
                    }

                    Properties.Settings.Default.LastOutpostUpdate = DateTime.UtcNow;
                    Properties.Settings.Default.Save();
                }
            }
            catch (Exception ex)
            {
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Warning, "Problem updating outpost data.", ex);
                }
                // Not much we can do about it and it's not critical so just allow things to continue.
            }
        }
        private void btnOk_Click(object sender, EventArgs e)
        {
            try
            {
                // Store the 'included' flags for any chars/corps as they have been setup by the user.
                _characters = new List<APICharacter>();
                foreach (EVEAccount account in _accounts)
                {
                    _characters.AddRange(account.Chars);
                }
                foreach (APICharacter apiChar in _characters)
                {
                    // API key may have been changed so make sure we update it.
                    apiChar.APIKey = UserAccount.CurrentGroup.GetAccount(apiChar.UserID).ApiKey;
                    // update standings for all those that are part of the group
                    //if (apiChar.CharIncWithRptGroup) { apiChar.UpdateStandings(CharOrCorp.Char); }
                    //if (apiChar.CorpIncWithRptGroup) { apiChar.UpdateStandings(CharOrCorp.Corp); }
                    if (apiChar.AccessType == CharOrCorp.Char){apiChar.UpdateStandings(CharOrCorp.Char);}
                    if (apiChar.AccessType == CharOrCorp.Corp){apiChar.UpdateStandings(CharOrCorp.Corp);}

                    if (apiChar.AccessType == CharOrCorp.Char)
                    {
                        apiChar.StoreGroupLevelSettings(SettingsStoreType.Char);
                    }

                    if (apiChar.AccessType == CharOrCorp.Corp)
                    {
                        apiChar.StoreGroupLevelSettings(SettingsStoreType.Corp);
                    }
                    //apiChar.StoreGroupLevelSettings(SettingsStoreType.Both);
                }

                // Make sure to clear 'included' flags for any chars/corps on accounts that have been removed.
                _characters = new List<APICharacter>();
                foreach (EVEAccount account in _removedAccounts)
                {
                    _characters.AddRange(account.Chars);
                }
                foreach (APICharacter apiChar in _characters)
                {
                    apiChar.CharIncWithRptGroup = false;
                    apiChar.CorpIncWithRptGroup = false;
                    apiChar.StoreGroupLevelSettings(SettingsStoreType.Both);
                }

                // Finally, update the list of eve accounts stored against this report group.
                _group.StoreEveAccounts();

                this.DialogResult = DialogResult.OK;
                this.Close();
            }
            catch (Exception ex)
            {
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Error, "Problem saving report group setup", ex);
                }
                MessageBox.Show("Problem storing data: " + ex.Message, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Beispiel #27
0
        private void Main_Load(object sender, EventArgs e)
        {
            try
            {
                Diagnostics.StopTimer("LoadMainForm");
                this.Size = EveMarketMonitorApp.Properties.Settings.Default.WindowSize;

                Diagnostics.StartTimer("Init");
                Initialisation();
                _controlPanel.InitSettings();
                _controlPanel.Show();
                Diagnostics.StopTimer("Init");

                this.Refresh();

                if (EveMarketMonitorApp.Properties.Settings.Default.FirstRun)
                {
                    DisplayTutorial();

                    EveMarketMonitorApp.Properties.Settings.Default.FirstRun = false;
                    EveMarketMonitorApp.Properties.Settings.Default.Save();
                }

                if (_status == SystemStatus.NoUserLoggedIn)
                {
                    // Set these to make sure nothing thinks we're logged in when we're not.
                    UserAccount.Name = "";
                    UserAccount.CurrentGroup = null;
                    Diagnostics.StopTimer("TotalStartupTimer");
                    Diagnostics.DisplayDiag("Total Startup Time: " + Diagnostics.GetRunningTime("TotalStartupTimer") +
                        "\r\n  Display Splashscreen: " + Diagnostics.GetRunningTime("DisplaySplash") +
                        "\r\n  Environment Setup: " + Diagnostics.GetRunningTime("Environment") +
                        "\r\n  Ping Checks: " + Diagnostics.GetRunningTime("PingChecks") +
                        "\r\n  EMMA Update Check: " + Diagnostics.GetRunningTime("Updates") +
                        "\r\n  Map Init: " + Diagnostics.GetRunningTime("MapInit") +
                        "\r\n  Load Main Form: " + Diagnostics.GetRunningTime("LoadMainForm") +
                        "\r\n  Global Init: " + Diagnostics.GetRunningTime("Init"));
                    if (Login())
                    {
                        if (UserAccount.CurrentGroup == null)
                        {
                            SelectReportGroup();
                        }
                    }
                }
                else
                {
                    Diagnostics.StartTimer("RefreshDisplay");
                    RefreshDisplay();
                    Diagnostics.StopTimer("RefreshDisplay");

                    Diagnostics.StopTimer("TotalStartupTimer");
                    Diagnostics.DisplayDiag("Total Startup Time: " + Diagnostics.GetRunningTime("TotalStartupTimer") +
                        "\r\n  Display Splashscreen: " + Diagnostics.GetRunningTime("DisplaySplash") +
                        "\r\n  Init GUI: " + Diagnostics.GetRunningTime("InitGUI") +
                        "\r\n  Environment Setup: " + Diagnostics.GetRunningTime("Environment") +
                        "\r\n  Ping Checks: " + Diagnostics.GetRunningTime("PingChecks") +
                        "\r\n  EMMA Update Check: " + Diagnostics.GetRunningTime("Updates") +
                        "\r\n  Map Init: " + Diagnostics.GetRunningTime("MapInit") +
                        "\r\n  Auto Login: "******"AutoLogin") +
                        "\r\n    Open Account: " + Diagnostics.GetRunningTime("OpenAccount") +
                        "\r\n      Load User Account: " + Diagnostics.GetRunningTime("OpenAccount.LoadAccount") +
                        "\r\n      Load Report Groups: " + Diagnostics.GetRunningTime("OpenAccount.GetGroups") +
                        "\r\n      Load Eve Accounts: " + Diagnostics.GetRunningTime("RptGrp.LoadEveAccounts") +
                        "\r\n      Init User Settings: " + Diagnostics.GetRunningTime("OpenAccount.InitSettings") +
                        "\r\n  Load Main Form: " + Diagnostics.GetRunningTime("LoadMainForm") +
                        "\r\n  Global Init: " + Diagnostics.GetRunningTime("Init") +
                        "\r\n  Refresh Display: " + Diagnostics.GetRunningTime("RefreshDisplay"));
                }
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Problem loading main form.", ex);
                }
                try
                {
                    MessageBox.Show(null, "Problem loading EMMA:\r\n" + ex.Message, "Error",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                catch (Exception)
                {
                }
                finally
                {
                    _forceClose = true;
                    this.Close();
                }
            }
        }
        private void ViewJournal_Load(object sender, EventArgs e)
        {
            try
            {
                Diagnostics.ResetAllTimers();
                Diagnostics.StartTimer("ViewJournal.Load");
                Diagnostics.StartTimer("ViewJournal.Load.Part1");
                _entries = new JournalList();
                _journalBindingSource = new BindingSource();
                _journalBindingSource.DataSource = _entries;

                DataGridViewCellStyle style = new DataGridViewCellStyle(AmountColumn.DefaultCellStyle);
                style.Format = IskAmount.FormatString();
                AmountColumn.DefaultCellStyle = style;
                DataGridViewCellStyle style2 = new DataGridViewCellStyle(BalanceColumn.DefaultCellStyle);
                style2.Format = IskAmount.FormatString();
                BalanceColumn.DefaultCellStyle = style2;

                journalDataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
                journalDataGridView.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

                journalDataGridView.DataSource = _journalBindingSource;
                IDColumn.DataPropertyName = "Id";
                DateColumn.DataPropertyName = "Date";
                TypeColumn.DataPropertyName = "Type";
                OwnerIsSenderColumn.DataPropertyName = "OwnerIsSender";
                Owner1Column.DataPropertyName = "Sender";
                OwnerID1Column.DataPropertyName = "SenderID";
                Owner2Column.DataPropertyName = "Reciever";
                OwnerID2Column.DataPropertyName = "RecieverID";
                ArgIDColumn.DataPropertyName = "ArgID";
                ArgNameColumn.DataPropertyName = "ArgName";
                AmountColumn.DataPropertyName = "Amount";
                BalanceColumn.DataPropertyName = "Balance";
                ReasonColumn.DataPropertyName = "Reason";
                Owner1CorpColumn.DataPropertyName = "SenderCorp";
                Owner2CorpColumn.DataPropertyName = "RecieverCorp";
                Owner1WalletColumn.DataPropertyName = "SenderWallet";
                Owner2WalletColumn.DataPropertyName = "RecieverWallet";

                UserAccount.Settings.GetColumnWidths(this.Name, journalDataGridView);

                dtpEndDate.Value = DateTime.Now;
                dtpStartDate.Value = DateTime.Now.AddDays(-2);
                dtpEndDate.KeyDown += new KeyEventHandler(dtpEndDate_KeyDown);
                dtpEndDate.Leave += new EventHandler(dtpEndDate_Leave);
                dtpStartDate.KeyDown += new KeyEventHandler(dtpStartDate_KeyDown);
                dtpStartDate.Leave += new EventHandler(dtpStartDate_Leave);

                Diagnostics.StopTimer("ViewJournal.Load.Part1");

                Diagnostics.StartTimer("ViewJournal.Load.Part2");
                List<CharCorpOption> charcorps = UserAccount.CurrentGroup.GetCharCorpOptions(APIDataType.Journal);
                _possibleOwners = new List<long>();
                foreach (CharCorpOption chop in charcorps)
                {
                    _possibleOwners.Add(chop.Corp ? chop.CharacterObj.CorpID : chop.CharacterObj.CharID);
                }
                _accessParams = new List<FinanceAccessParams>();
                foreach (long id in _possibleOwners)
                {
                    _accessParams.Add(new FinanceAccessParams(id));
                }
                cmbOwner.DisplayMember = "Name";
                cmbOwner.ValueMember = "Data";
                charcorps.Sort();
                cmbOwner.DataSource = charcorps;
                cmbOwner.SelectedValue = 0;
                cmbOwner.Enabled = false;
                Diagnostics.StopTimer("ViewJournal.Load.Part2");

                Diagnostics.StartTimer("ViewJournal.Load.Part3");
                EMMADataSet.JournalRefTypesDataTable types = JournalRefTypes.GetTypesByJournal(_accessParams);
                EMMADataSet.JournalRefTypesRow newType = types.NewJournalRefTypesRow();
                newType.ID = 0;
                newType.RefName = "All Types";
                types.AddJournalRefTypesRow(newType);
                BindingSource typesSource = new BindingSource();
                typesSource.DataSource = types;
                typesSource.Sort = "RefName";
                cmbType.DisplayMember = "RefName";
                cmbType.ValueMember = "ID";
                cmbType.DataSource = typesSource;
                cmbType.SelectedValue = 0;
                Diagnostics.StopTimer("ViewJournal.Load.Part3");

                cmbType.SelectedIndexChanged += new EventHandler(cmbType_SelectedIndexChanged);

                cmbOwner.SelectedIndexChanged += new EventHandler(cmbOwner_SelectedIndexChanged);
                chkIngoreOwner.Checked = true;
                chkIngoreOwner.CheckedChanged += new EventHandler(chkIngoreOwner_CheckedChanged);

                cmbWallet.SelectedIndexChanged += new EventHandler(cmbWallet_SelectedIndexChanged);

                DisplayWallets();
                chkIgnoreWallet.CheckedChanged += new EventHandler(chkIgnoreWallet_CheckedChanged);
                txtName.KeyDown += new KeyEventHandler(txtName_KeyDown);
                txtName.Leave += new EventHandler(txtName_Leave);

                Diagnostics.StartTimer("ViewJournal.Load.Part4");
                this.FormClosing += new FormClosingEventHandler(ViewJournal_FormClosing);
                DisplayEntries();
                Diagnostics.StopTimer("ViewJournal.Load.Part4");
                Diagnostics.StopTimer("ViewJournal.Load");

                Diagnostics.DisplayDiag(
                    "Total form load time: " + Diagnostics.GetRunningTime("ViewJournal.Load").ToString() +
                    "\r\nSplit time 1: " + Diagnostics.GetRunningTime("ViewJournal.Load.Part1").ToString() +
                    "\r\nSplit time 2: " + Diagnostics.GetRunningTime("ViewJournal.Load.Part2").ToString() +
                    "\r\nSplit time 3: " + Diagnostics.GetRunningTime("ViewJournal.Load.Part3").ToString() +
                    "\r\nSplit time 4: " + Diagnostics.GetRunningTime("ViewJournal.Load.Part4").ToString());
            }
            catch (Exception ex)
            {
                // Creating new EMMAexception will cause error to be logged.
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Critical, "Error setting up journal form", ex);
                }
                MessageBox.Show("Problem setting up journal view.\r\nCheck " + Globals.AppDataDir + "Logging\\ExceptionLog.txt" +
                    " for details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void ViewOrders_Load(object sender, EventArgs e)
        {
            try
            {
                _orders = new OrdersList();
                _ordersBindingSource = new BindingSource();
                _ordersBindingSource.DataSource = _orders;

                DataGridViewCellStyle iskStyle = new DataGridViewCellStyle(PriceColumn.DefaultCellStyle);
                iskStyle.Format = IskAmount.FormatString();
                PriceColumn.DefaultCellStyle = iskStyle;
                EscrowColumn.DefaultCellStyle = iskStyle;
                TotalValueColumn.DefaultCellStyle = iskStyle;
                RemainingValueColumn.DefaultCellStyle = iskStyle;
                DataGridViewCellStyle dayStyle = new DataGridViewCellStyle(DurationColumn.DefaultCellStyle);
                dayStyle.Format = "# Days;-# Days;# Days";
                DurationColumn.DefaultCellStyle = dayStyle;

                ordersGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
                ordersGrid.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

                ordersGrid.DataSource = _ordersBindingSource;
                DateIssuedColumn.DataPropertyName = "Date";
                OwnerColumn.DataPropertyName = "Owner";
                ItemColumn.DataPropertyName = "Item";
                PriceColumn.DataPropertyName = "Price";
                StationColumn.DataPropertyName = "Station";
                SystemColumn.DataPropertyName = "System";
                RegionColumn.DataPropertyName = "Region";
                TypeColumn.DataPropertyName = "Type";
                TotalUnitsColumn.DataPropertyName = "TotalVol";
                QuantityColumn.DataPropertyName = "RemainingVol";
                EscrowColumn.DataPropertyName = "Escrow";
                StateColumn.DataPropertyName = "State";
                RangeColumn.DataPropertyName = "RangeText";
                DurationColumn.DataPropertyName = "Duration";
                TotalValueColumn.DataPropertyName = "TotalValue";
                RemainingValueColumn.DataPropertyName = "RemainingValue";

                UserAccount.Settings.GetColumnWidths(this.Name, ordersGrid);

                List<CharCorpOption> charcorps = UserAccount.CurrentGroup.GetCharCorpOptions(APIDataType.Orders);
                _corporateOwners = new List<long>();
                _personalOwners = new List<long>();
                foreach (CharCorpOption chop in charcorps)
                {
                    if (chop.Corp)
                    {
                        _corporateOwners.Add(chop.CharacterObj.CorpID);
                    }
                    else
                    {
                        _personalOwners.Add(chop.CharacterObj.CharID);
                    }
                }
                cmbOwner.DisplayMember = "Name";
                cmbOwner.ValueMember = "Data";
                charcorps.Sort();
                cmbOwner.DataSource = charcorps;
                cmbOwner.SelectedValue = 0;
                cmbOwner.Enabled = false;
                cmbOwner.SelectedIndexChanged += new EventHandler(cmbOwner_SelectedIndexChanged);
                chkIngoreOwner.Checked = true;
                chkIngoreOwner.CheckedChanged += new EventHandler(chkIngoreOwner_CheckedChanged);

                EMMADataSet.OrderStatesDataTable allStates = OrderStates.GetAllStates();
                EMMADataSet.OrderStatesRow newState = allStates.NewOrderStatesRow();
                newState.StateID = 0;
                newState.Description = "All States";
                allStates.AddOrderStatesRow(newState);
                BindingSource stateSource = new BindingSource();
                stateSource.DataSource = allStates;
                stateSource.Sort = "Description";
                cmbStateFilter.DisplayMember = "Description";
                cmbStateFilter.ValueMember = "StateID";
                cmbStateFilter.DataSource = stateSource;
                cmbStateFilter.SelectedIndexChanged += new EventHandler(cmbStateFilter_SelectedIndexChanged);

                _recentStations = UserAccount.CurrentGroup.Settings.RecentStations;
                _recentStations.Sort();
                AutoCompleteStringCollection stations = new AutoCompleteStringCollection();
                stations.AddRange(_recentStations.ToArray());
                txtStation.AutoCompleteCustomSource = stations;
                txtStation.AutoCompleteSource = AutoCompleteSource.CustomSource;
                txtStation.AutoCompleteMode = AutoCompleteMode.Suggest;
                txtStation.Leave += new EventHandler(txtStation_Leave);
                txtStation.KeyDown += new KeyEventHandler(txtStation_KeyDown);
                txtStation.Tag = 0;
                txtStation.Text = "";

                cmbType.SelectedIndexChanged += new EventHandler(cmbType_SelectedIndexChanged);

                this.FormClosing += new FormClosingEventHandler(ViewOrders_FormClosing);

                DisplayOrders();
            }
            catch (Exception ex)
            {
                // Creating new EMMAexception will cause error to be logged.
                EMMAException emmaex = ex as EMMAException;
                if (emmaex == null)
                {
                    emmaex = new EMMAException(ExceptionSeverity.Critical, "Error setting up orders form", ex);
                }
                MessageBox.Show("Problem setting up orders view.\r\nCheck " + Globals.AppDataDir + "Logging\\ExceptionLog.txt" +
                    " for details.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void DisplayData()
        {
            try
            {
                //PublicCorp oldSelection = null;
                //if (sharesGrid.SelectedRows != null && sharesGrid.SelectedRows.Count > 0)
                //{
                //    oldSelection = (PublicCorp)sharesGrid.SelectedRows[0].DataBoundItem;
                //}

                _investments = PublicCorps.GetReportGroupInvestments(UserAccount.CurrentGroup.ID,
                    _bankMode);
                if (chkInvestedOnly.Checked && !_bankMode)
                {
                    _investments.ItemFilter = "SharesOwned > 0";
                }
                else
                {
                    _investments.ItemFilter = "";
                }

                DataGridViewCellStyle style = new DataGridViewCellStyle(ValueColumn.DefaultCellStyle);
                style.Format = IskAmount.FormatString();
                ValueColumn.DefaultCellStyle = style;

                sharesGrid.AutoGenerateColumns = false;
                CorpNameColumn.DataPropertyName = "Name";
                QuantityColumn.DataPropertyName = "SharesOwned";
                QuantityColumn.Visible = !_bankMode;
                if (!_bankMode)
                {
                    ValueColumn.DataPropertyName = "SharesOwnedValue";
                    ValueColumn.HeaderText = "Value";
                    AccountOwnerColumn.DataPropertyName = "";
                    AccountOwnerColumn.Visible = false;
                }
                else
                {
                    ValueColumn.DataPropertyName = "AmountInAccount";
                    ValueColumn.HeaderText = "Account Balance";
                    AccountOwnerColumn.DataPropertyName = "Owner";
                    AccountOwnerColumn.Visible = true;
                }

                DataGridViewColumn sortColumn = CorpNameColumn;
                ListSortDirection sortDirection = ListSortDirection.Ascending;
                if (sharesGrid.SortedColumn != null) { sortColumn = sharesGrid.SortedColumn; }
                if (sharesGrid.SortOrder == SortOrder.Descending)
                {
                    sortDirection = ListSortDirection.Descending;
                }

                if (_investments.ItemFilter.Length > 0)
                {
                    sharesGrid.DataSource = _investments.FiltredItems;
                }
                else
                {
                    sharesGrid.DataSource = _investments;
                }

                //if (oldSelection != null)
                //{
                //    for (int i = 0; i < sharesGrid.Rows.Count; i++)
                //    {
                //        if (((PublicCorp)sharesGrid.Rows[i].DataBoundItem).Equals(oldSelection))
                //        {
                //            sharesGrid.Rows[i].Selected = true;
                //        }
                //    }
                //}

                sharesGrid.Sort(sortColumn, sortDirection);

                btnCorpDetail.Enabled = false;
                btnDeleteCorp.Enabled = false;
                btnBuySell.Enabled = !_bankMode;

                if (sharesGrid.Rows.Count > 0)
                {
                    sharesGrid.Rows[0].Selected = true;
                    RowSelected(0);
                }
            }
            catch (Exception ex)
            {
                EMMAException emmaEx = ex as EMMAException;
                if (emmaEx == null)
                {
                    emmaEx = new EMMAException(ExceptionSeverity.Error, "Problem displaying current investments", ex);
                }
                MessageBox.Show(emmaEx.Message + ": " + ex.Message, "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }