5
// Matt Ward <ward.matt@gmail.com>
7
// Copyright (C) 2013 Matthew Ward
9
// Permission is hereby granted, free of charge, to any person obtaining
10
// a copy of this software and associated documentation files (the
11
// "Software"), to deal in the Software without restriction, including
12
// without limitation the rights to use, copy, modify, merge, publish,
13
// distribute, sublicense, and/or sell copies of the Software, and to
14
// permit persons to whom the Software is furnished to do so, subject to
15
// the following conditions:
17
// The above copyright notice and this permission notice shall be
18
// included in all copies or substantial portions of the Software.
20
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
using System.Collections.ObjectModel;
32
namespace ICSharpCode.PackageManagement
34
public class Pages : ObservableCollection<Page>
36
public const int DefaultPageSize = 29;
37
public const int DefaultMaximumSelectablePages = 5;
39
int pageSize = DefaultPageSize;
40
int selectedPageNumber = 1;
41
int maximumSelectablePages = DefaultMaximumSelectablePages;
43
int itemsOnSelectedPage = 0;
45
public int TotalItems {
46
get { return totalItems; }
48
if (totalItems != value) {
55
public int SelectedPageNumber {
56
get { return selectedPageNumber; }
58
if (selectedPageNumber != value) {
59
selectedPageNumber = value;
65
public int MaximumSelectablePages {
66
get { return maximumSelectablePages; }
68
if (maximumSelectablePages != value) {
69
maximumSelectablePages = value;
75
public int ItemsBeforeFirstPage {
77
return (selectedPageNumber - 1) * pageSize;
82
get { return totalItems > pageSize; }
85
public bool HasPreviousPage {
86
get { return IsPaged && !IsFirstPageSelected; }
89
bool IsFirstPageSelected {
90
get { return selectedPageNumber == 1; }
93
public bool HasNextPage {
94
get { return IsPaged && !IsLastPageSelected; }
97
bool IsLastPageSelected {
98
get { return selectedPageNumber == TotalPages; }
101
public int TotalPages {
102
get { return (totalItems + pageSize - 1) / pageSize; }
105
public int PageSize {
106
get { return pageSize; }
108
if (pageSize != value) {
119
int startPage = GetStartPage();
120
for (int pageNumber = startPage; pageNumber <= TotalPages; ++pageNumber) {
121
if (Count >= maximumSelectablePages) {
124
Page page = CreatePage(pageNumber);
131
// Less pages than can be selected?
132
int totalPages = TotalPages;
133
if (totalPages <= maximumSelectablePages) {
137
// First choice for start page.
138
int startPage = selectedPageNumber - (maximumSelectablePages / 2);
139
if (startPage <= 0) {
143
// Do we have enough pages?
144
int totalPagesBasedOnStartPage = totalPages - startPage + 1;
145
if (totalPagesBasedOnStartPage >= maximumSelectablePages) {
149
// Ensure we have enough pages.
150
startPage -= maximumSelectablePages - totalPagesBasedOnStartPage;
157
Page CreatePage(int pageNumber)
159
var page = new Page();
160
page.Number = pageNumber;
161
page.IsSelected = IsSelectedPage(pageNumber);
165
bool IsSelectedPage(int pageNumber)
167
return pageNumber == selectedPageNumber;
170
public int TotalItemsOnSelectedPage {
171
get { return itemsOnSelectedPage; }
173
itemsOnSelectedPage = value;
174
if (itemsOnSelectedPage < pageSize) {
175
TotalItems = (selectedPageNumber - 1) * pageSize + itemsOnSelectedPage;