5#include <AppKit/AppKit.h>
11#include <qpa/qplatformnativeinterface.h>
12#include <qpa/qplatformwindow_p.h>
13#include <QtPrintSupport/qprintengine.h>
15#include <QtPrintSupport/private/qprintengine_mac_p.h>
17#include <QtCore/private/qcore_mac_p.h>
21@
class QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate);
23@interface QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) : NSObject
26@implementation QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) {
27 NSPrintInfo *printInfo;
30- (instancetype)initWithNSPrintInfo:(NSPrintInfo *)nsPrintInfo
34 printInfo = nsPrintInfo;
39- (
void)pageLayoutDidEnd:(NSPageLayout *)pageLayout
40 returnCode:(
int)returnCode contextInfo:(
void *)contextInfo
43 QPageSetupDialog *dialog =
static_cast<QPageSetupDialog *>(contextInfo);
44 QPrinter *printer = dialog->printer();
46 if (returnCode == NSModalResponseOK) {
47 PMPageFormat format =
static_cast<PMPageFormat>([printInfo PMPageFormat]);
49 PMGetUnadjustedPaperRect(format, &paperRect);
50 PMOrientation orientation;
51 PMGetOrientation(format, &orientation);
52 QSizeF paperSize = QSizeF(paperRect.right - paperRect.left, paperRect.bottom - paperRect.top);
53 printer->printEngine()->setProperty(QPrintEngine::PPK_CustomPaperSize, paperSize);
54 printer->printEngine()->setProperty(QPrintEngine::PPK_Orientation, orientation == kPMLandscape ? QPageLayout::Landscape : QPageLayout::Portrait);
57 dialog->done((returnCode == NSModalResponseOK) ? QDialog::Accepted : QDialog::Rejected);
63class QMacPageSetupDialogPrivate :
public QPageSetupDialogPrivate
65 Q_DECLARE_PUBLIC(QPageSetupDialog)
68 QMacPageSetupDialogPrivate(QPrinter *printer)
69 : QPageSetupDialogPrivate(printer), printInfo(0), pageLayout(0)
72 ~QMacPageSetupDialogPrivate() {
75 void openCocoaPageLayout(Qt::WindowModality modality);
76 void closeCocoaPageLayout();
78 NSPrintInfo *printInfo;
79 NSPageLayout *pageLayout;
82void QMacPageSetupDialogPrivate::openCocoaPageLayout(Qt::WindowModality modality)
84 Q_Q(QPageSetupDialog);
86 printInfo =
static_cast<QMacPrintEngine *>(printer->printEngine())->printInfo();
89 pageLayout = [NSPageLayout pageLayout];
92 QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) alloc] initWithNSPrintInfo:printInfo];
94 if (modality == Qt::ApplicationModal) {
97 (
void) QMetaObject::invokeMethod(qApp->platformNativeInterface(),
98 "clearCurrentThreadCocoaEventDispatcherInterruptFlag");
100 int rval = [pageLayout runModalWithPrintInfo:printInfo];
101 [delegate pageLayoutDidEnd:pageLayout returnCode:rval contextInfo:q];
103 Q_ASSERT(q->parentWidget());
104 QWindow *parentWindow = q->parentWidget()->windowHandle();
105 auto *cocoaWindow = parentWindow->nativeInterface<QNativeInterface::Private::QCocoaWindow>();
106 NSWindow *window = cocoaWindow ? cocoaWindow->view().window : nil;
107 [pageLayout beginSheetWithPrintInfo:printInfo
108 modalForWindow:window
110 didEndSelector:@selector(pageLayoutDidEnd:returnCode:contextInfo:)
115void QMacPageSetupDialogPrivate::closeCocoaPageLayout()
119 [pageLayout release];
123QPageSetupDialog::QPageSetupDialog(QPrinter *printer, QWidget *parent)
124 : QDialog(*(
new QMacPageSetupDialogPrivate(printer)), parent)
126 setWindowTitle(QCoreApplication::translate(
"QPrintPreviewDialog",
"Page Setup"));
127 setAttribute(Qt::WA_DontShowOnScreen);
130QPageSetupDialog::QPageSetupDialog(QWidget *parent)
131 : QDialog(*(
new QMacPageSetupDialogPrivate(0)), parent)
133 setWindowTitle(QCoreApplication::translate(
"QPrintPreviewDialog",
"Page Setup"));
134 setAttribute(Qt::WA_DontShowOnScreen);
137void QPageSetupDialog::setVisible(
bool visible)
139 Q_D(QPageSetupDialog);
141 if (d->printer->outputFormat() != QPrinter::NativeFormat)
144 bool isCurrentlyVisible = (
static_cast <QMacPageSetupDialogPrivate*>(d)->pageLayout != 0);
145 if (!visible == !isCurrentlyVisible)
148 QDialog::setVisible(visible);
151 Qt::WindowModality modality = windowModality();
152 if (modality == Qt::NonModal) {
154 modality = parentWidget() ? Qt::WindowModal : Qt::ApplicationModal;
156 static_cast <QMacPageSetupDialogPrivate*>(d)->openCocoaPageLayout(modality);
159 if (
static_cast <QMacPageSetupDialogPrivate*>(d)->pageLayout) {
160 static_cast <QMacPageSetupDialogPrivate*>(d)->closeCocoaPageLayout();
166int QPageSetupDialog::exec()
168 Q_D(QPageSetupDialog);
170 if (d->printer->outputFormat() != QPrinter::NativeFormat)
173 QDialog::setVisible(
true);
175 QMacAutoReleasePool pool;
176 static_cast <QMacPageSetupDialogPrivate*>(d)->openCocoaPageLayout(Qt::ApplicationModal);
177 static_cast <QMacPageSetupDialogPrivate*>(d)->closeCocoaPageLayout();
179 QDialog::setVisible(
false);