| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | using System;using System.Collections;using System.Collections.Generic;namespace FastReport.Print{    internal class PageNumbersParser    {        private List<int> pages;        public int Count        {            get { return pages.Count; }        }        private bool Parse(string pageNumbers, int total)        {            pages.Clear();            string s = pageNumbers.Replace(" ", "");            if (s == "") return false;            if (s[s.Length - 1] == '-')                s += total.ToString();            s += ',';            int i = 0;            int j = 0;            int n1 = 0;            int n2 = 0;            bool isRange = false;            while (i < s.Length)            {                if (s[i] == ',')                {                    n2 = int.Parse(s.Substring(j, i - j));                    j = i + 1;                    if (isRange)                    {                        while (n1 <= n2)                        {                            pages.Add(n1 - 1);                            n1++;                        }                    }                    else                        pages.Add(n2 - 1);                    isRange = false;                }                else if (s[i] == '-')                {                    isRange = true;                    n1 = int.Parse(s.Substring(j, i - j));                    j = i + 1;                }                i++;            }            return true;        }        public bool GetPage(ref int pageNo)        {            if (pages.Count == 0)                return false;            pageNo = pages[0];            pages.RemoveAt(0);            return true;        }        public PageNumbersParser(Report report, int curPage)        {            pages = new List<int>();            int total = report.PreparedPages.Count;            if (report.PrintSettings.PageRange == PageRange.Current)                pages.Add(curPage - 1);            else if (!Parse(report.PrintSettings.PageNumbers, total))            {                for (int i = 0; i < total; i++)                    pages.Add(i);            }            // remove bad page numbers            for (int i = 0; i < pages.Count; i++)            {                if (pages[i] >= total || pages[i] < 0)                {                    pages.RemoveAt(i);                    i--;                }            }            if (report.PrintSettings.PrintPages == PrintPages.Odd)            {                int i = 0;                while (i < pages.Count)                {                    if (pages[i] % 2 == 0)                        i++;                    else                        pages.RemoveAt(i);                }            }            else if (report.PrintSettings.PrintPages == PrintPages.Even)            {                int i = 0;                while (i < pages.Count)                {                    if (pages[i] % 2 != 0)                        i++;                    else                        pages.RemoveAt(i);                }            }            // Remove pages with Printable property equal false.            for (int i = 0; i < pages.Count; i++)            {                if (!report.PreparedPages.GetPage(pages[i]).Printable)                {                    pages.RemoveAt(i);                }            }            if (report.PrintSettings.Reverse)                pages.Reverse();        }    }}
 |