source: trunk/src/gui/dialogs/qprintdialog_win.cpp@ 949

Last change on this file since 949 was 846, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

File size: 9.7 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtGui module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#ifndef QT_NO_PRINTDIALOG
43
44#include "qprintdialog.h"
45
46#include <qwidget.h>
47#include <qapplication.h>
48#include <qmessagebox.h>
49#include <private/qapplication_p.h>
50
51#include <private/qabstractprintdialog_p.h>
52#include <private/qprintengine_win_p.h>
53#include <private/qprinter_p.h>
54
55#if !defined(PD_NOCURRENTPAGE)
56#define PD_NOCURRENTPAGE 0x00800000
57#define PD_RESULT_PRINT 1
58#define PD_RESULT_APPLY 2
59#define START_PAGE_GENERAL 0XFFFFFFFF
60#endif
61
62QT_BEGIN_NAMESPACE
63
64extern void qt_win_eatMouseMove();
65
66class QPrintDialogPrivate : public QAbstractPrintDialogPrivate
67{
68 Q_DECLARE_PUBLIC(QPrintDialog)
69public:
70 QPrintDialogPrivate()
71 : ep(0)
72 {
73 }
74
75 inline void _q_printToFileChanged(int) {}
76 inline void _q_rbPrintRangeToggled(bool) {}
77 inline void _q_printerChanged(int) {}
78 inline void _q_chbPrintLastFirstToggled(bool) {}
79 inline void _q_paperSizeChanged(int) {}
80 inline void _q_btnBrowseClicked() {}
81 inline void _q_btnPropertiesClicked() {}
82 int openWindowsPrintDialogModally();
83
84 QWin32PrintEnginePrivate *ep;
85};
86
87static void qt_win_setup_PRINTDLGEX(PRINTDLGEX *pd, QWidget *parent,
88 QPrintDialog *pdlg,
89 QPrintDialogPrivate *d, HGLOBAL *tempDevNames)
90{
91 DEVMODE *devMode = d->ep->devMode;
92
93 if (devMode) {
94 int size = sizeof(DEVMODE) + devMode->dmDriverExtra;
95 pd->hDevMode = GlobalAlloc(GHND, size);
96 {
97 void *dest = GlobalLock(pd->hDevMode);
98 memcpy(dest, devMode, size);
99 GlobalUnlock(pd->hDevMode);
100 }
101 } else {
102 pd->hDevMode = NULL;
103 }
104 pd->hDevNames = tempDevNames;
105
106 pd->Flags = PD_RETURNDC;
107 pd->Flags |= PD_USEDEVMODECOPIESANDCOLLATE;
108
109 if (!pdlg->isOptionEnabled(QPrintDialog::PrintSelection))
110 pd->Flags |= PD_NOSELECTION;
111 if (pdlg->isOptionEnabled(QPrintDialog::PrintPageRange)) {
112 pd->nMinPage = pdlg->minPage();
113 pd->nMaxPage = pdlg->maxPage();
114 }
115
116 if(!pdlg->isOptionEnabled(QPrintDialog::PrintToFile))
117 pd->Flags |= PD_DISABLEPRINTTOFILE;
118
119 if (pdlg->printRange() == QPrintDialog::Selection)
120 pd->Flags |= PD_SELECTION;
121 else if (pdlg->printRange() == QPrintDialog::PageRange)
122 pd->Flags |= PD_PAGENUMS;
123 else
124 pd->Flags |= PD_ALLPAGES;
125
126 // As stated by MSDN, to enable collate option when minpage==maxpage==0
127 // set the PD_NOPAGENUMS flag
128 if (pd->nMinPage==0 && pd->nMaxPage==0)
129 pd->Flags |= PD_NOPAGENUMS;
130
131 // Disable Current Page option if not required as default is Enabled
132 if (!pdlg->isOptionEnabled(QPrintDialog::PrintCurrentPage))
133 pd->Flags |= PD_NOCURRENTPAGE;
134
135 // Default to showing the General tab first
136 pd->nStartPage = START_PAGE_GENERAL;
137
138 // We don't support more than one page range in the QPrinter API yet.
139 pd->nPageRanges = 1;
140 pd->nMaxPageRanges = 1;
141
142 if (d->ep->printToFile)
143 pd->Flags |= PD_PRINTTOFILE;
144 Q_ASSERT(parent);
145 pd->hwndOwner = parent->window()->winId();
146 pd->lpPageRanges[0].nFromPage = qMax(pdlg->fromPage(), pdlg->minPage());
147 pd->lpPageRanges[0].nToPage = (pdlg->toPage() > 0) ? qMin(pdlg->toPage(), pdlg->maxPage()) : 1;
148 pd->nCopies = d->ep->num_copies;
149}
150
151static void qt_win_read_back_PRINTDLGEX(PRINTDLGEX *pd, QPrintDialog *pdlg, QPrintDialogPrivate *d)
152{
153 if (pd->Flags & PD_SELECTION) {
154 pdlg->setPrintRange(QPrintDialog::Selection);
155 pdlg->setFromTo(0, 0);
156 } else if (pd->Flags & PD_PAGENUMS) {
157 pdlg->setPrintRange(QPrintDialog::PageRange);
158 pdlg->setFromTo(pd->lpPageRanges[0].nFromPage, pd->lpPageRanges[0].nToPage);
159 } else if (pd->Flags & PD_CURRENTPAGE) {
160 pdlg->setPrintRange(QPrintDialog::CurrentPage);
161 pdlg->setFromTo(0, 0);
162 } else { // PD_ALLPAGES
163 pdlg->setPrintRange(QPrintDialog::AllPages);
164 pdlg->setFromTo(0, 0);
165 }
166
167 d->ep->printToFile = (pd->Flags & PD_PRINTTOFILE) != 0;
168
169 d->ep->readDevnames(pd->hDevNames);
170 d->ep->readDevmode(pd->hDevMode);
171 d->ep->updateCustomPaperSize();
172
173 if (d->ep->printToFile && d->ep->fileName.isEmpty())
174 d->ep->fileName = d->ep->port;
175 else if (!d->ep->printToFile && d->ep->fileName == QLatin1String("FILE:"))
176 d->ep->fileName.clear();
177}
178
179static bool warnIfNotNative(QPrinter *printer)
180{
181 if (printer->outputFormat() != QPrinter::NativeFormat) {
182 qWarning("QPrintDialog: Cannot be used on non-native printers");
183 return false;
184 }
185 return true;
186}
187
188QPrintDialog::QPrintDialog(QPrinter *printer, QWidget *parent)
189 : QAbstractPrintDialog( *(new QPrintDialogPrivate), printer, parent)
190{
191 Q_D(QPrintDialog);
192 if (!warnIfNotNative(d->printer))
193 return;
194 d->ep = static_cast<QWin32PrintEngine *>(d->printer->paintEngine())->d_func();
195}
196
197QPrintDialog::QPrintDialog(QWidget *parent)
198 : QAbstractPrintDialog( *(new QPrintDialogPrivate), 0, parent)
199{