PageNumbersParser.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. namespace FastReport.Print
  5. {
  6. internal class PageNumbersParser
  7. {
  8. private List<int> pages;
  9. public int Count
  10. {
  11. get { return pages.Count; }
  12. }
  13. private bool Parse(string pageNumbers, int total)
  14. {
  15. pages.Clear();
  16. string s = pageNumbers.Replace(" ", "");
  17. if (s == "") return false;
  18. if (s[s.Length - 1] == '-')
  19. s += total.ToString();
  20. s += ',';
  21. int i = 0;
  22. int j = 0;
  23. int n1 = 0;
  24. int n2 = 0;
  25. bool isRange = false;
  26. while (i < s.Length)
  27. {
  28. if (s[i] == ',')
  29. {
  30. n2 = int.Parse(s.Substring(j, i - j));
  31. j = i + 1;
  32. if (isRange)
  33. {
  34. while (n1 <= n2)
  35. {
  36. pages.Add(n1 - 1);
  37. n1++;
  38. }
  39. }
  40. else
  41. pages.Add(n2 - 1);
  42. isRange = false;
  43. }
  44. else if (s[i] == '-')
  45. {
  46. isRange = true;
  47. n1 = int.Parse(s.Substring(j, i - j));
  48. j = i + 1;
  49. }
  50. i++;
  51. }
  52. return true;
  53. }
  54. public bool GetPage(ref int pageNo)
  55. {
  56. if (pages.Count == 0)
  57. return false;
  58. pageNo = pages[0];
  59. pages.RemoveAt(0);
  60. return true;
  61. }
  62. public PageNumbersParser(Report report, int curPage)
  63. {
  64. pages = new List<int>();
  65. int total = report.PreparedPages.Count;
  66. if (report.PrintSettings.PageRange == PageRange.Current)
  67. pages.Add(curPage - 1);
  68. else if (!Parse(report.PrintSettings.PageNumbers, total))
  69. {
  70. for (int i = 0; i < total; i++)
  71. pages.Add(i);
  72. }
  73. // remove bad page numbers
  74. for (int i = 0; i < pages.Count; i++)
  75. {
  76. if (pages[i] >= total || pages[i] < 0)
  77. {
  78. pages.RemoveAt(i);
  79. i--;
  80. }
  81. }
  82. if (report.PrintSettings.PrintPages == PrintPages.Odd)
  83. {
  84. int i = 0;
  85. while (i < pages.Count)
  86. {
  87. if (pages[i] % 2 == 0)
  88. i++;
  89. else
  90. pages.RemoveAt(i);
  91. }
  92. }
  93. else if (report.PrintSettings.PrintPages == PrintPages.Even)
  94. {
  95. int i = 0;
  96. while (i < pages.Count)
  97. {
  98. if (pages[i] % 2 != 0)
  99. i++;
  100. else
  101. pages.RemoveAt(i);
  102. }
  103. }
  104. // Remove pages with Printable property equal false.
  105. for (int i = 0; i < pages.Count; i++)
  106. {
  107. if (!report.PreparedPages.GetPage(pages[i]).Printable)
  108. {
  109. pages.RemoveAt(i);
  110. }
  111. }
  112. if (report.PrintSettings.Reverse)
  113. pages.Reverse();
  114. }
  115. }
  116. }