diff --git a/src/printsupport/dialogs/qprintdialog_unix.cpp b/src/printsupport/dialogs/qprintdialog_unix.cpp index 961cfd9613..3b45410e6f 100644 --- a/src/printsupport/dialogs/qprintdialog_unix.cpp +++ b/src/printsupport/dialogs/qprintdialog_unix.cpp @@ -64,6 +64,7 @@ #if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) # include +# include "qcupsjobwidget_p.h" #else # include # include @@ -127,6 +128,9 @@ protected: private: Ui::QPrintPropertiesWidget widget; QDialogButtonBox *m_buttons; +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + QCupsJobWidget *m_jobOptions; +#endif }; class QUnixPrintWidgetPrivate; @@ -237,6 +241,13 @@ QPrintPropertiesDialog::QPrintPropertiesDialog(QAbstractPrintDialog *parent) connect(m_buttons->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(accept())); connect(m_buttons->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(reject())); + +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (QCUPSSupport::isAvailable()) { + m_jobOptions = new QCupsJobWidget(); + widget.tabs->addTab(m_jobOptions, tr("Job Options")); + } +#endif } QPrintPropertiesDialog::~QPrintPropertiesDialog() @@ -246,11 +257,21 @@ QPrintPropertiesDialog::~QPrintPropertiesDialog() void QPrintPropertiesDialog::applyPrinterProperties(QPrinter *p) { widget.pageSetup->setPrinter(p); +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (QCUPSSupport::isAvailable()) { + m_jobOptions->setPrinter(p); + } +#endif } void QPrintPropertiesDialog::setupPrinter() const { widget.pageSetup->setupPrinter(); +#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) + if (QCUPSSupport::isAvailable()) { + m_jobOptions->setupPrinter(); + } +#endif } void QPrintPropertiesDialog::selectPrinter() diff --git a/src/printsupport/kernel/qcups.cpp b/src/printsupport/kernel/qcups.cpp index 49a97e327c..332245cc21 100644 --- a/src/printsupport/kernel/qcups.cpp +++ b/src/printsupport/kernel/qcups.cpp @@ -342,6 +342,97 @@ QStringList QCUPSSupport::options() const return list; } +QStringList QCUPSSupport::cupsOptionsList(QPrinter *printer) +{ + return printer->printEngine()->property(PPK_CupsOptions).toStringList(); +} + +void QCUPSSupport::setCupsOptions(QPrinter *printer, const QStringList &cupsOptions) +{ + printer->printEngine()->setProperty(PPK_CupsOptions, QVariant(cupsOptions)); +} + +void QCUPSSupport::setCupsOption(QStringList &cupsOptions, const QString &option, const QString &value) +{ + if (cupsOptions.contains(option)) { + cupsOptions.replace(cupsOptions.indexOf(option) + 1, value); + } else { + cupsOptions.append(option); + cupsOptions.append(value); + } +} + +void QCUPSSupport::setJobHold(QPrinter *printer, const JobHoldUntil jobHold, const QTime &holdUntilTime) +{ + QStringList cupsOptions = cupsOptionsList(printer); + + switch (jobHold) { + case NoHold: //default + break; + case Indefinite: + setCupsOption(cupsOptions, + QStringLiteral("job-hold-until"), + QStringLiteral("indefinite")); + break; + case DayTime: + setCupsOption(cupsOptions, + QStringLiteral("job-hold-until"), + QStringLiteral("day-time")); + break; + case Night: + setCupsOption(cupsOptions, + QStringLiteral("job-hold-until"), + QStringLiteral("night")); + break; + case SecondShift: + setCupsOption(cupsOptions, + QStringLiteral("job-hold-until"), + QStringLiteral("second-shift")); + break; + case ThirdShift: + setCupsOption(cupsOptions, + QStringLiteral("job-hold-until"), + QStringLiteral("third-shift")); + break; + case Weekend: + setCupsOption(cupsOptions, + QStringLiteral("job-hold-until"), + QStringLiteral("weekend")); + break; + case SpecificTime: + if (holdUntilTime.isNull()) { + setJobHold(printer, NoHold); + return; + } + // CUPS expects the time in UTC, user has entered in local time, so get the UTS equivalent + QDateTime localDateTime = QDateTime::currentDateTime(); + // Check if time is for tomorrow in case of DST change overnight + if (holdUntilTime < localDateTime.time()) + localDateTime.addDays(1); + localDateTime.setTime(holdUntilTime); + setCupsOption(cupsOptions, + QStringLiteral("job-hold-until"), + localDateTime.toUTC().time().toString(QStringLiteral("HH:mm"))); + break; + } + + setCupsOptions(printer, cupsOptions); +} + +void QCUPSSupport::setJobBilling(QPrinter *printer, const QString &jobBilling) +{ + QStringList cupsOptions = cupsOptionsList(printer); + setCupsOption(cupsOptions, QStringLiteral("job-billing"), jobBilling); + setCupsOptions(printer, cupsOptions); +} + +void QCUPSSupport::setJobPriority(QPrinter *printer, int priority) +{ + QStringList cupsOptions = cupsOptionsList(printer); + setCupsOption(cupsOptions, QStringLiteral("job-priority"), QString::number(priority)); + setCupsOptions(printer, cupsOptions); +} + bool QCUPSSupport::printerHasPPD(const char *printerName) { if (!isAvailable()) @@ -511,7 +602,6 @@ QList > QCUPSSupport::getCupsPrinterPaperSizesWithNames(i return result; } - QT_END_NAMESPACE #endif // QT_NO_CUPS diff --git a/src/printsupport/kernel/qcups_p.h b/src/printsupport/kernel/qcups_p.h index 0828f582a3..58608ea1f1 100644 --- a/src/printsupport/kernel/qcups_p.h +++ b/src/printsupport/kernel/qcups_p.h @@ -56,6 +56,7 @@ #include "QtCore/qstringlist.h" #include "QtCore/qpair.h" #include "QtPrintSupport/qprinter.h" +#include "QtCore/qdatetime.h" #ifndef QT_NO_CUPS #include @@ -90,6 +91,18 @@ public: QCUPSSupport(); ~QCUPSSupport(); + // Enum for values of job-hold-until option + enum JobHoldUntil { + NoHold = 0, //CUPS Default + Indefinite, + DayTime, + Night, + SecondShift, + ThirdShift, + Weekend, + SpecificTime + }; + static bool isAvailable(); static int cupsVersion() { return isAvailable() ? CUPS_VERSION_MAJOR*10000+CUPS_VERSION_MINOR*100+CUPS_VERSION_PATCH : 0; } int availablePrintersCount() const; @@ -111,6 +124,14 @@ public: QStringList options() const; + static QStringList cupsOptionsList(QPrinter *printer); + static void setCupsOptions(QPrinter *printer, const QStringList &cupsOptions); + static void setCupsOption(QStringList &cupsOptions, const QString &option, const QString &value); + + static void setJobHold(QPrinter *printer, const JobHoldUntil jobHold = NoHold, const QTime &holdUntilTime = QTime()); + static void setJobBilling(QPrinter *printer, const QString &jobBilling = QString()); + static void setJobPriority(QPrinter *printer, int priority = 50); + static bool printerHasPPD(const char *printerName); QString unicodeString(const char *s); @@ -139,6 +160,8 @@ private: QT_END_NAMESPACE +Q_DECLARE_METATYPE(QCUPSSupport::JobHoldUntil) + #endif // QT_NO_CUPS #endif diff --git a/src/printsupport/widgets/qcupsjobwidget.cpp b/src/printsupport/widgets/qcupsjobwidget.cpp new file mode 100644 index 0000000000..28fb8e859b --- /dev/null +++ b/src/printsupport/widgets/qcupsjobwidget.cpp @@ -0,0 +1,171 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtPrintSupport module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, 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. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include "qcupsjobwidget_p.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +/*! + \internal + \class QCupsJobWidget + + A widget to add to QPrintDialog to enable extra CUPS options + such as Job Scheduling, Job Priority or Job Billing + \ingroup printing + \inmodule QtPrintSupport + */ + +QCupsJobWidget::QCupsJobWidget(QWidget *parent) + : QWidget(parent) +{ + m_ui.setupUi(this); + //set all the default values + //TODO restore last used values + initJobHold(); + initJobBilling(); + initJobPriority(); +} + +QCupsJobWidget::~QCupsJobWidget() +{ +} + +void QCupsJobWidget::setPrinter(QPrinter *printer) +{ + m_printer = printer; +} + +void QCupsJobWidget::setupPrinter() +{ + QCUPSSupport::setJobHold(m_printer, jobHold(), jobHoldTime()); + QCUPSSupport::setJobBilling(m_printer, jobBilling()); + QCUPSSupport::setJobPriority(m_printer, jobPriority()); +} + +void QCupsJobWidget::initJobHold() +{ + m_ui.jobHoldComboBox->addItem(tr("Print Immediately"), QVariant::fromValue(QCUPSSupport::NoHold)); + m_ui.jobHoldComboBox->addItem(tr("Hold Indefinitely"), QVariant::fromValue(QCUPSSupport::Indefinite)); + m_ui.jobHoldComboBox->addItem(tr("Day (06:00 to 17:59)"), QVariant::fromValue(QCUPSSupport::DayTime)); + m_ui.jobHoldComboBox->addItem(tr("Night (18:00 to 05:59)"), QVariant::fromValue(QCUPSSupport::Night)); + m_ui.jobHoldComboBox->addItem(tr("Second Shift (16:00 to 23:59)"), QVariant::fromValue(QCUPSSupport::SecondShift)); + m_ui.jobHoldComboBox->addItem(tr("Third Shift (00:00 to 07:59)"), QVariant::fromValue(QCUPSSupport::ThirdShift)); + m_ui.jobHoldComboBox->addItem(tr("Weekend (Saturday to Sunday)"), QVariant::fromValue(QCUPSSupport::Weekend)); + m_ui.jobHoldComboBox->addItem(tr("Specific Time"), QVariant::fromValue(QCUPSSupport::SpecificTime)); + + connect(m_ui.jobHoldComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(toggleJobHoldTime())); + + setJobHold(QCUPSSupport::NoHold, QTime()); + toggleJobHoldTime(); +} + +void QCupsJobWidget::setJobHold(QCUPSSupport::JobHoldUntil jobHold, const QTime &holdUntilTime) +{ + if (jobHold == QCUPSSupport::SpecificTime && holdUntilTime.isNull()) { + jobHold = QCUPSSupport::NoHold; + toggleJobHoldTime(); + } + m_ui.jobHoldComboBox->setCurrentIndex(m_ui.jobHoldComboBox->findData(QVariant::fromValue(jobHold))); + m_ui.jobHoldTimeEdit->setTime(holdUntilTime); +} + +QCUPSSupport::JobHoldUntil QCupsJobWidget::jobHold() const +{ + return m_ui.jobHoldComboBox->itemData(m_ui.jobHoldComboBox->currentIndex()).value(); +} + +void QCupsJobWidget::toggleJobHoldTime() +{ + if (jobHold() == QCUPSSupport::SpecificTime) + m_ui.jobHoldTimeEdit->setEnabled(true); + else + m_ui.jobHoldTimeEdit->setEnabled(false); +} + +QTime QCupsJobWidget::jobHoldTime() const +{ + return m_ui.jobHoldTimeEdit->time(); +} + +void QCupsJobWidget::initJobBilling() +{ + setJobBilling(QString()); +} + +void QCupsJobWidget::setJobBilling(const QString &jobBilling) +{ + m_ui.jobBillingLineEdit->insert(jobBilling); +} + +QString QCupsJobWidget::jobBilling() const +{ + return m_ui.jobBillingLineEdit->text(); +} + +void QCupsJobWidget::initJobPriority() +{ + setJobPriority(50); +} + +void QCupsJobWidget::setJobPriority(int jobPriority) +{ + m_ui.jobPrioritySpinBox->setValue(jobPriority); +} + +int QCupsJobWidget::jobPriority() const +{ + return m_ui.jobPrioritySpinBox->value(); +} + +QT_END_NAMESPACE diff --git a/src/printsupport/widgets/qcupsjobwidget.ui b/src/printsupport/widgets/qcupsjobwidget.ui new file mode 100644 index 0000000000..2c03ef843a --- /dev/null +++ b/src/printsupport/widgets/qcupsjobwidget.ui @@ -0,0 +1,108 @@ + + QCupsJobWidget + + + + 0 + 0 + 400 + 294 + + + + Job + + + + + + Job Control + + + + + + Scheduled printing: + + + + + + + + + + + + + Billing information: + + + + + + + + + + Job priority: + + + + + + + 100 + + + 50 + + + + + + + Qt::Horizontal + + + + 180 + 20 + + + + + + + + Qt::Vertical + + + + 20 + 35 + + + + + + + + + + + Qt::Vertical + + + + 20 + 13 + + + + + + + + + diff --git a/src/printsupport/widgets/qcupsjobwidget_p.h b/src/printsupport/widgets/qcupsjobwidget_p.h new file mode 100644 index 0000000000..b0f276b251 --- /dev/null +++ b/src/printsupport/widgets/qcupsjobwidget_p.h @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtPrintSupport module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** 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, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, 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. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#ifndef QCUPSJOBWIDGET_P_H +#define QCUPSJOBWIDGET_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// to version without notice, or even be removed. +// +// We mean it. +// +// + +#include +#include + +QT_BEGIN_NAMESPACE + +class QString; +class QTime; +class QPrinter; + +class QCupsJobWidget : public QWidget +{ + Q_OBJECT + +public: + explicit QCupsJobWidget(QWidget *parent = 0); + ~QCupsJobWidget(); + void setPrinter(QPrinter *printer); + void setupPrinter(); + +private Q_SLOTS: + void toggleJobHoldTime(); + +private: + + void setJobHold(QCUPSSupport::JobHoldUntil jobHold = QCUPSSupport::NoHold, const QTime &holdUntilTime = QTime()); + QCUPSSupport::JobHoldUntil jobHold() const; + QTime jobHoldTime() const; + + void setJobBilling(const QString &jobBilling = QString()); + QString jobBilling() const; + + void setJobPriority(int priority = 50); + int jobPriority() const; + + void initJobHold(); + void initJobBilling(); + void initJobPriority(); + + QPrinter *m_printer; + Ui::QCupsJobWidget m_ui; + + Q_DISABLE_COPY(QCupsJobWidget) +}; + +QT_END_NAMESPACE + +#endif // QCUPSJOBWIDGET_P_H diff --git a/src/printsupport/widgets/widgets.pri b/src/printsupport/widgets/widgets.pri index 40eb306623..8e5cb12a6d 100644 --- a/src/printsupport/widgets/widgets.pri +++ b/src/printsupport/widgets/widgets.pri @@ -1,2 +1,11 @@ HEADERS += widgets/qprintpreviewwidget.h SOURCES += widgets/qprintpreviewwidget.cpp + +unix:!mac:contains(QT_CONFIG, cups): { + HEADERS += widgets/qcupsjobwidget_p.h + SOURCES += widgets/qcupsjobwidget.cpp + FORMS += widgets/qcupsjobwidget.ui + + INCLUDEPATH += $$PWD +} +