- add sources.
[platform/framework/web/crosswalk.git] / src / printing / page_number.cc
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "printing/page_number.h"
6
7 #include <limits>
8
9 #include "base/logging.h"
10 #include "printing/print_settings.h"
11
12 namespace printing {
13
14 PageNumber::PageNumber(const PrintSettings& settings, int document_page_count) {
15   Init(settings, document_page_count);
16 }
17
18 PageNumber::PageNumber()
19     : ranges_(NULL),
20       page_number_(-1),
21       page_range_index_(-1),
22       document_page_count_(0) {
23 }
24
25 void PageNumber::operator=(const PageNumber& other) {
26   ranges_ = other.ranges_;
27   page_number_ = other.page_number_;
28   page_range_index_ = other.page_range_index_;
29   document_page_count_ = other.document_page_count_;
30 }
31
32 void PageNumber::Init(const PrintSettings& settings, int document_page_count) {
33   DCHECK(document_page_count);
34   ranges_ = settings.ranges().empty() ? NULL : &settings.ranges();
35   document_page_count_ = document_page_count;
36   if (ranges_) {
37     page_range_index_ = 0;
38     page_number_ = (*ranges_)[0].from;
39   } else {
40     if (document_page_count) {
41       page_number_ = 0;
42     } else {
43       page_number_ = -1;
44     }
45     page_range_index_ = -1;
46   }
47 }
48
49 int PageNumber::operator++() {
50   if (!ranges_) {
51     // Switch to next page.
52     if (++page_number_ == document_page_count_) {
53       // Finished.
54       *this = npos();
55     }
56   } else {
57     // Switch to next page.
58     ++page_number_;
59     // Page ranges are inclusive.
60     if (page_number_ > (*ranges_)[page_range_index_].to) {
61       DCHECK(ranges_->size() <= static_cast<size_t>(
62           std::numeric_limits<int>::max()));
63       if (++page_range_index_ == static_cast<int>(ranges_->size())) {
64         // Finished.
65         *this = npos();
66       } else {
67         page_number_ = (*ranges_)[page_range_index_].from;
68       }
69     }
70   }
71   return ToInt();
72 }
73
74 bool PageNumber::operator==(const PageNumber& other) const {
75   return page_number_ == other.page_number_ &&
76          page_range_index_ == other.page_range_index_;
77 }
78 bool PageNumber::operator!=(const PageNumber& other) const {
79   return page_number_ != other.page_number_ ||
80          page_range_index_ != other.page_range_index_;
81 }
82
83 }  // namespace printing