/src/AddIns/Misc/PackageManagement/Project/Src/Pages.cs

https://github.com/ajadex/SharpDevelop · C# · 170 lines · 126 code · 23 blank · 21 comment · 20 complexity · 974389b4711d30a39d2af05c5e863445 MD5 · raw file

  1. // Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
  2. //
  3. // Permission is hereby granted, free of charge, to any person obtaining a copy of this
  4. // software and associated documentation files (the "Software"), to deal in the Software
  5. // without restriction, including without limitation the rights to use, copy, modify, merge,
  6. // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
  7. // to whom the Software is furnished to do so, subject to the following conditions:
  8. //
  9. // The above copyright notice and this permission notice shall be included in all copies or
  10. // substantial portions of the Software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  13. // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  14. // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
  15. // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  16. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  17. // DEALINGS IN THE SOFTWARE.
  18. using System;
  19. using System.Collections.ObjectModel;
  20. namespace ICSharpCode.PackageManagement
  21. {
  22. public class Pages : ObservableCollection<Page>
  23. {
  24. public const int DefaultPageSize = 10;
  25. public const int DefaultMaximumSelectablePages = 5;
  26. int pageSize = DefaultPageSize;
  27. int selectedPageNumber = 1;
  28. int maximumSelectablePages = DefaultMaximumSelectablePages;
  29. int totalItems = 0;
  30. int itemsOnSelectedPage = 0;
  31. public int TotalItems {
  32. get { return totalItems; }
  33. set {
  34. if (totalItems != value) {
  35. totalItems = value;
  36. UpdatePages();
  37. }
  38. }
  39. }
  40. public int SelectedPageNumber {
  41. get { return selectedPageNumber; }
  42. set {
  43. if (selectedPageNumber != value) {
  44. selectedPageNumber = value;
  45. UpdatePages();
  46. }
  47. }
  48. }
  49. public int MaximumSelectablePages {
  50. get { return maximumSelectablePages; }
  51. set {
  52. if (maximumSelectablePages != value) {
  53. maximumSelectablePages = value;
  54. UpdatePages();
  55. }
  56. }
  57. }
  58. public int ItemsBeforeFirstPage {
  59. get {
  60. return (selectedPageNumber - 1) * pageSize;
  61. }
  62. }
  63. public bool IsPaged {
  64. get { return totalItems > pageSize; }
  65. }
  66. public bool HasPreviousPage {
  67. get { return IsPaged && !IsFirstPageSelected; }
  68. }
  69. bool IsFirstPageSelected {
  70. get { return selectedPageNumber == 1; }
  71. }
  72. public bool HasNextPage {
  73. get { return IsPaged && !IsLastPageSelected; }
  74. }
  75. bool IsLastPageSelected {
  76. get { return selectedPageNumber == TotalPages; }
  77. }
  78. public int TotalPages {
  79. get { return (totalItems + pageSize - 1) / pageSize; }
  80. }
  81. public int PageSize {
  82. get { return pageSize; }
  83. set {
  84. if (pageSize != value) {
  85. pageSize = value;
  86. UpdatePages();
  87. }
  88. }
  89. }
  90. void UpdatePages()
  91. {
  92. Clear();
  93. int startPage = GetStartPage();
  94. for (int pageNumber = startPage; pageNumber <= TotalPages; ++pageNumber) {
  95. if (Count >= maximumSelectablePages) {
  96. break;
  97. }
  98. Page page = CreatePage(pageNumber);
  99. Add(page);
  100. }
  101. }
  102. int GetStartPage()
  103. {
  104. // Less pages than can be selected?
  105. int totalPages = TotalPages;
  106. if (totalPages <= maximumSelectablePages) {
  107. return 1;
  108. }
  109. // First choice for start page.
  110. int startPage = selectedPageNumber - (maximumSelectablePages / 2);
  111. if (startPage <= 0) {
  112. return 1;
  113. }
  114. // Do we have enough pages?
  115. int totalPagesBasedOnStartPage = totalPages - startPage + 1;
  116. if (totalPagesBasedOnStartPage >= maximumSelectablePages) {
  117. return startPage;
  118. }
  119. // Ensure we have enough pages.
  120. startPage -= maximumSelectablePages - totalPagesBasedOnStartPage;
  121. if (startPage > 0) {
  122. return startPage;
  123. }
  124. return 1;
  125. }
  126. Page CreatePage(int pageNumber)
  127. {
  128. var page = new Page();
  129. page.Number = pageNumber;
  130. page.IsSelected = IsSelectedPage(pageNumber);
  131. return page;
  132. }
  133. bool IsSelectedPage(int pageNumber)
  134. {
  135. return pageNumber == selectedPageNumber;
  136. }
  137. public int TotalItemsOnSelectedPage {
  138. get { return itemsOnSelectedPage; }
  139. set {
  140. itemsOnSelectedPage = value;
  141. if (itemsOnSelectedPage < pageSize) {
  142. TotalItems = (selectedPageNumber - 1) * pageSize + itemsOnSelectedPage;
  143. }
  144. }
  145. }
  146. }
  147. }