/**************************************************************************** ** ** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved. ** ** This file is part of the QtGui module of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License version 2.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 GNU ** General Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/ ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** In addition, as a special exception, Trolltech gives you certain ** additional rights. These rights are described in the Trolltech GPL ** Exception version 1.0, which can be found at ** http://www.trolltech.com/products/qt/gplexception/ and in the file ** GPL_EXCEPTION.txt in this package. ** ** In addition, as a special exception, Trolltech, as the sole copyright ** holder for Qt Designer, grants users of the Qt/Eclipse Integration ** plug-in the right for the Qt/Eclipse Integration to link to ** functionality provided by Qt Designer and its related libraries. ** ** Trolltech reserves all rights not expressly granted herein. ** ** Trolltech ASA (c) 2007 ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ #ifndef QTEXTDOCUMENTFRAGMENT_P_H #define QTEXTDOCUMENTFRAGMENT_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 // version without notice, or even be removed. // // We mean it. // #include "QtGui/qtextdocument.h" #include "private/qtexthtmlparser_p.h" #include "private/qtextdocument_p.h" #include "QtGui/qtexttable.h" #include "QtCore/qatomic.h" #include "QtCore/qlist.h" #include "QtCore/qmap.h" #include "QtCore/qpointer.h" #include "QtCore/qvarlengtharray.h" #include "QtCore/qdatastream.h" class QTextDocumentFragmentPrivate; class QTextCopyHelper { public: QTextCopyHelper(const QTextCursor &_source, const QTextCursor &_destination, bool forceCharFormat = false, const QTextCharFormat &fmt = QTextCharFormat()); void copy(); private: void appendFragments(int pos, int endPos); int appendFragment(int pos, int endPos, int objectIndex = -1); int convertFormatIndex(const QTextFormat &oldFormat, int objectIndexToSet = -1); inline int convertFormatIndex(int oldFormatIndex, int objectIndexToSet = -1) { return convertFormatIndex(src->formatCollection()->format(oldFormatIndex), objectIndexToSet); } inline QTextFormat convertFormat(const QTextFormat &fmt) { return dst->formatCollection()->format(convertFormatIndex(fmt)); } int insertPos; bool forceCharFormat; int primaryCharFormatIndex; QTextCursor cursor; QTextDocumentPrivate *dst; QTextDocumentPrivate *src; QTextFormatCollection &formatCollection; const QString originalText; QMap objectIndexMap; }; class QTextDocumentFragmentPrivate { public: QTextDocumentFragmentPrivate(const QTextCursor &cursor = QTextCursor()); inline ~QTextDocumentFragmentPrivate() { delete doc; } void insert(QTextCursor &cursor) const; QAtomic ref; QTextDocument *doc; uint importedFromPlainText : 1; private: Q_DISABLE_COPY(QTextDocumentFragmentPrivate) }; class QTextHtmlImporter : public QTextHtmlParser { struct Table; public: enum ImportMode { ImportToFragment, ImportToDocument }; QTextHtmlImporter(QTextDocument *_doc, const QString &html, ImportMode mode, const QTextDocument *resourceProvider = 0); void import(); private: bool closeTag(); Table scanTable(int tableNodeIdx); enum ProcessNodeResult { ContinueWithNextNode, ContinueWithCurrentNode }; void appendBlock(const QTextBlockFormat &format, QTextCharFormat charFmt = QTextCharFormat()); bool appendNodeText(); ProcessNodeResult processBlockNode(); ProcessNodeResult processSpecialNodes(); struct List { inline List() : listNode(0) {} QTextListFormat format; int listNode; QPointer list; }; QVector lists; int indent; // insert a named anchor the next time we emit a char format, // either in a block or in regular text QStringList namedAnchors; #ifdef Q_CC_SUN friend struct QTextHtmlImporter::Table; #endif struct TableCellIterator { inline TableCellIterator(QTextTable *t = 0) : table(t), row(0), column(0) {} inline TableCellIterator &operator++() { if (atEnd()) return *this; do { const QTextTableCell cell = table->cellAt(row, column); if (!cell.isValid()) break; column += cell.columnSpan(); if (column >= table->columns()) { column = 0; ++row; } } while (row < table->rows() && table->cellAt(row, column).row() != row); return *this; } inline bool atEnd() const { return table == 0 || row >= table->rows(); } QTextTableCell cell() const { return table->cellAt(row, column); } QTextTable *table; int row; int column; }; friend struct Table; struct Table { Table() : isTextFrame(false), rows(0), columns(0), currentRow(0), lastIndent(0) {} QPointer frame; bool isTextFrame; int rows; int columns; int currentRow; // ... for buggy html (see html_skipCell testcase) TableCellIterator currentCell; int lastIndent; }; QVector tables; struct RowColSpanInfo { int row, col; int rowSpan, colSpan; }; QTextDocument *doc; QTextCursor cursor; QTextHtmlParserNode::WhiteSpaceMode wsm; ImportMode importMode; bool compressNextWhitespace; bool hasBlock; bool forceBlockMerging; bool blockTagClosed; int currentNodeIdx; const QTextHtmlParserNode *currentNode; }; #endif // QTEXTDOCUMENTFRAGMENT_P_H