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 84