1 /****************************************************************************
2 **
3 ** Copyright (C) 2014 John Layt <jlayt@kde.org>
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of the QtPrintSupport module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or (at your option) the GNU General
28 ** Public license version 3 or any later version approved by the KDE Free
29 ** Qt Foundation. The licenses are as published by the Free Software
30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31 ** included in the packaging of this file. Please review the following
32 ** information to ensure the GNU General Public License requirements will
33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34 ** https://www.gnu.org/licenses/gpl-3.0.html.
35 **
36 ** $QT_END_LICENSE$
37 **
38 ****************************************************************************/
39
40 #include "qplatformprintdevice.h"
41
42 #include "qprintdevice_p.h"
43
44 #include <QtCore/qcoreapplication.h>
45 #include <QtGui/qpagelayout.h>
46
47 QT_BEGIN_NAMESPACE
48
49 #ifndef QT_NO_PRINTER
50
QPlatformPrintDevice(const QString & id)51 QPlatformPrintDevice::QPlatformPrintDevice(const QString &id)
52 : m_id(id),
53 m_isRemote(false),
54 m_supportsMultipleCopies(false),
55 m_supportsCollateCopies(false),
56 m_havePageSizes(false),
57 m_supportsCustomPageSizes(false),
58 m_haveResolutions(false),
59 m_haveInputSlots(false),
60 m_haveOutputBins(false),
61 m_haveDuplexModes(false),
62 m_haveColorModes(false)
63 #if QT_CONFIG(mimetype)
64 , m_haveMimeTypes(false)
65 #endif
66 {
67 }
68
~QPlatformPrintDevice()69 QPlatformPrintDevice::~QPlatformPrintDevice()
70 {
71 }
72
id() const73 QString QPlatformPrintDevice::id() const
74 {
75 return m_id;
76 }
77
name() const78 QString QPlatformPrintDevice::name() const
79 {
80 return m_name;
81 }
82
location() const83 QString QPlatformPrintDevice::location() const
84 {
85 return m_location;
86 }
87
makeAndModel() const88 QString QPlatformPrintDevice::makeAndModel() const
89 {
90 return m_makeAndModel;
91 }
92
isValid() const93 bool QPlatformPrintDevice::isValid() const
94 {
95 return false;
96 }
97
isDefault() const98 bool QPlatformPrintDevice::isDefault() const
99 {
100 return false;
101 }
102
isRemote() const103 bool QPlatformPrintDevice::isRemote() const
104 {
105 return m_isRemote;
106 }
107
isValidPageLayout(const QPageLayout & layout,int resolution) const108 bool QPlatformPrintDevice::isValidPageLayout(const QPageLayout &layout, int resolution) const
109 {
110 // Check the page size is supported
111 if (!supportedPageSize(layout.pageSize()).isValid())
112 return false;
113
114 // Check the margins are valid
115 QMarginsF pointMargins = layout.margins(QPageLayout::Point);
116 QMarginsF printMargins = printableMargins(layout.pageSize(), layout.orientation(), resolution);
117 return pointMargins.left() >= printMargins.left()
118 && pointMargins.right() >= printMargins.right()
119 && pointMargins.top() >= printMargins.top()
120 && pointMargins.bottom() >= printMargins.bottom();
121 }
122
state() const123 QPrint::DeviceState QPlatformPrintDevice::state() const
124 {
125 return QPrint::Error;
126 }
127
supportsMultipleCopies() const128 bool QPlatformPrintDevice::supportsMultipleCopies() const
129 {
130 return m_supportsMultipleCopies;
131 }
132
supportsCollateCopies() const133 bool QPlatformPrintDevice::supportsCollateCopies() const
134 {
135 return m_supportsCollateCopies;
136 }
137
loadPageSizes() const138 void QPlatformPrintDevice::loadPageSizes() const
139 {
140 }
141
defaultPageSize() const142 QPageSize QPlatformPrintDevice::defaultPageSize() const
143 {
144 return QPageSize();
145 }
146
supportedPageSizes() const147 QList<QPageSize> QPlatformPrintDevice::supportedPageSizes() const
148 {
149 if (!m_havePageSizes)
150 loadPageSizes();
151 return m_pageSizes;
152 }
153
supportedPageSize(const QPageSize & pageSize) const154 QPageSize QPlatformPrintDevice::supportedPageSize(const QPageSize &pageSize) const
155 {
156 if (!pageSize.isValid())
157 return QPageSize();
158
159 if (!m_havePageSizes)
160 loadPageSizes();
161
162 // First try match on name and id for case where printer defines same size twice with different names
163 // e.g. Windows defines DMPAPER_11X17 and DMPAPER_TABLOID with names "11x17" and "Tabloid", but both
164 // map to QPageSize::Tabloid / PPD Key "Tabloid" / ANSI B Tabloid
165 if (pageSize.id() != QPageSize::Custom) {
166 for (const QPageSize &ps : qAsConst(m_pageSizes)) {
167 if (ps.id() == pageSize.id() && ps.name() == pageSize.name())
168 return ps;
169 }
170 }
171
172 // Next try match on id only if not custom
173 if (pageSize.id() != QPageSize::Custom) {
174 for (const QPageSize &ps : qAsConst(m_pageSizes)) {
175 if (ps.id() == pageSize.id())
176 return ps;
177 }
178 }
179
180 // Next try a match on size, in case it's a custom with a different name
181 return supportedPageSizeMatch(pageSize);
182 }
183
supportedPageSize(QPageSize::PageSizeId pageSizeId) const184 QPageSize QPlatformPrintDevice::supportedPageSize(QPageSize::PageSizeId pageSizeId) const
185 {
186 if (!m_havePageSizes)
187 loadPageSizes();
188
189 for (const QPageSize &ps : qAsConst(m_pageSizes)) {
190 if (ps.id() == pageSizeId)
191 return ps;
192 }
193
194 // If no supported page size found, try use a custom size instead if supported
195 return supportedPageSizeMatch(QPageSize(pageSizeId));
196 }
197
supportedPageSize(const QString & pageName) const198 QPageSize QPlatformPrintDevice::supportedPageSize(const QString &pageName) const
199 {
200 if (!m_havePageSizes)
201 loadPageSizes();
202
203 for (const QPageSize &ps : qAsConst(m_pageSizes)) {
204 if (ps.name() == pageName)
205 return ps;
206 }
207
208 return QPageSize();
209 }
210
supportedPageSize(const QSize & sizePoints) const211 QPageSize QPlatformPrintDevice::supportedPageSize(const QSize &sizePoints) const
212 {
213 if (!m_havePageSizes)
214 loadPageSizes();
215
216 // Try to find a supported page size based on fuzzy-matched point size
217 return supportedPageSizeMatch(QPageSize(sizePoints));
218 }
219
supportedPageSize(const QSizeF & size,QPageSize::Unit units) const220 QPageSize QPlatformPrintDevice::supportedPageSize(const QSizeF &size, QPageSize::Unit units) const
221 {
222 if (!m_havePageSizes)
223 loadPageSizes();
224
225 // Try to find a supported page size based on fuzzy-matched unit size
226 return supportedPageSizeMatch(QPageSize(size, units));
227 }
228
supportedPageSizeMatch(const QPageSize & pageSize) const229 QPageSize QPlatformPrintDevice::supportedPageSizeMatch(const QPageSize &pageSize) const
230 {
231 // If it's a known page size, just return itself
232 if (m_pageSizes.contains(pageSize))
233 return pageSize;
234
235 // Try to find a supported page size based on point size
236 for (const QPageSize &ps : qAsConst(m_pageSizes)) {
237 if (ps.sizePoints() == pageSize.sizePoints())
238 return ps;
239 }
240 return QPageSize();
241 }
242
supportsCustomPageSizes() const243 bool QPlatformPrintDevice::supportsCustomPageSizes() const
244 {
245 return m_supportsCustomPageSizes;
246 }
247
minimumPhysicalPageSize() const248 QSize QPlatformPrintDevice::minimumPhysicalPageSize() const
249 {
250 return m_minimumPhysicalPageSize;
251 }
252
maximumPhysicalPageSize() const253 QSize QPlatformPrintDevice::maximumPhysicalPageSize() const
254 {
255 return m_maximumPhysicalPageSize;
256 }
257
printableMargins(const QPageSize & pageSize,QPageLayout::Orientation orientation,int resolution) const258 QMarginsF QPlatformPrintDevice::printableMargins(const QPageSize &pageSize,
259 QPageLayout::Orientation orientation,
260 int resolution) const
261 {
262 Q_UNUSED(pageSize)
263 Q_UNUSED(orientation)
264 Q_UNUSED(resolution)
265 return QMarginsF(0, 0, 0, 0);
266 }
267
loadResolutions() const268 void QPlatformPrintDevice::loadResolutions() const
269 {
270 }
271
defaultResolution() const272 int QPlatformPrintDevice::defaultResolution() const
273 {
274 return 0;
275 }
276
supportedResolutions() const277 QList<int> QPlatformPrintDevice::supportedResolutions() const
278 {
279 if (!m_haveResolutions)
280 loadResolutions();
281 return m_resolutions;
282 }
283
loadInputSlots() const284 void QPlatformPrintDevice::loadInputSlots() const
285 {
286 }
287
defaultInputSlot() const288 QPrint::InputSlot QPlatformPrintDevice::defaultInputSlot() const
289 {
290 QPrint::InputSlot input;
291 input.key = QByteArrayLiteral("Auto");
292 input.name = QCoreApplication::translate("Print Device Input Slot", "Automatic");
293 input.id = QPrint::Auto;
294 return input;
295 }
296
supportedInputSlots() const297 QVector<QPrint::InputSlot> QPlatformPrintDevice::supportedInputSlots() const
298 {
299 if (!m_haveInputSlots)
300 loadInputSlots();
301 return m_inputSlots;
302 }
303
loadOutputBins() const304 void QPlatformPrintDevice::loadOutputBins() const
305 {
306 }
307
defaultOutputBin() const308 QPrint::OutputBin QPlatformPrintDevice::defaultOutputBin() const
309 {
310 QPrint::OutputBin output;
311 output.key = QByteArrayLiteral("Auto");
312 output.name = QCoreApplication::translate("Print Device Output Bin", "Automatic");
313 output.id = QPrint::AutoOutputBin;
314 return output;
315 }
316
supportedOutputBins() const317 QVector<QPrint::OutputBin> QPlatformPrintDevice::supportedOutputBins() const
318 {
319 if (!m_haveOutputBins)
320 loadOutputBins();
321 return m_outputBins;
322 }
323
loadDuplexModes() const324 void QPlatformPrintDevice::loadDuplexModes() const
325 {
326 }
327
defaultDuplexMode() const328 QPrint::DuplexMode QPlatformPrintDevice::defaultDuplexMode() const
329 {
330 return QPrint::DuplexNone;
331 }
332
supportedDuplexModes() const333 QVector<QPrint::DuplexMode> QPlatformPrintDevice::supportedDuplexModes() const
334 {
335 if (!m_haveDuplexModes)
336 loadDuplexModes();
337 return m_duplexModes;
338 }
339
loadColorModes() const340 void QPlatformPrintDevice::loadColorModes() const
341 {
342 }
343
defaultColorMode() const344 QPrint::ColorMode QPlatformPrintDevice::defaultColorMode() const
345 {
346 return QPrint::GrayScale;
347 }
348
supportedColorModes() const349 QVector<QPrint::ColorMode> QPlatformPrintDevice::supportedColorModes() const
350 {
351 if (!m_haveColorModes)
352 loadColorModes();
353 return m_colorModes;
354 }
355
356 #if QT_CONFIG(mimetype)
loadMimeTypes() const357 void QPlatformPrintDevice::loadMimeTypes() const
358 {
359 }
360 #endif // mimetype
361
property(QPrintDevice::PrintDevicePropertyKey key) const362 QVariant QPlatformPrintDevice::property(QPrintDevice::PrintDevicePropertyKey key) const
363 {
364 Q_UNUSED(key)
365
366 return QVariant();
367 }
368
setProperty(QPrintDevice::PrintDevicePropertyKey key,const QVariant & value)369 bool QPlatformPrintDevice::setProperty(QPrintDevice::PrintDevicePropertyKey key, const QVariant &value)
370 {
371 Q_UNUSED(key)
372 Q_UNUSED(value)
373
374 return false;
375 }
376
isFeatureAvailable(QPrintDevice::PrintDevicePropertyKey key,const QVariant & params) const377 bool QPlatformPrintDevice::isFeatureAvailable(QPrintDevice::PrintDevicePropertyKey key, const QVariant ¶ms) const
378 {
379 Q_UNUSED(key)
380 Q_UNUSED(params)
381
382 return false;
383 }
384
385 #if QT_CONFIG(mimetype)
supportedMimeTypes() const386 QList<QMimeType> QPlatformPrintDevice::supportedMimeTypes() const
387 {
388 if (!m_haveMimeTypes)
389 loadMimeTypes();
390 return m_mimeTypes;
391 }
392 #endif // mimetype
393
createPageSize(const QString & key,const QSize & size,const QString & localizedName)394 QPageSize QPlatformPrintDevice::createPageSize(const QString &key, const QSize &size, const QString &localizedName)
395 {
396 return QPageSize(key, size, localizedName);
397 }
398
createPageSize(int windowsId,const QSize & size,const QString & localizedName)399 QPageSize QPlatformPrintDevice::createPageSize(int windowsId, const QSize &size, const QString &localizedName)
400 {
401 return QPageSize(windowsId, size, localizedName);
402 }
403
404 #endif // QT_NO_PRINTER
405
406 QT_END_NAMESPACE
407