blob: c267478e764238f6524c43310defd33fc1c3991a [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"
8#include "base/values.h"
9#include "printing/metafile.h"
10#include "printing/print_dialog_gtk_interface.h"
11#include "printing/print_job_constants.h"
12#include "printing/units.h"
13
14namespace {
15
16// Function pointer for creating print dialogs. |callback| is only used when
17// |show_dialog| is true.
18printing::PrintDialogGtkInterface* (*create_dialog_func_)(
19 printing::PrintingContextLinux* context) = NULL;
20
21// Function pointer for determining paper size.
22gfx::Size (*get_pdf_paper_size_)(
23 printing::PrintingContextLinux* context) = NULL;
24
25} // namespace
26
27namespace printing {
28
29// static
Vitaly Bukabd7c9812014-08-26 08:57:5430scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) {
31 return make_scoped_ptr<PrintingContext>(new PrintingContextLinux(delegate));
[email protected]d53002f42014-01-14 16:08:5632}
33
Vitaly Bukabd7c9812014-08-26 08:57:5434PrintingContextLinux::PrintingContextLinux(Delegate* delegate)
35 : PrintingContext(delegate), print_dialog_(NULL) {
[email protected]d53002f42014-01-14 16:08:5636}
37
38PrintingContextLinux::~PrintingContextLinux() {
39 ReleaseContext();
40
41 if (print_dialog_)
42 print_dialog_->ReleaseDialog();
43}
44
45// static
46void PrintingContextLinux::SetCreatePrintDialogFunction(
47 PrintDialogGtkInterface* (*create_dialog_func)(
48 PrintingContextLinux* context)) {
49 DCHECK(create_dialog_func);
50 DCHECK(!create_dialog_func_);
51 create_dialog_func_ = create_dialog_func;
52}
53
54// static
55void PrintingContextLinux::SetPdfPaperSizeFunction(
56 gfx::Size (*get_pdf_paper_size)(PrintingContextLinux* context)) {
57 DCHECK(get_pdf_paper_size);
58 DCHECK(!get_pdf_paper_size_);
59 get_pdf_paper_size_ = get_pdf_paper_size;
60}
61
62void PrintingContextLinux::PrintDocument(const Metafile* metafile) {
63 DCHECK(print_dialog_);
64 DCHECK(metafile);
65 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,
71 const PrintSettingsCallback& callback) {
[email protected]bdf12cb72014-02-07 22:48:0872 if (!print_dialog_) {
73 // Can only get here if the renderer is sending bad messages.
74 // http://crbug.com/341777
75 NOTREACHED();
76 callback.Run(FAILED);
77 return;
78 }
79
Vitaly Bukabd7c9812014-08-26 08:57:5480 print_dialog_->ShowDialog(
81 delegate_->GetParentView(), has_selection, callback);
[email protected]d53002f42014-01-14 16:08:5682}
83
84PrintingContext::Result PrintingContextLinux::UseDefaultSettings() {
85 DCHECK(!in_print_job_);
86
87 ResetSettings();
88
89 if (!create_dialog_func_)
90 return OK;
91
92 if (!print_dialog_) {
93 print_dialog_ = create_dialog_func_(this);
94 print_dialog_->AddRefToDialog();
95 }
96 print_dialog_->UseDefaultSettings();
97
98 return OK;
99}
100
101gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceUnits() {
102 if (get_pdf_paper_size_)
103 return get_pdf_paper_size_(this);
104
105 return gfx::Size();
106}
107
108PrintingContext::Result PrintingContextLinux::UpdatePrinterSettings(
109 bool external_preview) {
110 DCHECK(!in_print_job_);
111 DCHECK(!external_preview) << "Not implemented";
112
113 if (!create_dialog_func_)
114 return OK;
115
116 if (!print_dialog_) {
117 print_dialog_ = create_dialog_func_(this);
118 print_dialog_->AddRefToDialog();
119 }
120
121 if (!print_dialog_->UpdateSettings(&settings_))
122 return OnError();
123
124 return OK;
125}
126
127PrintingContext::Result PrintingContextLinux::InitWithSettings(
128 const PrintSettings& settings) {
129 DCHECK(!in_print_job_);
130
131 settings_ = settings;
132
133 return OK;
134}
135
136PrintingContext::Result PrintingContextLinux::NewDocument(
137 const base::string16& document_name) {
138 DCHECK(!in_print_job_);
139 in_print_job_ = true;
140
141 document_name_ = document_name;
142
143 return OK;
144}
145
146PrintingContext::Result PrintingContextLinux::NewPage() {
147 if (abort_printing_)
148 return CANCEL;
149 DCHECK(in_print_job_);
150
151 // Intentional No-op.
152
153 return OK;
154}
155
156PrintingContext::Result PrintingContextLinux::PageDone() {
157 if (abort_printing_)
158 return CANCEL;
159 DCHECK(in_print_job_);
160
161 // Intentional No-op.
162
163 return OK;
164}
165
166PrintingContext::Result PrintingContextLinux::DocumentDone() {
167 if (abort_printing_)
168 return CANCEL;
169 DCHECK(in_print_job_);
170
171 ResetSettings();
172 return OK;
173}
174
175void PrintingContextLinux::Cancel() {
176 abort_printing_ = true;
177 in_print_job_ = false;
178}
179
180void PrintingContextLinux::ReleaseContext() {
181 // Intentional No-op.
182}
183
184gfx::NativeDrawingContext PrintingContextLinux::context() const {
185 // Intentional No-op.
186 return NULL;
187}
188
189} // namespace printing