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
47QT_BEGIN_NAMESPACE
48
49#ifndef QT_NO_PRINTER
50
51QPlatformPrintDevice::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
69QPlatformPrintDevice::~QPlatformPrintDevice()
70{
71}
72
73QString QPlatformPrintDevice::id() const
74{
75 return m_id;
76}
77
78QString QPlatformPrintDevice::name() const
79{
80 return m_name;
81}
82
83QString QPlatformPrintDevice::location() const
84{
85 return m_location;
86}
87
88QString QPlatformPrintDevice::makeAndModel() const
89{
90 return m_makeAndModel;
91}
92
93bool QPlatformPrintDevice::isValid() const
94{
95 return false;
96}
97
98bool QPlatformPrintDevice::isDefault() const
99{
100 return false;
101}
102
103bool QPlatformPrintDevice::isRemote() const
104{
105 return m_isRemote;
106}
107
108bool 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
123QPrint::DeviceState QPlatformPrintDevice::state() const
124{
125 return QPrint::Error;
126}
127
128bool QPlatformPrintDevice::supportsMultipleCopies() const
129{
130 return m_supportsMultipleCopies;
131}
132
133bool QPlatformPrintDevice::supportsCollateCopies() const
134{
135 return m_supportsCollateCopies;
136}
137
138void QPlatformPrintDevice::loadPageSizes() const
139{
140}
141
142QPageSize QPlatformPrintDevice::defaultPageSize() const
143{
144 return QPageSize();
145}
146
147QList<QPageSize> QPlatformPrintDevice::supportedPageSizes() const
148{
149 if (!m_havePageSizes)
150 loadPageSizes();
151 return m_pageSizes;
152}
153
154QPageSize 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
184QPageSize 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
198QPageSize 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
211QPageSize 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
220QPageSize 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
229QPageSize 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
243bool QPlatformPrintDevice::supportsCustomPageSizes() const
244{
245 return m_supportsCustomPageSizes;
246}
247
248QSize QPlatformPrintDevice::minimumPhysicalPageSize() const
249{
250 return m_minimumPhysicalPageSize;
251}
252
253QSize QPlatformPrintDevice::maximumPhysicalPageSize() const
254{
255 return m_maximumPhysicalPageSize;
256}
257
258QMarginsF 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
268void QPlatformPrintDevice::loadResolutions() const
269{
270}
271
272int QPlatformPrintDevice::defaultResolution() const
273{
274 return 0;
275}
276
277QList<int> QPlatformPrintDevice::supportedResolutions() const
278{
279 if (!m_haveResolutions)
280 loadResolutions();
281 return m_resolutions;
282}
283
284void QPlatformPrintDevice::loadInputSlots() const
285{
286}
287
288QPrint::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
297QList<QPrint::InputSlot> QPlatformPrintDevice::supportedInputSlots() const
298{
299 if (!m_haveInputSlots)
300 loadInputSlots();
301 return m_inputSlots;
302}
303
304void QPlatformPrintDevice::loadOutputBins() const
305{
306}
307
308QPrint::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
317QList<QPrint::OutputBin> QPlatformPrintDevice::supportedOutputBins() const
318{
319 if (!m_haveOutputBins)
320 loadOutputBins();
321 return m_outputBins;
322}
323
324void QPlatformPrintDevice::loadDuplexModes() const
325{
326}
327
328QPrint::DuplexMode QPlatformPrintDevice::defaultDuplexMode() const
329{
330 return QPrint::DuplexNone;
331}
332
333QList<QPrint::DuplexMode> QPlatformPrintDevice::supportedDuplexModes() const
334{
335 if (!m_haveDuplexModes)
336 loadDuplexModes();
337 return m_duplexModes;
338}
339
340void QPlatformPrintDevice::loadColorModes() const
341{
342}
343
344QPrint::ColorMode QPlatformPrintDevice::defaultColorMode() const
345{
346 return QPrint::GrayScale;
347}
348
349QList<QPrint::ColorMode> QPlatformPrintDevice::supportedColorModes() const
350{
351 if (!m_haveColorModes)
352 loadColorModes();
353 return m_colorModes;
354}
355
356#if QT_CONFIG(mimetype)
357void QPlatformPrintDevice::loadMimeTypes() const
358{
359}
360#endif // mimetype
361
362QVariant QPlatformPrintDevice::property(QPrintDevice::PrintDevicePropertyKey key) const
363{
364 Q_UNUSED(key);
365
366 return QVariant();
367}
368
369bool QPlatformPrintDevice::setProperty(QPrintDevice::PrintDevicePropertyKey key, const QVariant &value)
370{
371 Q_UNUSED(key);
372 Q_UNUSED(value);
373
374 return false;
375}
376
377bool QPlatformPrintDevice::isFeatureAvailable(QPrintDevice::PrintDevicePropertyKey key, const QVariant &params) const
378{
379 Q_UNUSED(key);
380 Q_UNUSED(params);
381
382 return false;
383}
384
385#if QT_CONFIG(mimetype)
386QList<QMimeType> QPlatformPrintDevice::supportedMimeTypes() const
387{
388 if (!m_haveMimeTypes)
389 loadMimeTypes();
390 return m_mimeTypes;
391}
392#endif // mimetype
393
394QPageSize QPlatformPrintDevice::createPageSize(const QString &key, const QSize &size, const QString &localizedName)
395{
396 return QPageSize(key, size, localizedName);
397}
398
399QPageSize 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
406QT_END_NAMESPACE
407