PageNumbersParser.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. #if Demo
  74. total = 5;
  75. #endif
  76. // remove bad page numbers
  77. for (int i = 0; i < pages.Count; i++)
  78. {
  79. if (pages[i] >= total || pages[i] < 0)
  80. {
  81. pages.RemoveAt(i);
  82. i--;
  83. }
  84. }
  85. if (report.PrintSettings.PrintPages == PrintPages.Odd)
  86. {
  87. int i = 0;
  88. while (i < pages.Count)
  89. {
  90. if (pages[i] % 2 == 0)
  91. i++;
  92. else
  93. pages.RemoveAt(i);
  94. }
  95. }
  96. else if (report.PrintSettings.PrintPages == PrintPages.Even)
  97. {
  98. int i = 0;
  99. while (i < pages.Count)
  100. {
  101. if (pages[i] % 2 != 0)
  102. i++;
  103. else
  104. pages.RemoveAt(i);
  105. }
  106. }
  107. // Remove pages with Printable property equal false.
  108. for (int i = 0; i < pages.Count; i++)
  109. {
  110. if (!report.PreparedPages.GetPage(i).Printable)
  111. {
  112. pages.RemoveAt(i);
  113. }
  114. }
  115. if (report.PrintSettings.Reverse)
  116. pages.Reverse();
  117. }
  118. }
  119. }