diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2009-03-23 09:18:55 (GMT) |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2009-03-23 09:18:55 (GMT) |
commit | e5fcad302d86d316390c6b0f62759a067313e8a9 (patch) | |
tree | c2afbf6f1066b6ce261f14341cf6d310e5595bc1 /src/gui/dialogs/qprintdialog_qws.cpp | |
download | Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.zip Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.gz Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.bz2 |
Long live Qt 4.5!
Diffstat (limited to 'src/gui/dialogs/qprintdialog_qws.cpp')
-rw-r--r-- | src/gui/dialogs/qprintdialog_qws.cpp | 556 |
1 files changed, 556 insertions, 0 deletions
diff --git a/src/gui/dialogs/qprintdialog_qws.cpp b/src/gui/dialogs/qprintdialog_qws.cpp new file mode 100644 index 0000000..70eeffa --- /dev/null +++ b/src/gui/dialogs/qprintdialog_qws.cpp @@ -0,0 +1,556 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** 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, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qplatformdefs.h" + +#include <private/qabstractprintdialog_p.h> +#include "qprintdialog.h" + +#ifndef QT_NO_PRINTDIALOG + +#include "qapplication.h" +#include "qbuttongroup.h" +#include "qradiobutton.h" +#include "qcombobox.h" +#include "qspinbox.h" +#include "qprinter.h" +#include "qlineedit.h" +#include "qdir.h" +#include "qmessagebox.h" +#include "qinputdialog.h" +#include "qlayout.h" +#include "qlabel.h" + +#include "qlibrary.h" + +#ifndef QT_NO_NIS + +#ifndef BOOL_DEFINED +#define BOOL_DEFINED +#endif + +#include <rpcsvc/ypclnt.h> +#include <rpcsvc/yp_prot.h> + +#endif //QT_NO_NIS + +#include <ctype.h> +#include <stdlib.h> + +#include <qdebug.h> + +QT_BEGIN_NAMESPACE + +typedef void (*QPrintDialogCreator)(QPrintDialog *parent); +Q_GUI_EXPORT QPrintDialogCreator _qt_print_dialog_creator; + +class QPrintDialogPrivate : public QAbstractPrintDialogPrivate +{ + Q_DECLARE_PUBLIC(QPrintDialog) +public: + QButtonGroup *printerOrFile; + bool outputToFile; + QRadioButton *printToPrinterButton; + QRadioButton *printToFileButton; + QLineEdit *fileName; + + QButtonGroup *colorMode; + QRadioButton *printColor; + QRadioButton *printGray; + QPrinter::ColorMode colorMode2; + + QComboBox *orientationCombo, *sizeCombo; + QPrinter::PaperSize pageSize; + QPrinter::Orientation orientation; + + QSpinBox *copies; + int numCopies; + QPrinter::PaperSize indexToPaperSize[QPrinter::NPaperSize]; + + QComboBox *rangeCombo; + QSpinBox *firstPage; + QSpinBox *lastPage; + + QComboBox *pageOrderCombo; + QPrinter::PageOrder pageOrder2; + + QString faxNum; + + void init(); + + void _q_okClicked(); + void _q_printerOrFileSelected(QAbstractButton *b); + void _q_paperSizeSelected(int); + void _q_orientSelected(int); + void _q_pageOrderSelected(int); + void _q_colorModeSelected(QAbstractButton *); + void _q_setNumCopies(int); + void _q_printRangeSelected(int); + void _q_setFirstPage(int); + void _q_setLastPage(int); + void _q_fileNameEditChanged(const QString &text); + + void setupDestination(); + void setupPrinterSettings(); + void setupPaper(); + void setupOptions(); + + void setPrinter(QPrinter *p, bool pickUpSettings); +}; + +static void isc(QPrintDialogPrivate *d, const QString & text, + QPrinter::PaperSize ps); + +void QPrintDialogPrivate::_q_okClicked() +{ + Q_Q(QPrintDialog); +#ifndef QT_NO_MESSAGEBOX + if (outputToFile && fileName->isModified() && QFileInfo(fileName->text()).exists()) { + int confirm = QMessageBox::warning( + q, QPrintDialog::tr("File exists"), + QPrintDialog::tr("<qt>Do you want to overwrite it?</qt>"), + QMessageBox::Yes, QMessageBox::No); + if (confirm == QMessageBox::No) + return; + } +#endif // QT_NO_MESSAGEBOX + + lastPage->interpretText(); + firstPage->interpretText(); + copies->interpretText(); + if (outputToFile) { + printer->setOutputFileName(fileName->text()); + } + printer->setOrientation(orientation); + printer->setPaperSize(pageSize); + printer->setPageOrder(pageOrder2); + printer->setColorMode(colorMode2); + printer->setNumCopies(numCopies); + + switch ((rangeCombo->itemData(rangeCombo->currentIndex())).toInt()){ + case (int)QPrintDialog::AllPages: + q->setPrintRange(QPrintDialog::AllPages); + q->setFromTo(0, 0); + break; + case (int)QPrintDialog::Selection: + q->setPrintRange(QPrintDialog::Selection); + q->setFromTo(0, 0); + break; + case (int)QPrintDialog::PageRange: + q->setPrintRange(QPrintDialog::PageRange); + q->setFromTo(firstPage->value(), lastPage->value()); + break; + } + q->accept(); +} + +void QPrintDialogPrivate::_q_printerOrFileSelected(QAbstractButton *b) +{ + outputToFile = (b == printToFileButton); + if (outputToFile) { + _q_fileNameEditChanged(fileName->text()); + if (!fileName->isModified() && fileName->text().isEmpty()) { + QString file = "print.tiff"; + fileName->setText(file); + fileName->setCursorPosition(file.length()); + fileName->selectAll(); + fileName->setModified(true); // confirm overwrite when OK clicked + + } + fileName->setEnabled(true); + fileName->setFocus(); + } else { + fileName->setText(QString()); + if (fileName->isEnabled()) + fileName->setEnabled(false); + } +} + +void QPrintDialogPrivate::_q_paperSizeSelected(int id) +{ + if (id < QPrinter::NPaperSize) + pageSize = QPrinter::PaperSize(indexToPaperSize[id]); +} + +void QPrintDialogPrivate::_q_orientSelected(int id) +{ + orientation = (QPrinter::Orientation)id; +} + +void QPrintDialogPrivate::_q_pageOrderSelected(int id) +{ + pageOrder2 = (QPrinter::PageOrder)id; +} + +void QPrintDialogPrivate::_q_colorModeSelected(QAbstractButton *b) +{ + colorMode2 = (b == printColor) ? QPrinter::Color : QPrinter::GrayScale; +} + +void QPrintDialogPrivate::_q_setNumCopies(int copies) +{ + numCopies = copies; +} + +void QPrintDialogPrivate::_q_printRangeSelected(int id) +{ + bool enable = (rangeCombo->itemData(id).toInt() == (int)QPrintDialog::PageRange); + firstPage->setEnabled(enable); + lastPage->setEnabled(enable); +} + +void QPrintDialogPrivate::_q_setFirstPage(int fp) +{ + Q_Q(QPrintDialog); + if (printer) { + lastPage->setMinimum(fp); + lastPage->setMaximum(qMax(fp, q->maxPage())); + } +} + +void QPrintDialogPrivate::_q_setLastPage(int lp) +{ + Q_Q(QPrintDialog); + if (printer) { + firstPage->setMinimum(qMin(lp, q->minPage())); + firstPage->setMaximum(lp); + } +} + +void QPrintDialogPrivate::_q_fileNameEditChanged(const QString &text) +{ + Q_UNUSED(text); +} + +void QPrintDialogPrivate::setupDestination() +{ + Q_Q(QPrintDialog); + + // print destinations + printerOrFile = new QButtonGroup(q); + QObject::connect(printerOrFile, SIGNAL(buttonClicked(QAbstractButton *)), + q, SLOT(_q_printerOrFileSelected(QAbstractButton *))); + + printToPrinterButton = q->findChild<QRadioButton *>("printToPrinterButton"); + printerOrFile->addButton(printToPrinterButton); + printToFileButton = q->findChild<QRadioButton *>("printToFileButton"); + printerOrFile->addButton(printToFileButton); + + // file name + fileName = q->findChild<QLineEdit *>("fileName"); + QObject::connect(fileName, SIGNAL(textChanged(QString)), + q, SLOT(_q_fileNameEditChanged(QString))); + + outputToFile = false; +} + +void QPrintDialogPrivate::setupPrinterSettings() +{ + Q_Q(QPrintDialog); + + // color mode + colorMode = new QButtonGroup(q); + QObject::connect(colorMode, SIGNAL(buttonClicked(QAbstractButton *)), + q, SLOT(_q_colorModeSelected(QAbstractButton *))); + + printColor = q->findChild<QRadioButton *>("printColor"); + colorMode->addButton(printColor); + printGray = q->findChild<QRadioButton *>("printGray"); + colorMode->addButton(printGray); +} + +void isc(QPrintDialogPrivate *ptr, const QString & text, QPrinter::PaperSize ps) +{ + if (ptr && !text.isEmpty() && ps < QPrinter::NPaperSize) { + ptr->sizeCombo->addItem(text); + int index = ptr->sizeCombo->count()-1; + if (index >= 0 && index < QPrinter::NPaperSize) + ptr->indexToPaperSize[index] = ps; + } +} + +void QPrintDialogPrivate::setupPaper() +{ + Q_Q(QPrintDialog); + + pageSize = QPrinter::A4; + + // paper orientation + orientationCombo = q->findChild<QComboBox *>("orientationCombo"); + orientation = QPrinter::Portrait; + QObject::connect(orientationCombo, SIGNAL(activated(int)), + q, SLOT(_q_orientSelected(int))); + + // paper size + sizeCombo = q->findChild<QComboBox *>("sizeCombo"); + + int n; + for(n=0; n<QPrinter::NPaperSize; n++) + indexToPaperSize[n] = QPrinter::A4; + + isc(this, QPrintDialog::tr("A0 (841 x 1189 mm)"), QPrinter::A0); + isc(this, QPrintDialog::tr("A1 (594 x 841 mm)"), QPrinter::A1); + isc(this, QPrintDialog::tr("A2 (420 x 594 mm)"), QPrinter::A2); + isc(this, QPrintDialog::tr("A3 (297 x 420 mm)"), QPrinter::A3); + isc(this, QPrintDialog::tr("A4 (210 x 297 mm, 8.26 x 11.7 inches)"), QPrinter::A4); + isc(this, QPrintDialog::tr("A5 (148 x 210 mm)"), QPrinter::A5); + isc(this, QPrintDialog::tr("A6 (105 x 148 mm)"), QPrinter::A6); + isc(this, QPrintDialog::tr("A7 (74 x 105 mm)"), QPrinter::A7); + isc(this, QPrintDialog::tr("A8 (52 x 74 mm)"), QPrinter::A8); + isc(this, QPrintDialog::tr("A9 (37 x 52 mm)"), QPrinter::A9); + isc(this, QPrintDialog::tr("B0 (1000 x 1414 mm)"), QPrinter::B0); + isc(this, QPrintDialog::tr("B1 (707 x 1000 mm)"), QPrinter::B1); + isc(this, QPrintDialog::tr("B2 (500 x 707 mm)"), QPrinter::B2); + isc(this, QPrintDialog::tr("B3 (353 x 500 mm)"), QPrinter::B3); + isc(this, QPrintDialog::tr("B4 (250 x 353 mm)"), QPrinter::B4); + isc(this, QPrintDialog::tr("B5 (176 x 250 mm, 6.93 x 9.84 inches)"), QPrinter::B5); + isc(this, QPrintDialog::tr("B6 (125 x 176 mm)"), QPrinter::B6); + isc(this, QPrintDialog::tr("B7 (88 x 125 mm)"), QPrinter::B7); + isc(this, QPrintDialog::tr("B8 (62 x 88 mm)"), QPrinter::B8); + isc(this, QPrintDialog::tr("B9 (44 x 62 mm)"), QPrinter::B9); + isc(this, QPrintDialog::tr("B10 (31 x 44 mm)"), QPrinter::B10); + isc(this, QPrintDialog::tr("C5E (163 x 229 mm)"), QPrinter::C5E); + isc(this, QPrintDialog::tr("DLE (110 x 220 mm)"), QPrinter::DLE); + isc(this, QPrintDialog::tr("Executive (7.5 x 10 inches, 191 x 254 mm)"), QPrinter::Executive); + isc(this, QPrintDialog::tr("Folio (210 x 330 mm)"), QPrinter::Folio); + isc(this, QPrintDialog::tr("Ledger (432 x 279 mm)"), QPrinter::Ledger); + isc(this, QPrintDialog::tr("Legal (8.5 x 14 inches, 216 x 356 mm)"), QPrinter::Legal); + isc(this, QPrintDialog::tr("Letter (8.5 x 11 inches, 216 x 279 mm)"), QPrinter::Letter); + isc(this, QPrintDialog::tr("Tabloid (279 x 432 mm)"), QPrinter::Tabloid); + isc(this, QPrintDialog::tr("US Common #10 Envelope (105 x 241 mm)"), QPrinter::Comm10E); + + QObject::connect(sizeCombo, SIGNAL(activated(int)), + q, SLOT(_q_paperSizeSelected(int))); +} + +void QPrintDialogPrivate::setupOptions() +{ + Q_Q(QPrintDialog); + + // no. of copies + copies = q->findChild<QSpinBox *>("copies"); + QObject::connect(copies, SIGNAL(valueChanged(int)), + q, SLOT(_q_setNumCopies(int))); + + // print range + rangeCombo = q->findChild<QComboBox *>("rangeCombo"); + rangeCombo->addItem(QPrintDialog::tr("Print all"), QPrintDialog::AllPages); + rangeCombo->addItem(QPrintDialog::tr("Print selection"), QPrintDialog::Selection); + rangeCombo->addItem(QPrintDialog::tr("Print range"), QPrintDialog::PageRange); + QObject::connect(rangeCombo, SIGNAL(activated(int)), + q, SLOT(_q_printRangeSelected(int))); + + // page range + firstPage = q->findChild<QSpinBox *>("firstPage"); + firstPage->setRange(1, 9999); + firstPage->setValue(1); + QObject::connect(firstPage, SIGNAL(valueChanged(int)), + q, SLOT(_q_setFirstPage(int))); + + lastPage = q->findChild<QSpinBox *>("lastPage"); + lastPage->setRange(1, 9999); + lastPage->setValue(1); + QObject::connect(lastPage, SIGNAL(valueChanged(int)), + q, SLOT(_q_setLastPage(int))); + + // print order + pageOrderCombo = q->findChild<QComboBox *>("pageOrderCombo"); + QObject::connect(pageOrderCombo, SIGNAL(activated(int)), + q, SLOT(_q_pageOrderSelected(int))); +} + +bool QPrintDialog::eventFilter(QObject *o, QEvent *e) +{ + Q_UNUSED(o); + + Q_D(QPrintDialog); + switch (e->type()){ + case QEvent::KeyPress: + switch (static_cast<QKeyEvent*>(e)->key()) { + case Qt::Key_Back: + d->_q_okClicked(); + return true; + } + break; + default: + break; + } + return false; +} + +QPrintDialog::QPrintDialog(QPrinter *printer, QWidget *parent) + : QAbstractPrintDialog(*(new QPrintDialogPrivate), printer, parent) +{ + d_func()->init(); +} + +QPrintDialog::QPrintDialog(QWidget *parent) + : QAbstractPrintDialog(*(new QPrintDialogPrivate), 0, parent) +{ + d_func()->init(); +} + +QPrintDialog::~QPrintDialog() +{ +} + +void QPrintDialogPrivate::setPrinter(QPrinter *p, bool pickUpSettings) +{ + Q_Q(QPrintDialog); + printer = p; + + if (p && pickUpSettings) { + // top to bottom in the old dialog. + // printer or file + outputToFile = !p->outputFileName().isEmpty() && q->isOptionEnabled(QPrintDialog::PrintToFile); + if (outputToFile) + printToFileButton->setChecked(true); + else + printToPrinterButton->setChecked(true); + fileName->setEnabled(outputToFile); + + // file name + if (q->isOptionEnabled(QPrintDialog::PrintToFile)) { + fileName->setText(p->outputFileName()); + fileName->setModified(!fileName->text().isEmpty()); + } else { + printToFileButton->setEnabled(false); + } + + // orientation + orientationCombo->setCurrentIndex((int)p->orientation()); + _q_orientSelected(p->orientation()); + + // page size + int n = 0; + while (n < QPrinter::NPaperSize && + indexToPaperSize[n] != p->pageSize()) + n++; + sizeCombo->setCurrentIndex(n); + _q_paperSizeSelected(n); + + // page order + pageOrder2 = p->pageOrder(); + pageOrderCombo->setCurrentIndex((int)pageOrder2); + + // color mode + colorMode2 = p->colorMode(); + if (colorMode2 == QPrinter::Color) + printColor->setChecked(true); + else + printGray->setChecked(true); + + // number of copies + copies->setValue(p->numCopies()); + _q_setNumCopies(p->numCopies()); + } + + if (p) { + if (!q->isOptionEnabled(QPrintDialog::PrintSelection) + && rangeCombo->findData(QPrintDialog::Selection) > 0) + rangeCombo->removeItem(rangeCombo->findData(QPrintDialog::Selection)); + if (!q->isOptionEnabled(QPrintDialog::PrintPageRange) + && rangeCombo->findData(QPrintDialog::PageRange) > 0) + rangeCombo->removeItem(rangeCombo->findData(QPrintDialog::PageRange)); + + switch (q->printRange()) { + case QPrintDialog::AllPages: + rangeCombo->setCurrentIndex((int)(QPrintDialog::AllPages)); + break; + case QPrintDialog::Selection: + rangeCombo->setCurrentIndex((int)(QPrintDialog::Selection)); + break; + case QPrintDialog::PageRange: + rangeCombo->setCurrentIndex((int)(QPrintDialog::PageRange)); + break; + } + } + + if (p && q->maxPage()) { + int from = q->minPage(); + int to = q->maxPage(); + if (q->printRange() == QPrintDialog::PageRange) { + from = q->fromPage(); + to = q->toPage(); + } + firstPage->setRange(q->minPage(), to); + lastPage->setRange(from, q->maxPage()); + firstPage->setValue(from); + lastPage->setValue(to); + } +} + +int QPrintDialog::exec() +{ + Q_D(QPrintDialog); + d->setPrinter(d->printer, true); + return QDialog::exec(); +} + +void QPrintDialogPrivate::init() +{ + Q_Q(QPrintDialog); + numCopies = 1; + + if (_qt_print_dialog_creator) + (*_qt_print_dialog_creator)(q); + + setupDestination(); + setupPrinterSettings(); + setupPaper(); + setupOptions(); + + setPrinter(printer, true); + + q->installEventFilter(q); +} + +void QPrintDialog::setVisible(bool visible) +{ + QAbstractPrintDialog::setVisible(visible); +} + +QT_END_NAMESPACE + +#include "moc_qprintdialog.cpp" +#include "qrc_qprintdialog.cpp" + +#endif // QT_NO_PRINTDIALOG |