1// Copyright (c) 2011 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 PRINTING_PRINTING_CONTEXT_WIN_H_
6#define PRINTING_PRINTING_CONTEXT_WIN_H_
7
8#include <ocidl.h>
9#include <commdlg.h>
10
11#include <string>
12
13#include "base/memory/scoped_ptr.h"
14#include "build/build_config.h"
15#include "printing/printing_context.h"
16#include "ui/gfx/native_widget_types.h"
17
18namespace printing {
19
20class PRINTING_EXPORT PrintingContextWin : public PrintingContext {
21 public:
22  explicit PrintingContextWin(const std::string& app_locale);
23  ~PrintingContextWin();
24
25  // PrintingContext implementation.
26  virtual void AskUserForSettings(
27      gfx::NativeView parent_view,
28      int max_pages,
29      bool has_selection,
30      const PrintSettingsCallback& callback) OVERRIDE;
31  virtual Result UseDefaultSettings() OVERRIDE;
32  virtual gfx::Size GetPdfPaperSizeDeviceUnits() OVERRIDE;
33  virtual Result UpdatePrinterSettings(bool external_preview) OVERRIDE;
34  virtual Result InitWithSettings(const PrintSettings& settings) OVERRIDE;
35  virtual Result NewDocument(const base::string16& document_name) OVERRIDE;
36  virtual Result NewPage() OVERRIDE;
37  virtual Result PageDone() OVERRIDE;
38  virtual Result DocumentDone() OVERRIDE;
39  virtual void Cancel() OVERRIDE;
40  virtual void ReleaseContext() OVERRIDE;
41  virtual gfx::NativeDrawingContext context() const OVERRIDE;
42
43  // Allocates the HDC for a specific DEVMODE.
44  static bool AllocateContext(const std::wstring& printer_name,
45                              const DEVMODE* dev_mode,
46                              gfx::NativeDrawingContext* context);
47
48 protected:
49  virtual HRESULT ShowPrintDialog(PRINTDLGEX* options);
50
51 private:
52  // Class that manages the PrintDlgEx() callbacks. This is meant to be a
53  // temporary object used during the Print... dialog display.
54  class CallbackHandler;
55
56  // Used in response to the user canceling the printing.
57  static BOOL CALLBACK AbortProc(HDC hdc, int nCode);
58
59  // Reads the settings from the selected device context. Updates settings_ and
60  // its margins.
61  bool InitializeSettings(const DEVMODE& dev_mode,
62                          const std::wstring& new_device_name,
63                          const PRINTPAGERANGE* ranges,
64                          int number_ranges,
65                          bool selection_only);
66
67  // Retrieves the printer's default low-level settings. On Windows, context_ is
68  // allocated with this call.
69  bool GetPrinterSettings(HANDLE printer,
70                          const std::wstring& device_name);
71
72  // Parses the result of a PRINTDLGEX result.
73  Result ParseDialogResultEx(const PRINTDLGEX& dialog_options);
74  Result ParseDialogResult(const PRINTDLG& dialog_options);
75
76  // The selected printer context.
77  HDC context_;
78
79  // The dialog box for the time it is shown.
80  volatile HWND dialog_box_;
81
82  DISALLOW_COPY_AND_ASSIGN(PrintingContextWin);
83};
84
85}  // namespace printing
86
87#endif  // PRINTING_PRINTING_CONTEXT_WIN_H_
88