1// Copyright (c) 2011 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#ifndef PRINTING_PAGE_SETUP_H_
6#define PRINTING_PAGE_SETUP_H_
7
8#include "printing/printing_export.h"
9#include "ui/gfx/rect.h"
10
11namespace printing {
12
13// Margins for a page setup.
14class PRINTING_EXPORT PageMargins {
15 public:
16  PageMargins();
17
18  void Clear();
19
20  // Equality operator.
21  bool Equals(const PageMargins& rhs) const;
22
23  // Vertical space for the overlay from the top of the sheet.
24  int header;
25  // Vertical space for the overlay from the bottom of the sheet.
26  int footer;
27  // Margin on each side of the sheet.
28  int left;
29  int right;
30  int top;
31  int bottom;
32};
33
34// Settings that define the size and printable areas of a page. Unit is
35// unspecified.
36class PRINTING_EXPORT PageSetup {
37 public:
38  PageSetup();
39  ~PageSetup();
40
41  void Clear();
42
43  // Equality operator.
44  bool Equals(const PageSetup& rhs) const;
45
46  void Init(const gfx::Size& physical_size, const gfx::Rect& printable_area,
47            int text_height);
48
49  // Use |requested_margins| as long as they fall inside the printable area.
50  void SetRequestedMargins(const PageMargins& requested_margins);
51
52  // Ignore the printable area, and set the margins to |requested_margins|.
53  void ForceRequestedMargins(const PageMargins& requested_margins);
54
55  // Flips the orientation of the page and recalculates all page areas.
56  void FlipOrientation();
57
58  const gfx::Size& physical_size() const { return physical_size_; }
59  const gfx::Rect& overlay_area() const { return overlay_area_; }
60  const gfx::Rect& content_area() const { return content_area_; }
61  const gfx::Rect& printable_area() const { return printable_area_; }
62  const PageMargins& effective_margins() const {
63    return effective_margins_;
64  }
65
66 private:
67  // Store |requested_margins_| and update page setup values.
68  void SetRequestedMarginsAndCalculateSizes(
69      const PageMargins& requested_margins);
70
71  // Calculate overlay_area_, effective_margins_, and content_area_, based on
72  // a constraint of |bounds| and |text_height|.
73  void CalculateSizesWithinRect(const gfx::Rect& bounds, int text_height);
74
75  // Physical size of the page, including non-printable margins.
76  gfx::Size physical_size_;
77
78  // The printable area as specified by the printer driver. We can't get
79  // larger than this.
80  gfx::Rect printable_area_;
81
82  // The printable area for headers and footers.
83  gfx::Rect overlay_area_;
84
85  // The printable area as selected by the user's margins.
86  gfx::Rect content_area_;
87
88  // Effective margins.
89  PageMargins effective_margins_;
90
91  // Requested margins.
92  PageMargins requested_margins_;
93
94  // True when |effective_margins_| respects |printable_area_| else false.
95  bool forced_margins_;
96
97  // Space that must be kept free for the overlays.
98  int text_height_;
99};
100
101}  // namespace printing
102
103#endif  // PRINTING_PAGE_SETUP_H_
104