Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(941)

Side by Side Diff: printing/printing_context_cairo.cc

Issue 8372030: Get printing working in Aura. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: More gyp fixes Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « printing/printing_context_cairo.h ('k') | printing/printing_context_gtk.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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 #include "printing/printing_context_cairo.h"
6
7 // TODO(abodenha@chromium.org) The number of #ifdefs here has gotten too
8 // large. Refactor this code into separate files for Linux and Chrome OS.
9
10 #include "base/logging.h"
11 #include "base/values.h"
12 #include "printing/metafile.h"
13 #include "printing/print_job_constants.h"
14 #include "printing/units.h"
15
16 #if defined(OS_CHROMEOS)
17 #include <unicode/ulocdata.h>
18 #include "printing/print_settings_initializer_gtk.h"
19 #else
20 #include <gtk/gtk.h>
21 #include <gtk/gtkprintunixdialog.h>
22 #include "printing/print_dialog_gtk_interface.h"
23 #endif // defined(OS_CHROMEOS)
24
25 #if !defined(OS_CHROMEOS)
26 namespace {
27 // Function pointer for creating print dialogs. |callback| is only used when
28 // |show_dialog| is true.
29 static printing::PrintDialogGtkInterface* (*create_dialog_func_)(
30 printing::PrintingContextCairo* context) = NULL;
31 } // namespace
32 #endif // !defined(OS_CHROMEOS)
33
34 namespace printing {
35
36 // static
37 PrintingContext* PrintingContext::Create(const std::string& app_locale) {
38 return static_cast<PrintingContext*>(new PrintingContextCairo(app_locale));
39 }
40
41 PrintingContextCairo::PrintingContextCairo(const std::string& app_locale)
42 #if defined(OS_CHROMEOS)
43 : PrintingContext(app_locale) {
44 #else
45 : PrintingContext(app_locale),
46 print_dialog_(NULL) {
47 #endif
48 }
49
50 PrintingContextCairo::~PrintingContextCairo() {
51 ReleaseContext();
52
53 #if !defined(OS_CHROMEOS)
54 if (print_dialog_)
55 print_dialog_->ReleaseDialog();
56 #endif
57 }
58
59 #if !defined(OS_CHROMEOS)
60 // static
61 void PrintingContextCairo::SetCreatePrintDialogFunction(
62 PrintDialogGtkInterface* (*create_dialog_func)(
63 PrintingContextCairo* context)) {
64 DCHECK(create_dialog_func);
65 DCHECK(!create_dialog_func_);
66 create_dialog_func_ = create_dialog_func;
67 }
68
69 void PrintingContextCairo::PrintDocument(const Metafile* metafile) {
70 DCHECK(print_dialog_);
71 DCHECK(metafile);
72 print_dialog_->PrintDocument(metafile, document_name_);
73 }
74 #endif // !defined(OS_CHROMEOS)
75
76 void PrintingContextCairo::AskUserForSettings(
77 gfx::NativeView parent_view,
78 int max_pages,
79 bool has_selection,
80 PrintSettingsCallback* callback) {
81 #if defined(OS_CHROMEOS)
82 callback->Run(OK);
83 #else
84 print_dialog_->ShowDialog(callback);
85 #endif // defined(OS_CHROMEOS)
86 }
87
88 PrintingContext::Result PrintingContextCairo::UseDefaultSettings() {
89 DCHECK(!in_print_job_);
90
91 ResetSettings();
92 #if defined(OS_CHROMEOS)
93 // For Chrome OS use default values based on the app locale rather than rely
94 // on GTK. Note that relying on the app locale does not work well if it is
95 // different from the system locale, e.g. a user using Chinese ChromeOS in the
96 // US. Eventually we need to get the defaults from the printer.
97 // TODO(sanjeevr): We need a better feedback loop between the cloud print
98 // dialog and this code.
99 int dpi = 300;
100 gfx::Size physical_size_device_units;
101 gfx::Rect printable_area_device_units;
102 int32_t width = 0;
103 int32_t height = 0;
104 UErrorCode error = U_ZERO_ERROR;
105 ulocdata_getPaperSize(app_locale_.c_str(), &height, &width, &error);
106 if (error != U_ZERO_ERROR) {
107 // If the call failed, assume a paper size of 8.5 x 11 inches.
108 LOG(WARNING) << "ulocdata_getPaperSize failed, using 8.5 x 11, error: "
109 << error;
110 width = static_cast<int>(8.5 * dpi);
111 height = static_cast<int>(11 * dpi);
112 } else {
113 // ulocdata_getPaperSize returns the width and height in mm.
114 // Convert this to pixels based on the dpi.
115 width = static_cast<int>(ConvertUnitDouble(width, 25.4, 1.0) * dpi);
116 height = static_cast<int>(ConvertUnitDouble(height, 25.4, 1.0) * dpi);
117 }
118
119 physical_size_device_units.SetSize(width, height);
120 printable_area_device_units.SetRect(
121 static_cast<int>(PrintSettingsInitializerGtk::kLeftMarginInInch * dpi),
122 static_cast<int>(PrintSettingsInitializerGtk::kTopMarginInInch * dpi),
123 width - (PrintSettingsInitializerGtk::kLeftMarginInInch +
124 PrintSettingsInitializerGtk::kRightMarginInInch) * dpi,
125 height - (PrintSettingsInitializerGtk::kTopMarginInInch +
126 PrintSettingsInitializerGtk::kBottomMarginInInch) * dpi);
127
128 settings_.set_dpi(dpi);
129 settings_.SetPrinterPrintableArea(physical_size_device_units,
130 printable_area_device_units,
131 dpi);
132 #else
133 if (!print_dialog_) {
134 print_dialog_ = create_dialog_func_(this);
135 print_dialog_->AddRefToDialog();
136 }
137 print_dialog_->UseDefaultSettings();
138 #endif // defined(OS_CHROMEOS)
139
140 return OK;
141 }
142
143 PrintingContext::Result PrintingContextCairo::UpdatePrinterSettings(
144 const DictionaryValue& job_settings, const PageRanges& ranges) {
145 #if defined(OS_CHROMEOS)
146 bool landscape = false;
147
148 if (!job_settings.GetBoolean(kSettingLandscape, &landscape))
149 return OnError();
150
151 if (settings_.dpi() == 0)
152 UseDefaultSettings();
153
154 settings_.SetOrientation(landscape);
155 settings_.ranges = ranges;
156
157 return OK;
158 #else
159 DCHECK(!in_print_job_);
160
161 if (!print_dialog_) {
162 print_dialog_ = create_dialog_func_(this);
163 print_dialog_->AddRefToDialog();
164 }
165
166 if (!print_dialog_->UpdateSettings(job_settings, ranges, &settings_))
167 return OnError();
168
169 return OK;
170 #endif
171 }
172
173 PrintingContext::Result PrintingContextCairo::InitWithSettings(
174 const PrintSettings& settings) {
175 DCHECK(!in_print_job_);
176
177 settings_ = settings;
178
179 return OK;
180 }
181
182 PrintingContext::Result PrintingContextCairo::NewDocument(
183 const string16& document_name) {
184 DCHECK(!in_print_job_);
185 in_print_job_ = true;
186
187 #if !defined(OS_CHROMEOS)
188 document_name_ = document_name;
189 #endif // !defined(OS_CHROMEOS)
190
191 return OK;
192 }
193
194 PrintingContext::Result PrintingContextCairo::NewPage() {
195 if (abort_printing_)
196 return CANCEL;
197 DCHECK(in_print_job_);
198
199 // Intentional No-op.
200
201 return OK;
202 }
203
204 PrintingContext::Result PrintingContextCairo::PageDone() {
205 if (abort_printing_)
206 return CANCEL;
207 DCHECK(in_print_job_);
208
209 // Intentional No-op.
210
211 return OK;
212 }
213
214 PrintingContext::Result PrintingContextCairo::DocumentDone() {
215 if (abort_printing_)
216 return CANCEL;
217 DCHECK(in_print_job_);
218
219 ResetSettings();
220 return OK;
221 }
222
223 void PrintingContextCairo::Cancel() {
224 abort_printing_ = true;
225 in_print_job_ = false;
226 }
227
228 void PrintingContextCairo::ReleaseContext() {
229 // Intentional No-op.
230 }
231
232 gfx::NativeDrawingContext PrintingContextCairo::context() const {
233 // Intentional No-op.
234 return NULL;
235 }
236
237 } // namespace printing
OLDNEW
« no previous file with comments | « printing/printing_context_cairo.h ('k') | printing/printing_context_gtk.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698