public void OkDialog()
        {
            string message;
            if (Source == SpectralLibrarySource.file)
            {
                string path = textFilePath.Text;
                message = ValidateSpectralLibraryPath(path);
                if (message != null)
                {
                    MessageDlg.Show(this, message);
                    textFilePath.Focus();
                    return;
                }
            }
            var librarySpec = Library;
            if (librarySpec == null)
            {
                MessageDlg.Show(this, Resources.ImportIonMobilityFromSpectralLibrary_OkDialog_Please_choose_the_library_you_would_like_to_add_);
                return;
            }

            var table = new ChargeRegressionTable(gridRegression);
            var chargeRegressionLinesList = table.GetTableChargeRegressionLines();
            if (chargeRegressionLinesList == null) // Some error detected in the charged regression lines table
                return;
            ChargeRegressionsLines = chargeRegressionLinesList.ToDictionary(x => x.Charge, x => x.RegressionLine);

            // Have we got everything we need to populate the caller's grid view?
            message = _gridViewDriver.ImportFromSpectralLibrary(librarySpec, ChargeRegressionsLines);
            if (message == null)
            {
                DialogResult = DialogResult.OK;
            }
            else
            {
                MessageDlg.Show(this, message);
            }
        }
        /// <summary>
        /// Test various error conditions in EditDriftTimePredictorDlg.cs
        /// </summary>
        public void TestEditDriftTimePredictorDlgErrorHandling()
        {
            AssertEx.Contains(EditDriftTimePredictorDlg.ValidateResolvingPower(0), Resources.EditDriftTimePredictorDlg_ValidateResolvingPower_Resolving_power_must_be_greater_than_0_);
            AssertEx.Contains(EditDriftTimePredictorDlg.ValidateResolvingPower(-1), Resources.EditDriftTimePredictorDlg_ValidateResolvingPower_Resolving_power_must_be_greater_than_0_);
            Assert.IsNull(EditDriftTimePredictorDlg.ValidateResolvingPower(1));

            AssertEx.Contains(MeasuredDriftTimeTable.ValidateCharge(0),
                              String.Format(
                                  Resources.EditDriftTimePredictorDlg_ValidateCharge_The_entry__0__is_not_a_valid_charge__Precursor_charges_must_be_integer_values_between_1_and__1__,
                                  0, TransitionGroup.MAX_PRECURSOR_CHARGE));
            AssertEx.Contains(MeasuredDriftTimeTable.ValidateCharge(99),
                              String.Format(
                                  Resources.EditDriftTimePredictorDlg_ValidateCharge_The_entry__0__is_not_a_valid_charge__Precursor_charges_must_be_integer_values_between_1_and__1__,
                                  99, TransitionGroup.MAX_PRECURSOR_CHARGE));
            string[] dtValues = { null, null, null, null };
            AssertEx.Contains(MeasuredDriftTimeTable.ValidateMeasuredDriftTimeCellValues(new[] { "", "" }),
                              Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_The_pasted_text_must_have_three_columns_);
            AssertEx.Contains(MeasuredDriftTimeTable.ValidateMeasuredDriftTimeCellValues(dtValues),
                              Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_A_modified_peptide_sequence_is_required_for_each_entry_);
            dtValues[0] = "$%$%!";
            AssertEx.Contains(MeasuredDriftTimeTable.ValidateMeasuredDriftTimeCellValues(dtValues),
                              String.Format(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_The_sequence__0__is_not_a_valid_modified_peptide_sequence_, dtValues[0]));
            dtValues[0] = "JKLM";
            dtValues[1] = "dog";
            dtValues[2] = "-0.2"; // HighEnergyDriftTimeOffsetMsec
            AssertEx.Contains(MeasuredDriftTimeTable.ValidateMeasuredDriftTimeCellValues(dtValues),
                              String.Format(Resources.EditDriftTimePredictorDlg_ValidateCharge_The_entry__0__is_not_a_valid_charge__Precursor_charges_must_be_integer_values_between_1_and__1__,
                                            dtValues[EditDriftTimePredictorDlg.COLUMN_CHARGE].Trim(), TransitionGroup.MAX_PRECURSOR_CHARGE));
            dtValues[2] = (17.9).ToString(CultureInfo.CurrentCulture);
            dtValues[1] = "2";
            Assert.IsNull(MeasuredDriftTimeTable.ValidateMeasuredDriftTimeCellValues(dtValues),
                          string.Format("unexpected error {0}", MeasuredDriftTimeTable.ValidateMeasuredDriftTimeCellValues(dtValues)));
            dtValues[2] = "fish";
            AssertEx.Contains(MeasuredDriftTimeTable.ValidateMeasuredDriftTimeCellValues(dtValues),
                              String.Format(Resources.MeasuredDriftTimeTable_ValidateMeasuredDriftTimeCellValues_The_value__0__is_not_a_valid_drift_time_, dtValues[EditDriftTimePredictorDlg.COLUMN_DRIFT_TIME_MSEC].Trim()));

            AssertEx.Contains(ChargeRegressionTable.ValidateCharge(0),
                              String.Format(
                                  Resources.EditDriftTimePredictorDlg_ValidateCharge_The_entry__0__is_not_a_valid_charge__Precursor_charges_must_be_integer_values_between_1_and__1__,
                                  0, TransitionGroup.MAX_PRECURSOR_CHARGE));
            AssertEx.Contains(ChargeRegressionTable.ValidateCharge(99),
                              String.Format(
                                  Resources.EditDriftTimePredictorDlg_ValidateCharge_The_entry__0__is_not_a_valid_charge__Precursor_charges_must_be_integer_values_between_1_and__1__,
                                  99, TransitionGroup.MAX_PRECURSOR_CHARGE));
            Assert.IsNull(ChargeRegressionTable.ValidateCharge(1));
            Assert.IsNull(ChargeRegressionTable.ValidateCharge(TransitionGroup.MAX_PRECURSOR_CHARGE));

            string[] values = { "", "", "" };
            AssertEx.Contains(ChargeRegressionTable.ValidateRegressionCellValues(values),
                              string.Format(
                                  Resources.EditDriftTimePredictorDlg_ValidateRegressionCellValues_the_value__0__is_not_a_valid_charge__Charges_must_be_integer_values_between_1_and__1__,
                                  values[0], TransitionGroup.MAX_PRECURSOR_CHARGE));

            values[0] = "1";
            AssertEx.Contains(ChargeRegressionTable.ValidateRegressionCellValues(values),
                              string.Format(Resources.EditDriftTimePredictorDlg_ValidateRegressionCellValues_the_value__0__is_not_a_valid_slope_, values[1]));

            values[1] = "1";
            AssertEx.Contains(ChargeRegressionTable.ValidateRegressionCellValues(values),
                              string.Format(Resources.EditDriftTimePredictorDlg_ValidateRegressionCellValues_the_value__0__is_not_a_valid_intercept_, values[2]));

            values[2] = "1";
            Assert.IsNull(ChargeRegressionTable.ValidateRegressionCellValues(values));

            object[] column = { "1" };
            AssertEx.Contains(CollisionalCrossSectionGridViewDriverBase <ValidatingIonMobilityPeptide> .ValidateRow(column, 1),
                              Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_The_pasted_text_must_have_at_least_two_columns_);

            object[]  columns    = { "", "", "" };
            const int lineNumber = 1;

            AssertEx.Contains(CollisionalCrossSectionGridViewDriverBase <ValidatingIonMobilityPeptide> .ValidateRow(columns, lineNumber),
                              string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_Missing_peptide_sequence_on_line__0__, lineNumber));

            columns[0] = "@#%!";
            AssertEx.Contains(CollisionalCrossSectionGridViewDriverBase <ValidatingIonMobilityPeptide> .ValidateRow(columns, lineNumber),
                              string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_The_text__0__is_not_a_valid_peptide_sequence_on_line__1__, columns[0], lineNumber));

            columns[0] = "JKLM";
            AssertEx.Contains(CollisionalCrossSectionGridViewDriverBase <ValidatingIonMobilityPeptide> .ValidateRow(columns, lineNumber),
                              string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_Missing_collisional_cross_section_value_on_line__0__, lineNumber));

            columns[1] = "fish";
            AssertEx.Contains(CollisionalCrossSectionGridViewDriverBase <ValidatingIonMobilityPeptide> .ValidateRow(columns, lineNumber),
                              string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_Invalid_number_format__0__for_collisional_cross_section_on_line__1__,
                                            columns[1], lineNumber));

            columns[1] = "0";
            AssertEx.Contains(CollisionalCrossSectionGridViewDriverBase <ValidatingIonMobilityPeptide> .ValidateRow(columns, lineNumber),
                              string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_The_collisional_cross_section__0__must_be_greater_than_zero_on_line__1__,
                                            columns[1], lineNumber));

            columns[1] = "1";
            Assert.IsNull(CollisionalCrossSectionGridViewDriverBase <ValidatingIonMobilityPeptide> .ValidateRow(columns, lineNumber));

            columns[2] = "zeke"; // HighEnergyDriftTimeOffsetMsec
            AssertEx.Contains(CollisionalCrossSectionGridViewDriverBase <ValidatingIonMobilityPeptide> .ValidateRow(columns, lineNumber),
                              string.Format(Resources.CollisionalCrossSectionGridViewDriverBase_ValidateRow_Invalid_number_format__0__for_high_energy_drift_time_offset_on_line__1__,
                                            columns[2], lineNumber));

            columns[2] = ""; // HighEnergyDriftTimeOffsetMsec
            Assert.IsNull(CollisionalCrossSectionGridViewDriverBase <ValidatingIonMobilityPeptide> .ValidateRow(columns, lineNumber));

            columns[2] = "1"; // HighEnergyDriftTimeOffsetMsec (usually negative, but we don't demand it)
            Assert.IsNull(CollisionalCrossSectionGridViewDriverBase <ValidatingIonMobilityPeptide> .ValidateRow(columns, lineNumber));


            var pep = new ValidatingIonMobilityPeptide(null, 0, 0);

            AssertEx.Contains(pep.Validate(), Resources.ValidatingIonMobilityPeptide_ValidateSequence_A_modified_peptide_sequence_is_required_for_each_entry_);

            const string seq = "@#%!";

            pep = new ValidatingIonMobilityPeptide(seq, 0, 0);
            AssertEx.Contains(pep.Validate(), string.Format(
                                  Resources.ValidatingIonMobilityPeptide_ValidateSequence_The_sequence__0__is_not_a_valid_modified_peptide_sequence_, seq));

            pep = new ValidatingIonMobilityPeptide("JLKM", 0, 0);
            AssertEx.Contains(pep.Validate(),
                              Resources.ValidatingIonMobilityPeptide_ValidateCollisionalCrossSection_Measured_collisional_cross_section_values_must_be_valid_decimal_numbers_greater_than_zero_);

            pep = new ValidatingIonMobilityPeptide("JLKM", 1, 0);
            Assert.IsNull(pep.Validate());
        }