/// <summary>
        /// Sets the individual listView column widths based on the visibleColumns settings.
        /// </summary>
        /// <param name="visibleColumns">SummaryColumnFlags</param>
        private void UpdateVisibleColumns(SummaryColumnFlags visibleColumns)
        {
            Array fieldColumns = Enum.GetValues(typeof(FieldListColumns));

            // skip first two (Field Name, Value) and last (Unit). These columns are always displayed.
            for (int i = 1; i < fieldColumns.GetLength(0) - 1; i++)
            {
                FieldListColumns   fieldColumnsEnumValue  = (FieldListColumns)fieldColumns.GetValue(i);
                SummaryColumnFlags summaryColumnFlagValue = fieldColumnsEnumValue.GetSummaryFieldColumn();

                lvFieldList.Columns[(int)fieldColumnsEnumValue].Width =
                    (visibleColumns.HasFlag(summaryColumnFlagValue) ?
                     DefaultSummaryColumnWidth :
                     0);
            }
        }
        private void ResizeSeriesListColumns()
        {
            int  characterWidth       = (int)(lvFieldList.Font.Size * 1.5);
            Size startingListViewSize = lvFieldList.Size;

            int[] maxFieldSizes           = new int[lvFieldList.Columns.Count];
            int   totalVisibleColumnWidth = 0;
            float widthDelta = 0F;

            foreach (ListViewItem lvi in lvFieldList.Items)
            {
                Array fieldColumns = Enum.GetValues(typeof(FieldListColumns));

                /* These three columns have minimum sizes, and are never hidden */
                int fieldNameColumnIdx           = 0;
                int fieldColumnMinimumCharacters = 5; // Allow room for the warning image
                int valueColumnIdx = 1;
                int valueColumnMinimumCharacters = 6; // No header text in this column
                int unitColumnIdx = lvFieldList.Columns.Count - 1;
                int unitColumnMinimumCharacters = 5;  // Allow room for the warning image

                maxFieldSizes[fieldNameColumnIdx] = GetMaxWidthForColumn(lvi, fieldNameColumnIdx, fieldColumnMinimumCharacters);
                maxFieldSizes[valueColumnIdx]     = GetMaxWidthForColumn(lvi, valueColumnIdx, valueColumnMinimumCharacters);
                maxFieldSizes[unitColumnIdx]      = GetMaxWidthForColumn(lvi, unitColumnIdx, unitColumnMinimumCharacters);

                // skip first two (Field Name, Value) and last (Unit). These columns are always displayed.
                for (int i = 2; i < fieldColumns.GetLength(0) - 1; i++)
                {
                    FieldListColumns   fieldColumnsEnumValue  = (FieldListColumns)fieldColumns.GetValue(i);
                    SummaryColumnFlags summaryColumnFlagValue = fieldColumnsEnumValue.GetSummaryFieldColumn();

                    if (lvFieldList.Columns[(int)fieldColumnsEnumValue].Width > 0)
                    {
                        maxFieldSizes[(int)fieldColumnsEnumValue] = GetMaxWidthForColumn(lvi, (int)fieldColumnsEnumValue, _maxFieldSizes[(int)fieldColumnsEnumValue]);
                    }
                }
            }

            for (int i = 0; i < maxFieldSizes.Length; i++)
            {
                if (maxFieldSizes[i] > _maxFieldSizes[i] || lvFieldList.Columns[i].Width != (int)(maxFieldSizes[i] * characterWidth))
                {
                    widthDelta += (_maxFieldSizes[i] - maxFieldSizes[i]) * characterWidth;

                    _maxFieldSizes[i] = maxFieldSizes[i];

                    lvFieldList.Columns[i].Width = (int)(maxFieldSizes[i] * characterWidth);
                }

                totalVisibleColumnWidth += lvFieldList.Columns[i].Width;
            }

            if (widthDelta != 0)
            {
                int scrollBarMargin = 5; // to get rid of scroll bar at bottom of ListView

                Size newListViewSize = new Size(totalVisibleColumnWidth + scrollBarMargin, lvFieldList.Height);

                int listViewSizeDelta = newListViewSize.Width - startingListViewSize.Width;

                splitContainer1.SplitterDistance = totalVisibleColumnWidth + scrollBarMargin;

                lvFieldList.Size = newListViewSize;

                if (Parent != null)
                {
                    Parent.Size = new Size(Parent.Width + listViewSizeDelta, Parent.Height);
                }
            }
        }
        /// <summary>
        /// Updates the value columns in the listview from the selected frame data.
        /// </summary>
        /// <param name="frameIdx"></param>
        private void UpdateSeriesListValues(int frameIdx)
        {
            if (!(TelemetryData?.HasValues).GetValueOrDefault(false))
            {
                // default settings - clear out all columns except field name and unit
                foreach (ILineGraphSeries series in Model.SeriesCollection)
                {
                    ListViewItem listItem = lvFieldList.Items[series.FieldIndex];

                    for (int i = 1; i < lvFieldList.Columns.Count - 1; i++)
                    {
                        listItem.SubItems[i].Text = String.Empty;
                    }
                }
            }
            else
            {
                // display telemetry values
                foreach (ILineGraphSeries series in Model.SeriesCollection)
                {
                    ListViewItem listItem = lvFieldList.Items[series.FieldIndex];

                    float minWarning = series.ShowMinimumWarning ?
                                       series.MinWarning
                            : 0;

                    float maxWarning = series.ShowMaximumWarning ?
                                       series.MaxWarning
                            : 0;

                    FrameFieldValues frameFieldValues = GetFrameFieldValues(
                        series.SummaryColumnFlags,
                        _selectedLapIdx,
                        frameIdx,
                        series.FieldIndex,
                        minWarning,
                        maxWarning);

                    if (frameFieldValues.HasValues)
                    {
                        listItem.SubItems[(int)FieldListColumns.Value].Text = frameFieldValues.Value.ToString(series.Format);

                        if (frameFieldValues.MinWarning)
                        {
                            listItem.ImageIndex = MinWarningImageIndex;
                        }
                        else if (frameFieldValues.MaxWarning)
                        {
                            listItem.ImageIndex = MaxWarningImageIndex;
                        }
                        else
                        {
                            listItem.ImageIndex = NoWarningImageIndex;
                        }

                        Array fieldColumns = Enum.GetValues(typeof(FieldListColumns));

                        for (int i = 2; i < fieldColumns.GetLength(0) - 1; i++)
                        {
                            FieldListColumns   fieldColumnsEnumValue  = (FieldListColumns)fieldColumns.GetValue(i);
                            SummaryColumnFlags summaryColumnFlagValue = fieldColumnsEnumValue.GetSummaryFieldColumn();

                            listItem.SubItems[(int)fieldColumnsEnumValue].Text =
                                series.SummaryColumnFlags.HasFlag(summaryColumnFlagValue) ? frameFieldValues.SummaryValues[summaryColumnFlagValue].ToString(series.Format) : MissingSummaryValueDisplay;
                        }
                    }
                }
            }

            ResizeSeriesListColumns();
        }