QQuickTextDocumentWithImageResources: use QTextDocument::baseUrl
[qt:qtdeclarative.git] / src / quick / items / qquicktext_p_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtQuick module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.  For licensing terms and
14 ** conditions see http://qt.digia.com/licensing.  For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights.  These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file.  Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QQUICKTEXT_P_P_H
43 #define QQUICKTEXT_P_P_H
44
45 //
46 //  W A R N I N G
47 //  -------------
48 //
49 // This file is not part of the Qt API.  It exists purely as an
50 // implementation detail.  This header file may change from version to
51 // version without notice, or even be removed.
52 //
53 // We mean it.
54 //
55
56 #include "qquicktext_p.h"
57 #include "qquickimplicitsizeitem_p_p.h"
58
59 #include <QtQml/qqml.h>
60 #include <QtGui/qabstracttextdocumentlayout.h>
61 #include <QtGui/qtextlayout.h>
62 #include <private/qquickstyledtext_p.h>
63 #include <private/qlazilyallocated_p.h>
64
65 QT_BEGIN_NAMESPACE
66
67 class QTextLayout;
68 class QQuickTextDocumentWithImageResources;
69
70 class Q_AUTOTEST_EXPORT QQuickTextPrivate : public QQuickImplicitSizeItemPrivate
71 {
72     Q_DECLARE_PUBLIC(QQuickText)
73 public:
74     QQuickTextPrivate();
75     ~QQuickTextPrivate();
76     void init();
77
78     void updateBaseline(qreal baseline, qreal dy);
79     void updateSize();
80     void updateLayout();
81     bool determineHorizontalAlignment();
82     bool setHAlign(QQuickText::HAlignment, bool forceAlign = false);
83     void mirrorChange();
84     bool isLineLaidOutConnected();
85     void setLineGeometry(QTextLine &line, qreal lineWidth, qreal &height);
86
87     QString elidedText(qreal lineWidth, const QTextLine &line, QTextLine *nextLine = 0) const;
88     void elideFormats(int start, int length, int offset, QList<QTextLayout::FormatRange> *elidedFormats);
89
90     void processHoverEvent(QHoverEvent *event);
91
92     QRectF layedOutTextRect;
93
94     struct ExtraData {
95         ExtraData();
96
97         qreal lineHeight;
98         QQuickTextDocumentWithImageResources *doc;
99         QString activeLink;
100         QString hoveredLink;
101         int minimumPixelSize;
102         int minimumPointSize;
103         int nbActiveDownloads;
104         int maximumLineCount;
105         QQuickText::LineHeightMode lineHeightMode;
106         QQuickText::FontSizeMode fontSizeMode;
107     };
108     QLazilyAllocated<ExtraData> extra;
109
110     QString text;
111     QUrl baseUrl;
112     QFont font;
113     QFont sourceFont;
114     QList<QQuickStyledTextImgTag*> imgTags;
115     QList<QQuickStyledTextImgTag*> visibleImgTags;
116
117     QTextLayout layout;
118     QTextLayout *elideLayout;
119     QQuickTextLine *textLine;
120
121     qreal lineWidth;
122
123     QRgb color;
124     QRgb linkColor;
125     QRgb styleColor;
126
127     int lineCount;
128     int multilengthEos;
129
130     enum UpdateType {
131         UpdateNone,
132         UpdatePreprocess,
133         UpdatePaintNode
134     };
135
136     QQuickText::TextElideMode elideMode;
137     QQuickText::HAlignment hAlign;
138     QQuickText::VAlignment vAlign;
139     QQuickText::TextFormat format;
140     QQuickText::WrapMode wrapMode;
141     QQuickText::TextStyle style;
142     QQuickText::RenderType renderType;
143     UpdateType updateType;
144
145     bool maximumLineCountValid:1;
146     bool updateOnComponentComplete:1;
147     bool richText:1;
148     bool styledText:1;
149     bool widthExceeded:1;
150     bool heightExceeded:1;
151     bool internalWidthUpdate:1;
152     bool requireImplicitSize:1;
153     bool implicitWidthValid:1;
154     bool implicitHeightValid:1;
155     bool truncated:1;
156     bool hAlignImplicit:1;
157     bool rightToLeftText:1;
158     bool layoutTextElided:1;
159     bool textHasChanged:1;
160     bool needToUpdateLayout:1;
161     bool formatModifiesFontSize:1;
162
163     static const QChar elideChar;
164
165     virtual qreal getImplicitWidth() const;
166     virtual qreal getImplicitHeight() const;
167
168     void ensureDoc();
169
170     QRectF setupTextLayout(qreal * const baseline);
171     void setupCustomLineGeometry(QTextLine &line, qreal &height, int lineOffset = 0);
172     bool isLinkActivatedConnected();
173     bool isLinkHoveredConnected();
174     static QString anchorAt(const QTextLayout *layout, const QPointF &mousePos);
175     QString anchorAt(const QPointF &pos) const;
176
177     inline qreal lineHeight() const { return extra.isAllocated() ? extra->lineHeight : 1.0; }
178     inline int maximumLineCount() const { return extra.isAllocated() ? extra->maximumLineCount : INT_MAX; }
179     inline QQuickText::LineHeightMode lineHeightMode() const { return extra.isAllocated() ? extra->lineHeightMode : QQuickText::ProportionalHeight; }
180     inline QQuickText::FontSizeMode fontSizeMode() const { return extra.isAllocated() ? extra->fontSizeMode : QQuickText::FixedSize; }
181     inline int minimumPixelSize() const { return extra.isAllocated() ? extra->minimumPixelSize : 12; }
182     inline int minimumPointSize() const { return extra.isAllocated() ? extra->minimumPointSize : 12; }
183     static inline QQuickTextPrivate *get(QQuickText *t) { return t->d_func(); }
184 };
185
186 class QQuickPixmap;
187 class QQuickTextDocumentWithImageResources : public QTextDocument, public QTextObjectInterface
188 {
189     Q_OBJECT
190     Q_INTERFACES(QTextObjectInterface)
191 public:
192     QQuickTextDocumentWithImageResources(QQuickItem *parent);
193     virtual ~QQuickTextDocumentWithImageResources();
194
195     void setText(const QString &);
196     int resourcesLoading() const { return outstanding; }
197
198     QSizeF intrinsicSize(QTextDocument *doc, int posInDocument, const QTextFormat &format);
199     void drawObject(QPainter *p, const QRectF &rect, QTextDocument *doc, int posInDocument, const QTextFormat &format);
200
201     QImage image(const QTextImageFormat &format);
202
203 public Q_SLOTS:
204     void clearResources();
205
206 Q_SIGNALS:
207     void imagesLoaded();
208
209 protected:
210     QVariant loadResource(int type, const QUrl &name);
211
212     QQuickPixmap *loadPixmap(QQmlContext *context, const QUrl &name);
213
214 private Q_SLOTS:
215     void reset();
216     void requestFinished();
217
218 private:
219     QHash<QUrl, QQuickPixmap *> m_resources;
220
221     int outstanding;
222     static QSet<QUrl> errors;
223 };
224
225 QT_END_NAMESPACE
226
227 #endif // QQUICKTEXT_P_P_H