diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2009-03-23 09:34:13 (GMT) |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2009-03-23 09:34:13 (GMT) |
commit | 67ad0519fd165acee4a4d2a94fa502e9e4847bd0 (patch) | |
tree | 1dbf50b3dff8d5ca7e9344733968c72704eb15ff /src/gui/dialogs/qpagesetupdialog_win.cpp | |
download | Qt-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.cpp | 169 |
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 |