public static DataItemReport CaptureReport(this IScreenSection section, ScreenContent Content)
        {
            var sb            = new StringBuilder();
            var sectionHeader = section as ISectionHeader;
            var sectionDim    = section.CalcDim();
            var itemReport    = new DataItemReport();

            IScreenLoc start = section.ScreenLoc;
            {
                start = start.NewInstance(start.RowNum, start.ColNum);
            }

            int  repeatIx  = 0;
            bool endOfRows = false;

            while (endOfRows == false)
            {
                if ((repeatIx > 0) && (repeatIx >= section.RepeatCount))
                {
                    break;
                }
                repeatIx += 1;

                // section is a subfile. subfile row can be blank. If blank consider as
                // the end of rows of the subfile. So no need to match.
                bool rowIsBlank = false;
                if (section.PurposeCode == ScreenPurposeCode.ReportDetail)
                {
                    if (Content.RowIsBlank(start.RowNum) == true)
                    {
                        rowIsBlank = true;
                    }
                }

                // a blank row. no more rows to match.
                if (rowIsBlank == true)
                {
                    endOfRows = true;
                }

                if (endOfRows == false)
                {
                    var report = sectionHeader.CaptureToReport(start, Content);
                    var combo  = DataItemReport.CombineVertically(itemReport, report);
                    itemReport = combo;
                }
                start.RowNum += 1;
            }

            return(itemReport);
        }
        public static bool Match(this IScreenSection section, ScreenContent Content, string DebugInfo)
        {
            bool isMatch    = true;
            var  header     = section as ISectionHeader;
            var  sectionDim = section.CalcDim();

            IScreenLoc start = section.ScreenLoc;
            {
                start = start.NewInstance(start.RowNum, start.ColNum);
            }

            int  repeatIx  = 0;
            bool endOfRows = false;

            while (isMatch == true)
            {
                if ((repeatIx > 0) && (repeatIx >= section.RepeatCount))
                {
                    break;
                }
                repeatIx += 1;

                // section is a subfile. subfile row can be blank. If blank consider as
                // the end of rows of the subfile. So no need to match.
                bool rowIsBlank = false;
                if (section.PurposeCode == ScreenPurposeCode.ReportDetail)
                {
                    if (Content.RowIsBlank(start.RowNum) == true)
                    {
                        rowIsBlank = true;
                    }
                }

                // a blank row. no more rows to match.
                if (rowIsBlank == true)
                {
                    endOfRows = true;
                }

                if (endOfRows == false)
                {
                    isMatch = header.Match(start, Content, DebugInfo);
                }
                start.RowNum += 1;
            }

            return(isMatch);
        }
        /// <summary>
        /// find the item within the screen section.
        /// </summary>
        /// <param name="section"></param>
        /// <param name="Start"></param>
        /// <param name="FindLoc"></param>
        /// <param name="Content"></param>
        /// <returns></returns>
        public static ScreenItemInstance FindItem(
            this IScreenSection section, IScreenLoc Start, IScreenLoc FindLoc,
            ScreenContent Content)
        {
            ScreenItemInstance foundItem = null;
            var header     = section as ISectionHeader;
            var sectionDim = section.CalcDim();

            var adjRow = Start.RowNum - 1;
            var adjCol = Start.ColNum - 1;
            var start  = new OneScreenLoc(
                section.ScreenLoc.RowNum + adjRow, section.ScreenLoc.ColNum + adjCol);

            int  repeatIx  = 0;
            bool endOfRows = false;
            int  loopCx    = 0;

            while (foundItem == null)
            {
                if (section.PurposeCode != ScreenPurposeCode.ReportDetail)
                {
                    if (loopCx > 0)
                    {
                        break;
                    }
                }
                else
                {
                    if (repeatIx >= section.GetRepeatCount())
                    {
                        break;
                    }
                    repeatIx += 1;
                }
                loopCx += 1;

                // section is a subfile. subfile row can be blank. If blank consider as
                // the end of rows of the subfile. So no need to match.
                bool rowIsBlank = false;
                if (section.PurposeCode == ScreenPurposeCode.ReportDetail)
                {
                    if (Content.RowIsBlank(start.RowNum) == true)
                    {
                        rowIsBlank = true;
                    }
                }

                // a blank row. no more rows to match.
                if (rowIsBlank == true)
                {
                    endOfRows = true;
                }

                if (endOfRows == false)
                {
                    foundItem = header.FindItem(start, FindLoc, Content);
                    if (foundItem != null)
                    {
                        foundItem.RepeatNum = repeatIx;
                        break;
                    }
                }
                start.RowNum += 1;
            }

            return(foundItem);
        }