5#include <AppKit/AppKit.h>
11#include <qpa/qplatformnativeinterface.h>
12#include <QtPrintSupport/qprintengine.h>
14#include <QtPrintSupport/private/qprintengine_mac_p.h>
16#include <QtCore/private/qcore_mac_p.h>
20@
class QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate);
22@interface QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) : NSObject
25@implementation QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) {
26 NSPrintInfo *printInfo;
29- (instancetype)initWithNSPrintInfo:(NSPrintInfo *)nsPrintInfo
33 printInfo = nsPrintInfo;
38- (
void)pageLayoutDidEnd:(NSPageLayout *)pageLayout
39 returnCode:(
int)returnCode contextInfo:(
void *)contextInfo
42 QPageSetupDialog *dialog =
static_cast<QPageSetupDialog *>(contextInfo);
43 QPrinter *printer = dialog->printer();
45 if (returnCode == NSModalResponseOK) {
46 PMPageFormat format =
static_cast<PMPageFormat>([printInfo PMPageFormat]);
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);
56 dialog->done((returnCode == NSModalResponseOK) ? QDialog::Accepted : QDialog::Rejected);
62class QMacPageSetupDialogPrivate :
public QPageSetupDialogPrivate
64 Q_DECLARE_PUBLIC(QPageSetupDialog)
67 QMacPageSetupDialogPrivate(QPrinter *printer)
68 : QPageSetupDialogPrivate(printer), printInfo(0), pageLayout(0)
71 ~QMacPageSetupDialogPrivate() {
74 void openCocoaPageLayout(Qt::WindowModality modality);
75 void closeCocoaPageLayout();
77 NSPrintInfo *printInfo;
78 NSPageLayout *pageLayout;
81void QMacPageSetupDialogPrivate::openCocoaPageLayout(Qt::WindowModality modality)
83 Q_Q(QPageSetupDialog);
85 printInfo =
static_cast<QMacPrintEngine *>(printer->printEngine())->printInfo();
88 pageLayout = [NSPageLayout pageLayout];
91 QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) alloc] initWithNSPrintInfo:printInfo];
93 if (modality == Qt::ApplicationModal) {
96 (
void) QMetaObject::invokeMethod(qApp->platformNativeInterface(),
97 "clearCurrentThreadCocoaEventDispatcherInterruptFlag");
99 int rval = [pageLayout runModalWithPrintInfo:printInfo];
100 [delegate pageLayoutDidEnd:pageLayout returnCode:rval contextInfo:q];
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
108 didEndSelector:@selector(pageLayoutDidEnd:returnCode:contextInfo:)
113void QMacPageSetupDialogPrivate::closeCocoaPageLayout()
117 [pageLayout release];
121QPageSetupDialog::QPageSetupDialog(QPrinter *printer, QWidget *parent)
122 : QDialog(*(
new QMacPageSetupDialogPrivate(printer)), parent)
124 setWindowTitle(QCoreApplication::translate(
"QPrintPreviewDialog",
"Page Setup"));
125 setAttribute(Qt::WA_DontShowOnScreen);
128QPageSetupDialog::QPageSetupDialog(QWidget *parent)
129 : QDialog(*(
new QMacPageSetupDialogPrivate(0)), parent)
131 setWindowTitle(QCoreApplication::translate(
"QPrintPreviewDialog",
"Page Setup"));
132 setAttribute(Qt::WA_DontShowOnScreen);
135void QPageSetupDialog::setVisible(
bool visible)
137 Q_D(QPageSetupDialog);
139 if (d->printer->outputFormat() != QPrinter::NativeFormat)
142 bool isCurrentlyVisible = (
static_cast <QMacPageSetupDialogPrivate*>(d)->pageLayout != 0);
143 if (!visible == !isCurrentlyVisible)
146 QDialog::setVisible(visible);
149 Qt::WindowModality modality = windowModality();
150 if (modality == Qt::NonModal) {
152 modality = parentWidget() ? Qt::WindowModal : Qt::ApplicationModal;
154 static_cast <QMacPageSetupDialogPrivate*>(d)->openCocoaPageLayout(modality);
157 if (
static_cast <QMacPageSetupDialogPrivate*>(d)->pageLayout) {
158 static_cast <QMacPageSetupDialogPrivate*>(d)->closeCocoaPageLayout();
164int QPageSetupDialog::exec()
166 Q_D(QPageSetupDialog);
168 if (d->printer->outputFormat() != QPrinter::NativeFormat)
171 QDialog::setVisible(
true);
173 QMacAutoReleasePool pool;
174 static_cast <QMacPageSetupDialogPrivate*>(d)->openCocoaPageLayout(Qt::ApplicationModal);
175 static_cast <QMacPageSetupDialogPrivate*>(d)->closeCocoaPageLayout();
177 QDialog::setVisible(
false);