4b1dd7025bdd16da6451314f2f4c339a6ce596fd
[mono.git] / mcs / class / System.Web.Mobile / System.Web.UI.MobileControls / ItemPager.cs
1 /**
2  * Project   : Mono
3  * Namespace : System.Web.UI.MobileControls
4  * Class     : ItemPager
5  * Author    : Gaurav Vaish
6  *
7  * Copyright : 2003 with Gaurav Vaish, and with
8  *             Ximian Inc
9  */
10
11 using System.Web.Mobile;
12
13 namespace System.Web.UI.MobileControls
14 {
15         public class ItemPager
16         {
17                 private MobileControl control;
18
19                 private int firstPage;
20                 private int lastPage;
21
22                 private int firstPageItemCount;
23                 private int fullPageItemCount;
24                 private int lastPageItemCount;
25
26                 public ItemPager()
27                 {
28                 }
29
30                 public ItemPager(ControlPager pager, MobileControl control,
31                                  int itemCount, int itemsPerPage, int itemWeight)
32                 {
33                         this.control = control;
34                         if(itemsPerPage > 0)
35                         {
36                                 if(itemCount < itemsPerPage)
37                                 {
38                                         firstPageItemCount = itemCount;
39                                         firstPage = pager.GetPage(itemWeight * itemCount);
40                                         lastPage  = firstPage;
41                                 } else
42                                 {
43                                         int ppic = (itemCount - 1)/itemsPerPage + 1;
44                                         firstPageItemCount = itemsPerPage;
45                                         fullPageItemCount  = itemsPerPage;
46                                         lastPageItemCount = ppic - (ppic - 1)*itemsPerPage;
47                                         firstPage = pager.GetPage(itemsPerPage * itemWeight);
48                                         pager.PageCount += (ppic - 1);
49                                         if(ppic > 1)
50                                         {
51                                                 pager.RemainingWeight = pager.PageWeight
52                                                                         - (itemsPerPage * itemWeight);
53                                                 lastPage = firstPage + ppic - 1;
54                                         }
55                                 }
56                         } else
57                         {
58                                 int totalWt = itemWeight * itemCount;
59                                 if(totalWt <= pager.RemainingWeight)
60                                 {
61                                         firstPageItemCount = itemCount;
62                                         firstPage = pager.GetPage(totalWt);
63                                         lastPage  = firstPage;
64                                 } else
65                                 {
66                                         firstPageItemCount = pager.RemainingWeight / itemWeight;
67                                         int rem = itemCount - firstPageItemCount;
68                                         fullPageItemCount  = Math.Max(itemWeight, pager.PageWeight);
69                                         int pages = rem / fullPageItemCount;
70                                         lastPageItemCount = rem % fullPageItemCount;
71                                         firstPage = pager.PageCount;
72                                         pager.PageCount += 1;
73                                         pager.RemainingWeight = pager.PageWeight;
74                                         pager.PageCount += pages;
75                                         pager.RemainingWeight -= lastPageItemCount * itemWeight;
76                                         if(firstPageItemCount == 0)
77                                         {
78                                                 firstPage += 1;
79                                                 firstPageItemCount = Math.Min(fullPageItemCount,
80                                                                               itemCount);
81                                         }
82                                         if(lastPageItemCount == 0)
83                                         {
84                                                 pager.PageCount -= 1;
85                                                 lastPageItemCount = Math.Min(fullPageItemCount,
86                                                                              itemCount);
87                                                 pager.RemainingWeight = 0;
88                                         }
89                                         lastPage = pager.PageCount;
90                                 }
91                                 control.FirstPage = firstPage;
92                                 control.LastPage  = lastPage;
93                         }
94                 }
95
96                 public int ItemCount
97                 {
98                         get
99                         {
100                                 return GetItemCount();
101                         }
102                 }
103
104                 public int ItemIndex
105                 {
106                         get
107                         {
108                                 return GetItemIndex();
109                         }
110                 }
111
112                 private int GetItemCount()
113                 {
114                         int cp = control.Form.CurrentPage;
115                         int retVal;
116                         if(cp >= firstPage && cp <= lastPage)
117                         {
118                                 if(cp == firstPage)
119                                         retVal = firstPageItemCount;
120                                 else if(cp == lastPage)
121                                         retVal = lastPageItemCount;
122                                 else
123                                         retVal = fullPageItemCount;
124                         } else
125                         {
126                                 retVal = -1;
127                         }
128                         return retVal;
129                 }
130
131                 private int GetItemIndex()
132                 {
133                         int cp = control.Form.CurrentPage;
134                         int retVal;
135                         if(cp >= firstPage && cp <= lastPage)
136                         {
137                                 if(cp == firstPage)
138                                         retVal = 0;
139                                 else
140                                 {
141                                         retVal = (cp - firstPage - 1)* fullPageItemCount
142                                                  + firstPageItemCount;
143                                 }
144                         } else
145                         {
146                                 retVal = -1;
147                         }
148                         return retVal;
149                 }
150         }
151 }