1// 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 30PrintingContext* PrintingContext::Create(const std::string& app_locale) { 31 return static_cast<PrintingContext*>(new PrintingContextLinux(app_locale)); 32} 33 34PrintingContextLinux::PrintingContextLinux(const std::string& app_locale) 35 : PrintingContext(app_locale), 36 print_dialog_(NULL) { 37} 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 63void PrintingContextLinux::PrintDocument(const Metafile* metafile) { 64 DCHECK(print_dialog_); 65 DCHECK(metafile); 66 print_dialog_->PrintDocument(metafile, document_name_); 67} 68 69void PrintingContextLinux::AskUserForSettings( 70 gfx::NativeView parent_view, 71 int max_pages, 72 bool has_selection, 73 const PrintSettingsCallback& callback) { 74 if (!print_dialog_) { 75 // Can only get here if the renderer is sending bad messages. 76 // http://crbug.com/341777 77 NOTREACHED(); 78 callback.Run(FAILED); 79 return; 80 } 81 82 print_dialog_->ShowDialog(parent_view, has_selection, callback); 83} 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( 110 bool external_preview) { 111 DCHECK(!in_print_job_); 112 DCHECK(!external_preview) << "Not implemented"; 113 114 if (!create_dialog_func_) 115 return OK; 116 117 if (!print_dialog_) { 118 print_dialog_ = create_dialog_func_(this); 119 print_dialog_->AddRefToDialog(); 120 } 121 122 if (!print_dialog_->UpdateSettings(&settings_)) 123 return OnError(); 124 125 return OK; 126} 127 128PrintingContext::Result PrintingContextLinux::InitWithSettings( 129 const PrintSettings& settings) { 130 DCHECK(!in_print_job_); 131 132 settings_ = settings; 133 134 return OK; 135} 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 185gfx::NativeDrawingContext PrintingContextLinux::context() const { 186 // Intentional No-op. 187 return NULL; 188} 189 190} // namespace printing 191