Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1864)

Unified Diff: chrome/browser/printing/print_dialog_gtk.cc

Issue 200138: GTK: Add a dialog for printing. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « chrome/browser/printing/print_dialog_gtk.h ('k') | chrome/browser/renderer_host/resource_message_filter_gtk.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698