Index: chrome/browser/printing/print_dialog_gtk.cc |
=================================================================== |
--- chrome/browser/printing/print_dialog_gtk.cc (revision 0) |
+++ chrome/browser/printing/print_dialog_gtk.cc (revision 0) |
@@ -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; |
+} |
Property changes on: chrome/browser/printing/print_dialog_gtk.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |