src/gui/dialogs/qprintdialog_qws.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gui/dialogs/qprintdialog_qws.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,556 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
+** this package.
+**
+** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@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