15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/page_setup.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/page_size_margins.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "printing/print_job_constants.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/print_settings_conversion.h" 130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "printing/units.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace { 180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)const float kCloudPrintMarginInch = 0.25; 190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::PrintingContext(const std::string& app_locale) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : dialog_box_dismissed_(false), 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_print_job_(false), 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abort_printing_(false), 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_locale_(app_locale) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::~PrintingContext() { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContext::set_margin_type(MarginType type) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type != CUSTOM_MARGINS); 331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) settings_.set_margin_type(type); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContext::ResetSettings() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReleaseContext(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_.Clear(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in_print_job_ = false; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dialog_box_dismissed_ = false; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abort_printing_ = false; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContext::OnError() { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSettings(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return abort_printing_ ? CANCEL : FAILED; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PrintingContext::Result PrintingContext::UsePdfSettings() { 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::DictionaryValue> pdf_settings(new base::DictionaryValue); 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetBoolean(kSettingHeaderFooterEnabled, false); 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetBoolean(kSettingShouldPrintBackgrounds, false); 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetBoolean(kSettingShouldPrintSelectionOnly, false); 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetInteger(kSettingMarginsType, printing::NO_MARGINS); 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetBoolean(kSettingCollate, true); 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetInteger(kSettingCopies, 1); 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetInteger(kSettingColor, printing::COLOR); 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetInteger(kSettingDuplexMode, printing::SIMPLEX); 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetBoolean(kSettingLandscape, false); 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetString(kSettingDeviceName, ""); 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetBoolean(kSettingPrintToPDF, true); 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetBoolean(kSettingCloudPrintDialog, false); 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_settings->SetBoolean(kSettingPrintWithPrivet, false); 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return UpdatePrintSettings(*pdf_settings); 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContext::UpdatePrintSettings( 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::DictionaryValue& job_settings) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSettings(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!PrintSettingsFromJobSettings(job_settings, &settings_)) { 741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NOTREACHED(); 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return OnError(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool print_to_pdf = false; 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool is_cloud_dialog = false; 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool print_with_privet = false; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf) || 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !job_settings.GetBoolean(kSettingCloudPrintDialog, &is_cloud_dialog) || 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !job_settings.GetBoolean(kSettingPrintWithPrivet, &print_with_privet)) { 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) NOTREACHED(); 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return OnError(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool print_to_cloud = job_settings.HasKey(kSettingCloudPrintId); 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool open_in_external_preview = 911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) job_settings.HasKey(kSettingOpenPDFInPreview); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!open_in_external_preview && (print_to_pdf || print_to_cloud || 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) is_cloud_dialog || print_with_privet)) { 950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings_.set_dpi(kDefaultPdfDpi); 960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) gfx::Size paper_size(GetPdfPaperSizeDeviceUnits()); 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!settings_.requested_media().size_microns.IsEmpty()) { 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) float deviceMicronsPerDeviceUnit = 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) (kHundrethsMMPerInch * 10.0f) / settings_.device_units_per_inch(); 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) paper_size = gfx::Size(settings_.requested_media().size_microns.width() / 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) deviceMicronsPerDeviceUnit, 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) settings_.requested_media().size_microns.height() / 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) deviceMicronsPerDeviceUnit); 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) gfx::Rect paper_rect(0, 0, paper_size.width(), paper_size.height()); 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (print_to_cloud || print_with_privet) { 1070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) paper_rect.Inset( 1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) kCloudPrintMarginInch * settings_.device_units_per_inch(), 1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) kCloudPrintMarginInch * settings_.device_units_per_inch()); 1100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) settings_.SetPrinterPrintableArea(paper_size, paper_rect, true); 1120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return OK; 1130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return UpdatePrinterSettings(open_in_external_preview); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace printing 119