1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_LIBGTK2UI_PRINT_DIALOG_GTK2_H_
6#define CHROME_BROWSER_UI_LIBGTK2UI_PRINT_DIALOG_GTK2_H_
7
8#include <gtk/gtk.h>
9#include <gtk/gtkunixprint.h>
10
11#include "base/compiler_specific.h"
12#include "base/files/file_path.h"
13#include "base/memory/ref_counted.h"
14#include "base/sequenced_task_runner_helpers.h"
15#include "chrome/browser/ui/libgtk2ui/gtk2_signal.h"
16#include "content/public/browser/browser_thread.h"
17#include "printing/print_dialog_gtk_interface.h"
18#include "printing/printing_context_linux.h"
19#include "ui/aura/window_observer.h"
20
21namespace printing {
22class MetafilePlayer;
23class PrintSettings;
24}
25
26using printing::PrintingContextLinux;
27
28// Needs to be freed on the UI thread to clean up its GTK members variables.
29class PrintDialogGtk2
30    : public printing::PrintDialogGtkInterface,
31      public base::RefCountedThreadSafe<
32          PrintDialogGtk2, content::BrowserThread::DeleteOnUIThread>,
33      public aura::WindowObserver {
34 public:
35  // Creates and returns a print dialog.
36  static printing::PrintDialogGtkInterface* CreatePrintDialog(
37      PrintingContextLinux* context);
38
39  // printing::PrintDialogGtkInterface implementation.
40  virtual void UseDefaultSettings() OVERRIDE;
41  virtual bool UpdateSettings(printing::PrintSettings* settings) OVERRIDE;
42  virtual void ShowDialog(
43      gfx::NativeView parent_view,
44      bool has_selection,
45      const PrintingContextLinux::PrintSettingsCallback& callback) OVERRIDE;
46  virtual void PrintDocument(const printing::MetafilePlayer& metafile,
47                             const base::string16& document_name) OVERRIDE;
48  virtual void AddRefToDialog() OVERRIDE;
49  virtual void ReleaseDialog() OVERRIDE;
50
51 private:
52  friend struct content::BrowserThread::DeleteOnThread<
53      content::BrowserThread::UI>;
54  friend class base::DeleteHelper<PrintDialogGtk2>;
55
56  explicit PrintDialogGtk2(PrintingContextLinux* context);
57  virtual ~PrintDialogGtk2();
58
59  // Handles dialog response.
60  CHROMEGTK_CALLBACK_1(PrintDialogGtk2, void, OnResponse, int);
61
62  // Prints document named |document_name|.
63  void SendDocumentToPrinter(const base::string16& document_name);
64
65  // Handles print job response.
66  static void OnJobCompletedThunk(GtkPrintJob* print_job,
67                                  gpointer user_data,
68                                  GError* error);
69  void OnJobCompleted(GtkPrintJob* print_job, GError* error);
70
71  // Helper function for initializing |context_|'s PrintSettings with a given
72  // |settings|.
73  void InitPrintSettings(printing::PrintSettings* settings);
74
75  // aura::WindowObserver implementation.
76  virtual void OnWindowDestroying(aura::Window* window) OVERRIDE;
77
78  // Printing dialog callback.
79  PrintingContextLinux::PrintSettingsCallback callback_;
80  PrintingContextLinux* context_;
81
82  // Print dialog settings. PrintDialogGtk2 owns |dialog_| and holds references
83  // to the other objects.
84  GtkWidget* dialog_;
85  GtkPrintSettings* gtk_settings_;
86  GtkPageSetup* page_setup_;
87  GtkPrinter* printer_;
88
89  base::FilePath path_to_pdf_;
90
91  DISALLOW_COPY_AND_ASSIGN(PrintDialogGtk2);
92};
93
94#endif  // CHROME_BROWSER_UI_LIBGTK2UI_PRINT_DIALOG_GTK2_H_
95