summaryrefslogtreecommitdiffstats
path: root/src/gui/dialogs/qpagesetupdialog_win.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@nokia.com>2009-03-23 09:34:13 (GMT)
committerSimon Hausmann <simon.hausmann@nokia.com>2009-03-23 09:34:13 (GMT)
commit67ad0519fd165acee4a4d2a94fa502e9e4847bd0 (patch)
tree1dbf50b3dff8d5ca7e9344733968c72704eb15ff /src/gui/dialogs/qpagesetupdialog_win.cpp
downloadQt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.zip
Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.gz
Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.bz2
Long live Qt!
Diffstat (limited to 'src/gui/dialogs/qpagesetupdialog_win.cpp')
-rw-r--r--src/gui/dialogs/qpagesetupdialog_win.cpp169
1 files changed, 169 insertions, 0 deletions
diff --git a/src/gui/dialogs/qpagesetupdialog_win.cpp b/src/gui/dialogs/qpagesetupdialog_win.cpp
new file mode 100644
index 0000000..4bb571c
--- /dev/null
+++ b/src/gui/dialogs/qpagesetupdialog_win.cpp
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Contact: Qt Software Information (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the either Technology Preview License Agreement or the
+** Beta Release License Agreement.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain
+** additional rights. These rights are described in the Nokia Qt LGPL
+** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
+** package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at qt-sales@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qpagesetupdialog.h"
+
+#ifndef QT_NO_PRINTDIALOG
+#include <qapplication.h>
+
+#include <private/qprintengine_win_p.h>
+#include <private/qabstractpagesetupdialog_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QPageSetupDialogPrivate : public QAbstractPageSetupDialogPrivate
+{
+};
+
+QPageSetupDialog::QPageSetupDialog(QPrinter *printer, QWidget *parent)
+ : QAbstractPageSetupDialog(*(new QPageSetupDialogPrivate), printer, parent)
+{
+}
+
+QPageSetupDialog::QPageSetupDialog(QWidget *parent)
+ : QAbstractPageSetupDialog(*(new QPageSetupDialogPrivate), 0, parent)
+{
+}
+
+int QPageSetupDialog::exec()
+{
+ Q_D(QPageSetupDialog);
+
+ if (d->printer->outputFormat() != QPrinter::NativeFormat)
+ return Rejected;
+
+ QWin32PrintEngine *engine = static_cast<QWin32PrintEngine*>(d->printer->paintEngine());
+ QWin32PrintEnginePrivate *ep = static_cast<QWin32PrintEnginePrivate *>(engine->d_ptr);
+
+ PAGESETUPDLG psd;
+ memset(&psd, 0, sizeof(PAGESETUPDLG));
+ psd.lStructSize = sizeof(PAGESETUPDLG);
+
+ // we need a temp DEVMODE struct if we don't have a global DEVMODE
+ HGLOBAL hDevMode;
+ int devModeSize;
+ if (!ep->globalDevMode) {
+ QT_WA( { devModeSize = sizeof(DEVMODEW) + ((DEVMODEW *) ep->devMode)->dmDriverExtra; },
+ { devModeSize = sizeof(DEVMODEA) + ((DEVMODEA *) ep->devMode)->dmDriverExtra; });
+ hDevMode = GlobalAlloc(GHND, devModeSize);
+ if (hDevMode) {
+ void *dest = GlobalLock(hDevMode);
+ memcpy(dest, ep->devMode, devModeSize);
+ GlobalUnlock(hDevMode);
+ }
+ psd.hDevMode = hDevMode;
+ } else {
+ psd.hDevMode = ep->devMode;
+ }
+
+ HGLOBAL *tempDevNames = ep->createDevNames();
+ psd.hDevNames = tempDevNames;
+
+ QWidget *parent = parentWidget();
+ parent = parent ? parent->window() : qApp->activeWindow();
+ Q_ASSERT(!parent ||parent->testAttribute(Qt::WA_WState_Created));
+ psd.hwndOwner = parent ? parent->winId() : 0;
+
+ QRect paperRect = d->printer->paperRect();
+ QRect pageRect = d->printer->pageRect();
+
+ psd.Flags = PSD_MARGINS;
+ double multiplier = 1;
+ switch (QLocale::system().measurementSystem()) {
+ case QLocale::MetricSystem:
+ psd.Flags |= PSD_INHUNDREDTHSOFMILLIMETERS;
+ multiplier = 1;
+ break;
+ case QLocale::ImperialSystem:
+ psd.Flags |= PSD_INTHOUSANDTHSOFINCHES;
+ multiplier = 25.4/10;
+ break;
+ }
+
+ QRect marginRect = ep->getPageMargins();
+ psd.rtMargin.left = marginRect.left() / multiplier;
+ psd.rtMargin.top = marginRect.top() / multiplier;
+ psd.rtMargin.right = marginRect.width() / multiplier;;
+ psd.rtMargin.bottom = marginRect.height() / multiplier;;
+
+ bool result = PageSetupDlg(&psd);
+ if (result) {
+ ep->readDevnames(psd.hDevNames);
+ ep->readDevmode(psd.hDevMode);
+
+ QRect theseMargins = QRect(psd.rtMargin.left * multiplier,
+ psd.rtMargin.top * multiplier,
+ psd.rtMargin.right * multiplier,
+ psd.rtMargin.bottom * multiplier);
+
+ if (theseMargins != marginRect) {
+ ep->setPageMargins(psd.rtMargin.left * multiplier,
+ psd.rtMargin.top * multiplier,
+ psd.rtMargin.right * multiplier,
+ psd.rtMargin.bottom * multiplier);
+ }
+
+ ep->updateCustomPaperSize();
+
+ // copy from our temp DEVMODE struct
+ if (!ep->globalDevMode && hDevMode) {
+ void *src = GlobalLock(hDevMode);
+ memcpy(ep->devMode, src, devModeSize);
+ GlobalUnlock(hDevMode);
+ }
+ }
+
+ if (!ep->globalDevMode && hDevMode)
+ GlobalFree(hDevMode);
+ GlobalFree(tempDevNames);
+ done(result);
+ return result;
+}
+
+void QPageSetupDialog::setVisible(bool visible)
+{
+ if (!visible)
+ return;
+ exec();
+}
+
+QT_END_NAMESPACE
+#endif