From 699e8fe3a6724dd8288dd6a55b25e070eb198c9d Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 16 Aug 2011 14:04:48 +0200 Subject: Use the paged paintdevice in the print() method of QTextDocument. This is required to be able to move the printing system into it's own library. Change-Id: If70a55be4c4413f9cd917a30d1b368f32c1145e4 Reviewed-on: http://codereview.qt.nokia.com/3207 Reviewed-by: Qt Sanity Bot Reviewed-by: Gunnar Sletta --- src/gui/printsupport/printsupport.pri | 4 +- src/gui/text/qtextcontrol.cpp | 12 ++-- src/gui/text/qtextcontrol_p.h | 5 +- src/gui/text/qtextdocument.cpp | 103 +++++++++++------------------ src/gui/text/qtextdocument.h | 6 +- src/widgets/widgets/qwidgettextcontrol.cpp | 2 - 6 files changed, 51 insertions(+), 81 deletions(-) (limited to 'src') diff --git a/src/gui/printsupport/printsupport.pri b/src/gui/printsupport/printsupport.pri index 2faf36ff5b..b4773216d5 100644 --- a/src/gui/printsupport/printsupport.pri +++ b/src/gui/printsupport/printsupport.pri @@ -5,7 +5,8 @@ HEADERS += \ $$PWD/qprinter.h \ $$PWD/qprinter_p.h \ $$PWD/qprinterinfo.h \ - $$PWD/qprinterinfo_p.h + $$PWD/qprinterinfo_p.h \ + $$PWD/qprintabletextdocument.h SOURCES += \ $$PWD/qpaintengine_alpha.cpp \ @@ -13,6 +14,7 @@ SOURCES += \ $$PWD/qprintengine_pdf.cpp \ $$PWD/qprinter.cpp \ $$PWD/qprinterinfo.cpp \ + $$PWD/qprintabletextdocument.cpp unix:!symbian { HEADERS += \ diff --git a/src/gui/text/qtextcontrol.cpp b/src/gui/text/qtextcontrol.cpp index 689fd4379b..0a4b61f414 100644 --- a/src/gui/text/qtextcontrol.cpp +++ b/src/gui/text/qtextcontrol.cpp @@ -60,6 +60,7 @@ #include "qprinter.h" #include "qtextdocumentwriter.h" #include "private/qtextcursor_p.h" +#include "qpagedpaintdevice.h" #include #include @@ -2230,15 +2231,15 @@ bool QTextControl::isWordSelectionEnabled() const return d->wordSelectionEnabled; } -#ifndef QT_NO_PRINTER -void QTextControl::print(QPrinter *printer) const +void QTextControl::print(QPagedPaintDevice *printer) const { -#ifndef QT_NO_PRINTER Q_D(const QTextControl); - if (!printer || !printer->isValid()) + if (!printer) return; QTextDocument *tempDoc = 0; const QTextDocument *doc = d->doc; + // #### +#if 0 if (printer->printRange() == QPrinter::Selection) { if (!d->cursor.hasSelection()) return; @@ -2253,11 +2254,10 @@ void QTextControl::print(QPrinter *printer) const // copy the custom object handlers doc->documentLayout()->d_func()->handlers = d->doc->documentLayout()->d_func()->handlers; } +#endif doc->print(printer); delete tempDoc; -#endif } -#endif // QT_NO_PRINTER QMimeData *QTextControl::createMimeDataFromSelection() const { diff --git a/src/gui/text/qtextcontrol_p.h b/src/gui/text/qtextcontrol_p.h index 87eea3c2f5..95c5f4d56a 100644 --- a/src/gui/text/qtextcontrol_p.h +++ b/src/gui/text/qtextcontrol_p.h @@ -75,6 +75,7 @@ class QMimeData; class QAbstractScrollArea; class QEvent; class QTimerEvent; +class QPagedPaintDevice; class Q_GUI_EXPORT QTextControl : public QObject { @@ -171,9 +172,7 @@ public: bool isWordSelectionEnabled() const; void setWordSelectionEnabled(bool enabled); -#ifndef QT_NO_PRINTER - void print(QPrinter *printer) const; -#endif + void print(QPagedPaintDevice *printer) const; virtual int hitTest(const QPointF &point, Qt::HitTestAccuracy accuracy) const; virtual QRectF blockBoundingRect(const QTextBlock &block) const; diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index 08b6e0bf14..c3dd72ad41 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -65,6 +65,7 @@ #include "qtextdocument_p.h" #include #include +#include "qpagedpaintdevice.h" #include @@ -1694,7 +1695,7 @@ static void printPage(int index, QPainter *painter, const QTextDocument *doc, co } /*! - Prints the document to the given \a printer. The QPrinter must be + Prints the document to the given \a device. The QPageablePaintDevice must be set up before being used with this function. This is only a convenience method to print the whole document to the printer. @@ -1704,33 +1705,30 @@ static void printPage(int index, QPainter *painter, const QTextDocument *doc, co If the document is not paginated, like for example a document used in a QTextEdit, then a temporary copy of the document is created and the copy is broken into - multiple pages according to the size of the QPrinter's paperRect(). By default + multiple pages according to the size of the paint device's paperRect(). By default a 2 cm margin is set around the document contents. In addition the current page number is printed at the bottom of each page. - Note that QPrinter::Selection is not supported as print range with this function since - the selection is a property of QTextCursor. If you have a QTextEdit associated with - your QTextDocument then you can use QTextEdit's print() function because QTextEdit has - access to the user's selection. - \sa QTextEdit::print() */ -void QTextDocument::print(QPrinter *printer) const +void QTextDocument::print(QPagedPaintDevice *printer) const { Q_D(const QTextDocument); - if (!printer || !printer->isValid()) + if (!printer) return; - if (!d->title.isEmpty()) - printer->setDocName(d->title); + // ### +// if (!d->title.isEmpty()) +// printer->setDocName(d->title); bool documentPaginated = d->pageSize.isValid() && !d->pageSize.isNull() && d->pageSize.height() != INT_MAX; - if (!documentPaginated && !printer->fullPage() && !printer->d_func()->hasCustomPageMargins) - printer->setPageMargins(23.53, 23.53, 23.53, 23.53, QPrinter::Millimeter); + // ### set page size to paginated size? +// if (!documentPaginated && !printer->fullPage() && !printer->d_func()->hasCustomPageMargins) +// printer->setPageMargins(23.53, 23.53, 23.53, 23.53, QPrinter::Millimeter); QPainter p(printer); @@ -1765,7 +1763,7 @@ void QTextDocument::print(QPrinter *printer) const scaledPageSize.rwidth() *= dpiScaleX; scaledPageSize.rheight() *= dpiScaleY; - const QSizeF printerPageSize(printer->pageRect().size()); + const QSizeF printerPageSize(printer->width(), printer->height()); // scale to page p.scale(printerPageSize.width() / scaledPageSize.width(), @@ -1787,17 +1785,12 @@ void QTextDocument::print(QPrinter *printer) const layout->d_func()->handlers = documentLayout()->d_func()->handlers; int dpiy = p.device()->logicalDpiY(); - int margin = 0; - if (printer->fullPage() && !printer->d_func()->hasCustomPageMargins) { - // for compatibility - margin = (int) ((2/2.54)*dpiy); // 2 cm margins - QTextFrameFormat fmt = doc->rootFrame()->frameFormat(); - fmt.setMargin(margin); - doc->rootFrame()->setFrameFormat(fmt); - } + int margin = (int) ((2/2.54)*dpiy); // 2 cm margins + QTextFrameFormat fmt = doc->rootFrame()->frameFormat(); + fmt.setMargin(margin); + doc->rootFrame()->setFrameFormat(fmt); - QRectF pageRect(printer->pageRect()); - body = QRectF(0, 0, pageRect.width(), pageRect.height()); + body = QRectF(0, 0, printer->width(), printer->height()); pageNumberPos = QPointF(body.width() - margin, body.height() - margin + QFontMetrics(doc->defaultFont(), p.device()).ascent() @@ -1805,18 +1798,10 @@ void QTextDocument::print(QPrinter *printer) const clonedDoc->setPageSize(body.size()); } - int docCopies; - int pageCopies; - if (printer->collateCopies() == true){ - docCopies = 1; - pageCopies = printer->supportsMultipleCopies() ? 1 : printer->copyCount(); - } else { - docCopies = printer->supportsMultipleCopies() ? 1 : printer->copyCount(); - pageCopies = 1; - } - - int fromPage = printer->fromPage(); - int toPage = printer->toPage(); + int fromPage = 0; + int toPage = 0; +// int fromPage = printer->fromPage(); +// int toPage = printer->toPage(); bool ascending = true; if (fromPage == 0 && toPage == 0) { @@ -1833,39 +1818,27 @@ void QTextDocument::print(QPrinter *printer) const return; } - if (printer->pageOrder() == QPrinter::LastPageFirst) { - int tmp = fromPage; - fromPage = toPage; - toPage = tmp; - ascending = false; - } - - for (int i = 0; i < docCopies; ++i) { +// if (printer->pageOrder() == QPrinter::LastPageFirst) { +// int tmp = fromPage; +// fromPage = toPage; +// toPage = tmp; +// ascending = false; +// } - int page = fromPage; - while (true) { - for (int j = 0; j < pageCopies; ++j) { - if (printer->printerState() == QPrinter::Aborted - || printer->printerState() == QPrinter::Error) - return; - printPage(page, &p, doc, body, pageNumberPos); - if (j < pageCopies - 1) - printer->newPage(); - } + int page = fromPage; + while (true) { + printPage(page, &p, doc, body, pageNumberPos); - if (page == toPage) - break; - - if (ascending) - ++page; - else - --page; + if (page == toPage) + break; - printer->newPage(); - } + if (ascending) + ++page; + else + --page; - if ( i < docCopies - 1) - printer->newPage(); + if (!printer->newPage()) + return; } } #endif diff --git a/src/gui/text/qtextdocument.h b/src/gui/text/qtextdocument.h index 268b72e514..363d7abb21 100644 --- a/src/gui/text/qtextdocument.h +++ b/src/gui/text/qtextdocument.h @@ -57,7 +57,7 @@ class QTextFormatCollection; class QTextListFormat; class QRect; class QPainter; -class QPrinter; +class QPagedPaintDevice; class QAbstractTextDocumentLayout; class QPoint; class QTextObject; @@ -206,9 +206,7 @@ public: bool isModified() const; -#ifndef QT_NO_PRINTER - void print(QPrinter *printer) const; -#endif + void print(QPagedPaintDevice *printer) const; enum ResourceType { HtmlResource = 1, diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp index 462fe094cf..0f241136a5 100644 --- a/src/widgets/widgets/qwidgettextcontrol.cpp +++ b/src/widgets/widgets/qwidgettextcontrol.cpp @@ -2426,7 +2426,6 @@ bool QWidgetTextControl::isWordSelectionEnabled() const #ifndef QT_NO_PRINTER void QWidgetTextControl::print(QPrinter *printer) const { -#ifndef QT_NO_PRINTER Q_D(const QWidgetTextControl); if (!printer || !printer->isValid()) return; @@ -2448,7 +2447,6 @@ void QWidgetTextControl::print(QPrinter *printer) const } doc->print(printer); delete tempDoc; -#endif } #endif // QT_NO_PRINTER -- cgit v1.2.3