15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/printing_context_gtk.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtk.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtk/gtkunixprint.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_dialog_gtk_interface.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_job_constants.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/units.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function pointer for creating print dialogs. |callback| is only used when 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |show_dialog| is true. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)printing::PrintDialogGtkInterface* (*create_dialog_func_)( 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PrintingContextGtk* context) = NULL; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext* PrintingContext::Create(const std::string& app_locale) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<PrintingContext*>(new PrintingContextGtk(app_locale)); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContextGtk::PrintingContextGtk(const std::string& app_locale) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : PrintingContext(app_locale), 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_(NULL) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContextGtk::~PrintingContextGtk() { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleaseContext(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (print_dialog_) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_->ReleaseDialog(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContextGtk::SetCreatePrintDialogFunction( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintDialogGtkInterface* (*create_dialog_func)( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintingContextGtk* context)) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(create_dialog_func); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!create_dialog_func_); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_dialog_func_ = create_dialog_func; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContextGtk::PrintDocument(const Metafile* metafile) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(print_dialog_); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(metafile); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_->PrintDocument(metafile, document_name_); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContextGtk::AskUserForSettings( 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView parent_view, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_pages, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_selection, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrintSettingsCallback& callback) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_->ShowDialog(parent_view, has_selection, callback); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextGtk::UseDefaultSettings() { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_print_job_); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSettings(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!print_dialog_) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_ = create_dialog_func_(this); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_->AddRefToDialog(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_->UseDefaultSettings(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextGtk::UpdatePrinterSettings( 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DictionaryValue& job_settings, const PageRanges& ranges) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_print_job_); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!print_dialog_) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_ = create_dialog_func_(this); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_dialog_->AddRefToDialog(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!print_dialog_->UpdateSettings(job_settings, ranges, &settings_)) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OnError(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextGtk::InitWithSettings( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PrintSettings& settings) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_print_job_); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_ = settings; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextGtk::NewDocument( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& document_name) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!in_print_job_); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_print_job_ = true; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_name_ = document_name; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextGtk::NewPage() { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (abort_printing_) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CANCEL; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_print_job_); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextGtk::PageDone() { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (abort_printing_) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CANCEL; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_print_job_); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextGtk::DocumentDone() { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (abort_printing_) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CANCEL; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(in_print_job_); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSettings(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContextGtk::Cancel() { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abort_printing_ = true; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_print_job_ = false; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContextGtk::ReleaseContext() { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeDrawingContext PrintingContextGtk::context() const { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Intentional No-op. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace printing 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 160