summaryrefslogtreecommitdiffstats
path: root/src/printsupport/dialogs/qprintdialog_mac.mm
diff options
context:
space:
mode:
authorKent Hansen <kent.hansen@nokia.com>2012-03-16 10:01:29 +0100
committerKent Hansen <kent.hansen@nokia.com>2012-03-16 10:01:29 +0100
commit440f452aa3a5609e5f6006a03ac36d41462d5908 (patch)
tree598d682291945055e4f6feb08a228212648482c1 /src/printsupport/dialogs/qprintdialog_mac.mm
parentcd1e62ffc121cc68c5a133a8095d431f04d966ce (diff)
parentd4959fa6376255ab4adf8adaeb2ee47ae6b679d2 (diff)
Merge master into api_changes
Conflicts: src/corelib/kernel/qmetatype.cpp src/gui/kernel/qplatformsurface_qpa.cpp tests/auto/corelib/tools/qtimeline/qtimeline.pro Change-Id: Iff3fff34eeeb06f02369767ddfce44cfde505178
Diffstat (limited to 'src/printsupport/dialogs/qprintdialog_mac.mm')
-rw-r--r--src/printsupport/dialogs/qprintdialog_mac.mm119
1 files changed, 63 insertions, 56 deletions
diff --git a/src/printsupport/dialogs/qprintdialog_mac.mm b/src/printsupport/dialogs/qprintdialog_mac.mm
index 6a267d920b..417ae20f29 100644
--- a/src/printsupport/dialogs/qprintdialog_mac.mm
+++ b/src/printsupport/dialogs/qprintdialog_mac.mm
@@ -41,13 +41,16 @@
#ifndef QT_NO_PRINTDIALOG
-#include <private/qt_mac_p.h>
+#include <Cocoa/Cocoa.h>
-#include <qhash.h>
-#include <qprintdialog.h>
-#include <private/qapplication_p.h>
-#include <private/qabstractprintdialog_p.h>
-#include <private/qprintengine_mac_p.h>
+#include "qprintdialog.h"
+#include "qabstractprintdialog_p.h"
+
+#include <QtCore/qhash.h>
+#include <QtCore/private/qcore_mac_p.h>
+#include <QtWidgets/private/qapplication_p.h>
+#include <QtPrintSupport/qprinter.h>
+#include <QtPrintSupport/qprintengine.h>
QT_BEGIN_NAMESPACE
@@ -56,12 +59,11 @@ class QPrintDialogPrivate : public QAbstractPrintDialogPrivate
Q_DECLARE_PUBLIC(QPrintDialog)
public:
- QPrintDialogPrivate() : ep(0), printPanel(0)
+ QPrintDialogPrivate() : printInfo(0), printPanel(0)
{}
void openCocoaPrintPanel(Qt::WindowModality modality);
void closeCocoaPrintPanel();
- void initBeforeRun();
inline QPrintDialog *printDialog() { return q_func(); }
@@ -76,7 +78,7 @@ public:
inline void _q_btnBrowseClicked() {}
inline void _q_btnPropertiesClicked() {}
- QMacPrintEnginePrivate *ep;
+ NSPrintInfo *printInfo;
NSPrintPanel *printPanel;
};
@@ -87,25 +89,38 @@ QT_USE_NAMESPACE
@class QT_MANGLE_NAMESPACE(QCocoaPrintPanelDelegate);
-@interface QT_MANGLE_NAMESPACE(QCocoaPrintPanelDelegate) : NSObject {
+@interface QT_MANGLE_NAMESPACE(QCocoaPrintPanelDelegate) : NSObject
+{
+ NSPrintInfo *printInfo;
}
+- (id)initWithNSPrintInfo:(NSPrintInfo *)nsPrintInfo;
- (void)printPanelDidEnd:(NSPrintPanel *)printPanel
returnCode:(int)returnCode contextInfo:(void *)contextInfo;
@end
@implementation QT_MANGLE_NAMESPACE(QCocoaPrintPanelDelegate)
+- (id)initWithNSPrintInfo:(NSPrintInfo *)nsPrintInfo
+{
+ if (self = [super init]) {
+ printInfo = nsPrintInfo;
+ }
+ return self;
+}
- (void)printPanelDidEnd:(NSPrintPanel *)printPanel
returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
Q_UNUSED(printPanel);
- QPrintDialogPrivate *d = static_cast<QPrintDialogPrivate *>(contextInfo);
- QPrintDialog *dialog = d->printDialog();
+ QPrintDialog *dialog = static_cast<QPrintDialog *>(contextInfo);
+ QPrinter *printer = dialog->printer();
if (returnCode == NSOKButton) {
+ PMPrintSession session = static_cast<PMPrintSession>([printInfo PMPrintSession]);
+ PMPrintSettings settings = static_cast<PMPrintSettings>([printInfo PMPrintSettings]);
+
UInt32 frompage, topage;
- PMGetFirstPage(d->ep->settings, &frompage);
- PMGetLastPage(d->ep->settings, &topage);
+ PMGetFirstPage(settings, &frompage);
+ PMGetLastPage(settings, &topage);
topage = qMin(UInt32(INT_MAX), topage);
dialog->setFromTo(frompage, topage);
@@ -128,22 +143,19 @@ QT_USE_NAMESPACE
// If the user selected print to file, the session has been
// changed behind our back and our d->ep->session object is a
// dangling pointer. Update it based on the "current" session
- d->ep->session = static_cast<PMPrintSession>([d->ep->printInfo PMPrintSession]);
-
- PMSessionGetDestinationType(d->ep->session, d->ep->settings, &dest);
+ PMSessionGetDestinationType(session, settings, &dest);
if (dest == kPMDestinationFile) {
QCFType<CFURLRef> file;
- PMSessionCopyDestinationLocation(d->ep->session, d->ep->settings, &file);
+ PMSessionCopyDestinationLocation(session, settings, &file);
UInt8 localFile[2048]; // Assuming there's a POSIX file system here.
CFURLGetFileSystemRepresentation(file, true, localFile, sizeof(localFile));
- d->ep->outputFilename
- = QString::fromUtf8(reinterpret_cast<const char *>(localFile));
+ printer->setOutputFileName(QString::fromUtf8(reinterpret_cast<const char *>(localFile)));
} else {
// Keep output format.
QPrinter::OutputFormat format;
- format = d->printer->outputFormat();
- d->printer->setOutputFileName(QString());
- d->printer->setOutputFormat(format);
+ format = printer->outputFormat();
+ printer->setOutputFileName(QString());
+ printer->setOutputFormat(format);
}
}
@@ -151,38 +163,33 @@ QT_USE_NAMESPACE
}
@end
-
QT_BEGIN_NAMESPACE
-extern void macStartInterceptWindowTitle(QWidget *window);
-extern void macStopInterceptWindowTitle();
-
-
-void QPrintDialogPrivate::initBeforeRun()
+void QPrintDialogPrivate::openCocoaPrintPanel(Qt::WindowModality modality)
{
Q_Q(QPrintDialog);
- // If someone is reusing a QPrinter object, the end released all our old
- // information. In this case, we must reinitialize.
- if (ep->session == 0)
- ep->initialize();
+ // get the NSPrintInfo from the print engine in the platform plugin
+ void *voidp = 0;
+ (void) QMetaObject::invokeMethod(qApp->platformNativeInterface(),
+ "NSPrintInfoForPrintEngine",
+ Q_RETURN_ARG(void *, voidp),
+ Q_ARG(QPrintEngine *, printer->printEngine()));
+ printInfo = static_cast<NSPrintInfo *>(voidp);
+ [printInfo retain];
// It seems the only way that PM lets you use all is if the minimum
// for the page range is 1. This _kind of_ makes sense if you think about
// it. However, calling PMSetFirstPage() or PMSetLastPage() always enforces
// the range.
- PMSetPageRange(ep->settings, q->minPage(), q->maxPage());
+ // get print settings from the platform plugin
+ PMPrintSettings settings = static_cast<PMPrintSettings>([printInfo PMPrintSettings]);
+ PMSetPageRange(settings, q->minPage(), q->maxPage());
if (q->printRange() == QAbstractPrintDialog::PageRange) {
- PMSetFirstPage(ep->settings, q->fromPage(), false);
- PMSetLastPage(ep->settings, q->toPage(), false);
+ PMSetFirstPage(settings, q->fromPage(), false);
+ PMSetLastPage(settings, q->toPage(), false);
}
-}
-
-void QPrintDialogPrivate::openCocoaPrintPanel(Qt::WindowModality modality)
-{
- Q_Q(QPrintDialog);
-
- initBeforeRun();
+ [printInfo updateFromPMPrintSettings];
QPrintDialog::PrintDialogOptions qtOptions = q->options();
NSPrintPanelOptions macOptions = NSPrintPanelShowsCopies;
@@ -192,30 +199,32 @@ void QPrintDialogPrivate::openCocoaPrintPanel(Qt::WindowModality modality)
macOptions |= NSPrintPanelShowsPaperSize | NSPrintPanelShowsPageSetupAccessory
| NSPrintPanelShowsOrientation;
- macStartInterceptWindowTitle(q);
printPanel = [NSPrintPanel printPanel];
- QT_MANGLE_NAMESPACE(QCocoaPrintPanelDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QCocoaPrintPanelDelegate) alloc] init];
+ [printPanel retain];
[printPanel setOptions:macOptions];
+ QT_MANGLE_NAMESPACE(QCocoaPrintPanelDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QCocoaPrintPanelDelegate) alloc] init];
if (modality == Qt::ApplicationModal) {
- int rval = [printPanel runModalWithPrintInfo:ep->printInfo];
+ int rval = [printPanel runModalWithPrintInfo:printInfo];
[delegate printPanelDidEnd:printPanel returnCode:rval contextInfo:this];
} else {
Q_ASSERT(q->parentWidget());
- NSWindow *windowRef = qt_mac_window_for(q->parentWidget());
- [printPanel beginSheetWithPrintInfo:ep->printInfo
- modalForWindow:windowRef
+ QWindow *parentWindow = q->parentWidget()->windowHandle();
+ NSWindow *window = static_cast<NSWindow *>(qApp->platformNativeInterface()->nativeResourceForWindow("nswindow", parentWindow));
+ [printPanel beginSheetWithPrintInfo:printInfo
+ modalForWindow:window
delegate:delegate
didEndSelector:@selector(printPanelDidEnd:returnCode:contextInfo:)
contextInfo:this];
}
-
- macStopInterceptWindowTitle();
}
void QPrintDialogPrivate::closeCocoaPrintPanel()
{
- // ###
+ [printInfo release];
+ printInfo = 0;
+ [printPanel release];
+ printPanel = 0;
}
static bool warnIfNotNative(QPrinter *printer)
@@ -234,7 +243,6 @@ QPrintDialog::QPrintDialog(QPrinter *printer, QWidget *parent)
Q_D(QPrintDialog);
if (!warnIfNotNative(d->printer))
return;
- d->ep = static_cast<QMacPrintEngine *>(d->printer->paintEngine())->d_func();
}
QPrintDialog::QPrintDialog(QWidget *parent)
@@ -243,7 +251,6 @@ QPrintDialog::QPrintDialog(QWidget *parent)
Q_D(QPrintDialog);
if (!warnIfNotNative(d->printer))
return;
- d->ep = static_cast<QMacPrintEngine *>(d->printer->paintEngine())->d_func();
}
QPrintDialog::~QPrintDialog()
@@ -256,10 +263,10 @@ int QPrintDialog::exec()
if (!warnIfNotNative(d->printer))
return QDialog::Rejected;
- QMacCocoaAutoReleasePool pool;
-
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
d->openCocoaPrintPanel(Qt::ApplicationModal);
d->closeCocoaPrintPanel();
+ [pool release];
return result();
}