15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef PRINTING_PAGE_NUMBER_H_
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define PRINTING_PAGE_NUMBER_H_
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <ostream>
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "printing/page_range.h"
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace printing {
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PrintSettings;
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Represents a page series following the array of page ranges defined in a
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// PrintSettings.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class PRINTING_EXPORT PageNumber {
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public:
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Initializes the page to the first page in the settings's range or 0.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  PageNumber(const PrintSettings& settings, int document_page_count);
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  PageNumber();
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  void operator=(const PageNumber& other);
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Initializes the page to the first page in the setting's range or 0. It
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // initialize to npos if the range is empty and document_page_count is 0.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  void Init(const PrintSettings& settings, int document_page_count);
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Converts to a page numbers.
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  int ToInt() const {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return page_number_;
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch  }
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)  // Calculates the next page in the serie.
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  int operator++();
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
39e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)  // Returns an instance that represents the end of a serie.
40e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)  static const PageNumber npos() {
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return PageNumber();
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
43c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Equality operator. Only the current page number is verified so that
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // "page != PageNumber::npos()" works.
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool operator==(const PageNumber& other) const;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool operator!=(const PageNumber& other) const;
485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private:
50197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch  // The page range to follow.
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  const PageRanges* ranges_;
525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // The next page to be printed. -1 when not printing.
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  int page_number_;
551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  // The next page to be printed. -1 when not used. Valid only if
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // document()->settings().range.empty() is false.
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  int page_range_index_;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Number of expected pages in the document. Used when ranges_ is NULL.
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  int document_page_count_;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Debug output support.
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<class E, class T>
66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)inline typename std::basic_ostream<E,T>& operator<<(
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typename std::basic_ostream<E,T>& ss, const PageNumber& page) {
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return ss << page.ToInt();
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}  // namespace printing
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif  // PRINTING_PAGE_NUMBER_H_
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)