blob: 58ee3096e3c359a631ba5a39f85644a6415e275b [file] [log] [blame]
[email protected]d53002f42014-01-14 16:08:561// Copyright 2014 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_linux.h"
6
7#include "base/logging.h"
dchengc3df9ba2016-04-07 23:09:328#include "base/memory/ptr_util.h"
[email protected]d53002f42014-01-14 16:08:569#include "base/values.h"
10#include "printing/metafile.h"
11#include "printing/print_dialog_gtk_interface.h"
12#include "printing/print_job_constants.h"
13#include "printing/units.h"
14
15namespace {
16
17// Function pointer for creating print dialogs. |callback| is only used when
18// |show_dialog| is true.
19printing::PrintDialogGtkInterface* (*create_dialog_func_)(
20 printing::PrintingContextLinux* context) = NULL;
21
22// Function pointer for determining paper size.
23gfx::Size (*get_pdf_paper_size_)(
24 printing::PrintingContextLinux* context) = NULL;
25
26} // namespace
27
28namespace printing {
29
30// static
dchengc3df9ba2016-04-07 23:09:3231std::unique_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) {
32 return base::WrapUnique(new PrintingContextLinux(delegate));
[email protected]d53002f42014-01-14 16:08:5633}
34
Vitaly Bukabd7c9812014-08-26 08:57:5435PrintingContextLinux::PrintingContextLinux(Delegate* delegate)
36 : PrintingContext(delegate), print_dialog_(NULL) {
[email protected]d53002f42014-01-14 16:08:5637}
38
39PrintingContextLinux::~PrintingContextLinux() {
40 ReleaseContext();
41
42 if (print_dialog_)
43 print_dialog_->ReleaseDialog();
44}
45
46// static
47void PrintingContextLinux::SetCreatePrintDialogFunction(
48 PrintDialogGtkInterface* (*create_dialog_func)(
49 PrintingContextLinux* context)) {
50 DCHECK(create_dialog_func);
51 DCHECK(!create_dialog_func_);
52 create_dialog_func_ = create_dialog_func;
53}
54
55// static
56void PrintingContextLinux::SetPdfPaperSizeFunction(
57 gfx::Size (*get_pdf_paper_size)(PrintingContextLinux* context)) {
58 DCHECK(get_pdf_paper_size);
59 DCHECK(!get_pdf_paper_size_);
60 get_pdf_paper_size_ = get_pdf_paper_size;
61}
62
vitalybuka5d1290582014-09-12 09:19:5963void PrintingContextLinux::PrintDocument(const MetafilePlayer& metafile) {
[email protected]d53002f42014-01-14 16:08:5664 DCHECK(print_dialog_);
[email protected]d53002f42014-01-14 16:08:5665 print_dialog_->PrintDocument(metafile, document_name_);
66}
67
68void PrintingContextLinux::AskUserForSettings(
[email protected]d53002f42014-01-14 16:08:5669 int max_pages,
70 bool has_selection,
dgn4c172eea2014-12-15 21:11:2371 bool is_scripted,
[email protected]d53002f42014-01-14 16:08:5672 const PrintSettingsCallback& callback) {
[email protected]bdf12cb72014-02-07 22:48:0873 if (!print_dialog_) {
74 // Can only get here if the renderer is sending bad messages.
75 // http://crbug.com/341777
76 NOTREACHED();
77 callback.Run(FAILED);
78 return;
79 }
80
Vitaly Bukabd7c9812014-08-26 08:57:5481 print_dialog_->ShowDialog(
82 delegate_->GetParentView(), has_selection, callback);
[email protected]d53002f42014-01-14 16:08:5683}
84
85PrintingContext::Result PrintingContextLinux::UseDefaultSettings() {
86 DCHECK(!in_print_job_);
87
88 ResetSettings();
89
90 if (!create_dialog_func_)
91 return OK;
92
93 if (!print_dialog_) {
94 print_dialog_ = create_dialog_func_(this);
95 print_dialog_->AddRefToDialog();
96 }
97 print_dialog_->UseDefaultSettings();
98
99 return OK;
100}
101
102gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceUnits() {
103 if (get_pdf_paper_size_)
104 return get_pdf_paper_size_(this);
105
106 return gfx::Size();
107}
108
109PrintingContext::Result PrintingContextLinux::UpdatePrinterSettings(
vitalybuka92ab8ce2014-08-26 23:41:45110 bool external_preview,
vitalybuka95fa3c92015-05-05 03:03:32111 bool show_system_dialog,
112 int page_count) {
vitalybuka92ab8ce2014-08-26 23:41:45113 DCHECK(!show_system_dialog);
[email protected]d53002f42014-01-14 16:08:56114 DCHECK(!in_print_job_);
115 DCHECK(!external_preview) << "Not implemented";
116
117 if (!create_dialog_func_)
118 return OK;
119
120 if (!print_dialog_) {
121 print_dialog_ = create_dialog_func_(this);
122 print_dialog_->AddRefToDialog();
123 }
124
125 if (!print_dialog_->UpdateSettings(&settings_))
126 return OnError();
127
128 return OK;
129}
130
thestig5f683912016-09-30 22:42:16131void PrintingContextLinux::InitWithSettings(const PrintSettings& settings) {
[email protected]d53002f42014-01-14 16:08:56132 DCHECK(!in_print_job_);
133
134 settings_ = settings;
[email protected]d53002f42014-01-14 16:08:56135}
136
137PrintingContext::Result PrintingContextLinux::NewDocument(
138 const base::string16& document_name) {
139 DCHECK(!in_print_job_);
140 in_print_job_ = true;
141
142 document_name_ = document_name;
143
144 return OK;
145}
146
147PrintingContext::Result PrintingContextLinux::NewPage() {
148 if (abort_printing_)
149 return CANCEL;
150 DCHECK(in_print_job_);
151
152 // Intentional No-op.
153
154 return OK;
155}
156
157PrintingContext::Result PrintingContextLinux::PageDone() {
158 if (abort_printing_)
159 return CANCEL;
160 DCHECK(in_print_job_);
161
162 // Intentional No-op.
163
164 return OK;
165}
166
167PrintingContext::Result PrintingContextLinux::DocumentDone() {
168 if (abort_printing_)
169 return CANCEL;
170 DCHECK(in_print_job_);
171
172 ResetSettings();
173 return OK;
174}
175
176void PrintingContextLinux::Cancel() {
177 abort_printing_ = true;
178 in_print_job_ = false;
179}
180
181void PrintingContextLinux::ReleaseContext() {
182 // Intentional No-op.
183}
184
tfarina876d1e02016-10-11 23:12:53185skia::NativeDrawingContext PrintingContextLinux::context() const {
[email protected]d53002f42014-01-14 16:08:56186 // Intentional No-op.
187 return NULL;
188}
189
190} // namespace printing