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

Unified Diff: printing/printing_context_mac.mm

Issue 268036: Implement the basic OS-level printing mechanics on Mac (Closed)
Patch Set: Address review comments Created 11 years, 2 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: 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

Powered by Google App Engine
This is Rietveld 408576698