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 30scoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) { 31 return make_scoped_ptr<PrintingContext>(new PrintingContextLinux(delegate)); 32} 33 34PrintingContextLinux::PrintingContextLinux(Delegate* delegate) 35 : PrintingContext(delegate), print_dialog_(NULL) { 36} 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 MetafilePlayer& metafile) { 63 DCHECK(print_dialog_); 64 print_dialog_->PrintDocument(metafile, document_name_); 65} 66 67void PrintingContextLinux::AskUserForSettings( 68 int max_pages, 69 bool has_selection, 70 const PrintSettingsCallback& callback) { 71 if (!print_dialog_) { 72 // Can only get here if the renderer is sending bad messages. 73 // http://crbug.com/341777 74 NOTREACHED(); 75 callback.Run(FAILED); 76 return; 77 } 78 79 print_dialog_->ShowDialog( 80 delegate_->GetParentView(), has_selection, callback); 81} 82 83PrintingContext::Result PrintingContextLinux::UseDefaultSettings() { 84 DCHECK(!in_print_job_); 85 86 ResetSettings(); 87 88 if (!create_dialog_func_) 89 return OK; 90 91 if (!print_dialog_) { 92 print_dialog_ = create_dialog_func_(this); 93 print_dialog_->AddRefToDialog(); 94 } 95 print_dialog_->UseDefaultSettings(); 96 97 return OK; 98} 99 100gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceUnits() { 101 if (get_pdf_paper_size_) 102 return get_pdf_paper_size_(this); 103 104 return gfx::Size(); 105} 106 107PrintingContext::Result PrintingContextLinux::UpdatePrinterSettings( 108 bool external_preview, 109 bool show_system_dialog) { 110 DCHECK(!show_system_dialog); 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