OSDN Git Service

add scroll player
[pettanr/pettanr.git] / lib / locmare / list_group / lib / page_status.rb
1 module Locmare
2   module ListGroupModule
3     module LibModule
4       class PageStatus
5         
6         class Default
7           attr :total, :options
8           
9           def initialize list, total, options
10             @list = list
11             @total = total
12             @options = options
13           end
14           
15           def to_hash
16             {
17               :type => :default, :total => @total, :total_page => self.total_page, 
18               :page => self.page, :page_size => self.limit
19             }
20           end
21           
22           def pager
23             @pager ||= ::Locmare::ListGroupModule::LibModule::Pager::Default.new(self, @options)
24           end
25           
26           def offset
27             return @offset if @offset
28             @offset = (self.page - 1) * self.limit
29           end
30           
31           def limit
32             return @limit if @limit
33             @limit = PageStatus.page_size(@options) || self.default_page_size
34             if @list.limited?
35               @limit = self.default_page_size if @limit < 0
36               @limit = self.max_page_size if @limit > self.max_page_size
37             else  # unlimited api
38               @limit = -1 if @limit < 0
39             end
40             @limit = @total if @total and (@limit > @total)
41             @limit
42           end
43           
44           def page
45             return @page if @page
46             @page = PageStatus.page(@options).to_i
47             @page = 1 if @page < 1
48             @page
49           end
50           
51           def default_page_size
52             @list.default_page_size
53           end
54           
55           def max_page_size
56             @list.max_page_size
57           end
58           
59           def mod
60             @total % self.limit
61           end
62           
63           def adjust
64             self.mod == 0 ? 0 : 1
65           end
66           
67           def total_page
68             (@total / self.limit) + self.adjust
69           end
70           
71           def pageable?
72             self.total_page > 1
73           end
74           
75         end
76         
77         class Offset
78           attr :total, :options
79           
80           def initialize list, total, options
81             @list = list
82             @total = total
83             @options = options
84           end
85           
86           def to_hash
87             {
88               :type => :offset, :total => @total, :total_page => self.total_page, 
89               :offset => self.offset, :count => self.limit
90             }
91           end
92           
93           def pager
94             @pager ||= ::Locmare::ListGroupModule::LibModule::Pager::Offset.new(self, @options)
95           end
96           
97           def offset
98             return @offset if @offset
99             @offset = PageStatus.offset(@options).to_i
100             @offset = @total - 1 if @offset >= @total
101             @offset = @total - @offset.abs if @offset < 0
102             @offset = 0 if @offset < 0
103             @offset
104           end
105           
106           def limit
107             return @limit if @limit
108             @limit = self.count || self.default_page_size
109             @limit = self.default_page_size if @limit == 0
110             if @list.limited?
111               @limit = self.default_page_size if @limit < 0
112               @limit = self.max_page_size if @limit > self.max_page_size
113             else  # unlimited api
114               @limit = -1 if @limit < 0
115             end
116             @limit = @total if @total and (@limit > @total)
117             @limit
118           end
119           
120           def count
121             @count ||= PageStatus.count(@options)
122           end
123           
124           def first_mod
125             self.offset % self.limit
126           end
127           
128           def last_mod
129             (@total - self.offset) % self.limit
130           end
131           
132           def first_adjust
133             self.first_mod == 0 ? 0 : 1
134           end
135           
136           def last_adjust
137             self.last_mod == 0 ? 0 : 1
138           end
139           
140           def page
141             return 1 if self.limit < 0
142             self.offset / self.limit + 1 + self.first_adjust
143           end
144           
145           def default_page_size
146             @list.default_page_size
147           end
148           
149           def max_page_size
150             @list.max_page_size
151           end
152           
153           def total_page
154             return 1 if self.limit < 0
155             @total / self.limit + self.first_adjust + self.last_adjust
156           end
157           
158           def pageable?
159             self.total_page > 1
160           end
161           
162         end
163         
164         class Unlimited
165           attr :total, :options
166           
167           def initialize list, total, options
168             @list = list
169             @total = total
170             @options = options
171           end
172           
173           def to_hash
174             {
175               :type => :unlimited
176             }
177           end
178           
179           def pager
180             nil
181           end
182           
183           def offset
184             0
185           end
186           
187           def limit
188             -1
189           end
190           
191           def pageable?
192             false
193           end
194           
195         end
196         
197         def self.load list, total, options
198           return nil if total == 0
199           ps = if self.offset(options) or self.count(options)
200             Offset.new list, total, options
201           else
202             Default.new list, total, options
203           end
204           ps = Unlimited.new(list, total, options) if ps.limit < 0
205           ps
206         end
207         
208         def self.page options
209           n = options['page'] || options[:page]
210           n ? n.to_i : nil
211         end
212         
213         def self.page_size options
214           n = options['page_size'] || options[:page_size]
215           n ? n.to_i : nil
216         end
217         
218         def self.offset options
219           n = options['offset'] || options[:offset]
220           n ? n.to_i : nil
221         end
222         
223         def self.count options
224           n = options['count'] || options[:count]
225           n ? n.to_i : nil
226         end
227         
228       end
229       
230     end
231   end
232 end