printing_context.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_settings_initializer.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);
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return UpdatePrintSettings(*pdf_settings, PageRanges());
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContext::UpdatePrintSettings(
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::DictionaryValue& job_settings,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PageRanges& ranges) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetSettings();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!PrintSettingsInitializer::InitSettings(job_settings, ranges,
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                              &settings_)) {
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    NOTREACHED();
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return OnError();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool print_to_pdf = false;
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool is_cloud_dialog = false;
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool print_with_privet = false;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf) ||
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      !job_settings.GetBoolean(kSettingCloudPrintDialog, &is_cloud_dialog) ||
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      !job_settings.GetBoolean(kSettingPrintWithPrivet, &print_with_privet)) {
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    NOTREACHED();
881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return OnError();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool print_to_cloud = job_settings.HasKey(kSettingCloudPrintId);
921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool open_in_external_preview =
931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      job_settings.HasKey(kSettingOpenPDFInPreview);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!open_in_external_preview && (print_to_pdf || print_to_cloud ||
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                    is_cloud_dialog || print_with_privet)) {
970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    settings_.set_dpi(kDefaultPdfDpi);
980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    gfx::Size paper_size(GetPdfPaperSizeDeviceUnits());
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::DictionaryValue* media_size = NULL;
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (job_settings.GetDictionary(kSettingMediaSize, &media_size)) {
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      int width_microns = 0;
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      int height_microns = 0;
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (media_size->GetInteger(kSettingMediaSizeWidthMicrons,
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 &width_microns) &&
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          media_size->GetInteger(kSettingMediaSizeHeightMicrons,
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 &height_microns)) {
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        float deviceMicronsPerDeviceUnit =
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            (kHundrethsMMPerInch * 10.0f) / settings_.device_units_per_inch();
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        paper_size = gfx::Size(width_microns / deviceMicronsPerDeviceUnit,
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               height_microns / deviceMicronsPerDeviceUnit);
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      }
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
1130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    gfx::Rect paper_rect(0, 0, paper_size.width(), paper_size.height());
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (print_to_cloud || print_with_privet) {
1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      paper_rect.Inset(
1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          kCloudPrintMarginInch * settings_.device_units_per_inch(),
1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          kCloudPrintMarginInch * settings_.device_units_per_inch());
1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
1190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    settings_.SetPrinterPrintableArea(paper_size, paper_rect, true);
1200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return OK;
1210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return UpdatePrinterSettings(open_in_external_preview);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace printing
127