diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-16 21:49:46 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-16 21:49:46 +0000 |
commit | 4bee23f2f19aa81bc95c662a56d8b3ec66d611de (patch) | |
tree | a0cb9315a01ce975bd9afd6c1d15e3c1b07e477d /chrome/browser/printing | |
parent | a1748e45f0b50f59ea37ce9d065b0bcfb47c8e91 (diff) | |
download | chromium_src-4bee23f2f19aa81bc95c662a56d8b3ec66d611de.zip chromium_src-4bee23f2f19aa81bc95c662a56d8b3ec66d611de.tar.gz chromium_src-4bee23f2f19aa81bc95c662a56d8b3ec66d611de.tar.bz2 |
GTK: Add a dialog for printing.
Add an infobar directing users to tell us if they have problems with printing.
Hide printing behind --enable-printing flag on linux/gtk.
BUG=9847
TEST=none
Review URL: http://codereview.chromium.org/200138
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26400 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/printing')
-rw-r--r-- | chrome/browser/printing/print_dialog_gtk.cc | 138 | ||||
-rw-r--r-- | chrome/browser/printing/print_dialog_gtk.h | 55 |
2 files changed, 193 insertions, 0 deletions
diff --git a/chrome/browser/printing/print_dialog_gtk.cc b/chrome/browser/printing/print_dialog_gtk.cc new file mode 100644 index 0000000..81171a6 --- /dev/null +++ b/chrome/browser/printing/print_dialog_gtk.cc @@ -0,0 +1,138 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/printing/print_dialog_gtk.h" + +#include <gtk/gtkprintjob.h> +#include <gtk/gtkprintunixdialog.h> +#include <gtk/gtkpagesetupunixdialog.h> + +#include "base/logging.h" +#include "base/message_loop.h" +#include "chrome/browser/browser_list.h" +#include "chrome/browser/browser_window.h" +#include "chrome/browser/tab_contents/infobar_delegate.h" +#include "chrome/browser/tab_contents/tab_contents.h" + +namespace { + +// This is a temporary infobar designed to help gauge how many users are trying +// to print to printers that don't support PDF. +class PdfUnsupportedInfoBarDelegate : public LinkInfoBarDelegate { + public: + PdfUnsupportedInfoBarDelegate(Browser* browser) + : LinkInfoBarDelegate(NULL), + browser_(browser) { + } + + ~PdfUnsupportedInfoBarDelegate() {} + + virtual std::wstring GetMessageTextWithOffset(size_t* link_offset) const { + std::wstring message(L"Oops! Your printer does not support PDF. Please " + L"report this to us ."); + *link_offset = message.length() - 1; + return message; + } + + virtual std::wstring GetLinkText() const { + return std::wstring(L"here"); + } + + virtual Type GetInfoBarType() { + return ERROR_TYPE; + } + + virtual bool LinkClicked(WindowOpenDisposition disposition) { + browser_->OpenURL( + GURL("http://code.google.com/p/chromium/issues/detail?id=22027"), + GURL(), NEW_FOREGROUND_TAB, PageTransition::TYPED); + return true; + } + + private: + Browser* browser_; +}; + +} // namespace + +// static +void PrintDialogGtk::CreatePrintDialogForPdf(const FilePath& path, + MessageLoop* loop) { + loop->PostTask(FROM_HERE, + NewRunnableFunction(&PrintDialogGtk::CreateDialogImpl, path)); +} + +// static +void PrintDialogGtk::CreateDialogImpl(const FilePath& path) { + new PrintDialogGtk(path); +} + +PrintDialogGtk::PrintDialogGtk(const FilePath& path_to_pdf) + : path_to_pdf_(path_to_pdf), + browser_(BrowserList::GetLastActive()) { + GtkWindow* parent = browser_->window()->GetNativeHandle(); + + // TODO(estade): We need a window title here. + dialog_ = gtk_print_unix_dialog_new(NULL, parent); + g_signal_connect(dialog_, "response", G_CALLBACK(OnResponseThunk), this); + + gtk_widget_show_all(dialog_); +} + +PrintDialogGtk::~PrintDialogGtk() { +} + +void PrintDialogGtk::OnResponse(gint response_id) { + gtk_widget_hide(dialog_); + + switch (response_id) { + case GTK_RESPONSE_OK: { + GtkPrinter* printer = + gtk_print_unix_dialog_get_selected_printer( + GTK_PRINT_UNIX_DIALOG(dialog_)); + if (!gtk_printer_accepts_pdf(printer)) { + browser_->GetSelectedTabContents()->AddInfoBar( + new PdfUnsupportedInfoBarDelegate(browser_)); + break; + } + + GtkPrintSettings* settings = + gtk_print_unix_dialog_get_settings( + GTK_PRINT_UNIX_DIALOG(dialog_)); + GtkPageSetup* setup = gtk_print_unix_dialog_get_page_setup( + GTK_PRINT_UNIX_DIALOG(dialog_)); + + GtkPrintJob* job = + gtk_print_job_new(path_to_pdf_.value().c_str(), printer, + settings, setup); + gtk_print_job_set_source_file(job, path_to_pdf_.value().c_str(), NULL); + gtk_print_job_send(job, OnJobCompletedThunk, this, NULL); + g_object_unref(settings); + // Success; return early. + return; + } + case GTK_RESPONSE_CANCEL: { + break; + } + case GTK_RESPONSE_APPLY: + default: { + NOTREACHED(); + } + } + + // Delete this dialog. + OnJobCompleted(NULL, NULL); +} + +void PrintDialogGtk::OnJobCompleted(GtkPrintJob* job, GError* error) { + gtk_widget_destroy(dialog_); + + if (error) + LOG(ERROR) << "Printing failed: " << error->message; + + if (job) + g_object_unref(job); + + delete this; +} diff --git a/chrome/browser/printing/print_dialog_gtk.h b/chrome/browser/printing/print_dialog_gtk.h new file mode 100644 index 0000000..7f9cc7f --- /dev/null +++ b/chrome/browser/printing/print_dialog_gtk.h @@ -0,0 +1,55 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_PRINTING_PRINT_DIALOG_GTK_H_ +#define CHROME_BROWSER_PRINTING_PRINT_DIALOG_GTK_H_ + +#include <gtk/gtk.h> + +#include "base/basictypes.h" +#include "base/file_path.h" + +class Browser; +class MessageLoop; + +typedef struct _GtkPrintJob GtkPrintJob; + +// Currently this dialog only allows the user to choose a printer. +class PrintDialogGtk { + public: + // Called on the IO thread. Posts the dialog creation action on the given + // loop. + static void CreatePrintDialogForPdf(const FilePath& path, MessageLoop* loop); + + private: + explicit PrintDialogGtk(const FilePath& path_to_pdf); + ~PrintDialogGtk(); + + static void CreateDialogImpl(const FilePath& path); + + static void OnResponseThunk(GtkDialog* dialog, + gint response_id, + gpointer user_data) { + reinterpret_cast<PrintDialogGtk*>(user_data)->OnResponse(response_id); + } + void OnResponse(gint response_id); + + static void OnJobCompletedThunk(GtkPrintJob* print_job, + gpointer user_data, + GError* error) { + reinterpret_cast<PrintDialogGtk*>(user_data)->OnJobCompleted(print_job, + error); + } + void OnJobCompleted(GtkPrintJob* job, GError* error); + + FilePath path_to_pdf_; + + GtkWidget* dialog_; + + Browser* browser_; + + DISALLOW_COPY_AND_ASSIGN(PrintDialogGtk); +}; + +#endif // CHROME_BROWSER_PRINTING_PRINT_DIALOG_GTK_H_ |