summaryrefslogtreecommitdiffstats
path: root/tqtinterface/qt4/src/kernel/tqrichtext_p.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tqtinterface/qt4/src/kernel/tqrichtext_p.cpp')
-rw-r--r--tqtinterface/qt4/src/kernel/tqrichtext_p.cpp1283
1 files changed, 1283 insertions, 0 deletions
diff --git a/tqtinterface/qt4/src/kernel/tqrichtext_p.cpp b/tqtinterface/qt4/src/kernel/tqrichtext_p.cpp
new file mode 100644
index 0000000..d8504df
--- /dev/null
+++ b/tqtinterface/qt4/src/kernel/tqrichtext_p.cpp
@@ -0,0 +1,1283 @@
+#include "tqtglobaldefines.h"
+
+#ifdef USE_QT4
+// #if 0
+
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt3Support module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial Usage
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** 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.
+**
+** 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.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "tqrichtext_p.h"
+#include "tqpainter.h"
+
+#ifndef QT_NO_RICHTEXT
+
+QT_BEGIN_NAMESPACE
+
+TQTextCommand::~TQTextCommand() {}
+TQTextCommand::Commands TQTextCommand::type() const { return Invalid; }
+
+
+#ifndef QT_NO_TEXTCUSTOMITEM
+TQTextCustomItem::~TQTextCustomItem() {}
+void TQTextCustomItem::adjustToPainter(TQPainter* p){ if (p) width = 0; }
+TQTextCustomItem::Placement TQTextCustomItem::placement() const { return PlaceInline; }
+
+bool TQTextCustomItem::ownLine() const { return false; }
+void TQTextCustomItem::resize(int nwidth){ width = nwidth; }
+void TQTextCustomItem::invalidate() {}
+
+bool TQTextCustomItem::isNested() const { return false; }
+int TQTextCustomItem::minimumWidth() const { return 0; }
+
+TQString TQTextCustomItem::richText() const { return TQString(); }
+
+bool TQTextCustomItem::enter(TQTextCursor *, TQTextDocument*&, TQTextParagraph *&, int &, int &, int &, bool)
+{
+ return true;
+}
+bool TQTextCustomItem::enterAt(TQTextCursor *, TQTextDocument *&, TQTextParagraph *&, int &, int &, int &, const QPoint &)
+{
+ return true;
+}
+bool TQTextCustomItem::next(TQTextCursor *, TQTextDocument *&, TQTextParagraph *&, int &, int &, int &)
+{
+ return true;
+}
+bool TQTextCustomItem::prev(TQTextCursor *, TQTextDocument *&, TQTextParagraph *&, int &, int &, int &)
+{
+ return true;
+}
+bool TQTextCustomItem::down(TQTextCursor *, TQTextDocument *&, TQTextParagraph *&, int &, int &, int &)
+{
+ return true;
+}
+bool TQTextCustomItem::up(TQTextCursor *, TQTextDocument *&, TQTextParagraph *&, int &, int &, int &)
+{
+ return true;
+}
+#endif // QT_NO_TEXTCUSTOMITEM
+
+void TQTextFlow::setPageSize(int ps) { pagesize = ps; }
+#ifndef QT_NO_TEXTCUSTOMITEM
+bool TQTextFlow::isEmpty() { return leftItems.isEmpty() && rightItems.isEmpty(); }
+#else
+bool TQTextFlow::isEmpty() { return true; }
+#endif
+
+#ifndef QT_NO_TEXTCUSTOMITEM
+void TQTextTableCell::invalidate() { cached_width = -1; cached_sizehint = -1; }
+
+void TQTextTable::invalidate() { cachewidth = -1; }
+#endif
+
+TQTextParagraphData::~TQTextParagraphData() {}
+void TQTextParagraphData::join(TQTextParagraphData *) {}
+
+TQTextFormatter::~TQTextFormatter() {}
+void TQTextFormatter::setWrapEnabled(bool b) { wrapEnabled = b; }
+void TQTextFormatter::setWrapAtColumn(int c) { wrapColumn = c; }
+
+
+
+int TQTextCursor::x() const
+{
+ if (idx >= para->length())
+ return 0;
+ TQTextStringChar *c = para->at(idx);
+ int curx = c->x;
+ if (!c->rightToLeft &&
+ c->c.isSpace() &&
+ idx > 0 &&
+ para->at(idx - 1)->c != QLatin1Char('\t') &&
+ !c->lineStart &&
+ (para->alignment() & Qt::AlignJustify) == Qt::AlignJustify)
+ curx = para->at(idx - 1)->x + para->string()->width(idx - 1);
+ if (c->rightToLeft)
+ curx += para->string()->width(idx);
+ return curx;
+}
+
+int TQTextCursor::y() const
+{
+ int dummy, line;
+ para->lineStartOfChar(idx, &dummy, &line);
+ return para->lineY(line);
+}
+
+int TQTextCursor::globalX() const { return totalOffsetX() + para->rect().x() + x(); }
+int TQTextCursor::globalY() const { return totalOffsetY() + para->rect().y() + y(); }
+
+TQTextDocument *TQTextCursor::document() const
+{
+ return para ? para->document() : 0;
+}
+
+void TQTextCursor::gotoPosition(TQTextParagraph* p, int index)
+{
+ if (para && p != para) {
+ while (!indices.isEmpty() && para->document() != p->document())
+ pop();
+ Q_ASSERT(indices.isEmpty() || para->document() == p->document());
+ }
+ para = p;
+ if (index < 0 || index >= para->length()) {
+ qWarning("TQTextCursor::gotoParagraph Index: %d out of range", index);
+ if (index < 0 || para->length() == 0)
+ index = 0;
+ else
+ index = para->length() - 1;
+ }
+
+ tmpX = -1;
+ idx = index;
+ fixCursorPosition();
+}
+
+bool TQTextDocument::hasSelection(int id, bool visible) const
+{
+ return (selections.find(id) != selections.end() &&
+ (!visible ||
+ ((TQTextDocument*)this)->selectionStartCursor(id) !=
+ ((TQTextDocument*)this)->selectionEndCursor(id)));
+}
+
+void TQTextDocument::setSelectionStart(int id, const TQTextCursor &cursor)
+{
+ TQTextDocumentSelection sel;
+ sel.startCursor = cursor;
+ sel.endCursor = cursor;
+ sel.swapped = false;
+ selections[id] = sel;
+}
+
+TQTextParagraph *TQTextDocument::paragAt(int i) const
+{
+ TQTextParagraph* p = curParag;
+ if (!p || p->paragId() > i)
+ p = fParag;
+ while (p && p->paragId() != i)
+ p = p->next();
+ ((TQTextDocument*)this)->curParag = p;
+ return p;
+}
+
+
+TQTextFormat::~TQTextFormat()
+{
+}
+
+TQTextFormat::TQTextFormat()
+ : fm(QFontMetrics(fn)), linkColor(true), logicalFontSize(3), stdSize(qApp->font().pointSize())
+{
+ ref = 0;
+
+ usePixelSizes = false;
+ if (stdSize == -1) {
+ stdSize = qApp->font().pixelSize();
+ usePixelSizes = true;
+ }
+
+ missp = false;
+ ha = AlignNormal;
+ collection = 0;
+}
+
+TQTextFormat::TQTextFormat(const TQStyleSheetItem *style)
+ : fm(QFontMetrics(fn)), linkColor(true), logicalFontSize(3), stdSize(qApp->font().pointSize())
+{
+ ref = 0;
+
+ usePixelSizes = false;
+ if (stdSize == -1) {
+ stdSize = qApp->font().pixelSize();
+ usePixelSizes = true;
+ }
+
+ missp = false;
+ ha = AlignNormal;
+ collection = 0;
+ fn = QFont(style->fontFamily(),
+ style->fontSize(),
+ style->fontWeight(),
+ style->fontItalic());
+ fn.setUnderline(style->fontUnderline());
+ fn.setStrikeOut(style->fontStrikeOut());
+ col = style->color();
+ fm = QFontMetrics(fn);
+ leftBearing = fm.minLeftBearing();
+ rightBearing = fm.minRightBearing();
+ hei = fm.lineSpacing();
+ asc = fm.ascent() + (fm.leading()+1)/2;
+ dsc = fm.descent();
+ missp = false;
+ ha = AlignNormal;
+ memset(widths, 0, 256);
+ generateKey();
+ addRef();
+}
+
+TQTextFormat::TQTextFormat(const QFont &f, const QColor &c, TQTextFormatCollection *parent)
+ : fn(f), col(c), fm(QFontMetrics(f)), linkColor(true),
+ logicalFontSize(3), stdSize(f.pointSize())
+{
+ ref = 0;
+ usePixelSizes = false;
+ if (stdSize == -1) {
+ stdSize = f.pixelSize();
+ usePixelSizes = true;
+ }
+ collection = parent;
+ leftBearing = fm.minLeftBearing();
+ rightBearing = fm.minRightBearing();
+ hei = fm.lineSpacing();
+ asc = fm.ascent() + (fm.leading()+1)/2;
+ dsc = fm.descent();
+ missp = false;
+ ha = AlignNormal;
+ memset(widths, 0, 256);
+ generateKey();
+ addRef();
+}
+
+TQTextFormat::TQTextFormat(const TQTextFormat &f)
+ : fm(f.fm)
+{
+ ref = 0;
+ collection = 0;
+ fn = f.fn;
+ col = f.col;
+ leftBearing = f.leftBearing;
+ rightBearing = f.rightBearing;
+ memset(widths, 0, 256);
+ hei = f.hei;
+ asc = f.asc;
+ dsc = f.dsc;
+ stdSize = f.stdSize;
+ usePixelSizes = f.usePixelSizes;
+ logicalFontSize = f.logicalFontSize;
+ missp = f.missp;
+ ha = f.ha;
+ k = f.k;
+ linkColor = f.linkColor;
+ addRef();
+}
+
+TQTextFormat& TQTextFormat::operator=(const TQTextFormat &f)
+{
+ ref = 0;
+ collection = f.collection;
+ fn = f.fn;
+ col = f.col;
+ fm = f.fm;
+ leftBearing = f.leftBearing;
+ rightBearing = f.rightBearing;
+ memset(widths, 0, 256);
+ hei = f.hei;
+ asc = f.asc;
+ dsc = f.dsc;
+ stdSize = f.stdSize;
+ usePixelSizes = f.usePixelSizes;
+ logicalFontSize = f.logicalFontSize;
+ missp = f.missp;
+ ha = f.ha;
+ k = f.k;
+ linkColor = f.linkColor;
+ addRef();
+ return *this;
+}
+
+void TQTextFormat::update()
+{
+ fm = QFontMetrics(fn);
+ leftBearing = fm.minLeftBearing();
+ rightBearing = fm.minRightBearing();
+ hei = fm.lineSpacing();
+ asc = fm.ascent() + (fm.leading()+1)/2;
+ dsc = fm.descent();
+ memset(widths, 0, 256);
+ generateKey();
+}
+
+
+TQPainter* TQTextFormat::pntr = 0;
+QFontMetrics* TQTextFormat::pntr_fm = 0;
+int TQTextFormat::pntr_ldg=-1;
+int TQTextFormat::pntr_asc=-1;
+int TQTextFormat::pntr_hei=-1;
+int TQTextFormat::pntr_dsc=-1;
+
+void TQTextFormat::setPainter(TQPainter *p)
+{
+ pntr = p;
+}
+
+TQPainter* TQTextFormat::painter()
+{
+ return pntr;
+}
+
+void TQTextFormat::applyFont(const QFont &f)
+{
+ QFontMetrics fm(pntr->fontMetrics());
+ if (!pntr_fm || pntr->font() != f) {
+ pntr->setFont(f);
+ delete pntr_fm;
+ pntr_fm = new QFontMetrics(pntr->fontMetrics());
+ pntr_ldg = pntr_fm->leading();
+ pntr_asc = pntr_fm->ascent()+(pntr_ldg+1)/2;
+ pntr_hei = pntr_fm->lineSpacing();
+ pntr_dsc = -1;
+ }
+}
+
+int TQTextFormat::minLeftBearing() const
+{
+ if (!pntr || !pntr->isActive())
+ return leftBearing;
+ applyFont(fn);
+ return pntr_fm->minLeftBearing();
+}
+
+int TQTextFormat::minRightBearing() const
+{
+ if (!pntr || !pntr->isActive())
+ return rightBearing;
+ applyFont(fn);
+ return pntr_fm->minRightBearing();
+}
+
+int TQTextFormat::height() const
+{
+ if (!pntr || !pntr->isActive())
+ return hei;
+ applyFont(fn);
+ return pntr_hei;
+}
+
+int TQTextFormat::ascent() const
+{
+ if (!pntr || !pntr->isActive())
+ return asc;
+ applyFont(fn);
+ return pntr_asc;
+}
+
+int TQTextFormat::descent() const
+{
+ if (!pntr || !pntr->isActive())
+ return dsc;
+ applyFont(fn);
+ if (pntr_dsc < 0)
+ pntr_dsc = pntr_fm->descent();
+ return pntr_dsc;
+}
+
+int TQTextFormat::leading() const
+{
+ if (!pntr || !pntr->isActive())
+ return fm.leading();
+ applyFont(fn);
+ return pntr_ldg;
+}
+
+void TQTextFormat::generateKey()
+{
+ k = getKey(fn, col, isMisspelled(), vAlign());
+}
+
+TQString TQTextFormat::getKey(const QFont &fn, const QColor &col, bool misspelled, VerticalAlignment a)
+{
+ TQString k = fn.key();
+ k += QLatin1Char('/');
+ k += TQString::number((uint)col.rgb());
+ k += QLatin1Char('/');
+ k += TQString::number((int)misspelled);
+ k += QLatin1Char('/');
+ k += TQString::number((int)a);
+ return k;
+}
+
+TQString TQTextString::toString(const QVector<TQTextStringChar> &data)
+{
+ TQString s;
+ int l = data.size();
+ s.setUnicode(0, l);
+ const TQTextStringChar *c = data.data();
+ QChar *uc = (QChar *)s.unicode();
+ while (l--)
+ *(uc++) = (c++)->c;
+
+ return s;
+}
+
+void TQTextParagraph::setSelection(int id, int start, int end)
+{
+ QMap<int, TQTextParagraphSelection>::ConstIterator it = selections().constFind(id);
+ if (it != mSelections->constEnd()) {
+ if (start == (*it).start && end == (*it).end)
+ return;
+ }
+
+ TQTextParagraphSelection sel;
+ sel.start = start;
+ sel.end = end;
+ (*mSelections)[id] = sel;
+ setChanged(true, true);
+}
+
+void TQTextParagraph::removeSelection(int id)
+{
+ if (!hasSelection(id))
+ return;
+ if (mSelections)
+ mSelections->remove(id);
+ setChanged(true, true);
+}
+
+int TQTextParagraph::selectionStart(int id) const
+{
+ if (!mSelections)
+ return -1;
+ QMap<int, TQTextParagraphSelection>::ConstIterator it = mSelections->constFind(id);
+ if (it == mSelections->constEnd())
+ return -1;
+ return (*it).start;
+}
+
+int TQTextParagraph::selectionEnd(int id) const
+{
+ if (!mSelections)
+ return -1;
+ QMap<int, TQTextParagraphSelection>::ConstIterator it = mSelections->constFind(id);
+ if (it == mSelections->constEnd())
+ return -1;
+ return (*it).end;
+}
+
+bool TQTextParagraph::hasSelection(int id) const
+{
+ return mSelections ? mSelections->contains(id) : false;
+}
+
+bool TQTextParagraph::fullSelected(int id) const
+{
+ if (!mSelections)
+ return false;
+ QMap<int, TQTextParagraphSelection>::ConstIterator it = mSelections->constFind(id);
+ if (it == mSelections->constEnd())
+ return false;
+ return (*it).start == 0 && (*it).end == str->length() - 1;
+}
+
+int TQTextParagraph::lineY(int l) const
+{
+ if (l > (int)lineStarts.count() - 1) {
+ qWarning("TQTextParagraph::lineY: line %d out of range!", l);
+ return 0;
+ }
+
+ if (!isValid())
+ ((TQTextParagraph*)this)->format();
+
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin();
+ while (l-- > 0)
+ ++it;
+ return (*it)->y;
+}
+
+int TQTextParagraph::lineBaseLine(int l) const
+{
+ if (l > (int)lineStarts.count() - 1) {
+ qWarning("TQTextParagraph::lineBaseLine: line %d out of range!", l);
+ return 10;
+ }
+
+ if (!isValid())
+ ((TQTextParagraph*)this)->format();
+
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin();
+ while (l-- > 0)
+ ++it;
+ return (*it)->baseLine;
+}
+
+int TQTextParagraph::lineHeight(int l) const
+{
+ if (l > (int)lineStarts.count() - 1) {
+ qWarning("TQTextParagraph::lineHeight: line %d out of range!", l);
+ return 15;
+ }
+
+ if (!isValid())
+ ((TQTextParagraph*)this)->format();
+
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin();
+ while (l-- > 0)
+ ++it;
+ return (*it)->h;
+}
+
+void TQTextParagraph::lineInfo(int l, int &y, int &h, int &bl) const
+{
+ if (l > (int)lineStarts.count() - 1) {
+ qWarning("TQTextParagraph::lineInfo: line %d out of range!", l);
+ qDebug("%d %d", (int)lineStarts.count() - 1, l);
+ y = 0;
+ h = 15;
+ bl = 10;
+ return;
+ }
+
+ if (!isValid())
+ ((TQTextParagraph*)this)->format();
+
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin();
+ while (l-- > 0)
+ ++it;
+ y = (*it)->y;
+ h = (*it)->h;
+ bl = (*it)->baseLine;
+}
+
+
+void TQTextParagraph::setAlignment(int a)
+{
+ if (a == (int)align)
+ return;
+ align = a;
+ invalidate(0);
+}
+
+TQTextFormatter *TQTextParagraph::formatter() const
+{
+ if (hasdoc)
+ return document()->formatter();
+ if (pseudoDocument()->pFormatter)
+ return pseudoDocument()->pFormatter;
+ return (((TQTextParagraph*)this)->pseudoDocument()->pFormatter = new TQTextFormatterBreakWords);
+}
+
+void TQTextParagraph::setTabArray(int *a)
+{
+ delete [] tArray;
+ tArray = a;
+}
+
+void TQTextParagraph::setTabStops(int tw)
+{
+ if (hasdoc)
+ document()->setTabStops(tw);
+ else
+ tabStopWidth = tw;
+}
+
+QMap<int, TQTextParagraphSelection> &TQTextParagraph::selections() const
+{
+ if (!mSelections)
+ ((TQTextParagraph *)this)->mSelections = new QMap<int, TQTextParagraphSelection>;
+ return *mSelections;
+}
+
+#ifndef QT_NO_TEXTCUSTOMITEM
+QList<TQTextCustomItem *> &TQTextParagraph::floatingItems() const
+{
+ if (!mFloatingItems)
+ ((TQTextParagraph *)this)->mFloatingItems = new QList<TQTextCustomItem *>;
+ return *mFloatingItems;
+}
+#endif
+
+TQTextStringChar::~TQTextStringChar()
+{
+ if (format())
+ format()->removeRef();
+ if (type) // not Regular
+ delete p.custom;
+}
+
+TQTextParagraphPseudoDocument::TQTextParagraphPseudoDocument():pFormatter(0),commandHistory(0), minw(0),wused(0),collection(){}
+TQTextParagraphPseudoDocument::~TQTextParagraphPseudoDocument(){ delete pFormatter; delete commandHistory; }
+
+
+QT_END_NAMESPACE
+
+#endif //QT_NO_RICHTEXT
+
+#else // USE_QT4
+
+/****************************************************************************
+**
+** Implementation of the internal TQt classes dealing with rich text
+**
+** Created : 990101
+**
+** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA.
+**
+** This file is part of the kernel module of the TQt GUI Toolkit.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free TQt Foundation.
+**
+** 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.
+**
+** This file may be used under the terms of the Q Public License as
+** defined by Trolltech ASA and appearing in the file LICENSE.TQPL
+** included in the packaging of this file. Licensees holding valid TQt
+** Commercial licenses may use this file in accordance with the TQt
+** Commercial License Agreement provided with the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "tqrichtext_p.h"
+
+#ifndef TQT_NO_RICHTEXT
+
+TQTextCommand::~TQTextCommand() {}
+TQTextCommand::Commands TQTextCommand::type() const { return Invalid; }
+
+
+#ifndef TQT_NO_TEXTCUSTOMITEM
+TQTextCustomItem::~TQTextCustomItem() {}
+void TQTextCustomItem::adjustToPainter( TQPainter* p){ if ( p ) width = 0; }
+TQTextCustomItem::Placement TQTextCustomItem::placement() const { return PlaceInline; }
+
+bool TQTextCustomItem::ownLine() const { return FALSE; }
+void TQTextCustomItem::resize( int nwidth ){ width = nwidth; }
+void TQTextCustomItem::tqinvalidate() {}
+
+bool TQTextCustomItem::isNested() const { return FALSE; }
+int TQTextCustomItem::minimumWidth() const { return 0; }
+
+TQString TQTextCustomItem::richText() const { return TQString::null; }
+
+bool TQTextCustomItem::enter( TQTextCursor *, TQTextDocument*&, TQTextParagraph *&, int &, int &, int &, bool )
+{
+ return TRUE;
+}
+bool TQTextCustomItem::enterAt( TQTextCursor *, TQTextDocument *&, TQTextParagraph *&, int &, int &, int &, const TQPoint & )
+{
+ return TRUE;
+}
+bool TQTextCustomItem::next( TQTextCursor *, TQTextDocument *&, TQTextParagraph *&, int &, int &, int & )
+{
+ return TRUE;
+}
+bool TQTextCustomItem::prev( TQTextCursor *, TQTextDocument *&, TQTextParagraph *&, int &, int &, int & )
+{
+ return TRUE;
+}
+bool TQTextCustomItem::down( TQTextCursor *, TQTextDocument *&, TQTextParagraph *&, int &, int &, int & )
+{
+ return TRUE;
+}
+bool TQTextCustomItem::up( TQTextCursor *, TQTextDocument *&, TQTextParagraph *&, int &, int &, int & )
+{
+ return TRUE;
+}
+#endif // TQT_NO_TEXTCUSTOMITEM
+
+void TQTextFlow::setPageSize( int ps ) { pagesize = ps; }
+#ifndef TQT_NO_TEXTCUSTOMITEM
+bool TQTextFlow::isEmpty() { return leftItems.isEmpty() && rightItems.isEmpty(); }
+#else
+bool TQTextFlow::isEmpty() { return TRUE; }
+#endif
+
+#ifndef TQT_NO_TEXTCUSTOMITEM
+void TQTextTableCell::tqinvalidate() { cached_width = -1; cached_sizehint = -1; }
+
+void TQTextTable::tqinvalidate() { cachewidth = -1; }
+#endif
+
+TQTextParagraphData::~TQTextParagraphData() {}
+void TQTextParagraphData::join( TQTextParagraphData * ) {}
+
+TQTextFormatter::~TQTextFormatter() {}
+void TQTextFormatter::setWrapEnabled( bool b ) { wrapEnabled = b; }
+void TQTextFormatter::setWrapAtColumn( int c ) { wrapColumn = c; }
+
+
+
+int TQTextCursor::x() const
+{
+ if ( idx >= para->length() )
+ return 0;
+ TQTextStringChar *c = para->at( idx );
+ int curx = c->x;
+ if ( !c->rightToLeft &&
+ c->c.isSpace() &&
+ idx > 0 &&
+ para->at( idx - 1 )->c != '\t' &&
+ !c->lineStart &&
+ ( para->tqalignment() & TQt::AlignJustify ) == TQt::AlignJustify )
+ curx = para->at( idx - 1 )->x + para->string()->width( idx - 1 );
+ if ( c->rightToLeft )
+ curx += para->string()->width( idx );
+ return curx;
+}
+
+int TQTextCursor::y() const
+{
+ int dummy, line;
+ para->lineStartOfChar( idx, &dummy, &line );
+ return para->lineY( line );
+}
+
+int TQTextCursor::globalX() const { return totalOffsetX() + para->rect().x() + x(); }
+int TQTextCursor::globalY() const { return totalOffsetY() + para->rect().y() + y(); }
+
+TQTextDocument *TQTextCursor::document() const
+{
+ return para ? para->document() : 0;
+}
+
+void TQTextCursor::gotoPosition( TQTextParagraph* p, int index )
+{
+ if ( para && p != para ) {
+ while ( !indices.isEmpty() && para->document() != p->document() )
+ pop();
+ TQ_ASSERT( indices.isEmpty() || para->document() == p->document() );
+ }
+ para = p;
+ if ( index < 0 || index >= para->length() ) {
+#if defined(TQT_CHECK_RANGE)
+ qWarning( "TQTextCursor::gotoParagraph Index: %d out of range", index );
+#endif
+ if ( index < 0 || para->length() == 0 )
+ index = 0;
+ else
+ index = para->length() - 1;
+ }
+
+ tmpX = -1;
+ idx = index;
+ fixCursorPosition();
+}
+
+bool TQTextDocument::hasSelection( int id, bool visible ) const
+{
+ return ( selections.tqfind( id ) != selections.end() &&
+ ( !visible ||
+ ( (TQTextDocument*)this )->selectionStartCursor( id ) !=
+ ( (TQTextDocument*)this )->selectionEndCursor( id ) ) );
+}
+
+void TQTextDocument::setSelectionStart( int id, const TQTextCursor &cursor )
+{
+ TQTextDocumentSelection sel;
+ sel.startCursor = cursor;
+ sel.endCursor = cursor;
+ sel.swapped = FALSE;
+ selections[ id ] = sel;
+}
+
+TQTextParagraph *TQTextDocument::paragAt( int i ) const
+{
+ TQTextParagraph* p = curParag;
+ if ( !p || p->paragId() > i )
+ p = fParag;
+ while ( p && p->paragId() != i )
+ p = p->next();
+ ((TQTextDocument*)this)->curParag = p;
+ return p;
+}
+
+
+TQTextFormat::~TQTextFormat()
+{
+}
+
+TQTextFormat::TQTextFormat()
+ : fm( TQFontMetrics( fn ) ), linkColor( TRUE ), logicalFontSize( 3 ), stdSize( tqApp->font().pointSize() )
+{
+ ref = 0;
+
+ usePixelSizes = FALSE;
+ if ( stdSize == -1 ) {
+ stdSize = tqApp->font().pixelSize();
+ usePixelSizes = TRUE;
+ }
+
+ missp = FALSE;
+ ha = AlignNormal;
+ collection = 0;
+}
+
+TQTextFormat::TQTextFormat( const TQStyleSheetItem *style )
+ : fm( TQFontMetrics( fn ) ), linkColor( TRUE ), logicalFontSize( 3 ), stdSize( tqApp->font().pointSize() )
+{
+ ref = 0;
+
+ usePixelSizes = FALSE;
+ if ( stdSize == -1 ) {
+ stdSize = tqApp->font().pixelSize();
+ usePixelSizes = TRUE;
+ }
+
+ missp = FALSE;
+ ha = AlignNormal;
+ collection = 0;
+ fn = TQFont( style->fontFamily(),
+ style->fontSize(),
+ style->fontWeight(),
+ style->fontItalic() );
+ fn.setUnderline( style->fontUnderline() );
+ fn.setStrikeOut( style->fontStrikeOut() );
+ col = style->color();
+ fm = TQFontMetrics( fn );
+ leftBearing = fm.minLeftBearing();
+ rightBearing = fm.minRightBearing();
+ hei = fm.lineSpacing();
+ asc = fm.ascent() + (fm.leading()+1)/2;
+ dsc = fm.descent();
+ missp = FALSE;
+ ha = AlignNormal;
+ memset( widths, 0, 256 );
+ generateKey();
+ addRef();
+}
+
+TQTextFormat::TQTextFormat( const TQFont &f, const TQColor &c, TQTextFormatCollection *tqparent )
+ : fn( f ), col( c ), fm( TQFontMetrics( f ) ), linkColor( TRUE ),
+ logicalFontSize( 3 ), stdSize( f.pointSize() )
+{
+ ref = 0;
+ usePixelSizes = FALSE;
+ if ( stdSize == -1 ) {
+ stdSize = f.pixelSize();
+ usePixelSizes = TRUE;
+ }
+ collection = tqparent;
+ leftBearing = fm.minLeftBearing();
+ rightBearing = fm.minRightBearing();
+ hei = fm.lineSpacing();
+ asc = fm.ascent() + (fm.leading()+1)/2;
+ dsc = fm.descent();
+ missp = FALSE;
+ ha = AlignNormal;
+ memset( widths, 0, 256 );
+ generateKey();
+ addRef();
+}
+
+TQTextFormat::TQTextFormat( const TQTextFormat &f )
+ : fm( f.fm )
+{
+ ref = 0;
+ collection = 0;
+ fn = f.fn;
+ col = f.col;
+ leftBearing = f.leftBearing;
+ rightBearing = f.rightBearing;
+ memset( widths, 0, 256 );
+ hei = f.hei;
+ asc = f.asc;
+ dsc = f.dsc;
+ stdSize = f.stdSize;
+ usePixelSizes = f.usePixelSizes;
+ logicalFontSize = f.logicalFontSize;
+ missp = f.missp;
+ ha = f.ha;
+ k = f.k;
+ linkColor = f.linkColor;
+ addRef();
+}
+
+TQTextFormat& TQTextFormat::operator=( const TQTextFormat &f )
+{
+ ref = 0;
+ collection = f.collection;
+ fn = f.fn;
+ col = f.col;
+ fm = f.fm;
+ leftBearing = f.leftBearing;
+ rightBearing = f.rightBearing;
+ memset( widths, 0, 256 );
+ hei = f.hei;
+ asc = f.asc;
+ dsc = f.dsc;
+ stdSize = f.stdSize;
+ usePixelSizes = f.usePixelSizes;
+ logicalFontSize = f.logicalFontSize;
+ missp = f.missp;
+ ha = f.ha;
+ k = f.k;
+ linkColor = f.linkColor;
+ addRef();
+ return *this;
+}
+
+void TQTextFormat::update()
+{
+ fm = TQFontMetrics( fn );
+ leftBearing = fm.minLeftBearing();
+ rightBearing = fm.minRightBearing();
+ hei = fm.lineSpacing();
+ asc = fm.ascent() + (fm.leading()+1)/2;
+ dsc = fm.descent();
+ memset( widths, 0, 256 );
+ generateKey();
+}
+
+
+TQPainter* TQTextFormat::pntr = 0;
+TQFontMetrics* TQTextFormat::pntr_fm = 0;
+int TQTextFormat::pntr_ldg=-1;
+int TQTextFormat::pntr_asc=-1;
+int TQTextFormat::pntr_hei=-1;
+int TQTextFormat::pntr_dsc=-1;
+
+void TQTextFormat::setPainter( TQPainter *p )
+{
+ pntr = p;
+}
+
+TQPainter* TQTextFormat::painter()
+{
+ return pntr;
+}
+
+void TQTextFormat::applyFont( const TQFont &f )
+{
+ TQFontMetrics fm( pntr->fontMetrics() );
+ if ( !pntr_fm
+// || pntr_fm->painter != pntr
+// || pntr_fm->d != fm.d
+ || !pntr->font().isCopyOf( f ) ) {
+ pntr->setFont( f );
+ delete pntr_fm;
+ pntr_fm = new TQFontMetrics( pntr->fontMetrics() );
+ pntr_ldg = pntr_fm->leading();
+ pntr_asc = pntr_fm->ascent()+(pntr_ldg+1)/2;
+ pntr_hei = pntr_fm->lineSpacing();
+ pntr_dsc = -1;
+ }
+}
+
+int TQTextFormat::minLeftBearing() const
+{
+ if ( !pntr || !pntr->isActive() )
+ return leftBearing;
+ applyFont( fn );
+ return pntr_fm->minLeftBearing();
+}
+
+int TQTextFormat::minRightBearing() const
+{
+ if ( !pntr || !pntr->isActive() )
+ return rightBearing;
+ applyFont( fn );
+ return pntr_fm->minRightBearing();
+}
+
+int TQTextFormat::height() const
+{
+ if ( !pntr || !pntr->isActive() )
+ return hei;
+ applyFont( fn );
+ return pntr_hei;
+}
+
+int TQTextFormat::ascent() const
+{
+ if ( !pntr || !pntr->isActive() )
+ return asc;
+ applyFont( fn );
+ return pntr_asc;
+}
+
+int TQTextFormat::descent() const
+{
+ if ( !pntr || !pntr->isActive() )
+ return dsc;
+ applyFont( fn );
+ if ( pntr_dsc < 0 )
+ pntr_dsc = pntr_fm->descent();
+ return pntr_dsc;
+}
+
+int TQTextFormat::leading() const
+{
+ if ( !pntr || !pntr->isActive() )
+ return fm.leading();
+ applyFont( fn );
+ return pntr_ldg;
+}
+
+void TQTextFormat::generateKey()
+{
+ k = getKey( fn, col, isMisspelled(), vAlign() );
+}
+
+TQString TQTextFormat::getKey( const TQFont &fn, const TQColor &col, bool misspelled, VerticalAlignment a )
+{
+ TQString k = fn.key();
+ k += '/';
+ k += TQString::number( (uint)col.rgb() );
+ k += '/';
+ k += TQString::number( (int)misspelled );
+ k += '/';
+ k += TQString::number( (int)a );
+ return k;
+}
+
+TQString TQTextString::toString( const TQMemArray<TQTextStringChar> &data )
+{
+ TQString s;
+ int l = data.size();
+ s.setUnicode( 0, l );
+ TQTextStringChar *c = data.data();
+ TQChar *uc = (TQChar *)s.tqunicode();
+ while ( l-- )
+ *(uc++) = (c++)->c;
+
+ return s;
+}
+
+void TQTextParagraph::setSelection( int id, int start, int end )
+{
+ TQMap<int, TQTextParagraphSelection>::ConstIterator it = selections().tqfind( id );
+ if ( it != mSelections->end() ) {
+ if ( start == ( *it ).start && end == ( *it ).end )
+ return;
+ }
+
+ TQTextParagraphSelection sel;
+ sel.start = start;
+ sel.end = end;
+ (*mSelections)[ id ] = sel;
+ setChanged( TRUE, TRUE );
+}
+
+void TQTextParagraph::removeSelection( int id )
+{
+ if ( !hasSelection( id ) )
+ return;
+ if ( mSelections )
+ mSelections->remove( id );
+ setChanged( TRUE, TRUE );
+}
+
+int TQTextParagraph::selectionStart( int id ) const
+{
+ if ( !mSelections )
+ return -1;
+ TQMap<int, TQTextParagraphSelection>::ConstIterator it = mSelections->tqfind( id );
+ if ( it == mSelections->end() )
+ return -1;
+ return ( *it ).start;
+}
+
+int TQTextParagraph::selectionEnd( int id ) const
+{
+ if ( !mSelections )
+ return -1;
+ TQMap<int, TQTextParagraphSelection>::ConstIterator it = mSelections->tqfind( id );
+ if ( it == mSelections->end() )
+ return -1;
+ return ( *it ).end;
+}
+
+bool TQTextParagraph::hasSelection( int id ) const
+{
+ return mSelections ? mSelections->tqcontains( id ) : FALSE;
+}
+
+bool TQTextParagraph::fullSelected( int id ) const
+{
+ if ( !mSelections )
+ return FALSE;
+ TQMap<int, TQTextParagraphSelection>::ConstIterator it = mSelections->tqfind( id );
+ if ( it == mSelections->end() )
+ return FALSE;
+ return ( *it ).start == 0 && ( *it ).end == str->length() - 1;
+}
+
+int TQTextParagraph::lineY( int l ) const
+{
+ if ( l > (int)lineStarts.count() - 1 ) {
+ qWarning( "TQTextParagraph::lineY: line %d out of range!", l );
+ return 0;
+ }
+
+ if ( !isValid() )
+ ( (TQTextParagraph*)this )->format();
+
+ TQMap<int, TQTextLineStart*>::ConstIterator it = lineStarts.begin();
+ while ( l-- > 0 )
+ ++it;
+ return ( *it )->y;
+}
+
+int TQTextParagraph::lineBaseLine( int l ) const
+{
+ if ( l > (int)lineStarts.count() - 1 ) {
+ qWarning( "TQTextParagraph::lineBaseLine: line %d out of range!", l );
+ return 10;
+ }
+
+ if ( !isValid() )
+ ( (TQTextParagraph*)this )->format();
+
+ TQMap<int, TQTextLineStart*>::ConstIterator it = lineStarts.begin();
+ while ( l-- > 0 )
+ ++it;
+ return ( *it )->baseLine;
+}
+
+int TQTextParagraph::lineHeight( int l ) const
+{
+ if ( l > (int)lineStarts.count() - 1 ) {
+ qWarning( "TQTextParagraph::lineHeight: line %d out of range!", l );
+ return 15;
+ }
+
+ if ( !isValid() )
+ ( (TQTextParagraph*)this )->format();
+
+ TQMap<int, TQTextLineStart*>::ConstIterator it = lineStarts.begin();
+ while ( l-- > 0 )
+ ++it;
+ return ( *it )->h;
+}
+
+void TQTextParagraph::lineInfo( int l, int &y, int &h, int &bl ) const
+{
+ if ( l > (int)lineStarts.count() - 1 ) {
+ qWarning( "TQTextParagraph::lineInfo: line %d out of range!", l );
+ qDebug( "%d %d", (int)lineStarts.count() - 1, l );
+ y = 0;
+ h = 15;
+ bl = 10;
+ return;
+ }
+
+ if ( !isValid() )
+ ( (TQTextParagraph*)this )->format();
+
+ TQMap<int, TQTextLineStart*>::ConstIterator it = lineStarts.begin();
+ while ( l-- > 0 )
+ ++it;
+ y = ( *it )->y;
+ h = ( *it )->h;
+ bl = ( *it )->baseLine;
+}
+
+
+void TQTextParagraph::tqsetAlignment( int a )
+{
+ if ( a == (int)align )
+ return;
+ align = a;
+ tqinvalidate( 0 );
+}
+
+TQTextFormatter *TQTextParagraph::formatter() const
+{
+ if ( hasdoc )
+ return document()->formatter();
+ if ( pseudoDocument()->pFormatter )
+ return pseudoDocument()->pFormatter;
+ return ( ( (TQTextParagraph*)this )->pseudoDocument()->pFormatter = new TQTextFormatterBreakWords );
+}
+
+void TQTextParagraph::setTabArray( int *a )
+{
+ delete [] tArray;
+ tArray = a;
+}
+
+void TQTextParagraph::setTabStops( int tw )
+{
+ if ( hasdoc )
+ document()->setTabStops( tw );
+ else
+ tabStopWidth = tw;
+}
+
+TQMap<int, TQTextParagraphSelection> &TQTextParagraph::selections() const
+{
+ if ( !mSelections )
+ ((TQTextParagraph *)this)->mSelections = new TQMap<int, TQTextParagraphSelection>;
+ return *mSelections;
+}
+
+#ifndef TQT_NO_TEXTCUSTOMITEM
+TQPtrList<TQTextCustomItem> &TQTextParagraph::floatingItems() const
+{
+ if ( !mFloatingItems )
+ ((TQTextParagraph *)this)->mFloatingItems = new TQPtrList<TQTextCustomItem>;
+ return *mFloatingItems;
+}
+#endif
+
+TQTextStringChar::~TQTextStringChar()
+{
+ if ( format() )
+ format()->removeRef();
+ if ( type ) // not Regular
+ delete d.custom;
+}
+
+TQTextParagraphPseudoDocument::TQTextParagraphPseudoDocument():pFormatter(0),commandHistory(0), minw(0),wused(0),collection(){}
+TQTextParagraphPseudoDocument::~TQTextParagraphPseudoDocument(){ delete pFormatter; delete commandHistory; }
+
+
+#endif //TQT_NO_RICHTEXT
+
+#endif // USE_QT4 \ No newline at end of file