Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qpagesetupdialog_mac.mm
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4
5#include <AppKit/AppKit.h>
6
8
10
11#include <qpa/qplatformnativeinterface.h>
12#include <QtPrintSupport/qprintengine.h>
13
14#include <QtPrintSupport/private/qprintengine_mac_p.h>
15
16#include <QtCore/private/qcore_mac_p.h>
17
18QT_USE_NAMESPACE
19
20@class QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate);
21
22@interface QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) : NSObject
23@end
24
25@implementation QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) {
26 NSPrintInfo *printInfo;
27}
28
29- (instancetype)initWithNSPrintInfo:(NSPrintInfo *)nsPrintInfo
30{
31 self = [super init];
32 if (self) {
33 printInfo = nsPrintInfo;
34 }
35 return self;
36
37}
38- (void)pageLayoutDidEnd:(NSPageLayout *)pageLayout
39 returnCode:(int)returnCode contextInfo:(void *)contextInfo
40{
41 Q_UNUSED(pageLayout);
42 QPageSetupDialog *dialog = static_cast<QPageSetupDialog *>(contextInfo);
43 QPrinter *printer = dialog->printer();
44
45 if (returnCode == NSModalResponseOK) {
46 PMPageFormat format = static_cast<PMPageFormat>([printInfo PMPageFormat]);
47 PMRect paperRect;
48 PMGetUnadjustedPaperRect(format, &paperRect);
49 PMOrientation orientation;
50 PMGetOrientation(format, &orientation);
51 QSizeF paperSize = QSizeF(paperRect.right - paperRect.left, paperRect.bottom - paperRect.top);
52 printer->printEngine()->setProperty(QPrintEngine::PPK_CustomPaperSize, paperSize);
53 printer->printEngine()->setProperty(QPrintEngine::PPK_Orientation, orientation == kPMLandscape ? QPageLayout::Landscape : QPageLayout::Portrait);
54 }
55
56 dialog->done((returnCode == NSModalResponseOK) ? QDialog::Accepted : QDialog::Rejected);
57}
58@end
59
60QT_BEGIN_NAMESPACE
61
62class QMacPageSetupDialogPrivate : public QPageSetupDialogPrivate
63{
64 Q_DECLARE_PUBLIC(QPageSetupDialog)
65
66public:
67 QMacPageSetupDialogPrivate(QPrinter *printer)
68 : QPageSetupDialogPrivate(printer), printInfo(0), pageLayout(0)
69 { }
70
71 ~QMacPageSetupDialogPrivate() {
72 }
73
74 void openCocoaPageLayout(Qt::WindowModality modality);
75 void closeCocoaPageLayout();
76
77 NSPrintInfo *printInfo;
78 NSPageLayout *pageLayout;
79};
80
81void QMacPageSetupDialogPrivate::openCocoaPageLayout(Qt::WindowModality modality)
82{
83 Q_Q(QPageSetupDialog);
84
85 printInfo = static_cast<QMacPrintEngine *>(printer->printEngine())->printInfo();
86 [printInfo retain];
87
88 pageLayout = [NSPageLayout pageLayout];
89 // Keep a copy to this since we plan on using it for a bit.
90 [pageLayout retain];
91 QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) alloc] initWithNSPrintInfo:printInfo];
92
93 if (modality == Qt::ApplicationModal) {
94
95 // Make sure we don't interrupt the runModalWithPrintInfo call.
96 (void) QMetaObject::invokeMethod(qApp->platformNativeInterface(),
97 "clearCurrentThreadCocoaEventDispatcherInterruptFlag");
98
99 int rval = [pageLayout runModalWithPrintInfo:printInfo];
100 [delegate pageLayoutDidEnd:pageLayout returnCode:rval contextInfo:q];
101 } else {
102 Q_ASSERT(q->parentWidget());
103 QWindow *parentWindow = q->parentWidget()->windowHandle();
104 NSWindow *window = static_cast<NSWindow *>(qApp->platformNativeInterface()->nativeResourceForWindow("nswindow", parentWindow));
105 [pageLayout beginSheetWithPrintInfo:printInfo
106 modalForWindow:window
107 delegate:delegate
108 didEndSelector:@selector(pageLayoutDidEnd:returnCode:contextInfo:)
109 contextInfo:q];
110 }
111}
112
113void QMacPageSetupDialogPrivate::closeCocoaPageLayout()
114{
115 [printInfo release];
116 printInfo = 0;
117 [pageLayout release];
118 pageLayout = 0;
119}
120
121QPageSetupDialog::QPageSetupDialog(QPrinter *printer, QWidget *parent)
122 : QDialog(*(new QMacPageSetupDialogPrivate(printer)), parent)
123{
124 setWindowTitle(QCoreApplication::translate("QPrintPreviewDialog", "Page Setup"));
125 setAttribute(Qt::WA_DontShowOnScreen);
126}
127
128QPageSetupDialog::QPageSetupDialog(QWidget *parent)
129 : QDialog(*(new QMacPageSetupDialogPrivate(0)), parent)
130{
131 setWindowTitle(QCoreApplication::translate("QPrintPreviewDialog", "Page Setup"));
132 setAttribute(Qt::WA_DontShowOnScreen);
133}
134
135void QPageSetupDialog::setVisible(bool visible)
136{
137 Q_D(QPageSetupDialog);
138
139 if (d->printer->outputFormat() != QPrinter::NativeFormat)
140 return;
141
142 bool isCurrentlyVisible = (static_cast <QMacPageSetupDialogPrivate*>(d)->pageLayout != 0);
143 if (!visible == !isCurrentlyVisible)
144 return;
145
146 QDialog::setVisible(visible);
147
148 if (visible) {
149 Qt::WindowModality modality = windowModality();
150 if (modality == Qt::NonModal) {
151 // NSPrintPanels can only be modal, so we must pick a type
152 modality = parentWidget() ? Qt::WindowModal : Qt::ApplicationModal;
153 }
154 static_cast <QMacPageSetupDialogPrivate*>(d)->openCocoaPageLayout(modality);
155 return;
156 } else {
157 if (static_cast <QMacPageSetupDialogPrivate*>(d)->pageLayout) {
158 static_cast <QMacPageSetupDialogPrivate*>(d)->closeCocoaPageLayout();
159 return;
160 }
161 }
162}
163
164int QPageSetupDialog::exec()
165{
166 Q_D(QPageSetupDialog);
167
168 if (d->printer->outputFormat() != QPrinter::NativeFormat)
169 return Rejected;
170
171 QDialog::setVisible(true);
172
173 QMacAutoReleasePool pool;
174 static_cast <QMacPageSetupDialogPrivate*>(d)->openCocoaPageLayout(Qt::ApplicationModal);
175 static_cast <QMacPageSetupDialogPrivate*>(d)->closeCocoaPageLayout();
176
177 QDialog::setVisible(false);
178
179 return result();
180}
181
182QT_END_NAMESPACE