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_no_system_dialog.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unicode/ulocdata.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/print_job_constants.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/units.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) {
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return make_scoped_ptr<PrintingContext>(
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new PrintingContextNoSystemDialog(delegate));
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciPrintingContextNoSystemDialog::PrintingContextNoSystemDialog(Delegate* delegate)
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : PrintingContext(delegate) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContextNoSystemDialog::~PrintingContextNoSystemDialog() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReleaseContext();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContextNoSystemDialog::AskUserForSettings(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int max_pages,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_selection,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PrintSettingsCallback& callback) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't want to bring up a dialog here.  Ever.  Just signal the callback.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(OK);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::UseDefaultSettings() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!in_print_job_);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetSettings();
430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  settings_.set_dpi(kDefaultPdfDpi);
440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Size physical_size = GetPdfPaperSizeDeviceUnits();
450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Assume full page is printable for now.
460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  gfx::Rect printable_area(0, 0, physical_size.width(), physical_size.height());
470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DCHECK_EQ(settings_.device_units_per_inch(), kDefaultPdfDpi);
480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  settings_.SetPrinterPrintableArea(physical_size, printable_area, true);
490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return OK;
500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)gfx::Size PrintingContextNoSystemDialog::GetPdfPaperSizeDeviceUnits() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t width = 0;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t height = 0;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UErrorCode error = U_ZERO_ERROR;
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ulocdata_getPaperSize(
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->GetAppLocale().c_str(), &height, &width, &error);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error > U_ZERO_ERROR) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If the call failed, assume a paper size of 8.5 x 11 inches.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(WARNING) << "ulocdata_getPaperSize failed, using 8.5 x 11, error: "
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 << error;
620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    width = static_cast<int>(
630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        kLetterWidthInch * settings_.device_units_per_inch());
640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    height = static_cast<int>(
650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        kLetterHeightInch  * settings_.device_units_per_inch());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ulocdata_getPaperSize returns the width and height in mm.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Convert this to pixels based on the dpi.
690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    float multiplier = 100 * settings_.device_units_per_inch();
700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    multiplier /= kHundrethsMMPerInch;
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    width *= multiplier;
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    height *= multiplier;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return gfx::Size(width, height);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::UpdatePrinterSettings(
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool external_preview,
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool show_system_dialog) {
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!show_system_dialog);
810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (settings_.dpi() == 0)
830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    UseDefaultSettings();
840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::InitWithSettings(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PrintSettings& settings) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!in_print_job_);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings_ = settings;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::NewDocument(
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const base::string16& document_name) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!in_print_job_);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_print_job_ = true;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::NewPage() {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (abort_printing_)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CANCEL;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(in_print_job_);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Intentional No-op.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrintingContext::Result PrintingContextNoSystemDialog::PageDone() {
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 PrintingContextNoSystemDialog::DocumentDone() {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (abort_printing_)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CANCEL;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(in_print_job_);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetSettings();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OK;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContextNoSystemDialog::Cancel() {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  abort_printing_ = true;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_print_job_ = false;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintingContextNoSystemDialog::ReleaseContext() {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Intentional No-op.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeDrawingContext PrintingContextNoSystemDialog::context() const {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Intentional No-op.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace printing
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150