QPrintEngine - Fix PPK_CollateCopies

Mac supports Collate Copies using native api, so add support.  Note
this is mostly only useful for setting the print dialog default, as
Mac supports server-side multiple copies so the app will never need to
collate the copies itself.

Change PDF and Windows to default to collate true to match Mac as this
is the behavior users expect.

Task-number: QTBUG-27724
Task-number: QTBUG-35251
Task-number: QTBUG-22144

Change-Id: Ia43dbc260b3a71aa5b267cca54c168ffbea794fc
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
bb10
John Layt 2013-11-29 19:13:49 +01:00 committed by The Qt Project
parent 27473f19bb
commit 0ee72b09fd
5 changed files with 30 additions and 30 deletions

View File

@ -607,9 +607,6 @@ void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va
// The following keys are settings that are unsupported by the Mac PrintEngine
case PPK_ColorMode:
break;
case PPK_CollateCopies:
// TODO Add support using PMSetCollate / PMGetCollate
break;
case PPK_Creator:
// TODO Add value preservation support by using local variable
break;
@ -662,6 +659,9 @@ void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va
PMSessionValidatePageFormat(d->session(), d->format(), kPMDontWantBoolean);
break;
}
case PPK_CollateCopies:
PMSetCollate(d->settings(), value.toBool());
break;
case PPK_DocumentName:
PMPrintSettingsSetJobName(d->settings(), QCFString(value.toString()));
break;
@ -756,10 +756,6 @@ QVariant QMacPrintEngine::property(PrintEnginePropertyKey key) const
// The following keys are settings that are unsupported by the Mac PrintEngine
// Return sensible default values to ensure consistent behavior across platforms
case PPK_CollateCopies:
// TODO Add support using PMSetCollate / PMGetCollate
ret = false;
break;
case PPK_ColorMode:
ret = QPrinter::Color;
break;
@ -802,6 +798,12 @@ QVariant QMacPrintEngine::property(PrintEnginePropertyKey key) const
break;
// The following keys are properties and settings that are supported by the Mac PrintEngine
case PPK_CollateCopies: {
Boolean status;
PMGetCollate(d->settings(), &status);
ret = bool(status);
break;
}
case PPK_DocumentName: {
CFStringRef name;
PMPrintSettingsGetJobName(d->settings(), &name);

View File

@ -221,7 +221,7 @@ void QCupsPrintEnginePrivate::closePrintDevice()
if (copies > 1)
options.append(QPair<QByteArray, QByteArray>("copies", QString::number(copies).toLocal8Bit()));
if (collate)
if (copies > 1 && collate)
options.append(QPair<QByteArray, QByteArray>("Collate", "True"));
switch (duplex) {

View File

@ -386,7 +386,7 @@ void QPdfPrintEnginePrivate::closePrintDevice()
QPdfPrintEnginePrivate::QPdfPrintEnginePrivate(QPrinter::PrinterMode m)
: QPdfEnginePrivate(),
duplex(QPrinter::DuplexNone),
collate(false),
collate(true),
copies(1),
pageOrder(QPrinter::FirstPageFirst),
paperSource(QPrinter::Auto),

View File

@ -1098,6 +1098,7 @@ void QWin32PrintEnginePrivate::initialize()
if (devMode) {
num_copies = devMode->dmCopies;
devMode->dmCollate = DMCOLLATE_TRUE;
}
initHDC();
@ -1504,10 +1505,6 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const
// The following keys are settings that are unsupported by the Windows PrintEngine
// Return sensible default values to ensure consistent behavior across platforms
case PPK_CollateCopies:
// TODO Add support using DEVMODE.dmCollate to match setting
value = false;
break;
case PPK_Creator:
value = QString();
break;
@ -1529,6 +1526,10 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const
break;
// The following keys are properties and settings that are supported by the Windows PrintEngine
case PPK_CollateCopies:
value = d->devMode->dmCollate == DMCOLLATE_TRUE;
break;
case PPK_ColorMode:
{
if (!d->devMode) {

View File

@ -890,21 +890,21 @@ void tst_QPrinter::testMultipleKeys()
QCOMPARE(native.fullPage(), false);
QCOMPARE(native.orientation(), QPrinter::Portrait);
QCOMPARE(native.copyCount(), 1);
QCOMPARE(native.collateCopies(), false);
QCOMPARE(native.collateCopies(), true);
QCOMPARE(native.printRange(), QPrinter::AllPages);
// Change values
native.setFullPage(true);
native.setOrientation(QPrinter::Landscape);
native.setCopyCount(9);
native.setCollateCopies(true);
native.setCollateCopies(false);
native.setPrintRange(QPrinter::CurrentPage);
// Check changed values
QCOMPARE(native.fullPage(), true);
QCOMPARE(native.orientation(), QPrinter::Landscape);
QCOMPARE(native.copyCount(), 9);
QCOMPARE(native.collateCopies(), true);
QCOMPARE(native.collateCopies(), false);
QCOMPARE(native.printRange(), QPrinter::CurrentPage);
// Test value preservation
@ -912,21 +912,21 @@ void tst_QPrinter::testMultipleKeys()
QCOMPARE(native.fullPage(), true);
QCOMPARE(native.orientation(), QPrinter::Landscape);
QCOMPARE(native.copyCount(), 9);
QCOMPARE(native.collateCopies(), true);
QCOMPARE(native.collateCopies(), false);
QCOMPARE(native.printRange(), QPrinter::CurrentPage);
// Change values
native.setFullPage(false);
native.setOrientation(QPrinter::Portrait);
native.setCopyCount(5);
native.setCollateCopies(false);
native.setCollateCopies(true);
native.setPrintRange(QPrinter::PageRange);
// Check changed values
QCOMPARE(native.fullPage(), false);
QCOMPARE(native.orientation(), QPrinter::Portrait);
QCOMPARE(native.copyCount(), 5);
QCOMPARE(native.collateCopies(), false);
QCOMPARE(native.collateCopies(), true);
QCOMPARE(native.printRange(), QPrinter::PageRange);
} else {
QSKIP("No printers installed, cannot test NativeFormat, please install printers to test");
@ -936,28 +936,25 @@ void tst_QPrinter::testMultipleKeys()
void tst_QPrinter::collateCopies()
{
// collateCopies() / setCollateCopies() / PPK_ColorMode
// PdfFormat: Supported, default false
// NativeFormat, Cups: Supported, default false
// NativeFormat, Win: Part Supported if valid DevMode, can set but always returns false
// NativeFormat, Mac: Unsupported, always false
// PdfFormat: Supported, default true
// NativeFormat, Cups: Supported, default true
// NativeFormat, Win: Supported, default true
// NativeFormat, Mac: Supported, default true
QPrinter pdf;
pdf.setOutputFormat(QPrinter::PdfFormat);
QCOMPARE(pdf.collateCopies(), false);
pdf.setCollateCopies(true);
QCOMPARE(pdf.collateCopies(), true);
pdf.setCollateCopies(false);
QCOMPARE(pdf.collateCopies(), false);
QPrinter native;
if (native.outputFormat() == QPrinter::NativeFormat) {
// Test default
QCOMPARE(native.collateCopies(), false);
QCOMPARE(native.collateCopies(), true);
// Test set/get
bool expected = true;
bool expected = false;
native.setCollateCopies(expected);
#if defined Q_OS_MAC || defined Q_OS_WIN
expected = false;
#endif // Q_OS_MAC
QCOMPARE(native.collateCopies(), expected);
// Test value preservation