src/gui/text/qtextdocumentfragment_p.h
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gui/text/qtextdocumentfragment_p.h	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,236 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+#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"
+
+QT_BEGIN_NAMESPACE
+
+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<int, int> objectIndexMap;
+};
+
+class QTextDocumentFragmentPrivate
+{
+public:
+    QTextDocumentFragmentPrivate(const QTextCursor &cursor = QTextCursor());
+    inline ~QTextDocumentFragmentPrivate() { delete doc; }
+
+    void insert(QTextCursor &cursor) const;
+
+    QAtomicInt ref;
+    QTextDocument *doc;
+
+    uint importedFromPlainText : 1;
+private:
+    Q_DISABLE_COPY(QTextDocumentFragmentPrivate)
+};
+
+#ifndef QT_NO_TEXTHTMLPARSER
+
+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<QTextList> list;
+    };
+    QVector<List> 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<QTextFrame> frame;
+        bool isTextFrame;
+        int rows;
+        int columns;
+        int currentRow; // ... for buggy html (see html_skipCell testcase)
+        TableCellIterator currentCell;
+        int lastIndent;
+    };
+    QVector<Table> tables;
+
+    struct RowColSpanInfo
+    {
+        int row, col;
+        int rowSpan, colSpan;
+    };
+
+    enum WhiteSpace
+    {
+        RemoveWhiteSpace,
+        CollapseWhiteSpace,
+        PreserveWhiteSpace
+    };
+
+    WhiteSpace compressNextWhitespace;
+
+    QTextDocument *doc;
+    QTextCursor cursor;
+    QTextHtmlParserNode::WhiteSpaceMode wsm;
+    ImportMode importMode;
+    bool hasBlock;
+    bool forceBlockMerging;
+    bool blockTagClosed;
+    int currentNodeIdx;
+    const QTextHtmlParserNode *currentNode;
+};
+
+QT_END_NAMESPACE
+#endif // QT_NO_TEXTHTMLPARSER
+
+#endif // QTEXTDOCUMENTFRAGMENT_P_H