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