2011-04-27 10:05:43 +00:00
|
|
|
/****************************************************************************
|
|
|
|
**
|
|
|
|
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
|
|
** All rights reserved.
|
|
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
|
|
|
**
|
|
|
|
** This file is part of the test suite of the Qt Toolkit.
|
|
|
|
**
|
|
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
|
|
** GNU Lesser General Public License Usage
|
2011-05-24 09:34:08 +00:00
|
|
|
** 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.
|
2011-04-27 10:05:43 +00:00
|
|
|
**
|
|
|
|
** In addition, as a special exception, Nokia gives you certain additional
|
2011-05-24 09:34:08 +00:00
|
|
|
** rights. These rights are described in the Nokia Qt LGPL Exception
|
2011-04-27 10:05:43 +00:00
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
**
|
2011-05-24 09:34:08 +00:00
|
|
|
** 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.
|
2011-04-27 10:05:43 +00:00
|
|
|
**
|
2011-05-24 09:34:08 +00:00
|
|
|
** Other Usage
|
|
|
|
** Alternatively, this file may be used in accordance with the terms and
|
|
|
|
** conditions contained in a signed written agreement between you and Nokia.
|
2011-04-27 10:05:43 +00:00
|
|
|
**
|
|
|
|
**
|
|
|
|
**
|
|
|
|
**
|
|
|
|
**
|
|
|
|
** $QT_END_LICENSE$
|
|
|
|
**
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#include <QtTest/QtTest>
|
|
|
|
|
|
|
|
#include <qtextdocument.h>
|
|
|
|
#include <qabstracttextdocumentlayout.h>
|
|
|
|
#include <qdebug.h>
|
|
|
|
#include <qpainter.h>
|
|
|
|
#include <qtexttable.h>
|
|
|
|
#include <qtextedit.h>
|
|
|
|
#include <qscrollbar.h>
|
|
|
|
|
|
|
|
//TESTED_CLASS=
|
|
|
|
//TESTED_FILES=gui/text/qtextdocumentlayout_p.h gui/text/qtextdocumentlayout.cpp
|
|
|
|
|
|
|
|
class tst_QTextDocumentLayout : public QObject
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
inline tst_QTextDocumentLayout() {}
|
|
|
|
virtual ~tst_QTextDocumentLayout() {}
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
void init();
|
|
|
|
void cleanup();
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
void defaultPageSizeHandling();
|
|
|
|
void idealWidth();
|
|
|
|
void lineSeparatorFollowingTable();
|
|
|
|
void wrapAtWordBoundaryOrAnywhere();
|
|
|
|
void inlineImage();
|
|
|
|
void clippedTableCell();
|
|
|
|
void floatingTablePageBreak();
|
|
|
|
|
|
|
|
private:
|
|
|
|
QTextDocument *doc;
|
|
|
|
};
|
|
|
|
|
|
|
|
void tst_QTextDocumentLayout::init()
|
|
|
|
{
|
|
|
|
doc = new QTextDocument;
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QTextDocumentLayout::cleanup()
|
|
|
|
{
|
|
|
|
delete doc;
|
|
|
|
doc = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QTextDocumentLayout::defaultPageSizeHandling()
|
|
|
|
{
|
|
|
|
QAbstractTextDocumentLayout *layout = doc->documentLayout();
|
|
|
|
QVERIFY(layout);
|
|
|
|
|
|
|
|
QVERIFY(!doc->pageSize().isValid());
|
|
|
|
QSizeF docSize = layout->documentSize();
|
|
|
|
QVERIFY(docSize.width() > 0 && docSize.width() < 1000);
|
|
|
|
QVERIFY(docSize.height() > 0 && docSize.height() < 1000);
|
|
|
|
|
|
|
|
doc->setPlainText("Some text\nwith a few lines\nand not real information\nor anything otherwise useful");
|
|
|
|
|
|
|
|
docSize = layout->documentSize();
|
|
|
|
QVERIFY(docSize.isValid());
|
|
|
|
QVERIFY(docSize.width() != INT_MAX);
|
|
|
|
QVERIFY(docSize.height() != INT_MAX);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QTextDocumentLayout::idealWidth()
|
|
|
|
{
|
|
|
|
doc->setPlainText("Some text\nwith a few lines\nand not real information\nor anything otherwise useful");
|
|
|
|
doc->setTextWidth(1000);
|
|
|
|
QCOMPARE(doc->textWidth(), qreal(1000));
|
|
|
|
QCOMPARE(doc->size().width(), doc->textWidth());
|
|
|
|
QVERIFY(doc->idealWidth() < doc->textWidth());
|
|
|
|
QVERIFY(doc->idealWidth() > 0);
|
|
|
|
|
|
|
|
QTextBlockFormat fmt;
|
|
|
|
fmt.setAlignment(Qt::AlignRight | Qt::AlignAbsolute);
|
|
|
|
QTextCursor cursor(doc);
|
|
|
|
cursor.select(QTextCursor::Document);
|
|
|
|
cursor.mergeBlockFormat(fmt);
|
|
|
|
|
|
|
|
QCOMPARE(doc->textWidth(), qreal(1000));
|
|
|
|
QCOMPARE(doc->size().width(), doc->textWidth());
|
|
|
|
QVERIFY(doc->idealWidth() < doc->textWidth());
|
|
|
|
QVERIFY(doc->idealWidth() > 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
// none of the QTextLine items in the document should intersect with the margin rect
|
|
|
|
void tst_QTextDocumentLayout::lineSeparatorFollowingTable()
|
|
|
|
{
|
|
|
|
QString html_begin("<html><table border=1><tr><th>Column 1</th></tr><tr><td>Data</td></tr></table><br>");
|
|
|
|
QString html_text("bla bla bla bla bla bla bla bla<br>");
|
|
|
|
QString html_end("<table border=1><tr><th>Column 1</th></tr><tr><td>Data</td></tr></table></html>");
|
|
|
|
|
|
|
|
QString html = html_begin;
|
|
|
|
|
|
|
|
for (int i = 0; i < 80; ++i)
|
|
|
|
html += html_text;
|
|
|
|
|
|
|
|
html += html_end;
|
|
|
|
|
|
|
|
doc->setHtml(html);
|
|
|
|
|
|
|
|
QTextCursor cursor(doc);
|
|
|
|
cursor.movePosition(QTextCursor::Start);
|
|
|
|
|
|
|
|
const int margin = 87;
|
|
|
|
const int pageWidth = 873;
|
|
|
|
const int pageHeight = 1358;
|
|
|
|
|
|
|
|
QTextFrameFormat fmt = doc->rootFrame()->frameFormat();
|
|
|
|
fmt.setMargin(margin);
|
|
|
|
doc->rootFrame()->setFrameFormat(fmt);
|
|
|
|
|
|
|
|
QFont font(doc->defaultFont());
|
|
|
|
font.setPointSize(10);
|
|
|
|
doc->setDefaultFont(font);
|
|
|
|
doc->setPageSize(QSizeF(pageWidth, pageHeight));
|
|
|
|
|
|
|
|
QRectF marginRect(QPointF(0, pageHeight - margin), QSizeF(pageWidth, 2 * margin));
|
|
|
|
|
|
|
|
// force layouting
|
|
|
|
doc->pageCount();
|
|
|
|
|
|
|
|
for (QTextBlock block = doc->begin(); block != doc->end(); block = block.next()) {
|
|
|
|
QTextLayout *layout = block.layout();
|
|
|
|
for (int i = 0; i < layout->lineCount(); ++i) {
|
|
|
|
QTextLine line = layout->lineAt(i);
|
|
|
|
QRectF rect = line.rect().translated(layout->position());
|
|
|
|
QVERIFY(!rect.intersects(marginRect));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QTextDocumentLayout::wrapAtWordBoundaryOrAnywhere()
|
|
|
|
{
|
|
|
|
//task 150562
|
|
|
|
QTextEdit edit;
|
|
|
|
edit.setText("<table><tr><td>hello hello hello"
|
|
|
|
"thisisabigwordthisisabigwordthisisabigwordthisisabigwordthisisabigword"
|
|
|
|
"hello hello hello</td></tr></table>");
|
|
|
|
edit.setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
|
|
|
|
edit.resize(100, 100);
|
|
|
|
edit.show();
|
|
|
|
QVERIFY(!edit.horizontalScrollBar()->isVisible());
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QTextDocumentLayout::inlineImage()
|
|
|
|
{
|
|
|
|
doc->setPageSize(QSizeF(800, 500));
|
|
|
|
|
|
|
|
QImage img(400, 400, QImage::Format_RGB32);
|
|
|
|
QLatin1String name("bigImage");
|
|
|
|
|
|
|
|
doc->addResource(QTextDocument::ImageResource, QUrl(name), img);
|
|
|
|
|
|
|
|
QTextImageFormat imgFormat;
|
|
|
|
imgFormat.setName(name);
|
|
|
|
imgFormat.setWidth(img.width());
|
|
|
|
|
|
|
|
QTextFrameFormat fmt = doc->rootFrame()->frameFormat();
|
|
|
|
qreal height = doc->pageSize().height() - fmt.topMargin() - fmt.bottomMargin();
|
|
|
|
imgFormat.setHeight(height);
|
|
|
|
|
|
|
|
QTextCursor cursor(doc);
|
|
|
|
cursor.insertImage(imgFormat);
|
|
|
|
|
|
|
|
QCOMPARE(doc->pageCount(), 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QTextDocumentLayout::clippedTableCell()
|
|
|
|
{
|
|
|
|
const char *html =
|
|
|
|
"<table style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\""
|
|
|
|
"border=\"0\" margin=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td></td></tr></table>";
|
|
|
|
|
|
|
|
doc->setHtml(html);
|
|
|
|
doc->pageSize();
|
|
|
|
|
|
|
|
QTextCursor cursor(doc);
|
|
|
|
cursor.movePosition(QTextCursor::Right);
|
|
|
|
|
|
|
|
QTextTable *table = cursor.currentTable();
|
|
|
|
QVERIFY(table);
|
|
|
|
|
|
|
|
QTextCursor cellCursor = table->cellAt(0, 0).firstCursorPosition();
|
|
|
|
QImage src(16, 16, QImage::Format_ARGB32_Premultiplied);
|
|
|
|
src.fill(0xffff0000);
|
|
|
|
cellCursor.insertImage(src);
|
|
|
|
|
|
|
|
QTextBlock block = cellCursor.block();
|
|
|
|
QRectF r = doc->documentLayout()->blockBoundingRect(block);
|
|
|
|
|
|
|
|
QRectF rect(0, 0, r.left() + 1, 64);
|
|
|
|
|
|
|
|
QImage img(64, 64, QImage::Format_ARGB32_Premultiplied);
|
|
|
|
img.fill(0x0);
|
|
|
|
QImage expected = img;
|
|
|
|
QPainter p(&img);
|
|
|
|
doc->drawContents(&p, rect);
|
|
|
|
p.end();
|
|
|
|
p.begin(&expected);
|
|
|
|
r.setWidth(1);
|
|
|
|
p.fillRect(r, Qt::red);
|
|
|
|
p.end();
|
|
|
|
|
|
|
|
img.save("img.png");
|
|
|
|
expected.save("expected.png");
|
|
|
|
QCOMPARE(img, expected);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tst_QTextDocumentLayout::floatingTablePageBreak()
|
|
|
|
{
|
|
|
|
doc->clear();
|
|
|
|
|
|
|
|
QTextCursor cursor(doc);
|
|
|
|
|
|
|
|
QTextTableFormat tableFormat;
|
|
|
|
tableFormat.setPosition(QTextFrameFormat::FloatLeft);
|
|
|
|
QTextTable *table = cursor.insertTable(50, 1, tableFormat);
|
2011-05-19 14:19:01 +00:00
|
|
|
Q_UNUSED(table);
|
2011-04-27 10:05:43 +00:00
|
|
|
|
|
|
|
// Make height of document 2/3 of the table, fitting the table into two pages
|
|
|
|
QSizeF documentSize = doc->size();
|
|
|
|
documentSize.rheight() *= 2.0 / 3.0;
|
|
|
|
|
|
|
|
doc->setPageSize(documentSize);
|
|
|
|
|
|
|
|
QCOMPARE(doc->pageCount(), 2);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QTEST_MAIN(tst_QTextDocumentLayout)
|
|
|
|
#include "tst_qtextdocumentlayout.moc"
|