Index: printing/printing_context_mac.mm |
diff --git a/printing/printing_context_mac.mm b/printing/printing_context_mac.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a933f74ea95df2dc33eba6250b6521a4f20ec16b |
--- /dev/null |
+++ b/printing/printing_context_mac.mm |
@@ -0,0 +1,206 @@ |
+// 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 "printing/printing_context.h" |
+ |
+#import <ApplicationServices/ApplicationServices.h> |
+#import <AppKit/AppKit.h> |
+ |
+#include "base/logging.h" |
+ |
+namespace printing { |
+ |
+PrintingContext::PrintingContext() |
+ : context_(NULL), |
+ print_info_(nil), |
+#ifndef NDEBUG |
+ page_number_(-1), |
+#endif |
+ dialog_box_dismissed_(false), |
+ in_print_job_(false), |
+ abort_printing_(false) { |
+} |
+ |
+PrintingContext::~PrintingContext() { |
+ ResetSettings(); |
+} |
+ |
+ |
+PrintingContext::Result PrintingContext::AskUserForSettings( |
+ gfx::NativeWindow window, int max_pages, bool has_selection) { |
+ DCHECK([NSThread isMainThread]); |
+ |
+ // We deliberately don't feed max_pages into the dialog, because setting |
+ // NSPrintLastPage makes the print dialog pre-select the option to only print |
+ // a range. |
+ |
+ // TODO(stuartmorgan): implement 'print selection only' (probably requires |
+ // adding a new custom view to the panel on 10.5; 10.6 has |
+ // NSPrintPanelShowsPrintSelection). |
+ NSPrintPanel* panel = [NSPrintPanel printPanel]; |
+ // TODO(stuartmorgan): We really want a tab sheet here, not a modal window. |
+ // Will require restructuring the PrintingContext API to use a callback. |
+ NSInteger selection = |
+ [panel runModalWithPrintInfo:[NSPrintInfo sharedPrintInfo]]; |
+ if (selection != NSOKButton) { |
+ return CANCEL; |
+ } |
+ |
+ ParsePrintInfo([panel printInfo]); |
+ return OK; |
+} |
+ |
+PrintingContext::Result PrintingContext::UseDefaultSettings() { |
+ DCHECK(!in_print_job_); |
+ |
+ ParsePrintInfo([NSPrintInfo sharedPrintInfo]); |
+ |
+ return OK; |
+} |
+ |
+void PrintingContext::ParsePrintInfo(NSPrintInfo* print_info) { |
+ ResetSettings(); |
+ print_info_ = [print_info retain]; |
+ PageRanges page_ranges; |
+ NSDictionary* print_info_dict = [print_info_ dictionary]; |
+ if (![[print_info_dict objectForKey:NSPrintAllPages] boolValue]) { |
+ PageRange range; |
+ range.from = [[print_info_dict objectForKey:NSPrintFirstPage] intValue] - 1; |
+ range.to = [[print_info_dict objectForKey:NSPrintLastPage] intValue] - 1; |
+ page_ranges.push_back(range); |
+ } |
+ PMPrintSession print_session = |
+ static_cast<PMPrintSession>([print_info_ PMPrintSession]); |
+ PMPageFormat page_format = |
+ static_cast<PMPageFormat>([print_info_ PMPageFormat]); |
+ PMPrinter printer; |
+ PMSessionGetCurrentPrinter(print_session, &printer); |
+ |
+ settings_.Init(printer, page_format, page_ranges, false); |
+} |
+ |
+PrintingContext::Result PrintingContext::InitWithSettings( |
+ const PrintSettings& settings) { |
+ DCHECK(!in_print_job_); |
+ settings_ = settings; |
+ |
+ NOTIMPLEMENTED(); |
+ |
+ return FAILED; |
+} |
+ |
+void PrintingContext::ResetSettings() { |
+ [print_info_ autorelease]; |
+ print_info_ = nil; |
+ settings_.Clear(); |
+#ifndef NDEBUG |
+ page_number_ = -1; |
+#endif |
+ dialog_box_dismissed_ = false; |
+ abort_printing_ = false; |
+ in_print_job_ = false; |
+ context_ = NULL; |
+} |
+ |
+PrintingContext::Result PrintingContext::NewDocument( |
+ const std::wstring& document_name) { |
+ DCHECK(!in_print_job_); |
+ |
+ in_print_job_ = true; |
+ |
+ PMPrintSession print_session = |
+ static_cast<PMPrintSession>([print_info_ PMPrintSession]); |
+ PMPrintSettings print_settings = |
+ static_cast<PMPrintSettings>([print_info_ PMPrintSettings]); |
+ PMPageFormat page_format = |
+ static_cast<PMPageFormat>([print_info_ PMPageFormat]); |
+ OSStatus status = PMSessionBeginCGDocumentNoDialog(print_session, |
+ print_settings, |
+ page_format); |
+ if (status != noErr) |
+ return OnError(); |
+ |
+#ifndef NDEBUG |
+ page_number_ = 0; |
+#endif |
+ |
+ return OK; |
+} |
+ |
+PrintingContext::Result PrintingContext::NewPage() { |
+ if (abort_printing_) |
+ return CANCEL; |
+ DCHECK(in_print_job_); |
+ DCHECK(!context_); |
+ |
+ PMPrintSession print_session = |
+ static_cast<PMPrintSession>([print_info_ PMPrintSession]); |
+ PMPageFormat page_format = |
+ static_cast<PMPageFormat>([print_info_ PMPageFormat]); |
+ OSStatus status; |
+ status = PMSessionBeginPageNoDialog(print_session, page_format, NULL); |
+ if (status != noErr) |
+ return OnError(); |
+ status = PMSessionGetCGGraphicsContext(print_session, &context_); |
+ if (status != noErr) |
+ return OnError(); |
+ |
+#ifndef NDEBUG |
+ ++page_number_; |
+#endif |
+ |
+ return OK; |
+} |
+ |
+PrintingContext::Result PrintingContext::PageDone() { |
+ if (abort_printing_) |
+ return CANCEL; |
+ DCHECK(in_print_job_); |
+ DCHECK(context_); |
+ |
+ PMPrintSession print_session = |
+ static_cast<PMPrintSession>([print_info_ PMPrintSession]); |
+ OSStatus status = PMSessionEndPageNoDialog(print_session); |
+ if (status != noErr) |
+ OnError(); |
+ context_ = NULL; |
+ |
+ return OK; |
+} |
+ |
+PrintingContext::Result PrintingContext::DocumentDone() { |
+ if (abort_printing_) |
+ return CANCEL; |
+ DCHECK(in_print_job_); |
+ |
+ PMPrintSession print_session = |
+ static_cast<PMPrintSession>([print_info_ PMPrintSession]); |
+ OSStatus status = PMSessionEndDocumentNoDialog(print_session); |
+ if (status != noErr) |
+ OnError(); |
+ |
+ ResetSettings(); |
+ return OK; |
+} |
+ |
+void PrintingContext::Cancel() { |
+ abort_printing_ = true; |
+ in_print_job_ = false; |
+ context_ = NULL; |
+ |
+ PMPrintSession print_session = |
+ static_cast<PMPrintSession>([print_info_ PMPrintSession]); |
+ PMSessionEndPageNoDialog(print_session); |
+} |
+ |
+void PrintingContext::DismissDialog() { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+PrintingContext::Result PrintingContext::OnError() { |
+ ResetSettings(); |
+ return abort_printing_ ? CANCEL : FAILED; |
+} |
+ |
+} // namespace printing |