summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-write/qcleanuphandler.h12
-rw-r--r--noncore/apps/opie-write/qcomplextext.cpp3
-rw-r--r--noncore/apps/opie-write/qrichtext.cpp4311
-rw-r--r--noncore/apps/opie-write/qrichtext_p.cpp303
-rw-r--r--noncore/apps/opie-write/qrichtext_p.h576
-rw-r--r--noncore/apps/opie-write/qstylesheet.cpp1230
-rw-r--r--noncore/apps/opie-write/qstylesheet.h16
-rw-r--r--noncore/apps/opie-write/qt3namespace.h1
-rw-r--r--noncore/apps/opie-write/qtextedit.cpp1495
-rw-r--r--noncore/apps/opie-write/qtextedit.h30
10 files changed, 3833 insertions, 4144 deletions
diff --git a/noncore/apps/opie-write/qcleanuphandler.h b/noncore/apps/opie-write/qcleanuphandler.h
index 5c5bf16..2d6eb7c 100644
--- a/noncore/apps/opie-write/qcleanuphandler.h
+++ b/noncore/apps/opie-write/qcleanuphandler.h
@@ -43,7 +43,3 @@
template<class Type>
-#ifdef Q_NO_TEMPLATE_EXPORT
class QCleanupHandler
-#else
-class Q_EXPORT QCleanupHandler
-#endif
{
@@ -90,7 +86,3 @@ private:
template<class Type>
-#ifdef Q_NO_TEMPLATE_EXPORT
class QSingleCleanupHandler
-#else
-class Q_EXPORT QSingleCleanupHandler
-#endif
{
@@ -114,7 +106,3 @@ private:
template<class Type>
-#ifdef Q_NO_TEMPLATE_EXPORT
class QSharedCleanupHandler
-#else
-class Q_EXPORT QSharedCleanupHandler
-#endif
{
diff --git a/noncore/apps/opie-write/qcomplextext.cpp b/noncore/apps/opie-write/qcomplextext.cpp
index 0fa6c2e..e8b94da 100644
--- a/noncore/apps/opie-write/qcomplextext.cpp
+++ b/noncore/apps/opie-write/qcomplextext.cpp
@@ -68,5 +68,2 @@ QBidiContext::~QBidiContext()
-static QChar *shapeBuffer = 0;
-static int shapeBufSize = 0;
-
/*
diff --git a/noncore/apps/opie-write/qrichtext.cpp b/noncore/apps/opie-write/qrichtext.cpp
index 7901000..3b044c3 100644
--- a/noncore/apps/opie-write/qrichtext.cpp
+++ b/noncore/apps/opie-write/qrichtext.cpp
@@ -43,5 +43,3 @@
#include "qfile.h"
-#include "qregexp.h"
#include "qapplication.h"
-#include "qclipboard.h"
#include "qmap.h"
@@ -50,3 +48,2 @@
#include "qmime.h"
-#include "qregexp.h"
#include "qimage.h"
@@ -66,5 +63,4 @@ using namespace Qt3;
-//#define PARSER_DEBUG
-//#define DEBUG_COLLECTION// ---> also in qrichtext_p.h
-//#define DEBUG_TABLE_RENDERING
+static QTextCursor* richTextExportStart = 0;
+static QTextCursor* richTextExportEnd = 0;
@@ -72,11 +68,4 @@ static QTextFormatCollection *qFormatCollection = 0;
-const int QStyleSheetItem_WhiteSpaceNoCompression = 3; // ### belongs in QStyleSheetItem, fix 3.1
-const int QStyleSheetItem_WhiteSpaceNormalWithNewlines = 4; // ### belongs in QStyleSheetItem, fix 3.1
-
const int border_tolerance = 2;
-#if defined(PARSER_DEBUG)
-static QString debug_indent;
-#endif
-
#ifdef Q_WS_WIN
@@ -85,2 +74,4 @@ static QString debug_indent;
+#define QChar_linesep QChar(0x2028U)
+
static inline bool is_printer( QPainter *p )
@@ -179,6 +170,4 @@ bool QTextCommandHistory::isRedoAvailable()
QTextDeleteCommand::QTextDeleteCommand( QTextDocument *d, int i, int idx, const QMemArray<QTextStringChar> &str,
- const QValueList< QPtrVector<QStyleSheetItem> > &os,
- const QValueList<QStyleSheetItem::ListStyle> &ols,
- const QMemArray<int> &oas)
- : QTextCommand( d ), id( i ), index( idx ), parag( 0 ), text( str ), oldStyles( os ), oldListStyles( ols ), oldAligns( oas )
+ const QByteArray& oldStyleInfo )
+ : QTextCommand( d ), id( i ), index( idx ), parag( 0 ), text( str ), styleInformation( oldStyleInfo )
{
@@ -190,3 +179,3 @@ QTextDeleteCommand::QTextDeleteCommand( QTextDocument *d, int i, int idx, const
-QTextDeleteCommand::QTextDeleteCommand( QTextParag *p, int idx, const QMemArray<QTextStringChar> &str )
+QTextDeleteCommand::QTextDeleteCommand( QTextParagraph *p, int idx, const QMemArray<QTextStringChar> &str )
: QTextCommand( 0 ), id( -1 ), index( idx ), parag( p ), text( str )
@@ -210,5 +199,5 @@ QTextCursor *QTextDeleteCommand::execute( QTextCursor *c )
{
- QTextParag *s = doc ? doc->paragAt( id ) : parag;
+ QTextParagraph *s = doc ? doc->paragAt( id ) : parag;
if ( !s ) {
- qWarning( "can't locate parag at %d, last parag: %d", id, doc->lastParag()->paragId() );
+ qWarning( "can't locate parag at %d, last parag: %d", id, doc->lastParagraph()->paragId() );
return 0;
@@ -216,3 +205,3 @@ QTextCursor *QTextDeleteCommand::execute( QTextCursor *c )
- cursor.setParag( s );
+ cursor.setParagraph( s );
cursor.setIndex( index );
@@ -222,6 +211,6 @@ QTextCursor *QTextDeleteCommand::execute( QTextCursor *c )
if ( doc ) {
- doc->setSelectionStart( QTextDocument::Temp, &cursor );
+ doc->setSelectionStart( QTextDocument::Temp, cursor );
for ( int i = 0; i < len; ++i )
cursor.gotoNextLetter();
- doc->setSelectionEnd( QTextDocument::Temp, &cursor );
+ doc->setSelectionEnd( QTextDocument::Temp, cursor );
doc->removeSelectedText( QTextDocument::Temp, &cursor );
@@ -238,5 +227,5 @@ QTextCursor *QTextDeleteCommand::unexecute( QTextCursor *c )
{
- QTextParag *s = doc ? doc->paragAt( id ) : parag;
+ QTextParagraph *s = doc ? doc->paragAt( id ) : parag;
if ( !s ) {
- qWarning( "can't locate parag at %d, last parag: %d", id, doc->lastParag()->paragId() );
+ qWarning( "can't locate parag at %d, last parag: %d", id, doc->lastParagraph()->paragId() );
return 0;
@@ -244,3 +233,3 @@ QTextCursor *QTextDeleteCommand::unexecute( QTextCursor *c )
- cursor.setParag( s );
+ cursor.setParagraph( s );
cursor.setIndex( index );
@@ -248,6 +237,6 @@ QTextCursor *QTextDeleteCommand::unexecute( QTextCursor *c )
cursor.insert( str, TRUE, &text );
- cursor.setParag( s );
+ cursor.setParagraph( s );
cursor.setIndex( index );
if ( c ) {
- c->setParag( s );
+ c->setParagraph( s );
c->setIndex( index );
@@ -257,29 +246,13 @@ QTextCursor *QTextDeleteCommand::unexecute( QTextCursor *c )
- QValueList< QPtrVector<QStyleSheetItem> >::Iterator it = oldStyles.begin();
- QValueList<QStyleSheetItem::ListStyle>::Iterator lit = oldListStyles.begin();
- int i = 0;
- QTextParag *p = s;
- bool end = FALSE;
- while ( p ) {
- if ( it != oldStyles.end() )
- p->setStyleSheetItems( *it );
- else
- end = TRUE;
- if ( lit != oldListStyles.end() )
- p->setListStyle( *lit );
- else
- end = TRUE;
- if ( i < (int)oldAligns.size() )
- p->setAlignment( oldAligns.at( i ) );
- else
- end = TRUE;
- if ( end )
- break;
- p = p->next();
- ++it;
- ++lit;
- ++i;
+ if ( !styleInformation.isEmpty() ) {
+ QDataStream styleStream( styleInformation, IO_ReadOnly );
+ int num;
+ styleStream >> num;
+ QTextParagraph *p = s;
+ while ( num-- && p ) {
+ p->readStyleInformation( styleStream );
+ p = p->next();
+ }
}
-
- s = cursor.parag();
+ s = cursor.paragraph();
while ( s ) {
@@ -287,3 +260,3 @@ QTextCursor *QTextDeleteCommand::unexecute( QTextCursor *c )
s->setChanged( TRUE );
- if ( s == c->parag() )
+ if ( s == c->paragraph() )
break;
@@ -317,4 +290,4 @@ QTextCursor *QTextFormatCommand::execute( QTextCursor *c )
{
- QTextParag *sp = doc->paragAt( startId );
- QTextParag *ep = doc->paragAt( endId );
+ QTextParagraph *sp = doc->paragAt( startId );
+ QTextParagraph *ep = doc->paragAt( endId );
if ( !sp || !ep )
@@ -323,10 +296,10 @@ QTextCursor *QTextFormatCommand::execute( QTextCursor *c )
QTextCursor start( doc );
- start.setParag( sp );
+ start.setParagraph( sp );
start.setIndex( startIndex );
QTextCursor end( doc );
- end.setParag( ep );
+ end.setParagraph( ep );
end.setIndex( endIndex );
- doc->setSelectionStart( QTextDocument::Temp, &start );
- doc->setSelectionEnd( QTextDocument::Temp, &end );
+ doc->setSelectionStart( QTextDocument::Temp, start );
+ doc->setSelectionEnd( QTextDocument::Temp, end );
doc->setFormat( QTextDocument::Temp, format, flags );
@@ -341,4 +314,4 @@ QTextCursor *QTextFormatCommand::unexecute( QTextCursor *c )
{
- QTextParag *sp = doc->paragAt( startId );
- QTextParag *ep = doc->paragAt( endId );
+ QTextParagraph *sp = doc->paragAt( startId );
+ QTextParagraph *ep = doc->paragAt( endId );
if ( !sp || !ep )
@@ -375,3 +348,3 @@ QTextCursor *QTextFormatCommand::unexecute( QTextCursor *c )
QTextCursor end( doc );
- end.setParag( ep );
+ end.setParagraph( ep );
end.setIndex( endIndex );
@@ -383,56 +356,42 @@ QTextCursor *QTextFormatCommand::unexecute( QTextCursor *c )
-QTextAlignmentCommand::QTextAlignmentCommand( QTextDocument *d, int fParag, int lParag, int na, const QMemArray<int> &oa )
- : QTextCommand( d ), firstParag( fParag ), lastParag( lParag ), newAlign( na ), oldAligns( oa )
+QTextStyleCommand::QTextStyleCommand( QTextDocument *d, int fParag, int lParag, const QByteArray& beforeChange )
+ : QTextCommand( d ), firstParag( fParag ), lastParag( lParag ), before( beforeChange )
{
+ after = readStyleInformation( d, fParag, lParag );
}
-QTextCursor *QTextAlignmentCommand::execute( QTextCursor *c )
+
+QByteArray QTextStyleCommand::readStyleInformation( QTextDocument* doc, int fParag, int lParag )
{
- QTextParag *p = doc->paragAt( firstParag );
+ QByteArray style;
+ QTextParagraph *p = doc->paragAt( fParag );
if ( !p )
- return c;
- while ( p ) {
- p->setAlignment( newAlign );
- if ( p->paragId() == lastParag )
- break;
+ return style;
+ QDataStream styleStream( style, IO_WriteOnly );
+ int num = lParag - fParag + 1;
+ styleStream << num;
+ while ( num -- && p ) {
+ p->writeStyleInformation( styleStream );
p = p->next();
}
- return c;
+ return style;
}
-QTextCursor *QTextAlignmentCommand::unexecute( QTextCursor *c )
+void QTextStyleCommand::writeStyleInformation( QTextDocument* doc, int fParag, const QByteArray& style )
{
- QTextParag *p = doc->paragAt( firstParag );
+ QTextParagraph *p = doc->paragAt( fParag );
if ( !p )
- return c;
- int i = 0;
- while ( p ) {
- if ( i < (int)oldAligns.size() )
- p->setAlignment( oldAligns.at( i ) );
- if ( p->paragId() == lastParag )
- break;
+ return;
+ QDataStream styleStream( style, IO_ReadOnly );
+ int num;
+ styleStream >> num;
+ while ( num-- && p ) {
+ p->readStyleInformation( styleStream );
p = p->next();
- ++i;
}
- return c;
-}
-
-QTextParagTypeCommand::QTextParagTypeCommand( QTextDocument *d, int fParag, int lParag, bool l,
- QStyleSheetItem::ListStyle s, const QValueList< QPtrVector<QStyleSheetItem> > &os,
- const QValueList<QStyleSheetItem::ListStyle> &ols )
- : QTextCommand( d ), firstParag( fParag ), lastParag( lParag ), list( l ), listStyle( s ), oldStyles( os ), oldListStyles( ols )
-{
}
-QTextCursor *QTextParagTypeCommand::execute( QTextCursor *c )
+QTextCursor *QTextStyleCommand::execute( QTextCursor *c )
{
- QTextParag *p = doc->paragAt( firstParag );
- if ( !p )
- return c;
- while ( p ) {
- p->setList( list, (int)listStyle );
- if ( p->paragId() == lastParag )
- break;
- p = p->next();
- }
+ writeStyleInformation( doc, firstParag, after );
return c;
@@ -440,20 +399,5 @@ QTextCursor *QTextParagTypeCommand::execute( QTextCursor *c )
-QTextCursor *QTextParagTypeCommand::unexecute( QTextCursor *c )
+QTextCursor *QTextStyleCommand::unexecute( QTextCursor *c )
{
- QTextParag *p = doc->paragAt( firstParag );
- if ( !p )
- return c;
- QValueList< QPtrVector<QStyleSheetItem> >::Iterator it = oldStyles.begin();
- QValueList<QStyleSheetItem::ListStyle>::Iterator lit = oldListStyles.begin();
- while ( p ) {
- if ( it != oldStyles.end() )
- p->setStyleSheetItems( *it );
- if ( lit != oldListStyles.end() )
- p->setListStyle( *lit );
- if ( p->paragId() == lastParag )
- break;
- p = p->next();
- ++it;
- ++lit;
- }
+ writeStyleInformation( doc, firstParag, before );
return c;
@@ -464,13 +408,6 @@ QTextCursor *QTextParagTypeCommand::unexecute( QTextCursor *c )
QTextCursor::QTextCursor( QTextDocument *d )
- : doc( d ), ox( 0 ), oy( 0 )
-{
- nested = FALSE;
- idx = 0;
- string = doc ? doc->firstParag() : 0;
- tmpIndex = -1;
- valid = TRUE;
-}
-
-QTextCursor::QTextCursor()
+ : idx( 0 ), tmpIndex( -1 ), ox( 0 ), oy( 0 ),
+ valid( TRUE )
{
+ para = d ? d->firstParagraph() : 0;
}
@@ -479,11 +416,9 @@ QTextCursor::QTextCursor( const QTextCursor &c )
{
- doc = c.doc;
ox = c.ox;
oy = c.oy;
- nested = c.nested;
idx = c.idx;
- string = c.string;
+ para = c.para;
tmpIndex = c.tmpIndex;
indices = c.indices;
- parags = c.parags;
+ paras = c.paras;
xOffsets = c.xOffsets;
@@ -495,11 +430,9 @@ QTextCursor &QTextCursor::operator=( const QTextCursor &c )
{
- doc = c.doc;
ox = c.ox;
oy = c.oy;
- nested = c.nested;
idx = c.idx;
- string = c.string;
+ para = c.para;
tmpIndex = c.tmpIndex;
indices = c.indices;
- parags = c.parags;
+ paras = c.paras;
xOffsets = c.xOffsets;
@@ -513,3 +446,3 @@ bool QTextCursor::operator==( const QTextCursor &c ) const
{
- return doc == c.doc && string == c.string && idx == c.idx;
+ return para == c.para && idx == c.idx;
}
@@ -518,7 +451,4 @@ int QTextCursor::totalOffsetX() const
{
- if ( !nested )
- return 0;
- QValueStack<int>::ConstIterator xit = xOffsets.begin();
int xoff = ox;
- for ( ; xit != xOffsets.end(); ++xit )
+ for ( QValueStack<int>::ConstIterator xit = xOffsets.begin(); xit != xOffsets.end(); ++xit )
xoff += *xit;
@@ -529,7 +459,4 @@ int QTextCursor::totalOffsetY() const
{
- if ( !nested )
- return 0;
- QValueStack<int>::ConstIterator yit = yOffsets.begin();
int yoff = oy;
- for ( ; yit != yOffsets.end(); ++yit )
+ for ( QValueStack<int>::ConstIterator yit = yOffsets.begin(); yit != yOffsets.end(); ++yit )
yoff += *yit;
@@ -540,3 +467,3 @@ void QTextCursor::gotoIntoNested( const QPoint &globalPos )
{
- if ( !doc )
+ if ( !para )
return;
@@ -545,9 +472,10 @@ void QTextCursor::gotoIntoNested( const QPoint &globalPos )
int bl, y;
- string->lineHeightOfChar( idx, &bl, &y );
- oy = y + string->rect().y();
- nested = TRUE;
+ para->lineHeightOfChar( idx, &bl, &y );
+ oy = y + para->rect().y();
QPoint p( globalPos.x() - offsetX(), globalPos.y() - offsetY() );
- Q_ASSERT( string->at( idx )->isCustom() );
- ox = string->at( idx )->x;
- string->at( idx )->customItem()->enterAt( this, doc, string, idx, ox, oy, p );
+ Q_ASSERT( para->at( idx )->isCustom() );
+ ox = para->at( idx )->x;
+
+ QTextDocument* doc = document();
+ para->at( idx )->customItem()->enterAt( this, doc, para, idx, ox, oy, p );
}
@@ -556,12 +484,10 @@ void QTextCursor::invalidateNested()
{
- if ( nested ) {
- QValueStack<QTextParag*>::Iterator it = parags.begin();
- QValueStack<int>::Iterator it2 = indices.begin();
- for ( ; it != parags.end(); ++it, ++it2 ) {
- if ( *it == string )
- continue;
- (*it)->invalidate( 0 );
- if ( (*it)->at( *it2 )->isCustom() )
- (*it)->at( *it2 )->customItem()->invalidate();
- }
+ QValueStack<QTextParagraph*>::Iterator it = paras.begin();
+ QValueStack<int>::Iterator it2 = indices.begin();
+ for ( ; it != paras.end(); ++it, ++it2 ) {
+ if ( *it == para )
+ continue;
+ (*it)->invalidate( 0 );
+ if ( (*it)->at( *it2 )->isCustom() )
+ (*it)->at( *it2 )->customItem()->invalidate();
}
@@ -575,4 +501,7 @@ void QTextCursor::insert( const QString &str, bool checkNewLine, QMemArray<QText
#if defined(Q_WS_WIN)
- if ( checkNewLine )
- s = s.replace( QRegExp( "\\r" ), "" );
+ if ( checkNewLine ) {
+ int i = 0;
+ while ( ( i = s.find( '\r', i ) ) != -1 )
+ s.remove( i ,1 );
+ }
#endif
@@ -580,4 +509,4 @@ void QTextCursor::insert( const QString &str, bool checkNewLine, QMemArray<QText
justInsert = s.find( '\n' ) == -1;
- if ( justInsert ) {
- string->insert( idx, s );
+ if ( justInsert ) { // we ignore new lines and insert all in the current para at the current index
+ para->insert( idx, s.unicode(), s.length() );
if ( formatting ) {
@@ -586,3 +515,3 @@ void QTextCursor::insert( const QString &str, bool checkNewLine, QMemArray<QText
formatting->at( i ).format()->addRef();
- string->string()->setFormat( idx + i, formatting->at( i ).format(), TRUE );
+ para->string()->setFormat( idx + i, formatting->at( i ).format(), TRUE );
}
@@ -591,27 +520,17 @@ void QTextCursor::insert( const QString &str, bool checkNewLine, QMemArray<QText
idx += s.length();
- } else {
- QStringList lst = QStringList::split( '\n', s, TRUE );
- QStringList::Iterator it = lst.begin();
- int y = string->rect().y() + string->rect().height();
+ } else { // we split at new lines
+ int start = -1;
+ int end;
+ int y = para->rect().y() + para->rect().height();
int lastIndex = 0;
- QTextFormat *lastFormat = 0;
- for ( ; it != lst.end(); ) {
- if ( it != lst.begin() ) {
- splitAndInsertEmptyParag( FALSE, TRUE );
- string->setEndState( -1 );
- string->prev()->format( -1, FALSE );
- if ( lastFormat && formatting && string->prev() ) {
- lastFormat->addRef();
- string->prev()->string()->setFormat( string->prev()->length() - 1, lastFormat, TRUE );
- }
- }
- lastFormat = 0;
- QString s = *it;
- ++it;
- if ( !s.isEmpty() )
- string->insert( idx, s );
+ do {
+ end = s.find( '\n', start + 1 ); // find line break
+ if ( end == -1 ) // didn't find one, so end of line is end of string
+ end = s.length();
+ int len = (start == -1 ? end : end - start - 1);
+ if ( len > 0 ) // insert the line
+ para->insert( idx, s.unicode() + start + 1, len );
else
- string->invalidate( 0 );
- if ( formatting ) {
- int len = s.length();
+ para->invalidate( 0 );
+ if ( formatting ) { // set formats to the chars of the line
for ( int i = 0; i < len; ++i ) {
@@ -619,17 +538,22 @@ void QTextCursor::insert( const QString &str, bool checkNewLine, QMemArray<QText
formatting->at( i + lastIndex ).format()->addRef();
- string->string()->setFormat( i + idx, formatting->at( i + lastIndex ).format(), TRUE );
+ para->string()->setFormat( i + idx, formatting->at( i + lastIndex ).format(), TRUE );
}
}
- if ( it != lst.end() )
- lastFormat = formatting->at( len + lastIndex ).format();
- ++len;
lastIndex += len;
}
+ start = end; // next start is at the end of this line
+ idx += len; // increase the index of the cursor to the end of the inserted text
+ if ( s[end] == '\n' ) { // if at the end was a line break, break the line
+ splitAndInsertEmptyParagraph( FALSE, TRUE );
+ para->setEndState( -1 );
+ para->prev()->format( -1, FALSE );
+ lastIndex++;
+ }
- idx += s.length();
- }
- string->format( -1, FALSE );
- int dy = string->rect().y() + string->rect().height() - y;
- QTextParag *p = string;
- p->setParagId( p->prev()->paragId() + 1 );
+ } while ( end < (int)s.length() );
+
+ para->format( -1, FALSE );
+ int dy = para->rect().y() + para->rect().height() - y;
+ QTextParagraph *p = para;
+ p->setParagId( p->prev() ? p->prev()->paragId() + 1 : 0 );
p = p->next();
@@ -644,8 +568,8 @@ void QTextCursor::insert( const QString &str, bool checkNewLine, QMemArray<QText
- int h = string->rect().height();
- string->format( -1, TRUE );
- if ( h != string->rect().height() )
+ int h = para->rect().height();
+ para->format( -1, TRUE );
+ if ( h != para->rect().height() )
invalidateNested();
- else if ( doc && doc->parent() )
- doc->nextDoubleBuffered = TRUE;
+ else if ( para->document() && para->document()->parent() )
+ para->document()->nextDoubleBuffered = TRUE;
}
@@ -654,3 +578,3 @@ void QTextCursor::gotoLeft()
{
- if ( string->string()->isRightToLeft() )
+ if ( para->string()->isRightToLeft() )
gotoNextLetter();
@@ -666,22 +590,20 @@ void QTextCursor::gotoPreviousLetter()
idx--;
- } else if ( string->prev() ) {
- QTextParag *s = string->prev();
- while ( s && !s->isVisible() )
- s = s->prev();
- if ( s ) {
- string = s;
- idx = string->length() - 1;
- }
- } else {
- if ( nested ) {
+ const QTextStringChar *tsc = para->at( idx );
+ if ( tsc && tsc->isCustom() && tsc->customItem()->isNested() )
+ processNesting( EnterEnd );
+ } else if ( para->prev() ) {
+ para = para->prev();
+ while ( !para->isVisible() && para->prev() )
+ para = para->prev();
+ idx = para->length() - 1;
+ } else if ( nestedDepth() ) {
+ pop();
+ processNesting( Prev );
+ if ( idx == -1 ) {
pop();
- processNesting( Prev );
- if ( idx == -1 ) {
- pop();
- if ( idx > 0 ) {
- idx--;
- } else if ( string->prev() ) {
- string = string->prev();
- idx = string->length() - 1;
- }
+ if ( idx > 0 ) {
+ idx--;
+ } else if ( para->prev() ) {
+ para = para->prev();
+ idx = para->length() - 1;
}
@@ -689,7 +611,2 @@ void QTextCursor::gotoPreviousLetter()
}
-
- const QTextStringChar *tsc = string->at( idx );
- if ( tsc && tsc->isCustom() && tsc->customItem()->isNested() ) {
- processNesting( EnterEnd );
- }
}
@@ -699,6 +616,5 @@ void QTextCursor::push()
indices.push( idx );
- parags.push( string );
+ paras.push( para );
xOffsets.push( ox );
yOffsets.push( oy );
- nestedStack.push( nested );
}
@@ -707,11 +623,8 @@ void QTextCursor::pop()
{
- if ( !doc )
+ if ( indices.isEmpty() )
return;
idx = indices.pop();
- string = parags.pop();
+ para = paras.pop();
ox = xOffsets.pop();
oy = yOffsets.pop();
- if ( doc->parent() )
- doc = doc->parent();
- nested = nestedStack.pop();
}
@@ -724,3 +637,3 @@ void QTextCursor::restoreState()
-bool QTextCursor::place( const QPoint &p, QTextParag *s, bool link )
+bool QTextCursor::place( const QPoint &p, QTextParagraph *s, bool link )
{
@@ -728,3 +641,3 @@ bool QTextCursor::place( const QPoint &p, QTextParag *s, bool link )
QRect r;
- QTextParag *str = s;
+ QTextParagraph *str = s;
if ( pos.y() < s->rect().y() )
@@ -733,3 +646,3 @@ bool QTextCursor::place( const QPoint &p, QTextParag *s, bool link )
r = s->rect();
- r.setWidth( doc ? doc->width() : QWIDGETSIZE_MAX );
+ r.setWidth( document() ? document()->width() : QWIDGETSIZE_MAX );
if ( s->isVisible() )
@@ -746,3 +659,3 @@ bool QTextCursor::place( const QPoint &p, QTextParag *s, bool link )
- setParag( s, FALSE );
+ setParagraph( s );
int y = s->rect().y();
@@ -760,3 +673,3 @@ bool QTextCursor::place( const QPoint &p, QTextParag *s, bool link )
return FALSE;
- if ( pos.y() >= y + cy && pos.y() <= y + cy + ch )
+ if ( pos.y() <= y + cy + ch )
break;
@@ -800,11 +713,11 @@ bool QTextCursor::place( const QPoint &p, QTextParag *s, bool link )
}
- setIndex( curpos, FALSE );
+ setIndex( curpos );
- if ( inCustom && doc && parag()->at( curpos )->isCustom() && parag()->at( curpos )->customItem()->isNested() ) {
- QTextDocument *oldDoc = doc;
+ if ( inCustom && para->document() && para->at( curpos )->isCustom() && para->at( curpos )->customItem()->isNested() ) {
+ QTextDocument *oldDoc = para->document();
gotoIntoNested( pos );
- if ( oldDoc == doc )
+ if ( oldDoc == para->document() )
return TRUE;
QPoint p( pos.x() - offsetX(), pos.y() - offsetY() );
- if ( !place( p, document()->firstParag(), link ) )
+ if ( !place( p, document()->firstParagraph(), link ) )
pop();
@@ -816,10 +729,10 @@ void QTextCursor::processNesting( Operation op )
{
- if ( !doc )
+ if ( !para->document() )
return;
+ QTextDocument* doc = para->document();
push();
- ox = string->at( idx )->x;
+ ox = para->at( idx )->x;
int bl, y;
- string->lineHeightOfChar( idx, &bl, &y );
- oy = y + string->rect().y();
- nested = TRUE;
+ para->lineHeightOfChar( idx, &bl, &y );
+ oy = y + para->rect().y();
bool ok = FALSE;
@@ -828,18 +741,18 @@ void QTextCursor::processNesting( Operation op )
case EnterBegin:
- ok = string->at( idx )->customItem()->enter( this, doc, string, idx, ox, oy );
+ ok = para->at( idx )->customItem()->enter( this, doc, para, idx, ox, oy );
break;
case EnterEnd:
- ok = string->at( idx )->customItem()->enter( this, doc, string, idx, ox, oy, TRUE );
+ ok = para->at( idx )->customItem()->enter( this, doc, para, idx, ox, oy, TRUE );
break;
case Next:
- ok = string->at( idx )->customItem()->next( this, doc, string, idx, ox, oy );
+ ok = para->at( idx )->customItem()->next( this, doc, para, idx, ox, oy );
break;
case Prev:
- ok = string->at( idx )->customItem()->prev( this, doc, string, idx, ox, oy );
+ ok = para->at( idx )->customItem()->prev( this, doc, para, idx, ox, oy );
break;
case Down:
- ok = string->at( idx )->customItem()->down( this, doc, string, idx, ox, oy );
+ ok = para->at( idx )->customItem()->down( this, doc, para, idx, ox, oy );
break;
case Up:
- ok = string->at( idx )->customItem()->up( this, doc, string, idx, ox, oy );
+ ok = para->at( idx )->customItem()->up( this, doc, para, idx, ox, oy );
break;
@@ -852,3 +765,3 @@ void QTextCursor::gotoRight()
{
- if ( string->string()->isRightToLeft() )
+ if ( para->string()->isRightToLeft() )
gotoPreviousLetter();
@@ -862,3 +775,3 @@ void QTextCursor::gotoNextLetter()
- const QTextStringChar *tsc = string->at( idx );
+ const QTextStringChar *tsc = para->at( idx );
if ( tsc && tsc->isCustom() && tsc->customItem()->isNested() ) {
@@ -868,24 +781,19 @@ void QTextCursor::gotoNextLetter()
- if ( idx < string->length() - 1 ) {
+ if ( idx < para->length() - 1 ) {
idx++;
- } else if ( string->next() ) {
- QTextParag *s = string->next();
- while ( s && !s->isVisible() )
- s = s->next();
- if ( s ) {
- string = s;
- idx = 0;
- }
- } else {
- if ( nested ) {
+ } else if ( para->next() ) {
+ para = para->next();
+ while ( !para->isVisible() && para->next() )
+ para = para->next();
+ idx = 0;
+ } else if ( nestedDepth() ) {
+ pop();
+ processNesting( Next );
+ if ( idx == -1 ) {
pop();
- processNesting( Next );
- if ( idx == -1 ) {
- pop();
- if ( idx < string->length() - 1 ) {
- idx++;
- } else if ( string->next() ) {
- string = string->next();
- idx = 0;
- }
+ if ( idx < para->length() - 1 ) {
+ idx++;
+ } else if ( para->next() ) {
+ para = para->next();
+ idx = 0;
}
@@ -899,3 +807,3 @@ void QTextCursor::gotoUp()
int line;
- QTextStringChar *c = string->lineStartOfChar( idx, &indexOfLineStart, &line );
+ QTextStringChar *c = para->lineStartOfChar( idx, &indexOfLineStart, &line );
if ( !c )
@@ -905,4 +813,4 @@ void QTextCursor::gotoUp()
if ( indexOfLineStart == 0 ) {
- if ( !string->prev() ) {
- if ( !nested )
+ if ( !para->prev() ) {
+ if ( !nestedDepth() )
return;
@@ -912,3 +820,3 @@ void QTextCursor::gotoUp()
pop();
- if ( !string->prev() )
+ if ( !para->prev() )
return;
@@ -920,14 +828,14 @@ void QTextCursor::gotoUp()
}
- QTextParag *s = string->prev();
- while ( s && !s->isVisible() )
- s = s->prev();
- if ( s )
- string = s;
- int lastLine = string->lines() - 1;
- if ( !string->lineStartOfLine( lastLine, &indexOfLineStart ) )
+ QTextParagraph *p = para->prev();
+ while ( p && !p->isVisible() )
+ p = p->prev();
+ if ( p )
+ para = p;
+ int lastLine = para->lines() - 1;
+ if ( !para->lineStartOfLine( lastLine, &indexOfLineStart ) )
return;
- if ( indexOfLineStart + tmpIndex < string->length() )
+ if ( indexOfLineStart + tmpIndex < para->length() )
idx = indexOfLineStart + tmpIndex;
else
- idx = string->length() - 1;
+ idx = para->length() - 1;
} else {
@@ -935,3 +843,3 @@ void QTextCursor::gotoUp()
int oldIndexOfLineStart = indexOfLineStart;
- if ( !string->lineStartOfLine( line, &indexOfLineStart ) )
+ if ( !para->lineStartOfLine( line, &indexOfLineStart ) )
return;
@@ -948,3 +856,3 @@ void QTextCursor::gotoDown()
int line;
- QTextStringChar *c = string->lineStartOfChar( idx, &indexOfLineStart, &line );
+ QTextStringChar *c = para->lineStartOfChar( idx, &indexOfLineStart, &line );
if ( !c )
@@ -953,5 +861,5 @@ void QTextCursor::gotoDown()
tmpIndex = QMAX( tmpIndex, idx - indexOfLineStart );
- if ( line == string->lines() - 1 ) {
- if ( !string->next() ) {
- if ( !nested )
+ if ( line == para->lines() - 1 ) {
+ if ( !para->next() ) {
+ if ( !nestedDepth() )
return;
@@ -961,3 +869,3 @@ void QTextCursor::gotoDown()
pop();
- if ( !string->next() )
+ if ( !para->next() )
return;
@@ -969,3 +877,3 @@ void QTextCursor::gotoDown()
}
- QTextParag *s = string->next();
+ QTextParagraph *s = para->next();
while ( s && !s->isVisible() )
@@ -973,10 +881,10 @@ void QTextCursor::gotoDown()
if ( s )
- string = s;
- if ( !string->lineStartOfLine( 0, &indexOfLineStart ) )
+ para = s;
+ if ( !para->lineStartOfLine( 0, &indexOfLineStart ) )
return;
int end;
- if ( string->lines() == 1 )
- end = string->length();
+ if ( para->lines() == 1 )
+ end = para->length();
else
- string->lineStartOfLine( 1, &end );
+ para->lineStartOfLine( 1, &end );
if ( indexOfLineStart + tmpIndex < end )
@@ -988,7 +896,7 @@ void QTextCursor::gotoDown()
int end;
- if ( line == string->lines() - 1 )
- end = string->length();
+ if ( line == para->lines() - 1 )
+ end = para->length();
else
- string->lineStartOfLine( line + 1, &end );
- if ( !string->lineStartOfLine( line, &indexOfLineStart ) )
+ para->lineStartOfLine( line + 1, &end );
+ if ( !para->lineStartOfLine( line, &indexOfLineStart ) )
return;
@@ -1006,3 +914,3 @@ void QTextCursor::gotoLineEnd()
int line;
- QTextStringChar *c = string->lineStartOfChar( idx, &indexOfLineStart, &line );
+ QTextStringChar *c = para->lineStartOfChar( idx, &indexOfLineStart, &line );
if ( !c )
@@ -1010,6 +918,6 @@ void QTextCursor::gotoLineEnd()
- if ( line == string->lines() - 1 ) {
- idx = string->length() - 1;
+ if ( line == para->lines() - 1 ) {
+ idx = para->length() - 1;
} else {
- c = string->lineStartOfLine( ++line, &indexOfLineStart );
+ c = para->lineStartOfLine( ++line, &indexOfLineStart );
indexOfLineStart--;
@@ -1024,3 +932,3 @@ void QTextCursor::gotoLineStart()
int line;
- QTextStringChar *c = string->lineStartOfChar( idx, &indexOfLineStart, &line );
+ QTextStringChar *c = para->lineStartOfChar( idx, &indexOfLineStart, &line );
if ( !c )
@@ -1033,6 +941,6 @@ void QTextCursor::gotoHome()
{
- tmpIndex = -1;
- if ( doc )
- string = doc->firstParag();
- idx = 0;
+ if ( topParagraph()->document() )
+ gotoPosition( topParagraph()->document()->firstParagraph() );
+ else
+ gotoLineStart();
}
@@ -1041,9 +949,7 @@ void QTextCursor::gotoEnd()
{
- if ( doc && !doc->lastParag()->isValid() )
- return;
-
- tmpIndex = -1;
- if ( doc )
- string = doc->lastParag();
- idx = string->length() - 1;
+ if ( topParagraph()->document() && topParagraph()->document()->lastParagraph()->isValid() )
+ gotoPosition( topParagraph()->document()->lastParagraph(),
+ topParagraph()->document()->lastParagraph()->length() - 1);
+ else
+ gotoLineEnd();
}
@@ -1052,17 +958,8 @@ void QTextCursor::gotoPageUp( int visibleHeight )
{
- tmpIndex = -1;
- QTextParag *s = string;
- int h = visibleHeight;
- int y = s->rect().y();
- while ( s ) {
- if ( y - s->rect().y() >= h )
- break;
- s = s->prev();
- }
-
- if ( !s && doc )
- s = doc->firstParag();
-
- string = s;
- idx = 0;
+ int targetY = globalY() - visibleHeight;
+ QTextParagraph* old; int index;
+ do {
+ old = para; index = idx;
+ gotoUp();
+ } while ( (old != para || index != idx) && globalY() > targetY );
}
@@ -1071,24 +968,8 @@ void QTextCursor::gotoPageDown( int visibleHeight )
{
- tmpIndex = -1;
- QTextParag *s = string;
- int h = visibleHeight;
- int y = s->rect().y();
- while ( s ) {
- if ( s->rect().y() - y >= h )
- break;
- s = s->next();
- }
-
- if ( !s && doc ) {
- s = doc->lastParag();
- string = s;
- idx = string->length() - 1;
- return;
- }
-
- if ( !s->isValid() )
- return;
-
- string = s;
- idx = 0;
+ int targetY = globalY() + visibleHeight;
+ QTextParagraph* old; int index;
+ do {
+ old = para; index = idx;
+ gotoDown();
+ } while ( (old != para || index != idx) && globalY() < targetY );
}
@@ -1097,3 +978,3 @@ void QTextCursor::gotoWordRight()
{
- if ( string->string()->isRightToLeft() )
+ if ( para->string()->isRightToLeft() )
gotoPreviousWord();
@@ -1105,3 +986,3 @@ void QTextCursor::gotoWordLeft()
{
- if ( string->string()->isRightToLeft() )
+ if ( para->string()->isRightToLeft() )
gotoNextWord();
@@ -1115,3 +996,3 @@ void QTextCursor::gotoPreviousWord()
tmpIndex = -1;
- QTextString *s = string->string();
+ QTextString *s = para->string();
bool allowSame = FALSE;
@@ -1137,3 +1018,3 @@ void QTextCursor::gotoNextWord()
tmpIndex = -1;
- QTextString *s = string->string();
+ QTextString *s = para->string();
bool allowSame = FALSE;
@@ -1155,8 +1036,8 @@ void QTextCursor::gotoNextWord()
gotoLineEnd();
- } else if ( string->next() ) {
- QTextParag *s = string->next();
- while ( s && !s->isVisible() )
- s = s->next();
+ } else if ( para->next() ) {
+ QTextParagraph *p = para->next();
+ while ( p && !p->isVisible() )
+ p = p->next();
if ( s ) {
- string = s;
+ para = p;
idx = 0;
@@ -1175,8 +1056,8 @@ bool QTextCursor::atParagEnd()
{
- return idx == string->length() - 1;
+ return idx == para->length() - 1;
}
-void QTextCursor::splitAndInsertEmptyParag( bool ind, bool updateIds )
+void QTextCursor::splitAndInsertEmptyParagraph( bool ind, bool updateIds )
{
- if ( !doc )
+ if ( !para->document() )
return;
@@ -1184,9 +1065,9 @@ void QTextCursor::splitAndInsertEmptyParag( bool ind, bool updateIds )
QTextFormat *f = 0;
- if ( doc->useFormatCollection() ) {
- f = string->at( idx )->format();
- if ( idx == string->length() - 1 && idx > 0 )
- f = string->at( idx - 1 )->format();
+ if ( para->document()->useFormatCollection() ) {
+ f = para->at( idx )->format();
+ if ( idx == para->length() - 1 && idx > 0 )
+ f = para->at( idx - 1 )->format();
if ( f->isMisspelled() ) {
f->removeRef();
- f = doc->formatCollection()->format( f->font(), f->color() );
+ f = para->document()->formatCollection()->format( f->font(), f->color() );
}
@@ -1195,7 +1076,7 @@ void QTextCursor::splitAndInsertEmptyParag( bool ind, bool updateIds )
if ( atParagEnd() ) {
- QTextParag *n = string->next();
- QTextParag *s = doc->createParag( doc, string, n, updateIds );
+ QTextParagraph *n = para->next();
+ QTextParagraph *s = para->document()->createParagraph( para->document(), para, n, updateIds );
if ( f )
s->setFormat( 0, 1, f, TRUE );
- s->copyParagData( string );
+ s->copyParagData( para );
if ( ind ) {
@@ -1203,6 +1084,6 @@ void QTextCursor::splitAndInsertEmptyParag( bool ind, bool updateIds )
s->indent( &oi, &ni );
- string = s;
+ para = s;
idx = ni;
} else {
- string = s;
+ para = s;
idx = 0;
@@ -1210,7 +1091,7 @@ void QTextCursor::splitAndInsertEmptyParag( bool ind, bool updateIds )
} else if ( atParagStart() ) {
- QTextParag *p = string->prev();
- QTextParag *s = doc->createParag( doc, p, string, updateIds );
+ QTextParagraph *p = para->prev();
+ QTextParagraph *s = para->document()->createParagraph( para->document(), p, para, updateIds );
if ( f )
s->setFormat( 0, 1, f, TRUE );
- s->copyParagData( string );
+ s->copyParagData( para );
if ( ind ) {
@@ -1219,9 +1100,9 @@ void QTextCursor::splitAndInsertEmptyParag( bool ind, bool updateIds )
indent();
- string->format();
+ para->format();
}
} else {
- QString str = string->string()->toString().mid( idx, 0xFFFFFF );
- QTextParag *n = string->next();
- QTextParag *s = doc->createParag( doc, string, n, updateIds );
- s->copyParagData( string );
+ QString str = para->string()->toString().mid( idx, 0xFFFFFF );
+ QTextParagraph *n = para->next();
+ QTextParagraph *s = para->document()->createParagraph( para->document(), para, n, updateIds );
+ s->copyParagData( para );
s->remove( 0, 1 );
@@ -1229,10 +1110,14 @@ void QTextCursor::splitAndInsertEmptyParag( bool ind, bool updateIds )
for ( uint i = 0; i < str.length(); ++i ) {
- s->setFormat( i, 1, string->at( idx + i )->format(), TRUE );
- if ( string->at( idx + i )->isCustom() ) {
- QTextCustomItem * item = string->at( idx + i )->customItem();
+ QTextStringChar* tsc = para->at( idx + i );
+ s->setFormat( i, 1, tsc->format(), TRUE );
+ if ( tsc->isCustom() ) {
+ QTextCustomItem * item = tsc->customItem();
s->at( i )->setCustomItem( item );
- string->at( idx + i )->loseCustomItem();
+ tsc->loseCustomItem();
}
+ if ( tsc->isAnchor() )
+ s->at( i )->setAnchor( tsc->anchorName(),
+ tsc->anchorHref() );
}
- string->truncate( idx );
+ para->truncate( idx );
if ( ind ) {
@@ -1240,6 +1125,6 @@ void QTextCursor::splitAndInsertEmptyParag( bool ind, bool updateIds )
s->indent( &oi, &ni );
- string = s;
+ para = s;
idx = ni;
} else {
- string = s;
+ para = s;
idx = 0;
@@ -1255,31 +1140,12 @@ bool QTextCursor::remove()
if ( !atParagEnd() ) {
- string->remove( idx, 1 );
- int h = string->rect().height();
- string->format( -1, TRUE );
- if ( h != string->rect().height() )
+ para->remove( idx, 1 );
+ int h = para->rect().height();
+ para->format( -1, TRUE );
+ if ( h != para->rect().height() )
invalidateNested();
- else if ( doc && doc->parent() )
- doc->nextDoubleBuffered = TRUE;
+ else if ( para->document() && para->document()->parent() )
+ para->document()->nextDoubleBuffered = TRUE;
return FALSE;
- } else if ( string->next() ) {
- if ( string->length() == 1 ) {
- string->next()->setPrev( string->prev() );
- if ( string->prev() )
- string->prev()->setNext( string->next() );
- QTextParag *p = string->next();
- delete string;
- string = p;
- string->invalidate( 0 );
- QTextParag *s = string;
- while ( s ) {
- s->id = s->p ? s->p->id + 1 : 0;
- s->state = -1;
- s->needPreProcess = TRUE;
- s->changed = TRUE;
- s = s->n;
- }
- string->format();
- } else {
- string->join( string->next() );
- }
+ } else if ( para->next() ) {
+ para->join( para->next() );
invalidateNested();
@@ -1290,15 +1156,2 @@ bool QTextCursor::remove()
-void QTextCursor::killLine()
-{
- if ( atParagEnd() )
- return;
- string->remove( idx, string->length() - idx - 1 );
- int h = string->rect().height();
- string->format( -1, TRUE );
- if ( h != string->rect().height() )
- invalidateNested();
- else if ( doc && doc->parent() )
- doc->nextDoubleBuffered = TRUE;
-}
-
void QTextCursor::indent()
@@ -1306,3 +1159,3 @@ void QTextCursor::indent()
int oi = 0, ni = 0;
- string->indent( &oi, &ni );
+ para->indent( &oi, &ni );
if ( oi == ni )
@@ -1316,12 +1169,2 @@ void QTextCursor::indent()
-void QTextCursor::setDocument( QTextDocument *d )
-{
- doc = d;
- string = d->firstParag();
- idx = 0;
- nested = FALSE;
- restoreState();
- tmpIndex = -1;
-}
-
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -1329,3 +1172,3 @@ void QTextCursor::setDocument( QTextDocument *d )
QTextDocument::QTextDocument( QTextDocument *p )
- : par( p ), parParag( 0 ), tc( 0 ), tArray( 0 ), tStopWidth( 0 )
+ : par( p ), parentPar( 0 ), tc( 0 ), tArray( 0 ), tStopWidth( 0 )
{
@@ -1336,3 +1179,3 @@ QTextDocument::QTextDocument( QTextDocument *p )
QTextDocument::QTextDocument( QTextDocument *p, QTextFormatCollection *f )
- : par( p ), parParag( 0 ), tc( 0 ), tArray( 0 ), tStopWidth( 0 )
+ : par( p ), parentPar( 0 ), tc( 0 ), tArray( 0 ), tStopWidth( 0 )
{
@@ -1344,5 +1187,2 @@ void QTextDocument::init()
{
-#if defined(PARSER_DEBUG)
- qDebug( debug_indent + "new QTextDocument (%p)", this );
-#endif
oTextValid = TRUE;
@@ -1365,8 +1205,6 @@ void QTextDocument::init()
nSelections = 1;
- addMargs = FALSE;
- sheet_ = QStyleSheet::defaultSheet();
+ setStyleSheet( QStyleSheet::defaultSheet() );
factory_ = QMimeSourceFactory::defaultFactory();
contxt = QString::null;
- fCollection->setStyleSheet( sheet_ );
@@ -1382,4 +1220,3 @@ void QTextDocument::init()
- lParag = fParag = createParag( this, 0, 0 );
- tmpCursor = 0;
+ lParag = fParag = createParagraph( this, 0, 0 );
@@ -1395,2 +1232,4 @@ void QTextDocument::init()
leftmargin = rightmargin = 4;
+ scaleFontsFactor = 1;
+
@@ -1425,3 +1264,3 @@ void QTextDocument::clear( bool createEmptyParag )
while ( fParag ) {
- QTextParag *p = fParag->next();
+ QTextParagraph *p = fParag->next();
delete fParag;
@@ -1431,4 +1270,6 @@ void QTextDocument::clear( bool createEmptyParag )
if ( createEmptyParag )
- fParag = lParag = createParag( this );
+ fParag = lParag = createParagraph( this );
selections.clear();
+ oText = QString::null;
+ oTextValid = TRUE;
}
@@ -1451,8 +1292,8 @@ int QTextDocument::height() const
-QTextParag *QTextDocument::createParag( QTextDocument *d, QTextParag *pr, QTextParag *nx, bool updateIds )
+QTextParagraph *QTextDocument::createParagraph( QTextDocument *d, QTextParagraph *pr, QTextParagraph *nx, bool updateIds )
{
- return new QTextParag( d, pr, nx, updateIds );
+ return new QTextParagraph( d, pr, nx, updateIds );
}
-bool QTextDocument::setMinimumWidth( int needed, int used, QTextParag *p )
+bool QTextDocument::setMinimumWidth( int needed, int used, QTextParagraph *p )
{
@@ -1487,3 +1328,3 @@ void QTextDocument::setPlainText( const QString &text )
if ( nl == -1 ) {
- lParag = createParag( this, lParag, 0 );
+ lParag = createParagraph( this, lParag, 0 );
if ( !fParag )
@@ -1498,3 +1339,3 @@ void QTextDocument::setPlainText( const QString &text )
for (;;) {
- lParag = createParag( this, lParag, 0 );
+ lParag = createParagraph( this, lParag, 0 );
if ( !fParag )
@@ -1516,3 +1357,3 @@ void QTextDocument::setPlainText( const QString &text )
if ( !lParag )
- lParag = fParag = createParag( this, 0, 0 );
+ lParag = fParag = createParagraph( this, 0, 0 );
}
@@ -1561,14 +1402,20 @@ struct Q_EXPORT QTextDocumentTag {
-#define NEWPAR do{ if ( !hasNewPar ) curpar = createParag( this, curpar ); \
- if ( curpar->isBr ) curpar->isBr = FALSE; \
+
+#define NEWPAR do{ if ( !hasNewPar) { \
+ if ( !textEditMode && curpar && curpar->length()>1 && curpar->at( curpar->length()-2)->c == QChar_linesep ) \
+ curpar->remove( curpar->length()-2, 1 ); \
+ curpar = createParagraph( this, curpar, curpar->next() ); styles.append( vec ); vec = 0;} \
hasNewPar = TRUE; \
- curpar->setAlignment( curtag.alignment ); \
- curpar->setDirection( (QChar::Direction)curtag.direction ); \
+ curpar->rtext = TRUE; \
+ curpar->align = curtag.alignment; \
+ curpar->lstyle = curtag.liststyle; \
+ curpar->litem = ( curtag.style->displayMode() == QStyleSheetItem::DisplayListItem ); \
+ curpar->str->setDirection( (QChar::Direction)curtag.direction ); \
space = TRUE; \
- QPtrVector<QStyleSheetItem> vec( (uint)tags.count() + 1); \
+ delete vec; vec = new QPtrVector<QStyleSheetItem>( (uint)tags.count() + 1); \
int i = 0; \
for ( QValueStack<QTextDocumentTag>::Iterator it = tags.begin(); it != tags.end(); ++it ) \
- vec.insert( i++, (*it).style ); \
- vec.insert( i, curtag.style ); \
- curpar->setStyleSheetItems( vec ); }while(FALSE)
+ vec->insert( i++, (*it).style ); \
+ vec->insert( i, curtag.style ); \
+ }while(FALSE)
@@ -1577,3 +1424,2 @@ void QTextDocument::setRichText( const QString &text, const QString &context )
{
- setTextFormat( Qt::RichText );
if ( !context.isEmpty() )
@@ -1581,40 +1427,12 @@ void QTextDocument::setRichText( const QString &text, const QString &context )
clear();
- fParag = lParag = createParag( this );
+ fParag = lParag = createParagraph( this );
+ oTextValid = TRUE;
+ oText = text;
setRichTextInternal( text );
+ fParag->rtext = TRUE;
}
-static QStyleSheetItem::ListStyle chooseListStyle( const QStyleSheetItem *nstyle,
- const QMap<QString, QString> &attr,
- QStyleSheetItem::ListStyle curListStyle )
-{
- if ( nstyle->name() == "ol" || nstyle->name() == "ul" ) {
- curListStyle = nstyle->listStyle();
- QMap<QString, QString>::ConstIterator it = attr.find( "type" );
- if ( it != attr.end() ) {
- QString sl = *it;
- if ( sl == "1" ) {
- curListStyle = QStyleSheetItem::ListDecimal;
- } else if ( sl == "a" ) {
- curListStyle = QStyleSheetItem::ListLowerAlpha;
- } else if ( sl == "A" ) {
- curListStyle = QStyleSheetItem::ListUpperAlpha;
- } else {
- sl = sl.lower();
- if ( sl == "square" )
- curListStyle = QStyleSheetItem::ListSquare;
- else if ( sl == "disc" )
- curListStyle = QStyleSheetItem::ListDisc;
- else if ( sl == "circle" )
- curListStyle = QStyleSheetItem::ListCircle;
- }
- }
- }
- return curListStyle;
-}
-
-void QTextDocument::setRichTextInternal( const QString &text )
+void QTextDocument::setRichTextInternal( const QString &text, QTextCursor* cursor )
{
- oTextValid = TRUE;
- oText = text;
- QTextParag* curpar = lParag;
+ QTextParagraph* curpar = lParag;
int pos = 0;
@@ -1624,2 +1442,5 @@ void QTextDocument::setRichTextInternal( const QString &text )
bool space = TRUE;
+ bool canMergeLi = FALSE;
+
+ bool textEditMode = FALSE;
@@ -1628,4 +1449,26 @@ void QTextDocument::setRichTextInternal( const QString &text )
bool hasNewPar = curpar->length() <= 1;
- QString lastClose;
QString anchorName;
+
+ // style sheet handling for margin and line spacing calculation below
+ QTextParagraph* stylesPar = curpar;
+ QPtrVector<QStyleSheetItem>* vec = 0;
+ QPtrList< QPtrVector<QStyleSheetItem> > styles;
+ styles.setAutoDelete( TRUE );
+
+ if ( cursor ) {
+ cursor->splitAndInsertEmptyParagraph();
+ QTextCursor tmp = *cursor;
+ tmp.gotoPreviousLetter();
+ stylesPar = curpar = tmp.paragraph();
+ hasNewPar = TRUE;
+ textEditMode = TRUE;
+ } else {
+ NEWPAR;
+ }
+
+ // set rtext spacing to FALSE for the initial paragraph.
+ curpar->rtext = FALSE;
+
+ QString wellKnownTags = "br hr wsp table qt body meta title";
+
while ( pos < length ) {
@@ -1640,29 +1483,4 @@ void QTextDocument::setRichTextInternal( const QString &text )
- if ( tagname == "title" ) {
- QString title;
- while ( pos < length ) {
- if ( hasPrefix( doc, length, pos, QChar('<') ) && hasPrefix( doc, length, pos+1, QChar('/') ) &&
- parseCloseTag( doc, length, pos ) == "title" )
- break;
- title += doc[ pos ];
- ++pos;
- }
- attribs.replace( "title", title );
- }
-
const QStyleSheetItem* nstyle = sheet_->item(tagname);
- if ( curtag.style->displayMode() == QStyleSheetItem::DisplayListItem ) {
-// if ( tagname == "br" ) {
-// // our standard br emty-tag handling breaks
-// // inside list items, we would get another
-// // list item in this case. As workaround, fake
-// // a new paragraph instead
-// tagname = "p";
-// nstyle = sheet_->item( tagname );
-// }
- if ( nstyle )
- hasNewPar = FALSE; // we want empty paragraphs in this case
- }
-
if ( nstyle ) {
@@ -1679,4 +1497,9 @@ void QTextDocument::setRichTextInternal( const QString &text )
- // special handling for p. We do not want to nest there for HTML compatibility
- if ( nstyle->displayMode() == QStyleSheetItem::DisplayBlock ) {
+ /* special handling for p and li for HTML
+ compatibility. We do not want to embed blocks in
+ p, and we do not want new blocks inside non-empty
+ lis. Plus we want to merge empty lis sometimes. */
+ if( nstyle->displayMode() == QStyleSheetItem::DisplayListItem ) {
+ canMergeLi = TRUE;
+ } else if ( nstyle->displayMode() == QStyleSheetItem::DisplayBlock ) {
while ( curtag.style->name() == "p" ) {
@@ -1686,4 +1509,23 @@ void QTextDocument::setRichTextInternal( const QString &text )
}
- }
+ if ( curtag.style->displayMode() == QStyleSheetItem::DisplayListItem ) {
+ // we are in a li and a new block comes along
+ if ( nstyle->name() == "ul" || nstyle->name() == "ol" )
+ hasNewPar = FALSE; // we want an empty li (like most browsers)
+ if ( !hasNewPar ) {
+ /* do not add new blocks inside
+ non-empty lis */
+ while ( curtag.style->displayMode() == QStyleSheetItem::DisplayListItem ) {
+ if ( tags.isEmpty() )
+ break;
+ curtag = tags.pop();
+ }
+ } else if ( canMergeLi ) {
+ /* we have an empty li and a block
+ comes along, merge them */
+ nstyle = curtag.style;
+ }
+ canMergeLi = FALSE;
+ }
+ }
}
@@ -1691,41 +1533,34 @@ void QTextDocument::setRichTextInternal( const QString &text )
QTextCustomItem* custom = 0;
- // some well-known empty tags
- if ( tagname == "br" ) {
- emptyTag = TRUE;
- hasNewPar = FALSE;
- if ( curtag.style->displayMode() == QStyleSheetItem::DisplayListItem ) {
- // when linebreaking a list item, we do not
- // actually want a new list item but just a
- // new line. Fake this by pushing a paragraph
- // onto the stack
- tags.push( curtag );
- curtag.name = tagname;
- curtag.style = nstyle;
- }
- NEWPAR;
- curpar->isBr = TRUE;
- curpar->setAlignment( curtag.alignment );
- } else if ( tagname == "hr" ) {
- emptyTag = TRUE;
- custom = sheet_->tag( tagname, attr, contxt, *factory_ , emptyTag, this );
- NEWPAR;
- } else if ( tagname == "table" ) {
- QTextFormat format = curtag.format.makeTextFormat( nstyle, attr );
- curpar->setAlignment( curtag.alignment );
- custom = parseTable( attr, format, doc, length, pos, curpar );
- (void)eatSpace( doc, length, pos );
- emptyTag = TRUE;
- } else if ( tagname == "qt" ) {
- for ( QMap<QString, QString>::Iterator it = attr.begin(); it != attr.end(); ++it ) {
- if ( it.key() == "bgcolor" ) {
- QBrush *b = new QBrush( QColor( *it ) );
+
+ // some well-known tags, some have a nstyle, some not
+ if ( wellKnownTags.find( tagname ) != -1 ) {
+ if ( tagname == "br" ) {
+ emptyTag = space = TRUE;
+ int index = QMAX( curpar->length(),1) - 1;
+ QTextFormat format = curtag.format.makeTextFormat( nstyle, attr, scaleFontsFactor );
+ curpar->append( QChar_linesep );
+ curpar->setFormat( index, 1, &format );
+ } else if ( tagname == "hr" ) {
+ emptyTag = space = TRUE;
+ custom = sheet_->tag( tagname, attr, contxt, *factory_ , emptyTag, this );
+ NEWPAR;
+ } else if ( tagname == "table" ) {
+ emptyTag = space = TRUE;
+ QTextFormat format = curtag.format.makeTextFormat( nstyle, attr, scaleFontsFactor );
+ curpar->setAlignment( curtag.alignment );
+ custom = parseTable( attr, format, doc, length, pos, curpar );
+ } else if ( tagname == "qt" || tagname == "body" ) {
+ if ( attr.contains( "bgcolor" ) ) {
+ QBrush *b = new QBrush( QColor( attr["bgcolor"] ) );
setPaper( b );
- } else if ( it.key() == "background" ) {
+ }
+ if ( attr.contains( "background" ) ) {
QImage img;
- const QMimeSource* m = factory_->data( *it, contxt );
+ QString bg = attr["background"];
+ const QMimeSource* m = factory_->data( bg, contxt );
if ( !m ) {
- qWarning("QRichText: no mimesource for %s", (*it).latin1() );
+ qWarning("QRichText: no mimesource for %s", bg.latin1() );
} else {
if ( !QImageDrag::decode( m, img ) ) {
- qWarning("QTextImage: cannot decode %s", (*it).latin1() );
+ qWarning("QTextImage: cannot decode %s", bg.latin1() );
}
@@ -1738,4 +1573,5 @@ void QTextDocument::setRichTextInternal( const QString &text )
}
- } else if ( it.key() == "text" ) {
- QColor c( *it );
+ }
+ if ( attr.contains( "text" ) ) {
+ QColor c( attr["text"] );
if ( formatCollection()->defaultFormat()->color() != c ) {
@@ -1754,11 +1590,40 @@ void QTextDocument::setRichTextInternal( const QString &text )
}
- } else if ( it.key() == "link" ) {
- linkColor = QColor( *it );
- } else if ( it.key() == "title" ) {
- attribs.replace( it.key(), *it );
}
+ if ( attr.contains( "link" ) )
+ linkColor = QColor( attr["link"] );
+ if ( attr.contains( "title" ) )
+ attribs.replace( "title", attr["title"] );
+
+ if ( textEditMode ) {
+ if ( attr.contains("style" ) ) {
+ QString a = attr["style"];
+ for ( int s = 0; s < a.contains(';')+1; s++ ) {
+ QString style = QTextDocument::section( a, ";", s, s );
+ if ( style.startsWith("font-size:" ) && QTextDocument::endsWith(style, "pt") ) {
+ scaleFontsFactor = double( formatCollection()->defaultFormat()->fn.pointSize() ) /
+ style.mid( 10, style.length() - 12 ).toInt();
+ }
+ }
+ }
+ nstyle = 0; // ignore body in textEditMode
+ }
+ // end qt- and body-tag handling
+ } else if ( tagname == "meta" ) {
+ if ( attr["name"] == "qrichtext" && attr["content"] == "1" )
+ textEditMode = TRUE;
+ } else if ( tagname == "title" ) {
+ QString title;
+ while ( pos < length ) {
+ if ( hasPrefix( doc, length, pos, QChar('<') ) && hasPrefix( doc, length, pos+1, QChar('/') ) &&
+ parseCloseTag( doc, length, pos ) == "title" )
+ break;
+ title += doc[ pos ];
+ ++pos;
+ }
+ attribs.replace( "title", title );
}
- } else {
+ } // end of well-known tag handling
+
+ if ( !custom ) // try generic custom item
custom = sheet_->tag( tagname, attr, contxt, *factory_ , emptyTag, this );
- }
@@ -1768,6 +1633,4 @@ void QTextDocument::setRichTextInternal( const QString &text )
if ( custom ) {
- int index = curpar->length() - 1;
- if ( index < 0 )
- index = 0;
- QTextFormat format = curtag.format.makeTextFormat( nstyle, attr );
+ int index = QMAX( curpar->length(),1) - 1;
+ QTextFormat format = curtag.format.makeTextFormat( nstyle, attr, scaleFontsFactor );
curpar->append( QChar('*') );
@@ -1784,10 +1647,5 @@ void QTextDocument::setRichTextInternal( const QString &text )
} else if ( !emptyTag ) {
- // ignore whitespace for inline elements if there was already one
- if ( nstyle->whiteSpaceMode() == QStyleSheetItem::WhiteSpaceNormal
- && ( space || nstyle->displayMode() != QStyleSheetItem::DisplayInline ) )
- eatSpace( doc, length, pos );
-
- // if we do nesting, push curtag on the stack,
- // otherwise reinint curag.
- if ( nstyle != curtag.style || nstyle->selfNesting() ) {
+ /* if we do nesting, push curtag on the stack,
+ otherwise reinint curag. */
+ if ( curtag.style->name() != tagname || nstyle->selfNesting() ) {
tags.push( curtag );
@@ -1800,4 +1658,2 @@ void QTextDocument::setRichTextInternal( const QString &text )
- const QStyleSheetItem* ostyle = curtag.style;
-
curtag.name = tagname;
@@ -1806,6 +1662,12 @@ void QTextDocument::setRichTextInternal( const QString &text )
curtag.style = nstyle;
- if ( nstyle->whiteSpaceMode() != QStyleSheetItem::WhiteSpaceNormal )
+ if ( int(nstyle->whiteSpaceMode()) != QStyleSheetItem::Undefined )
curtag.wsm = nstyle->whiteSpaceMode();
- curtag.liststyle = chooseListStyle( nstyle, attr, curtag.liststyle );
- curtag.format = curtag.format.makeTextFormat( nstyle, attr );
+
+ /* ignore whitespace for inline elements if there
+ was already one*/
+ if ( !textEditMode && curtag.wsm == QStyleSheetItem::WhiteSpaceNormal
+ && ( space || nstyle->displayMode() != QStyleSheetItem::DisplayInline ) )
+ eatSpace( doc, length, pos );
+
+ curtag.format = curtag.format.makeTextFormat( nstyle, attr, scaleFontsFactor );
if ( nstyle->isAnchor() ) {
@@ -1821,46 +1683,84 @@ void QTextDocument::setRichTextInternal( const QString &text )
- if ( ostyle->displayMode() == QStyleSheetItem::DisplayListItem &&
- curpar->length() <= 1
- && nstyle->displayMode() == QStyleSheetItem::DisplayBlock ) {
- // do not do anything, we reuse the paragraph we have
- } else if ( nstyle->displayMode() != QStyleSheetItem::DisplayInline && nstyle->displayMode() != QStyleSheetItem::DisplayNone ) {
+ if ( (int) nstyle->listStyle() != QStyleSheetItem::Undefined )
+ curtag.liststyle = nstyle->listStyle();
+
+ if ( nstyle->displayMode() == QStyleSheetItem::DisplayBlock
+ || nstyle->displayMode() == QStyleSheetItem::DisplayListItem ) {
+
+ if ( nstyle->name() == "ol" || nstyle->name() == "ul" || nstyle->name() == "li") {
+ QString type = attr["type"];
+ if ( !type.isEmpty() ) {
+ if ( type == "1" ) {
+ curtag.liststyle = QStyleSheetItem::ListDecimal;
+ } else if ( type == "a" ) {
+ curtag.liststyle = QStyleSheetItem::ListLowerAlpha;
+ } else if ( type == "A" ) {
+ curtag.liststyle = QStyleSheetItem::ListUpperAlpha;
+ } else {
+ type = type.lower();
+ if ( type == "square" )
+ curtag.liststyle = QStyleSheetItem::ListSquare;
+ else if ( type == "disc" )
+ curtag.liststyle = QStyleSheetItem::ListDisc;
+ else if ( type == "circle" )
+ curtag.liststyle = QStyleSheetItem::ListCircle;
+ }
+ }
+ }
+
+
+ /* Internally we treat ordered and bullet
+ lists the same for margin calculations. In
+ order to have fast pointer compares in the
+ xMargin() functions we restrict ourselves to
+ <ol>. Once we calculate the margins in the
+ parser rathern than later, the unelegance of
+ this approach goes awy
+ */
+ if ( nstyle->name() == "ul" )
+ curtag.style = sheet_->item( "ol" );
+
+ if ( attr.contains( "align" ) ) {
+ QString align = attr["align"];
+ if ( align == "center" )
+ curtag.alignment = Qt::AlignCenter;
+ else if ( align == "right" )
+ curtag.alignment = Qt::AlignRight;
+ else if ( align == "justify" )
+ curtag.alignment = Qt3::AlignJustify;
+ }
+ if ( attr.contains( "dir" ) ) {
+ QString dir = attr["dir"];
+ if ( dir == "rtl" )
+ curtag.direction = QChar::DirR;
+ else if ( dir == "ltr" )
+ curtag.direction = QChar::DirL;
+ }
+
NEWPAR;
- }
- if ( curtag.style->displayMode() == QStyleSheetItem::DisplayListItem ) {
- curpar->setListStyle( curtag.liststyle );
- if ( attr.find( "value" ) != attr.end() )
- curpar->setListValue( (*attr.find( "value" )).toInt() );
- }
+ if ( curtag.style->displayMode() == QStyleSheetItem::DisplayListItem ) {
+ if ( attr.contains( "value " ) )
+ curpar->setListValue( attr["value"].toInt() );
+ }
- if ( nstyle->displayMode() != QStyleSheetItem::DisplayInline )
- curpar->setFormat( &curtag.format );
-
- if ( attr.contains( "align" ) &&
- ( curtag.name == "p" ||
- curtag.name == "div" ||
- curtag.name == "li" ||
- curtag.name[ 0 ] == 'h' ) ) {
- QString align = attr["align"];
- if ( align == "center" )
- curtag.alignment = Qt::AlignCenter;
- else if ( align == "right" )
- curtag.alignment = Qt::AlignRight;
- else if ( align == "justify" )
- curtag.alignment = Qt3::AlignJustify;
- }
- if ( attr.contains( "dir" ) &&
- ( curtag.name == "p" ||
- curtag.name == "div" ||
- curtag.name == "li" ||
- curtag.name[ 0 ] == 'h' ) ) {
- QString dir = attr["dir"];
- if ( dir == "rtl" )
- curtag.direction = QChar::DirR;
- else if ( dir == "ltr" )
- curtag.direction = QChar::DirL;
- }
- if ( nstyle->displayMode() != QStyleSheetItem::DisplayInline ) {
- curpar->setAlignment( curtag.alignment );
- curpar->setDirection( (QChar::Direction)curtag.direction );
+ if ( attr.contains( "style" ) ) {
+ QString a = attr["style"];
+ bool ok = TRUE;
+ for ( int s = 0; ok && s < a.contains(';')+1; s++ ) {
+ QString style = QTextDocument::section( a, ";", s, s );
+ if ( style.startsWith("margin-top:" ) && QTextDocument::endsWith(style, "px") )
+ curpar->utm = 1+style.mid(11, style.length() - 13).toInt(&ok);
+ else if ( style.startsWith("margin-bottom:" ) && QTextDocument::endsWith(style, "px") )
+ curpar->ubm = 1+style.mid(14, style.length() - 16).toInt(&ok);
+ else if ( style.startsWith("margin-left:" ) && QTextDocument::endsWith(style, "px") )
+ curpar->ulm = 1+style.mid(12, style.length() - 14).toInt(&ok);
+ else if ( style.startsWith("margin-right:" ) && QTextDocument::endsWith(style, "px") )
+ curpar->urm = 1+style.mid(13, style.length() - 15).toInt(&ok);
+ else if ( style.startsWith("text-indent:" ) && QTextDocument::endsWith(style, "px") )
+ curpar->uflm = 1+style.mid(12, style.length() - 14).toInt(&ok);
+ }
+ if ( !ok ) // be pressmistic
+ curpar->utm = curpar->ubm = curpar->urm = curpar->ulm = 0;
+ }
}
@@ -1869,3 +1769,2 @@ void QTextDocument::setRichTextInternal( const QString &text )
QString tagname = parseCloseTag( doc, length, pos );
- lastClose = tagname;
if ( tagname.isEmpty() )
@@ -1875,10 +1774,6 @@ void QTextDocument::setRichTextInternal( const QString &text )
-
// we close a block item. Since the text may continue, we need to have a new paragraph
- bool needNewPar = curtag.style->displayMode() == QStyleSheetItem::DisplayBlock;
+ bool needNewPar = curtag.style->displayMode() == QStyleSheetItem::DisplayBlock
+ || curtag.style->displayMode() == QStyleSheetItem::DisplayListItem;
- if ( curtag.style->displayMode() == QStyleSheetItem::DisplayListItem ) {
- needNewPar = TRUE;
- hasNewPar = FALSE; // we want empty paragraphs in this case
- }
@@ -1903,7 +1798,4 @@ void QTextDocument::setRichTextInternal( const QString &text )
if ( needNewPar ) {
- if ( curtag.style->displayMode() == QStyleSheetItem::DisplayListItem ) {
- tags.push( curtag );
- curtag.name = "p";
- curtag.style = sheet_->item( curtag.name ); // a list item continues, use p for that
- }
+ if ( textEditMode && tagname == "p" ) // preserve empty paragraphs
+ hasNewPar = FALSE;
NEWPAR;
@@ -1916,13 +1808,38 @@ void QTextDocument::setRichTextInternal( const QString &text )
while ( pos < length && !hasPrefix(doc, length, pos, QChar('<') ) ){
- QStyleSheetItem::WhiteSpaceMode wsm = curtag.wsm;
- if ( s.length() > 4096 )
- wsm = (QStyleSheetItem::WhiteSpaceMode)QStyleSheetItem_WhiteSpaceNormalWithNewlines;
-
- c = parseChar( doc, length, pos, wsm );
+ if ( textEditMode ) {
+ // text edit mode: we handle all white space but ignore newlines
+ c = parseChar( doc, length, pos, QStyleSheetItem::WhiteSpacePre );
+ if ( c == QChar_linesep )
+ break;
+ } else {
+ int l = pos;
+ c = parseChar( doc, length, pos, curtag.wsm );
+
+ // in white space pre mode: treat any space as non breakable
+ if ( c == ' ' && curtag.wsm == QStyleSheetItem::WhiteSpacePre )
+ c = QChar::nbsp;
+
+ if ( c == ' ' || c == QChar_linesep ) {
+ /* avoid overlong paragraphs by forcing a new
+ paragraph after 4096 characters. This case can
+ occur when loading undiscovered plain text
+ documents in rich text mode. Instead of hanging
+ forever, we do the trick.
+ */
+ if ( curtag.wsm == QStyleSheetItem::WhiteSpaceNormal && s.length() > 4096 ) do {
+ if ( doc[l] == '\n' ) {
+ hasNewPar = FALSE; // for a new paragraph ...
+ NEWPAR;
+ hasNewPar = FALSE; // ... and make it non-reusable
+ c = '\n'; // make sure we break below
+ break;
+ }
+ } while ( ++l < pos );
+ }
+ }
- if ( c == '\n' ) // happens only in whitespacepre-mode or with WhiteSpaceNormalWithNewlines.
- break; // we want a new line in this case
+ if ( c == '\n' )
+ break; // break on newlines, pre delievers a QChar_linesep
- bool c_isSpace = c.isSpace() && c.unicode() != 0x00a0U &&
- curtag.wsm != QStyleSheetItem_WhiteSpaceNoCompression;
+ bool c_isSpace = c.isSpace() && c.unicode() != 0x00a0U && !textEditMode;
@@ -1937,5 +1854,3 @@ void QTextDocument::setRichTextInternal( const QString &text )
hasNewPar = FALSE;
- int index = curpar->length() - 1;
- if ( index < 0 )
- index = 0;
+ int index = QMAX( curpar->length(),1) - 1;
curpar->append( s );
@@ -1953,12 +1868,5 @@ void QTextDocument::setRichTextInternal( const QString &text )
}
- if ( c == '\n' ) { // happens in WhiteSpacePre mode
- hasNewPar = FALSE;
- tags.push( curtag );
- NEWPAR;
- curtag = tags.pop();
- }
}
}
-
- if ( hasNewPar && curpar != fParag ) {
+ if ( hasNewPar && curpar != fParag && !cursor ) {
// cleanup unused last paragraphs
@@ -1967,3 +1875,2 @@ void QTextDocument::setRichTextInternal( const QString &text )
}
-
if ( !anchorName.isEmpty() ) {
@@ -1972,2 +1879,164 @@ void QTextDocument::setRichTextInternal( const QString &text )
}
+
+
+ setRichTextMarginsInternal( styles, stylesPar );
+
+ if ( cursor ) {
+ cursor->gotoPreviousLetter();
+ cursor->remove();
+ }
+
+}
+
+void QTextDocument::setRichTextMarginsInternal( QPtrList< QPtrVector<QStyleSheetItem> >& styles, QTextParagraph* stylesPar )
+{
+ // margin and line spacing calculation
+ QPtrVector<QStyleSheetItem>* prevStyle = 0;
+ QPtrVector<QStyleSheetItem>* curStyle = styles.first();
+ QPtrVector<QStyleSheetItem>* nextStyle = styles.next();
+ while ( stylesPar ) {
+ if ( !curStyle ) {
+ stylesPar = stylesPar->next();
+ prevStyle = curStyle;
+ curStyle = nextStyle;
+ nextStyle = styles.next();
+ continue;
+ }
+
+ int i, mar;
+ QStyleSheetItem* mainStyle = curStyle->size() ? (*curStyle)[curStyle->size()-1] : 0;
+ if ( mainStyle && mainStyle->displayMode() == QStyleSheetItem::DisplayListItem )
+ stylesPar->setListItem( TRUE );
+ int numLists = 0;
+ for ( i = 0; i < (int)curStyle->size(); ++i ) {
+ if ( (*curStyle)[ i ]->displayMode() == QStyleSheetItem::DisplayBlock
+ && int((*curStyle)[ i ]->listStyle()) != QStyleSheetItem::Undefined )
+ numLists++;
+ }
+ stylesPar->ldepth = numLists;
+ if ( stylesPar->next() && nextStyle ) {
+ // also set the depth of the next paragraph, required for the margin calculation
+ numLists = 0;
+ for ( i = 0; i < (int)nextStyle->size(); ++i ) {
+ if ( (*nextStyle)[ i ]->displayMode() == QStyleSheetItem::DisplayBlock
+ && int((*nextStyle)[ i ]->listStyle()) != QStyleSheetItem::Undefined )
+ numLists++;
+ }
+ stylesPar->next()->ldepth = numLists;
+ }
+
+ // do the top margin
+ QStyleSheetItem* item = mainStyle;
+ int m;
+ if (stylesPar->utm > 0 ) {
+ m = stylesPar->utm-1;
+ stylesPar->utm = 0;
+ } else {
+ m = QMAX(0, item->margin( QStyleSheetItem::MarginTop ) );
+ if ( item->displayMode() == QStyleSheetItem::DisplayListItem
+ && stylesPar->ldepth )
+ m /= stylesPar->ldepth;
+ }
+ for ( i = (int)curStyle->size() - 2 ; i >= 0; --i ) {
+ item = (*curStyle)[ i ];
+ if ( prevStyle && i < (int) prevStyle->size() &&
+ ( item->displayMode() == QStyleSheetItem::DisplayBlock &&
+ (*prevStyle)[ i ] == item ) )
+ break;
+ // emulate CSS2' standard 0 vertical margin for multiple ul or ol tags
+ if ( int(item->listStyle()) != QStyleSheetItem::Undefined &&
+ ( ( i> 0 && (*curStyle)[ i-1 ] == item ) || (*curStyle)[i+1] == item ) )
+ continue;
+ mar = QMAX( 0, item->margin( QStyleSheetItem::MarginTop ) );
+ m = QMAX( m, mar );
+ }
+ stylesPar->utm = m - stylesPar->topMargin();
+
+ // do the bottom margin
+ item = mainStyle;
+ if (stylesPar->ubm > 0 ) {
+ m = stylesPar->ubm-1;
+ stylesPar->ubm = 0;
+ } else {
+ m = QMAX(0, item->margin( QStyleSheetItem::MarginBottom ) );
+ if ( item->displayMode() == QStyleSheetItem::DisplayListItem
+ && stylesPar->ldepth )
+ m /= stylesPar->ldepth;
+ }
+ for ( i = (int)curStyle->size() - 2 ; i >= 0; --i ) {
+ item = (*curStyle)[ i ];
+ if ( nextStyle && i < (int) nextStyle->size() &&
+ ( item->displayMode() == QStyleSheetItem::DisplayBlock &&
+ (*nextStyle)[ i ] == item ) )
+ break;
+ // emulate CSS2' standard 0 vertical margin for multiple ul or ol tags
+ if ( int(item->listStyle()) != QStyleSheetItem::Undefined &&
+ ( ( i> 0 && (*curStyle)[ i-1 ] == item ) || (*curStyle)[i+1] == item ) )
+ continue;
+ mar = QMAX(0, item->margin( QStyleSheetItem::MarginBottom ) );
+ m = QMAX( m, mar );
+ }
+ stylesPar->ubm = m - stylesPar->bottomMargin();
+
+ // do the left margin, simplyfied
+ item = mainStyle;
+ if (stylesPar->ulm > 0 ) {
+ m = stylesPar->ulm-1;
+ stylesPar->ulm = 0;
+ } else {
+ m = QMAX( 0, item->margin( QStyleSheetItem::MarginLeft ) );
+ }
+ for ( i = (int)curStyle->size() - 2 ; i >= 0; --i ) {
+ item = (*curStyle)[ i ];
+ m += QMAX( 0, item->margin( QStyleSheetItem::MarginLeft ) );
+ }
+ stylesPar->ulm = m - stylesPar->leftMargin();
+
+ // do the right margin, simplyfied
+ item = mainStyle;
+ if (stylesPar->urm > 0 ) {
+ m = stylesPar->urm-1;
+ stylesPar->urm = 0;
+ } else {
+ m = QMAX( 0, item->margin( QStyleSheetItem::MarginRight ) );
+ }
+ for ( i = (int)curStyle->size() - 2 ; i >= 0; --i ) {
+ item = (*curStyle)[ i ];
+ m += QMAX( 0, item->margin( QStyleSheetItem::MarginRight ) );
+ }
+ stylesPar->urm = m - stylesPar->rightMargin();
+
+ // do the first line margin, which really should be called text-indent
+ item = mainStyle;
+ if (stylesPar->uflm > 0 ) {
+ m = stylesPar->uflm-1;
+ stylesPar->uflm = 0;
+ } else {
+ m = QMAX( 0, item->margin( QStyleSheetItem::MarginFirstLine ) );
+ }
+ for ( i = (int)curStyle->size() - 2 ; i >= 0; --i ) {
+ item = (*curStyle)[ i ];
+ mar = QMAX( 0, item->margin( QStyleSheetItem::MarginFirstLine ) );
+ m = QMAX( m, mar );
+ }
+ stylesPar->uflm =m - stylesPar->firstLineMargin();
+
+ // do the bogus line "spacing", which really is just an extra margin
+ item = mainStyle;
+ for ( i = (int)curStyle->size() - 1 ; i >= 0; --i ) {
+ item = (*curStyle)[ i ];
+ if ( item->lineSpacing() != QStyleSheetItem::Undefined ) {
+ stylesPar->ulinespacing = item->lineSpacing();
+ if ( formatCollection() &&
+ stylesPar->ulinespacing < formatCollection()->defaultFormat()->height() )
+ stylesPar->ulinespacing += formatCollection()->defaultFormat()->height();
+ break;
+ }
+ }
+
+ stylesPar = stylesPar->next();
+ prevStyle = curStyle;
+ curStyle = nextStyle;
+ nextStyle = styles.next();
+ }
}
@@ -1985,128 +2054,189 @@ void QTextDocument::setText( const QString &text, const QString &context )
-QString QTextDocument::plainText( QTextParag *p ) const
+QString QTextDocument::plainText() const
{
- if ( !p ) {
- QString buffer;
- QString s;
- QTextParag *p = fParag;
- while ( p ) {
- if ( !p->mightHaveCustomItems ) {
- s = p->string()->toString();
- } else {
- for ( int i = 0; i < p->length() - 1; ++i ) {
- if ( p->at( i )->isCustom() ) {
- if ( p->at( i )->customItem()->isNested() ) {
- s += "\n";
- QTextTable *t = (QTextTable*)p->at( i )->customItem();
- QPtrList<QTextTableCell> cells = t->tableCells();
- for ( QTextTableCell *c = cells.first(); c; c = cells.next() )
- s += c->richText()->plainText() + "\n";
- s += "\n";
- }
- } else {
- s += p->at( i )->c;
+ QString buffer;
+ QString s;
+ QTextParagraph *p = fParag;
+ while ( p ) {
+ if ( !p->mightHaveCustomItems ) {
+ s = p->string()->toString();
+ } else {
+ for ( int i = 0; i < p->length() - 1; ++i ) {
+ if ( p->at( i )->isCustom() ) {
+ if ( p->at( i )->customItem()->isNested() ) {
+ s += "\n";
+ QTextTable *t = (QTextTable*)p->at( i )->customItem();
+ QPtrList<QTextTableCell> cells = t->tableCells();
+ for ( QTextTableCell *c = cells.first(); c; c = cells.next() )
+ s += c->richText()->plainText() + "\n";
+ s += "\n";
}
+ } else {
+ s += p->at( i )->c;
}
}
- s.remove( s.length() - 1, 1 );
- if ( p->next() )
- s += "\n";
- buffer += s;
- p = p->next();
}
- return buffer;
- } else {
- return p->string()->toString();
+ s.remove( s.length() - 1, 1 );
+ if ( p->next() )
+ s += "\n";
+ buffer += s;
+ p = p->next();
}
+ return buffer;
}
-static QString align_to_string( const QString &tag, int a )
+static QString align_to_string( int a )
{
- if ( tag == "p" || tag == "li" || ( tag[0] == 'h' && tag[1].isDigit() ) ) {
- if ( a & Qt::AlignRight )
- return " align=\"right\"";
- if ( a & Qt::AlignCenter )
- return " align=\"center\"";
- if ( a & Qt3::AlignJustify )
- return " align=\"justify\"";
- }
- return "";
+ if ( a & Qt::AlignRight )
+ return " align=\"right\"";
+ if ( a & Qt::AlignHCenter )
+ return " align=\"center\"";
+ if ( a & Qt3::AlignJustify )
+ return " align=\"justify\"";
+ return QString::null;
}
-static QString direction_to_string( const QString &tag, int d )
+static QString direction_to_string( int d )
{
- if ( d != QChar::DirON &&
- ( tag == "p" || tag == "div" || tag == "li" || ( tag[0] == 'h' && tag[1].isDigit() ) ) )
+ if ( d != QChar::DirON )
return ( d == QChar::DirL? " dir=\"ltr\"" : " dir=\"rtl\"" );
- return "";
+ return QString::null;
}
-QString QTextDocument::richText( QTextParag *p ) const
+static QString list_value_to_string( int v )
{
- QString s,n;
- if ( !p ) {
- p = fParag;
- QPtrVector<QStyleSheetItem> lastItems, items;
- while ( p ) {
- items = p->styleSheetItems();
- if ( items.size() ) {
- QStyleSheetItem *item = items[ items.size() - 1 ];
- items.resize( items.size() - 1 );
- if ( items.size() > lastItems.size() ) {
- for ( int i = lastItems.size(); i < (int)items.size(); ++i ) {
- n = items[i]->name();
- if ( n.isEmpty() || n == "li" )
- continue;
- s += "<" + n + align_to_string( n, p->alignment() ) + ">";
- }
- } else {
- QString end;
- for ( int i = items.size(); i < (int)lastItems.size(); ++i ) {
- n = lastItems[i]->name();
- if ( n.isEmpty() || n == "li" || n == "br" )
- continue;
- end.prepend( "</" + lastItems[ i ]->name() + ">" );
- }
- s += end;
- }
- lastItems = items;
- n = item->name();
- if ( n == "li" && p->listValue() != -1 ) {
- s += "<li value=\"" + QString::number( p->listValue() ) + "\">";
- } else {
- QString ps = p->richText();
- if ( ps.isEmpty() )
- s += "<br>"; // empty paragraph
- else if ( !n.isEmpty() ) {
- s += "<" + n + align_to_string( n, p->alignment() )
- + direction_to_string( n, p->direction() ) + ">" + ps;
- if ( n != "li" && n != "br")
- s += "</" + n + ">";
- } else
- s += ps;
- }
- } else {
- QString end;
- for ( int i = 0; i < (int)lastItems.size(); ++i ) {
- QString n = lastItems[i]->name();
- if ( n.isEmpty() || n == "li" || n == "br" )
- continue;
- end.prepend( "</" + n + ">" );
- }
- s += end;
- QString ps = p->richText();
- if ( ps.isEmpty() )
- s += "<br>"; // empty paragraph
- else
- s += "<p" + align_to_string( "p", p->alignment() ) + direction_to_string( "p", p->direction() )
- + ">" + ps + "</p>";
- lastItems = items;
+ if ( v != -1 )
+ return " listvalue=\"" + QString::number( v ) + "\"";
+ return QString::null;
+}
+
+static QString list_style_to_string( int v )
+{
+ switch( v ) {
+ case QStyleSheetItem::ListDecimal: return "\"1\"";
+ case QStyleSheetItem::ListLowerAlpha: return "\"a\"";
+ case QStyleSheetItem::ListUpperAlpha: return "\"A\"";
+ case QStyleSheetItem::ListDisc: return "\"disc\"";
+ case QStyleSheetItem::ListSquare: return "\"square\"";
+ case QStyleSheetItem::ListCircle: return "\"circle\"";
+ default:
+ return QString::null;
+ }
+}
+
+static inline bool list_is_ordered( int v )
+{
+ return v == QStyleSheetItem::ListDecimal ||
+ v == QStyleSheetItem::ListLowerAlpha ||
+ v == QStyleSheetItem::ListUpperAlpha;
+}
+
+
+static QString margin_to_string( QStyleSheetItem* style, int t, int b, int l, int r, int fl )
+{
+ QString s;
+ if ( l > 0 )
+ s += QString(!!s?";":"") + "margin-left:" + QString::number(l+QMAX(0,style->margin(QStyleSheetItem::MarginLeft))) + "px";
+ if ( r > 0 )
+ s += QString(!!s?";":"") + "margin-right:" + QString::number(r+QMAX(0,style->margin(QStyleSheetItem::MarginRight))) + "px";
+ if ( t > 0 )
+ s += QString(!!s?";":"") + "margin-top:" + QString::number(t+QMAX(0,style->margin(QStyleSheetItem::MarginTop))) + "px";
+ if ( b > 0 )
+ s += QString(!!s?";":"") + "margin-bottom:" + QString::number(b+QMAX(0,style->margin(QStyleSheetItem::MarginBottom))) + "px";
+ if ( fl > 0 )
+ s += QString(!!s?";":"") + "text-indent:" + QString::number(fl+QMAX(0,style->margin(QStyleSheetItem::MarginFirstLine))) + "px";
+ if ( !!s )
+ return " style=\"" + s + "\"";
+ return QString::null;
+}
+
+QString QTextDocument::richText() const
+{
+ QString s = "";
+ if ( !par ) {
+ s += "<html><head><meta name=\"qrichtext\" content=\"1\" /></head><body style=\"font-size:" ;
+ s += QString::number( formatCollection()->defaultFormat()->font().pointSize() );
+ s += "pt;font-family:";
+ s += formatCollection()->defaultFormat()->font().family();
+ s +="\">";
+ }
+ QTextParagraph* p = fParag;
+
+ QStyleSheetItem* item_p = styleSheet()->item("p");
+ QStyleSheetItem* item_ul = styleSheet()->item("ul");
+ QStyleSheetItem* item_ol = styleSheet()->item("ol");
+ QStyleSheetItem* item_li = styleSheet()->item("li");
+ if ( !item_p || !item_ul || !item_ol || !item_li ) {
+ qWarning( "QTextEdit: cannot export HTML due to insufficient stylesheet (lack of p, ul, ol, or li)" );
+ return QString::null;
+ }
+ int pastListDepth = 0;
+ int listDepth = 0;
+ int futureListDepth = 0;
+ QMemArray<int> listStyles(10);
+
+ while ( p ) {
+ listDepth = p->listDepth();
+ if ( listDepth < pastListDepth ) {
+ for ( int i = listDepth+1; i <= pastListDepth; i++ )
+ s += list_is_ordered( listStyles[i] ) ? "</ol>" : "</ul>";
+ s += '\n';
+ } else if ( listDepth > pastListDepth ) {
+ s += '\n';
+ listStyles.resize( QMAX( (int)listStyles.size(), listDepth+1 ) );
+ QString list_type;
+ listStyles[listDepth] = p->listStyle();
+ if ( !list_is_ordered( p->listStyle() ) || item_ol->listStyle() != p->listStyle() )
+ list_type = " type=" + list_style_to_string( p->listStyle() );
+ for ( int i = pastListDepth; i < listDepth; i++ ) {
+ s += list_is_ordered( p->listStyle() ) ? "<ol" : "<ul" ;
+ s += list_type + ">";
}
- if ( ( p = p->next() ) )
- s += '\n';
- }
- } else {
- s = p->richText();
+ } else {
+ s += '\n';
+ }
+
+ QString ps = p->richText();
+
+ // for the bottom margin we need to know whether we are at the end of a list
+ futureListDepth = 0;
+ if ( listDepth > 0 && p->next() )
+ futureListDepth = p->next()->listDepth();
+
+ if ( richTextExportStart && richTextExportStart->paragraph() ==p &&
+ richTextExportStart->index() == 0 )
+ s += "<selstart/>";
+
+ if ( p->isListItem() ) {
+ s += "<li";
+ if ( p->listStyle() != listStyles[listDepth] )
+ s += " type=" + list_style_to_string( p->listStyle() );
+ s +=align_to_string( p->alignment() );
+ s += margin_to_string( item_li, p->utm, p->ubm, p->ulm, p->urm, p->uflm );
+ s += list_value_to_string( p->listValue() );
+ s += direction_to_string( p->direction() );
+ s +=">";
+ s += ps;
+ s += "</li>";
+ } else {
+ // normal paragraph item
+ s += "<p";
+ s += align_to_string( p->alignment() );
+ s += margin_to_string( item_p, p->utm, p->ubm, p->ulm, p->urm, p->uflm );
+ s +=direction_to_string( p->direction() );
+ s += ">";
+ s += ps;
+ s += "</p>";
+ }
+ pastListDepth = listDepth;
+ p = p->next();
+ }
+ while ( listDepth > 0 ) {
+ s += list_is_ordered( listStyles[listDepth] ) ? "</ol>" : "</ul>";
+ listDepth--;
}
+ if ( !par )
+ s += "\n</body></html>\n";
+
return s;
@@ -2116,7 +2246,5 @@ QString QTextDocument::text() const
{
- if ( plainText().simplifyWhiteSpace().isEmpty() )
- return QString("");
if ( txtFormat == Qt::AutoText && preferRichText || txtFormat == Qt::RichText )
return richText();
- return plainText( 0 );
+ return plainText();
}
@@ -2125,3 +2253,3 @@ QString QTextDocument::text( int parag ) const
{
- QTextParag *p = paragAt( parag );
+ QTextParagraph *p = paragAt( parag );
if ( !p )
@@ -2130,5 +2258,5 @@ QString QTextDocument::text( int parag ) const
if ( txtFormat == Qt::AutoText && preferRichText || txtFormat == Qt::RichText )
- return richText( p );
+ return p->richText();
else
- return plainText( p );
+ return p->string()->toString();
}
@@ -2137,3 +2265,3 @@ void QTextDocument::invalidate()
{
- QTextParag *s = fParag;
+ QTextParagraph *s = fParag;
while ( s ) {
@@ -2150,3 +2278,3 @@ void QTextDocument::selectionStart( int id, int &paragId, int &index )
QTextDocumentSelection &sel = *it;
- paragId = !sel.swapped ? sel.startCursor.parag()->paragId() : sel.endCursor.parag()->paragId();
+ paragId = !sel.swapped ? sel.startCursor.paragraph()->paragId() : sel.endCursor.paragraph()->paragId();
index = !sel.swapped ? sel.startCursor.index() : sel.endCursor.index();
@@ -2182,3 +2310,3 @@ void QTextDocument::selectionEnd( int id, int &paragId, int &index )
QTextDocumentSelection &sel = *it;
- paragId = sel.swapped ? sel.startCursor.parag()->paragId() : sel.endCursor.parag()->paragId();
+ paragId = sel.swapped ? sel.startCursor.paragraph()->paragId() : sel.endCursor.paragraph()->paragId();
index = sel.swapped ? sel.startCursor.index() : sel.endCursor.index();
@@ -2186,24 +2314,2 @@ void QTextDocument::selectionEnd( int id, int &paragId, int &index )
-QTextParag *QTextDocument::selectionStart( int id )
-{
- QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
- if ( it == selections.end() )
- return 0;
- QTextDocumentSelection &sel = *it;
- if ( sel.startCursor.parag()->paragId() < sel.endCursor.parag()->paragId() )
- return sel.startCursor.parag();
- return sel.endCursor.parag();
-}
-
-QTextParag *QTextDocument::selectionEnd( int id )
-{
- QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
- if ( it == selections.end() )
- return 0;
- QTextDocumentSelection &sel = *it;
- if ( sel.startCursor.parag()->paragId() > sel.endCursor.parag()->paragId() )
- return sel.startCursor.parag();
- return sel.endCursor.parag();
-}
-
void QTextDocument::addSelection( int id )
@@ -2222,9 +2328,9 @@ static void setSelectionEndHelper( int id, QTextDocumentSelection &sel, QTextCur
- c1.parag()->removeSelection( id );
- c2.parag()->removeSelection( id );
- if ( c1.parag() != c2.parag() ) {
- c1.parag()->setSelection( id, c1.index(), c1.parag()->length() - 1 );
- c2.parag()->setSelection( id, 0, c2.index() );
+ c1.paragraph()->removeSelection( id );
+ c2.paragraph()->removeSelection( id );
+ if ( c1.paragraph() != c2.paragraph() ) {
+ c1.paragraph()->setSelection( id, c1.index(), c1.paragraph()->length() - 1 );
+ c2.paragraph()->setSelection( id, 0, c2.index() );
} else {
- c1.parag()->setSelection( id, QMIN( c1.index(), c2.index() ), QMAX( c1.index(), c2.index() ) );
+ c1.paragraph()->setSelection( id, QMIN( c1.index(), c2.index() ), QMAX( c1.index(), c2.index() ) );
}
@@ -2233,3 +2339,3 @@ static void setSelectionEndHelper( int id, QTextDocumentSelection &sel, QTextCur
sel.endCursor = end;
- if ( sel.startCursor.parag() == sel.endCursor.parag() )
+ if ( sel.startCursor.paragraph() == sel.endCursor.paragraph() )
sel.swapped = sel.startCursor.index() > sel.endCursor.index();
@@ -2237,3 +2343,3 @@ static void setSelectionEndHelper( int id, QTextDocumentSelection &sel, QTextCur
-bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
+bool QTextDocument::setSelectionEnd( int id, const QTextCursor &cursor )
{
@@ -2245,3 +2351,3 @@ bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
QTextCursor start = sel.startCursor;
- QTextCursor end = *cursor;
+ QTextCursor end = cursor;
@@ -2253,3 +2359,3 @@ bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
- if ( sel.endCursor.parag() == end.parag() ) {
+ if ( sel.endCursor.paragraph() == end.paragraph() ) {
setSelectionEndHelper( id, sel, start, end );
@@ -2264,6 +2370,5 @@ bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
tmp.restoreState();
- QTextCursor tmp2 = *cursor;
+ QTextCursor tmp2 = cursor;
tmp2.restoreState();
- c.setParag( tmp.parag()->paragId() < tmp2.parag()->paragId() ? tmp.parag() : tmp2.parag() );
- QTextCursor old;
+ c.setParagraph( tmp.paragraph()->paragId() < tmp2.paragraph()->paragId() ? tmp.paragraph() : tmp2.paragraph() );
bool hadStart = FALSE;
@@ -2281,5 +2386,5 @@ bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
hadEnd = TRUE;
- if ( c.parag() == start.parag() )
+ if ( c.paragraph() == start.paragraph() )
hadStartParag = TRUE;
- if ( c.parag() == end.parag() )
+ if ( c.paragraph() == end.paragraph() )
hadEndParag = TRUE;
@@ -2292,3 +2397,3 @@ bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
( hadEnd && !hadStart ||
- hadEnd && hadStart && start.parag() == end.parag() && start.index() > end.index() ) )
+ hadEnd && hadStart && start.paragraph() == end.paragraph() && start.index() > end.index() ) )
sel.swapped = TRUE;
@@ -2299,6 +2404,6 @@ bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
tmp.restoreState();
- if ( tmp.parag() != c.parag() ) {
- int sstart = tmp.parag()->selectionStart( id );
- tmp.parag()->removeSelection( id );
- tmp.parag()->setSelection( id, sstart, tmp.index() );
+ if ( tmp.paragraph() != c.paragraph() ) {
+ int sstart = tmp.paragraph()->selectionStart( id );
+ tmp.paragraph()->removeSelection( id );
+ tmp.paragraph()->setSelection( id, sstart, tmp.index() );
}
@@ -2312,17 +2417,17 @@ bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
- bool noSelectionAnymore = hadOldStart && hadOldEnd && leftSelection && !inSelection && !c.parag()->hasSelection( id ) && c.atParagEnd();
- c.parag()->removeSelection( id );
+ bool noSelectionAnymore = hadOldStart && hadOldEnd && leftSelection && !inSelection && !c.paragraph()->hasSelection( id ) && c.atParagEnd();
+ c.paragraph()->removeSelection( id );
if ( inSelection ) {
- if ( c.parag() == start.parag() && start.parag() == end.parag() ) {
- c.parag()->setSelection( id, QMIN( start.index(), end.index() ), QMAX( start.index(), end.index() ) );
- } else if ( c.parag() == start.parag() && !hadEndParag ) {
- c.parag()->setSelection( id, start.index(), c.parag()->length() - 1 );
- } else if ( c.parag() == end.parag() && !hadStartParag ) {
- c.parag()->setSelection( id, end.index(), c.parag()->length() - 1 );
- } else if ( c.parag() == end.parag() && hadEndParag ) {
- c.parag()->setSelection( id, 0, end.index() );
- } else if ( c.parag() == start.parag() && hadStartParag ) {
- c.parag()->setSelection( id, 0, start.index() );
+ if ( c.paragraph() == start.paragraph() && start.paragraph() == end.paragraph() ) {
+ c.paragraph()->setSelection( id, QMIN( start.index(), end.index() ), QMAX( start.index(), end.index() ) );
+ } else if ( c.paragraph() == start.paragraph() && !hadEndParag ) {
+ c.paragraph()->setSelection( id, start.index(), c.paragraph()->length() - 1 );
+ } else if ( c.paragraph() == end.paragraph() && !hadStartParag ) {
+ c.paragraph()->setSelection( id, end.index(), c.paragraph()->length() - 1 );
+ } else if ( c.paragraph() == end.paragraph() && hadEndParag ) {
+ c.paragraph()->setSelection( id, 0, end.index() );
+ } else if ( c.paragraph() == start.paragraph() && hadStartParag ) {
+ c.paragraph()->setSelection( id, 0, start.index() );
} else {
- c.parag()->setSelection( id, 0, c.parag()->length() - 1 );
+ c.paragraph()->setSelection( id, 0, c.paragraph()->length() - 1 );
}
@@ -2333,6 +2438,18 @@ bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
- old = c;
- c.gotoNextLetter();
- if ( old == c || noSelectionAnymore )
+ if ( noSelectionAnymore )
break;
+ // *ugle*hack optimization
+ QTextParagraph *p = c.paragraph();
+ if ( p->mightHaveCustomItems || p == start.paragraph() || p == end.paragraph() || p == lastParagraph() ) {
+ c.gotoNextLetter();
+ if ( p == lastParagraph() && c.atParagEnd() )
+ break;
+ } else {
+ if ( p->document()->parent() )
+ do {
+ c.gotoNextLetter();
+ } while ( c.paragraph() == p );
+ else
+ c.setParagraph( p->next() );
+ }
}
@@ -2340,3 +2457,3 @@ bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
if ( !sel.swapped )
- sel.startCursor.parag()->setSelection( id, sel.startCursor.index(), sel.startCursor.parag()->length() - 1 );
+ sel.startCursor.paragraph()->setSelection( id, sel.startCursor.index(), sel.startCursor.paragraph()->length() - 1 );
@@ -2344,3 +2461,3 @@ bool QTextDocument::setSelectionEnd( int id, QTextCursor *cursor )
sel.endCursor = end;
- if ( sel.startCursor.parag() == sel.endCursor.parag() )
+ if ( sel.startCursor.paragraph() == sel.endCursor.paragraph() )
sel.swapped = sel.startCursor.index() > sel.endCursor.index();
@@ -2360,3 +2477,3 @@ void QTextDocument::selectAll( int id )
- c.setParag( fParag );
+ c.setParagraph( fParag );
c.setIndex( 0 );
@@ -2364,3 +2481,3 @@ void QTextDocument::selectAll( int id )
- c.setParag( lParag );
+ c.setParagraph( lParag );
c.setIndex( lParag->length() - 1 );
@@ -2368,13 +2485,7 @@ void QTextDocument::selectAll( int id )
- QTextParag *p = fParag;
+ selections.insert( id, sel );
+
+ QTextParagraph *p = fParag;
while ( p ) {
p->setSelection( id, 0, p->length() - 1 );
- for ( int i = 0; i < (int)p->length(); ++i ) {
- if ( p->at( i )->isCustom() && p->at( i )->customItem()->isNested() ) {
- QTextTable *t = (QTextTable*)p->at( i )->customItem();
- QPtrList<QTextTableCell> tableCells = t->tableCells();
- for ( QTextTableCell *c = tableCells.first(); c; c = tableCells.next() )
- c->richText()->selectAll( id );
- }
- }
p = p->next();
@@ -2382,3 +2493,4 @@ void QTextDocument::selectAll( int id )
- selections.insert( id, sel );
+ for ( QTextDocument *d = childList.first(); d; d = childList.next() )
+ d->selectAll( id );
}
@@ -2387,68 +2499,17 @@ bool QTextDocument::removeSelection( int id )
{
- QMap<int, QTextDocumentSelection>::Iterator it = selections.find( id );
- if ( it == selections.end() )
+ if ( !selections.contains( id ) )
return FALSE;
- QTextDocumentSelection &sel = *it;
-
- if ( sel.startCursor == sel.endCursor ) {
- selections.remove( id );
- return TRUE;
- }
-
- if ( !mightHaveCustomItems ) {
- QTextCursor start = sel.startCursor;
- QTextCursor end = sel.endCursor;
- if ( sel.swapped ) {
- start = sel.endCursor;
- end = sel.startCursor;
- }
+ QTextDocumentSelection &sel = selections[ id ];
- for ( QTextParag *p = start.parag(); p; p = p->next() ) {
+ QTextCursor start = sel.swapped ? sel.endCursor : sel.startCursor;
+ QTextCursor end = sel.swapped ? sel.startCursor : sel.endCursor;
+ QTextParagraph* p = 0;
+ while ( start != end ) {
+ if ( p != start.paragraph() ) {
+ p = start.paragraph();
p->removeSelection( id );
- if ( p == end.parag() )
- break;
}
-
- selections.remove( id );
- return TRUE;
- }
-
- QTextCursor c( this );
- QTextCursor tmp = sel.startCursor;
- if ( sel.swapped )
- tmp = sel.endCursor;
- tmp.restoreState();
- c.setParag( tmp.parag() );
- QTextCursor old;
- bool hadStart = FALSE;
- bool hadEnd = FALSE;
- QTextParag *lastParag = 0;
- bool leftSelection = FALSE;
- bool inSelection = FALSE;
- sel.swapped = FALSE;
- for ( ;; ) {
- if ( c.parag() == sel.startCursor.parag() )
- hadStart = TRUE;
- if ( c.parag() == sel.endCursor.parag() )
- hadEnd = TRUE;
-
- if ( inSelection &&
- ( c == sel.endCursor && hadStart || c == sel.startCursor && hadEnd ) )
- leftSelection = TRUE;
- else if ( !leftSelection && !inSelection && ( c.parag() == sel.startCursor.parag() || c.parag() == sel.endCursor.parag() ) )
- inSelection = TRUE;
-
- bool noSelectionAnymore = leftSelection && !inSelection && !c.parag()->hasSelection( id ) && c.atParagEnd();
-
- if ( lastParag != c.parag() )
- c.parag()->removeSelection( id );
-
- old = c;
- lastParag = c.parag();
- c.gotoNextLetter();
- if ( old == c || noSelectionAnymore )
- break;
+ start.gotoNextLetter();
}
-
selections.remove( id );
@@ -2457,5 +2518,4 @@ bool QTextDocument::removeSelection( int id )
-QString QTextDocument::selectedText( int id, bool withCustom ) const
+QString QTextDocument::selectedText( int id, bool asRichText ) const
{
- // ######## TODO: look at textFormat() and return rich text or plain text (like the text() method!)
QMap<int, QTextDocumentSelection>::ConstIterator it = selections.find( id );
@@ -2483,3 +2543,3 @@ QString QTextDocument::selectedText( int id, bool withCustom ) const
- ### Fix this properly for 3.0.4.
+ ### Fix this properly when refactoring
*/
@@ -2490,3 +2550,3 @@ QString QTextDocument::selectedText( int id, bool withCustom ) const
while ( c1.nestedDepth() && c2.nestedDepth() &&
- c1.parag()->document() != c2.parag()->document() ) {
+ c1.paragraph()->document() != c2.paragraph()->document() ) {
c1.oneUp();
@@ -2494,5 +2554,5 @@ QString QTextDocument::selectedText( int id, bool withCustom ) const
}
- // do not trust sel_swapped with tables. Fix this properly for 3.0.4 as well
- if ( c1.parag()->paragId() > c2.parag()->paragId() ||
- (c1.parag() == c2.parag() && c1.index() > c2.index() ) ) {
+ // do not trust sel_swapped with tables. Fix this properly when refactoring as well
+ if ( c1.paragraph()->paragId() > c2.paragraph()->paragId() ||
+ (c1.paragraph() == c2.paragraph() && c1.index() > c2.index() ) ) {
QTextCursor tmp = c1;
@@ -2504,6 +2564,18 @@ QString QTextDocument::selectedText( int id, bool withCustom ) const
+ if ( asRichText && !parent() ) {
+ richTextExportStart = &c1;
+ richTextExportEnd = &c2;
- if ( c1.parag() == c2.parag() ) {
- QString s;
- QTextParag *p = c1.parag();
+ QString sel = richText();
+ int from = sel.find( "<selstart/>" );
+ int to = sel.findRev( "<selend/>" );
+ if ( from >= 0 && from <= to )
+ sel = sel.mid( from, to - from );
+ richTextExportStart = richTextExportEnd = 0;
+ return sel;
+ }
+
+ QString s;
+ if ( c1.paragraph() == c2.paragraph() ) {
+ QTextParagraph *p = c1.paragraph();
int end = c2.index();
@@ -2511,3 +2583,3 @@ QString QTextDocument::selectedText( int id, bool withCustom ) const
++end;
- if ( !withCustom || !p->mightHaveCustomItems ) {
+ if ( !p->mightHaveCustomItems ) {
s += p->string()->toString().mid( c1.index(), end - c1.index() );
@@ -2529,37 +2601,43 @@ QString QTextDocument::selectedText( int id, bool withCustom ) const
}
- return s;
- }
-
- QString s;
- QTextParag *p = c1.parag();
- int start = c1.index();
- while ( p ) {
- int end = p == c2.parag() ? c2.index() : p->length() - 1;
- if ( p == c2.parag() && p->at( QMAX( 0, end - 1 ) )->isCustom() )
- ++end;
- if ( !withCustom || !p->mightHaveCustomItems ) {
- s += p->string()->toString().mid( start, end - start );
- if ( p != c2.parag() )
- s += "\n";
- } else {
- for ( int i = start; i < end; ++i ) {
- if ( p->at( i )->isCustom() ) {
- if ( p->at( i )->customItem()->isNested() ) {
- s += "\n";
- QTextTable *t = (QTextTable*)p->at( i )->customItem();
- QPtrList<QTextTableCell> cells = t->tableCells();
- for ( QTextTableCell *c = cells.first(); c; c = cells.next() )
- s += c->richText()->plainText() + "\n";
- s += "\n";
+ } else {
+ QTextParagraph *p = c1.paragraph();
+ int start = c1.index();
+ while ( p ) {
+ int end = p == c2.paragraph() ? c2.index() : p->length() - 1;
+ if ( p == c2.paragraph() && p->at( QMAX( 0, end - 1 ) )->isCustom() )
+ ++end;
+ if ( !p->mightHaveCustomItems ) {
+ s += p->string()->toString().mid( start, end - start );
+ if ( p != c2.paragraph() )
+ s += "\n";
+ } else {
+ for ( int i = start; i < end; ++i ) {
+ if ( p->at( i )->isCustom() ) {
+ if ( p->at( i )->customItem()->isNested() ) {
+ s += "\n";
+ QTextTable *t = (QTextTable*)p->at( i )->customItem();
+ QPtrList<QTextTableCell> cells = t->tableCells();
+ for ( QTextTableCell *c = cells.first(); c; c = cells.next() )
+ s += c->richText()->plainText() + "\n";
+ s += "\n";
+ }
+ } else {
+ s += p->at( i )->c;
}
- } else {
- s += p->at( i )->c;
}
}
+ start = 0;
+ if ( p == c2.paragraph() )
+ break;
+ p = p->next();
}
- start = 0;
- if ( p == c2.parag() )
- break;
- p = p->next();
}
+ // ### workaround for plain text export until we get proper
+ // mime types: turn unicode line seperators into the more
+ // widely understood \n. Makes copy and pasting code snipplets
+ // from within Assistent possible
+ QChar* uc = (QChar*) s.unicode();
+ for ( uint ii = 0; ii < s.length(); ii++ )
+ if ( uc[(int)ii] == QChar_linesep )
+ uc[(int)ii] = QChar('\n');
return s;
@@ -2585,4 +2663,4 @@ void QTextDocument::setFormat( int id, QTextFormat *f, int flags )
- if ( c1.parag() == c2.parag() ) {
- c1.parag()->setFormat( c1.index(), c2.index() - c1.index(), f, TRUE, flags );
+ if ( c1.paragraph() == c2.paragraph() ) {
+ c1.paragraph()->setFormat( c1.index(), c2.index() - c1.index(), f, TRUE, flags );
return;
@@ -2590,5 +2668,5 @@ void QTextDocument::setFormat( int id, QTextFormat *f, int flags )
- c1.parag()->setFormat( c1.index(), c1.parag()->length() - c1.index(), f, TRUE, flags );
- QTextParag *p = c1.parag()->next();
- while ( p && p != c2.parag() ) {
+ c1.paragraph()->setFormat( c1.index(), c1.paragraph()->length() - c1.index(), f, TRUE, flags );
+ QTextParagraph *p = c1.paragraph()->next();
+ while ( p && p != c2.paragraph() ) {
p->setFormat( 0, p->length(), f, TRUE, flags );
@@ -2596,13 +2674,3 @@ void QTextDocument::setFormat( int id, QTextFormat *f, int flags )
}
- c2.parag()->setFormat( 0, c2.index(), f, TRUE, flags );
-}
-
-void QTextDocument::copySelectedText( int id )
-{
-#ifndef QT_NO_CLIPBOARD
- if ( !hasSelection( id ) )
- return;
-
- QApplication::clipboard()->setText( selectedText( id ) );
-#endif
+ c2.paragraph()->setFormat( 0, c2.index(), f, TRUE, flags );
}
@@ -2634,4 +2702,4 @@ void QTextDocument::removeSelectedText( int id, QTextCursor *cursor )
- if ( c1.parag() == c2.parag() ) {
- c1.parag()->remove( c1.index(), c2.index() - c1.index() );
+ if ( c1.paragraph() == c2.paragraph() ) {
+ c1.paragraph()->remove( c1.index(), c2.index() - c1.index() );
return;
@@ -2639,4 +2707,4 @@ void QTextDocument::removeSelectedText( int id, QTextCursor *cursor )
- if ( c1.parag() == fParag && c1.index() == 0 &&
- c2.parag() == lParag && c2.index() == lParag->length() - 1 )
+ if ( c1.paragraph() == fParag && c1.index() == 0 &&
+ c2.paragraph() == lParag && c2.index() == lParag->length() - 1 )
cursor->setValid( FALSE );
@@ -2644,3 +2712,3 @@ void QTextDocument::removeSelectedText( int id, QTextCursor *cursor )
bool didGoLeft = FALSE;
- if ( c1.index() == 0 && c1.parag() != fParag ) {
+ if ( c1.index() == 0 && c1.paragraph() != fParag ) {
cursor->gotoPreviousLetter();
@@ -2650,7 +2718,7 @@ void QTextDocument::removeSelectedText( int id, QTextCursor *cursor )
- c1.parag()->remove( c1.index(), c1.parag()->length() - 1 - c1.index() );
- QTextParag *p = c1.parag()->next();
+ c1.paragraph()->remove( c1.index(), c1.paragraph()->length() - 1 - c1.index() );
+ QTextParagraph *p = c1.paragraph()->next();
int dy = 0;
- QTextParag *tmp;
- while ( p && p != c2.parag() ) {
+ QTextParagraph *tmp;
+ while ( p && p != c2.paragraph() ) {
tmp = p->next();
@@ -2660,3 +2728,3 @@ void QTextDocument::removeSelectedText( int id, QTextCursor *cursor )
}
- c2.parag()->remove( 0, c2.index() );
+ c2.paragraph()->remove( 0, c2.index() );
while ( p ) {
@@ -2668,3 +2736,3 @@ void QTextDocument::removeSelectedText( int id, QTextCursor *cursor )
- c1.parag()->join( c2.parag() );
+ c1.paragraph()->join( c2.paragraph() );
@@ -2681,10 +2749,10 @@ void QTextDocument::indentSelection( int id )
QTextDocumentSelection sel = *it;
- QTextParag *startParag = sel.startCursor.parag();
- QTextParag *endParag = sel.endCursor.parag();
- if ( sel.endCursor.parag()->paragId() < sel.startCursor.parag()->paragId() ) {
- endParag = sel.startCursor.parag();
- startParag = sel.endCursor.parag();
+ QTextParagraph *startParag = sel.startCursor.paragraph();
+ QTextParagraph *endParag = sel.endCursor.paragraph();
+ if ( sel.endCursor.paragraph()->paragId() < sel.startCursor.paragraph()->paragId() ) {
+ endParag = sel.startCursor.paragraph();
+ startParag = sel.endCursor.paragraph();
}
- QTextParag *p = startParag;
+ QTextParagraph *p = startParag;
while ( p && p != endParag ) {
@@ -2710,67 +2778,57 @@ QTextCursor *QTextDocument::redo( QTextCursor *c )
-bool QTextDocument::find( const QString &expr, bool cs, bool wo, bool forward,
- int *parag, int *index, QTextCursor *cursor )
+bool QTextDocument::find( QTextCursor& cursor, const QString &e, bool cs, bool wo, bool forward )
{
- QTextParag *p = forward ? fParag : lParag;
- if ( parag )
- p = paragAt( *parag );
- else if ( cursor )
- p = cursor->parag();
- bool first = TRUE;
-
- while ( p ) {
- QString s = p->string()->toString();
- s.remove( s.length() - 1, 1 ); // get rid of trailing space
- int start = forward ? 0 : s.length() - 1;
- if ( first && index )
- start = *index;
- else if ( first )
- start = cursor->index();
- if ( !forward && first ) {
- start -= expr.length() + 1;
- if ( start < 0 ) {
- first = FALSE;
- p = p->prev();
- continue;
- }
+ removeSelection( Standard );
+ QTextParagraph *p = 0;
+ QString expr = e;
+ // if we search for 'word only' than we have to be sure that
+ // the expression contains no space or punct character at the
+ // beginning or in the end. Otherwise we would run into a
+ // endlessloop.
+ if ( wo ) {
+ for ( ;; ) {
+ if ( expr[ 0 ].isSpace() || expr[ 0 ].isPunct() )
+ expr = expr.right( expr.length() - 1 );
+ else
+ break;
}
- first = FALSE;
-
for ( ;; ) {
- int res = forward ? s.find( expr, start, cs ) : s.findRev( expr, start, cs );
- if ( res == -1 )
+ if ( expr.at( expr.length() - 1 ).isSpace() || expr.at( expr.length() - 1 ).isPunct() )
+ expr = expr.left( expr.length() - 1 );
+ else
break;
-
- bool ok = TRUE;
- if ( wo ) {
+ }
+ }
+ for (;;) {
+ if ( p != cursor.paragraph() ) {
+ p = cursor.paragraph();
+ QString s = cursor.paragraph()->string()->toString();
+ int start = cursor.index();
+ for ( ;; ) {
+ int res = forward ? s.find( expr, start, cs ) : s.findRev( expr, start, cs );
int end = res + expr.length();
- if ( ( res == 0 || s[ res - 1 ].isSpace() || s[ res - 1 ].isPunct() ) &&
- ( end == (int)s.length() || s[ end ].isSpace() || s[ end ].isPunct() ) )
- ok = TRUE;
- else
- ok = FALSE;
- }
- if ( ok ) {
- cursor->setParag( p );
- cursor->setIndex( res );
- setSelectionStart( Standard, cursor );
- cursor->setIndex( res + expr.length() );
- setSelectionEnd( Standard, cursor );
- if ( parag )
- *parag = p->paragId();
- if ( index )
- *index = res;
- return TRUE;
- }
- if ( forward ) {
- start = res + 1;
- } else {
- if ( res == 0 )
+ if ( res == -1 || ( !forward && start < end ) )
break;
- start = res - 1;
+ if ( !wo || ( ( res == 0 || s[ res - 1 ].isSpace() || s[ res - 1 ].isPunct() ) &&
+ ( end == (int)s.length() || s[ end ].isSpace() || s[ end ].isPunct() ) ) ) {
+ removeSelection( Standard );
+ cursor.setIndex( forward ? end : res );
+ setSelectionStart( Standard, cursor );
+ cursor.setIndex( forward ? res : end );
+ setSelectionEnd( Standard, cursor );
+ return TRUE;
+ }
+ start = res + (forward ? 1 : -1);
}
}
- p = forward ? p->next() : p->prev();
+ if ( forward ) {
+ if ( cursor.paragraph() == lastParagraph() && cursor.atParagEnd () )
+ break;
+ cursor.gotoNextLetter();
+ } else {
+ if ( cursor.paragraph() == firstParagraph() && cursor.atParagStart() )
+ break;
+ cursor.gotoPreviousLetter();
+ }
}
-
return FALSE;
@@ -2781,9 +2839,4 @@ void QTextDocument::setTextFormat( Qt::TextFormat f )
txtFormat = f;
- if ( txtFormat == Qt::RichText && fParag && fParag == lParag && fParag->length() <= 1 ) {
- QPtrVector<QStyleSheetItem> v = fParag->styleSheetItems();
- v.resize( v.size() + 1 );
- v.insert( v.size() - 1, styleSheet()->item( "p" ) );
- fParag->setStyleSheetItems( v );
- }
-
+ if ( fParag == lParag && fParag->length() <= 1 )
+ fParag->rtext = ( f == Qt::RichText );
}
@@ -2802,13 +2855,13 @@ bool QTextDocument::inSelection( int selId, const QPoint &pos ) const
QTextDocumentSelection sel = *it;
- QTextParag *startParag = sel.startCursor.parag();
- QTextParag *endParag = sel.endCursor.parag();
- if ( sel.startCursor.parag() == sel.endCursor.parag() &&
- sel.startCursor.parag()->selectionStart( selId ) == sel.endCursor.parag()->selectionEnd( selId ) )
+ QTextParagraph *startParag = sel.startCursor.paragraph();
+ QTextParagraph *endParag = sel.endCursor.paragraph();
+ if ( sel.startCursor.paragraph() == sel.endCursor.paragraph() &&
+ sel.startCursor.paragraph()->selectionStart( selId ) == sel.endCursor.paragraph()->selectionEnd( selId ) )
return FALSE;
- if ( sel.endCursor.parag()->paragId() < sel.startCursor.parag()->paragId() ) {
- endParag = sel.startCursor.parag();
- startParag = sel.endCursor.parag();
+ if ( sel.endCursor.paragraph()->paragId() < sel.startCursor.paragraph()->paragId() ) {
+ endParag = sel.startCursor.paragraph();
+ startParag = sel.endCursor.paragraph();
}
- QTextParag *p = startParag;
+ QTextParagraph *p = startParag;
while ( p ) {
@@ -2857,3 +2910,3 @@ void QTextDocument::doLayout( QPainter *p, int w )
vw = w;
- QTextParag *parag = fParag;
+ QTextParagraph *parag = fParag;
while ( parag ) {
@@ -2870,14 +2923,6 @@ QPixmap *QTextDocument::bufferPixmap( const QSize &s )
{
- if ( !buf_pixmap ) {
- int w = QABS( s.width() );
- int h = QABS( s.height() );
- buf_pixmap = new QPixmap( w, h );
- } else {
- if ( buf_pixmap->width() < s.width() ||
- buf_pixmap->height() < s.height() ) {
- buf_pixmap->resize( QMAX( s.width(), buf_pixmap->width() ),
- QMAX( s.height(), buf_pixmap->height() ) );
- }
- }
-
+ if ( !buf_pixmap )
+ buf_pixmap = new QPixmap( s.expandedTo( QSize(1,1) ) );
+ else if ( buf_pixmap->size() != s )
+ buf_pixmap->resize( s.expandedTo( buf_pixmap->size() ) );
return buf_pixmap;
@@ -2887,3 +2932,3 @@ void QTextDocument::draw( QPainter *p, const QRect &rect, const QColorGroup &cg,
{
- if ( !firstParag() )
+ if ( !firstParagraph() )
return;
@@ -2896,17 +2941,6 @@ void QTextDocument::draw( QPainter *p, const QRect &rect, const QColorGroup &cg,
- if ( formatCollection()->defaultFormat()->color() != cg.text() ) {
- QDict<QTextFormat> formats = formatCollection()->dict();
- QDictIterator<QTextFormat> it( formats );
- while ( it.current() ) {
- if ( it.current() == formatCollection()->defaultFormat() ) {
- ++it;
- continue;
- }
- it.current()->setColor( cg.text() );
- ++it;
- }
- formatCollection()->defaultFormat()->setColor( cg.text() );
- }
+ if ( formatCollection()->defaultFormat()->color() != cg.text() )
+ setDefaultFormat( formatCollection()->defaultFormat()->font(), cg.text() );
- QTextParag *parag = firstParag();
+ QTextParagraph *parag = firstParagraph();
while ( parag ) {
@@ -2934,3 +2968,3 @@ void QTextDocument::draw( QPainter *p, const QRect &rect, const QColorGroup &cg,
-void QTextDocument::drawParag( QPainter *p, QTextParag *parag, int cx, int cy, int cw, int ch,
+void QTextDocument::drawParagraph( QPainter *p, QTextParagraph *parag, int cx, int cy, int cw, int ch,
QPixmap *&doubleBuffer, const QColorGroup &cg,
@@ -2967,19 +3001,7 @@ void QTextDocument::drawParag( QPainter *p, QTextParag *parag, int cx, int cy, i
- if ( useDoubleBuffer || is_printer( painter ) ) {
- if ( !parag->backgroundColor() )
- painter->fillRect( QRect( 0, 0, ir.width(), ir.height() ),
- cg.brush( QColorGroup::Base ) );
- else
- painter->fillRect( QRect( 0, 0, ir.width(), ir.height() ),
- *parag->backgroundColor() );
- } else {
- if ( cursor && cursor->parag() == parag ) {
- if ( !parag->backgroundColor() )
- painter->fillRect( QRect( parag->at( cursor->index() )->x, 0, 2, ir.height() ),
- cg.brush( QColorGroup::Base ) );
- else
- painter->fillRect( QRect( parag->at( cursor->index() )->x, 0, 2, ir.height() ),
- *parag->backgroundColor() );
- }
- }
+ if ( useDoubleBuffer || is_printer( painter ) )
+ painter->fillRect( QRect( 0, 0, ir.width(), ir.height() ), parag->backgroundBrush( cg ) );
+ else if ( cursor && cursor->paragraph() == parag )
+ painter->fillRect( QRect( parag->at( cursor->index() )->x, 0, 2, ir.height() ),
+ parag->backgroundBrush( cg ) );
@@ -2997,7 +3019,9 @@ void QTextDocument::drawParag( QPainter *p, QTextParag *parag, int cx, int cy, i
- if ( parag->rect().x() + parag->rect().width() < parag->document()->x() + parag->document()->width() ) {
- p->fillRect( parag->rect().x() + parag->rect().width(), parag->rect().y(),
- ( parag->document()->x() + parag->document()->width() ) -
- ( parag->rect().x() + parag->rect().width() ),
- parag->rect().height(), cg.brush( QColorGroup::Base ) );
+ if ( useDoubleBuffer ) {
+ if ( parag->rect().x() + parag->rect().width() < parag->document()->x() + parag->document()->width() ) {
+ p->fillRect( parag->rect().x() + parag->rect().width(), parag->rect().y(),
+ ( parag->document()->x() + parag->document()->width() ) -
+ ( parag->rect().x() + parag->rect().width() ),
+ parag->rect().height(), cg.brush( QColorGroup::Base ) );
+ }
}
@@ -3007,3 +3031,3 @@ void QTextDocument::drawParag( QPainter *p, QTextParag *parag, int cx, int cy, i
-QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, const QColorGroup &cg,
+QTextParagraph *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, const QColorGroup &cg,
bool onlyChanged, bool drawCursor, QTextCursor *cursor, bool resetChanged )
@@ -3018,7 +3042,5 @@ QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, co
- if ( !firstParag() )
+ if ( !firstParagraph() )
return 0;
- if ( drawCursor && cursor )
- tmpCursor = cursor;
if ( cx < 0 && cy < 0 ) {
@@ -3030,4 +3052,4 @@ QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, co
- QTextParag *lastFormatted = 0;
- QTextParag *parag = firstParag();
+ QTextParagraph *lastFormatted = 0;
+ QTextParagraph *parag = firstParagraph();
@@ -3036,2 +3058,3 @@ QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, co
+ bool fullWidthSelection = FALSE;
while ( parag ) {
@@ -3041,16 +3064,8 @@ QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, co
- if ( !parag->rect().intersects( QRect( cx, cy, cw, ch ) ) ) {
- QRect pr( parag->rect() );
+ QRect pr = parag->rect();
+ if ( fullWidthSelection )
pr.setWidth( parag->document()->width() );
- if ( pr.intersects( QRect( cx, cy, cw, ch ) ) )
- p->fillRect( pr.intersect( QRect( cx, cy, cw, ch ) ), cg.brush( QColorGroup::Base ) );
- if ( parag->rect().y() > cy + ch ) {
- tmpCursor = 0;
- goto floating;
- }
- parag = parag->next();
- continue;
- }
-
- if ( !parag->hasChanged() && onlyChanged ) {
+ if ( pr.y() > cy + ch )
+ goto floating;
+ if ( !pr.intersects( QRect( cx, cy, cw, ch ) ) || ( onlyChanged && !parag->hasChanged() ) ) {
parag = parag->next();
@@ -3059,3 +3074,3 @@ QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, co
- drawParag( p, parag, cx, cy, cw, ch, doubleBuffer, cg, drawCursor, cursor, resetChanged );
+ drawParagraph( p, parag, cx, cy, cw, ch, doubleBuffer, cg, drawCursor, cursor, resetChanged );
parag = parag->next();
@@ -3063,3 +3078,3 @@ QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, co
- parag = lastParag();
+ parag = lastParagraph();
@@ -3067,3 +3082,3 @@ QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, co
if ( parag->rect().y() + parag->rect().height() < parag->document()->height() ) {
- if ( !parag->document()->parent() ) { // !useDoubleBuffer
+ if ( !parag->document()->parent() ) {
p->fillRect( 0, parag->rect().y() + parag->rect().height(), parag->document()->width(),
@@ -3074,4 +3089,2 @@ QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, co
QRect cr( cx, cy, cw, ch );
-// cr = cr.intersect( QRect( 0, parag->rect().y() + parag->rect().height(), parag->document()->width(),
-// parag->document()->height() - ( parag->rect().y() + parag->rect().height() ) ) );
flow()->drawFloatingItems( p, cr.x(), cr.y(), cr.width(), cr.height(), cg, FALSE );
@@ -3085,3 +3098,2 @@ QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, co
- tmpCursor = 0;
return lastFormatted;
@@ -3089,14 +3101,28 @@ QTextParag *QTextDocument::draw( QPainter *p, int cx, int cy, int cw, int ch, co
-void QTextDocument::setDefaultFont( const QFont &f )
+/*
+ #### this function only sets the default font size in the format collection
+ */
+void QTextDocument::setDefaultFormat( const QFont &font, const QColor &color )
{
- int s = f.pointSize();
- bool usePixels = FALSE;
- if ( s == -1 ) {
- s = f.pixelSize();
- usePixels = TRUE;
+ bool reformat = font != fCollection->defaultFormat()->font();
+ for ( QTextDocument *d = childList.first(); d; d = childList.next() )
+ d->setDefaultFormat( font, color );
+ fCollection->updateDefaultFormat( font, color, sheet_ );
+
+ if ( !reformat )
+ return;
+ tStopWidth = formatCollection()->defaultFormat()->width( 'x' ) * 8;
+
+ // invalidate paragraphs and custom items
+ QTextParagraph *p = fParag;
+ while ( p ) {
+ p->invalidate( 0 );
+ for ( int i = 0; i < p->length() - 1; ++i )
+ if ( p->at( i )->isCustom() )
+ p->at( i )->customItem()->invalidate();
+ p = p->next();
}
- updateFontSizes( s, usePixels );
}
-void QTextDocument::registerCustomItem( QTextCustomItem *i, QTextParag *p )
+void QTextDocument::registerCustomItem( QTextCustomItem *i, QTextParagraph *p )
{
@@ -3110,3 +3136,3 @@ void QTextDocument::registerCustomItem( QTextCustomItem *i, QTextParag *p )
-void QTextDocument::unregisterCustomItem( QTextCustomItem *i, QTextParag *p )
+void QTextDocument::unregisterCustomItem( QTextCustomItem *i, QTextParagraph *p )
{
@@ -3145,3 +3171,3 @@ bool QTextDocument::focusNextPrevChild( bool next )
if ( next ) {
- QTextParag *p = focusIndicator.parag;
+ QTextParagraph *p = focusIndicator.parag;
int index = focusIndicator.start + focusIndicator.len;
@@ -3204,3 +3230,3 @@ bool QTextDocument::focusNextPrevChild( bool next )
} else {
- QTextParag *p = focusIndicator.parag;
+ QTextParagraph *p = focusIndicator.parag;
int index = focusIndicator.start - 1;
@@ -3284,3 +3310,3 @@ int QTextDocument::length() const
int l = 0;
- QTextParag *p = fParag;
+ QTextParagraph *p = fParag;
while ( p ) {
@@ -3387,9 +3413,14 @@ void QTextString::insert( int index, const QString &s, QTextFormat *f )
{
+ insert( index, s.unicode(), s.length(), f );
+}
+
+void QTextString::insert( int index, const QChar *unicode, int len, QTextFormat *f )
+{
int os = data.size();
- data.resize( data.size() + s.length() );
+ data.resize( data.size() + len );
if ( index < os ) {
- memmove( data.data() + index + s.length(), data.data() + index,
+ memmove( data.data() + index + len, data.data() + index,
sizeof( QTextStringChar ) * ( os - index ) );
}
- for ( int i = 0; i < (int)s.length(); ++i ) {
+ for ( int i = 0; i < len; ++i ) {
data[ (int)index + i ].x = 0;
@@ -3400,3 +3431,3 @@ void QTextString::insert( int index, const QString &s, QTextFormat *f )
data[ (int)index + i ].startOfRun = 0;
- data[ (int)index + i ].c = s[ i ];
+ data[ (int)index + i ].c = unicode[i];
data[ (int)index + i ].setFormat( f );
@@ -3411,3 +3442,3 @@ QTextString::~QTextString()
-void QTextString::insert( int index, QTextStringChar *c )
+void QTextString::insert( int index, QTextStringChar *c, bool doAddRefFormat )
{
@@ -3425,2 +3456,4 @@ void QTextString::insert( int index, QTextStringChar *c )
data[ (int)index ].type = QTextStringChar::Regular;
+ if ( doAddRefFormat && c->format() )
+ c->format()->addRef();
data[ (int)index ].setFormat( c->format() );
@@ -3547,30 +3580,25 @@ void QTextDocument::setStyleSheet( QStyleSheet *s )
sheet_ = s;
- fCollection->setStyleSheet( s );
- updateStyles();
-}
-
-void QTextDocument::updateStyles()
-{
- invalidate();
- if ( par )
- underlLinks = par->underlLinks;
- fCollection->updateStyles();
- for ( QTextDocument *d = childList.first(); d; d = childList.next() )
- d->updateStyles();
-}
-
-void QTextDocument::updateFontSizes( int base, bool usePixels )
-{
- for ( QTextDocument *d = childList.first(); d; d = childList.next() )
- d->updateFontSizes( base, usePixels );
- invalidate();
- fCollection->updateFontSizes( base, usePixels );
+ list_tm = list_bm = par_tm = par_bm = 12;
+ list_lm = 40;
+ li_tm = li_bm = 0;
+ QStyleSheetItem* item = s->item( "ol" );
+ if ( item ) {
+ list_tm = QMAX(0,item->margin( QStyleSheetItem::MarginTop ));
+ list_bm = QMAX(0,item->margin( QStyleSheetItem::MarginBottom ));
+ list_lm = QMAX(0,item->margin( QStyleSheetItem::MarginLeft ));
+ }
+ if ( (item = s->item( "li" ) ) ) {
+ li_tm = QMAX(0,item->margin( QStyleSheetItem::MarginTop ));
+ li_bm = QMAX(0,item->margin( QStyleSheetItem::MarginBottom ));
+ }
+ if ( (item = s->item( "p" ) ) ) {
+ par_tm = QMAX(0,item->margin( QStyleSheetItem::MarginTop ));
+ par_bm = QMAX(0,item->margin( QStyleSheetItem::MarginBottom ));
+ }
}
-void QTextDocument::updateFontAttributes( const QFont &f, const QFont &old )
-{
+void QTextDocument::setUnderlineLinks( bool b ) {
+ underlLinks = b;
for ( QTextDocument *d = childList.first(); d; d = childList.next() )
- d->updateFontAttributes( f, old );
- invalidate();
- fCollection->updateFontAttributes( f, old );
+ d->setUnderlineLinks( b );
}
@@ -3580,9 +3608,9 @@ void QTextStringChar::setFormat( QTextFormat *f )
if ( type == Regular ) {
- d.format = f;
+ d.format = f;
} else {
- if ( !d.custom ) {
- d.custom = new CustomData;
- d.custom->custom = 0;
- }
- d.custom->format = f;
+ if ( !d.custom ) {
+ d.custom = new CustomData;
+ d.custom->custom = 0;
+ }
+ d.custom->format = f;
}
@@ -3653,3 +3681,3 @@ int QTextString::width( int idx ) const
QTextStringChar *c = &at( idx );
- if ( c->c.unicode() == 0xad )
+ if ( c->c.unicode() == 0xad || c->c.unicode() == 0x2028 )
return 0;
@@ -3701,38 +3729,20 @@ QMemArray<QTextStringChar> QTextString::subString( int start, int len ) const
-QTextStringChar *QTextStringChar::clone() const
-{
- QTextStringChar *chr = new QTextStringChar;
- chr->c = c;
- chr->x = 0;
- chr->lineStart = 0;
- chr->rightToLeft = 0;
- chr->d.format = 0;
- chr->type = QTextStringChar::Regular;
- chr->setFormat( format() );
- if ( chr->format() )
- chr->format()->addRef();
- return chr;
-}
-
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-QTextParag::QTextParag( QTextDocument *d, QTextParag *pr, QTextParag *nx, bool updateIds )
- : invalid( 0 ), p( pr ), n( nx ), docOrPseudo( d ), align( 0 ),mSelections( 0 ),
- mStyleSheetItemsVec( 0 ), mFloatingItems( 0 ), listS( QStyleSheetItem::ListDisc ),
- numSubParag( -1 ), tm( -1 ), bm( -1 ), lm( -1 ), rm( -1 ), flm( -1 ),
- tArray(0), tabStopWidth(0), eData( 0 )
-{
- listS = QStyleSheetItem::ListDisc;
- if ( ! (hasdoc = docOrPseudo != 0 ) )
- docOrPseudo = new QTextParagPseudoDocument;
+QTextParagraph::QTextParagraph( QTextDocument *d, QTextParagraph *pr, QTextParagraph *nx, bool updateIds )
+ : invalid( 0 ), p( pr ), n( nx ), docOrPseudo( d ),
+ changed(FALSE), firstFormat(TRUE), firstPProcess(TRUE), needPreProcess(FALSE), fullWidth(TRUE),
+ lastInFrame(FALSE), visible(TRUE), breakable(TRUE), movedDown(FALSE),
+ mightHaveCustomItems(FALSE), hasdoc( d != 0 ), litem(FALSE), rtext(FALSE),
+ align( 0 ),mSelections( 0 ),
+ mFloatingItems( 0 ), lstyle( QStyleSheetItem::ListDisc ),
+ utm( 0 ), ubm( 0 ), ulm( 0 ), urm( 0 ), uflm( 0 ), ulinespacing( 0 ),
+ tArray(0), tabStopWidth(0), eData( 0 ), ldepth( 0 )
+{
+ lstyle = QStyleSheetItem::ListDisc;
+ if ( !hasdoc )
+ docOrPseudo = new QTextParagraphPseudoDocument;
bgcol = 0;
- breakable = TRUE;
- isBr = FALSE;
- movedDown = FALSE;
- mightHaveCustomItems = FALSE;
- visible = TRUE;
list_val = -1;
- newLinesAllowed = FALSE;
- lastInFrame = FALSE;
- defFormat = formatCollection()->defaultFormat();
+ QTextFormat* defFormat = formatCollection()->defaultFormat();
if ( !hasdoc ) {
@@ -3741,6 +3751,2 @@ QTextParag::QTextParag( QTextDocument *d, QTextParag *pr, QTextParag *nx, bool u
}
-#if defined(PARSER_DEBUG)
- qDebug( debug_indent + "new QTextParag" );
-#endif
- fullWidth = TRUE;
@@ -3753,10 +3759,7 @@ QTextParag::QTextParag( QTextDocument *d, QTextParag *pr, QTextParag *nx, bool u
if ( !p && hasdoc )
- document()->setFirstParag( this );
+ document()->setFirstParagraph( this );
if ( !n && hasdoc )
- document()->setLastParag( this );
+ document()->setLastParagraph( this );
- changed = FALSE;
- firstFormat = TRUE;
state = -1;
- needPreProcess = FALSE;
@@ -3767,7 +3770,6 @@ QTextParag::QTextParag( QTextDocument *d, QTextParag *pr, QTextParag *nx, bool u
if ( n && updateIds ) {
- QTextParag *s = n;
+ QTextParagraph *s = n;
while ( s ) {
s->id = s->p->id + 1;
- s->numSubParag = -1;
- s->lm = s->rm = s->tm = s->bm = -1, s->flm = -1;
+ s->invalidateStyleCache();
s = s->n;
@@ -3775,3 +3777,2 @@ QTextParag::QTextParag( QTextDocument *d, QTextParag *pr, QTextParag *nx, bool u
}
- firstPProcess = TRUE;
@@ -3781,3 +3782,3 @@ QTextParag::QTextParag( QTextDocument *d, QTextParag *pr, QTextParag *nx, bool u
-QTextParag::~QTextParag()
+QTextParagraph::~QTextParagraph()
{
@@ -3798,3 +3799,3 @@ QTextParag::~QTextParag()
delete eData;
- QMap<int, QTextParagLineStart*>::Iterator it = lineStarts.begin();
+ QMap<int, QTextLineStart*>::Iterator it = lineStarts.begin();
for ( ; it != lineStarts.end(); ++it )
@@ -3805,4 +3806,2 @@ QTextParag::~QTextParag()
delete mFloatingItems;
- if ( mStyleSheetItemsVec )
- delete mStyleSheetItemsVec;
if ( p )
@@ -3813,3 +3812,3 @@ QTextParag::~QTextParag()
-void QTextParag::setNext( QTextParag *s )
+void QTextParagraph::setNext( QTextParagraph *s )
{
@@ -3817,6 +3816,6 @@ void QTextParag::setNext( QTextParag *s )
if ( !n && hasdoc )
- document()->setLastParag( this );
+ document()->setLastParagraph( this );
}
-void QTextParag::setPrev( QTextParag *s )
+void QTextParagraph::setPrev( QTextParagraph *s )
{
@@ -3824,6 +3823,6 @@ void QTextParag::setPrev( QTextParag *s )
if ( !p && hasdoc )
- document()->setFirstParag( this );
+ document()->setFirstParagraph( this );
}
-void QTextParag::invalidate( int chr )
+void QTextParagraph::invalidate( int chr )
{
@@ -3837,12 +3836,24 @@ void QTextParag::invalidate( int chr )
}
- lm = rm = bm = tm = flm = -1;
+ invalidateStyleCache();
}
-void QTextParag::insert( int index, const QString &s )
+void QTextParagraph::invalidateStyleCache()
+{
+ if ( list_val < 0 )
+ list_val = -1;
+}
+
+
+void QTextParagraph::insert( int index, const QString &s )
+{
+ insert( index, s.unicode(), s.length() );
+}
+
+void QTextParagraph::insert( int index, const QChar *unicode, int len )
{
if ( hasdoc && !document()->useFormatCollection() && document()->preProcessor() )
- str->insert( index, s,
+ str->insert( index, unicode, len,
document()->preProcessor()->format( QTextPreProcessor::Standard ) );
else
- str->insert( index, s, formatCollection()->defaultFormat() );
+ str->insert( index, unicode, len, formatCollection()->defaultFormat() );
invalidate( index );
@@ -3851,3 +3862,3 @@ void QTextParag::insert( int index, const QString &s )
-void QTextParag::truncate( int index )
+void QTextParagraph::truncate( int index )
{
@@ -3858,3 +3869,3 @@ void QTextParag::truncate( int index )
-void QTextParag::remove( int index, int len )
+void QTextParagraph::remove( int index, int len )
{
@@ -3873,3 +3884,3 @@ void QTextParag::remove( int index, int len )
-void QTextParag::join( QTextParag *s )
+void QTextParagraph::join( QTextParagraph *s )
{
@@ -3880,3 +3891,3 @@ void QTextParag::join( QTextParag *s )
else if ( hasdoc )
- document()->setLastParag( this );
+ document()->setLastParagraph( this );
@@ -3898,2 +3909,6 @@ void QTextParag::join( QTextParag *s )
s->str->at( i ).loseCustomItem();
+ if ( hasdoc ) {
+ document()->unregisterCustomItem( item, s );
+ document()->registerCustomItem( item, this );
+ }
}
@@ -3916,3 +3931,4 @@ void QTextParag::join( QTextParag *s )
if ( n ) {
- QTextParag *s = n;
+ QTextParagraph *s = n;
+ s->invalidate( 0 );
while ( s ) {
@@ -3922,2 +3938,3 @@ void QTextParag::join( QTextParag *s )
s->changed = TRUE;
+ s->invalidateStyleCache();
s = s->n;
@@ -3929,3 +3946,3 @@ void QTextParag::join( QTextParag *s )
-void QTextParag::move( int &dy )
+void QTextParagraph::move( int &dy )
{
@@ -3953,3 +3970,3 @@ void QTextParag::move( int &dy )
-void QTextParag::format( int start, bool doMove )
+void QTextParagraph::format( int start, bool doMove )
{
@@ -3968,3 +3985,2 @@ void QTextParag::format( int start, bool doMove )
r.moveTopLeft( QPoint( documentX(), p ? p->r.y() + p->r.height() : documentY() ) );
- r.setWidth( documentWidth() );
if ( p )
@@ -3977,2 +3993,3 @@ void QTextParag::format( int start, bool doMove )
+ r.setWidth( documentWidth() );
if ( hasdoc && mFloatingItems ) {
@@ -3985,3 +4002,3 @@ void QTextParag::format( int start, bool doMove )
}
- QMap<int, QTextParagLineStart*> oldLineStarts = lineStarts;
+ QMap<int, QTextLineStart*> oldLineStarts = lineStarts;
lineStarts.clear();
@@ -3993,3 +4010,3 @@ void QTextParag::format( int start, bool doMove )
- QMap<int, QTextParagLineStart*>::Iterator it = oldLineStarts.begin();
+ QMap<int, QTextLineStart*>::Iterator it = oldLineStarts.begin();
@@ -3999,8 +4016,8 @@ void QTextParag::format( int start, bool doMove )
QTextStringChar *c = 0;
- // do not do this on mac, as the paragraph
- // with has to be the full document width on mac as the selections
- // always extend completely to the right. This is a bit unefficient,
- // as this results in a bigger double buffer than needed but ok for
- // now.
- if ( lineStarts.count() == 1 ) { //&& ( !doc || document()->flow()->isEmpty() ) ) {
+ // do not do this on mac, as the paragraph
+ // with has to be the full document width on mac as the selections
+ // always extend completely to the right. This is a bit unefficient,
+ // as this results in a bigger double buffer than needed but ok for
+ // now.
+ if ( lineStarts.count() == 1 ) {
if ( !string()->isBidi() ) {
@@ -4013,3 +4030,3 @@ void QTextParag::format( int start, bool doMove )
- if ( newLinesAllowed ) {
+ if ( !hasdoc ) { // qt_format_text bounding rect handling
it = lineStarts.begin();
@@ -4056,3 +4073,3 @@ void QTextParag::format( int start, bool doMove )
int dy = ( r.y() + r.height() ) - n->r.y();
- QTextParag *s = n;
+ QTextParagraph *s = n;
bool makeInvalid = p && p->lastInFrame;
@@ -4076,8 +4093,8 @@ void QTextParag::format( int start, bool doMove )
-int QTextParag::lineHeightOfChar( int i, int *bl, int *y ) const
+int QTextParagraph::lineHeightOfChar( int i, int *bl, int *y ) const
{
if ( !isValid() )
- ( (QTextParag*)this )->format();
+ ( (QTextParagraph*)this )->format();
- QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.end();
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.end();
--it;
@@ -4096,3 +4113,3 @@ int QTextParag::lineHeightOfChar( int i, int *bl, int *y ) const
- qWarning( "QTextParag::lineHeightOfChar: couldn't find lh for %d", i );
+ qWarning( "QTextParagraph::lineHeightOfChar: couldn't find lh for %d", i );
return 15;
@@ -4100,9 +4117,9 @@ int QTextParag::lineHeightOfChar( int i, int *bl, int *y ) const
-QTextStringChar *QTextParag::lineStartOfChar( int i, int *index, int *line ) const
+QTextStringChar *QTextParagraph::lineStartOfChar( int i, int *index, int *line ) const
{
if ( !isValid() )
- ( (QTextParag*)this )->format();
+ ( (QTextParagraph*)this )->format();
int l = (int)lineStarts.count() - 1;
- QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.end();
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.end();
--it;
@@ -4122,3 +4139,3 @@ QTextStringChar *QTextParag::lineStartOfChar( int i, int *index, int *line ) con
- qWarning( "QTextParag::lineStartOfChar: couldn't find %d", i );
+ qWarning( "QTextParagraph::lineStartOfChar: couldn't find %d", i );
return 0;
@@ -4126,6 +4143,6 @@ QTextStringChar *QTextParag::lineStartOfChar( int i, int *index, int *line ) con
-int QTextParag::lines() const
+int QTextParagraph::lines() const
{
if ( !isValid() )
- ( (QTextParag*)this )->format();
+ ( (QTextParagraph*)this )->format();
@@ -4134,9 +4151,9 @@ int QTextParag::lines() const
-QTextStringChar *QTextParag::lineStartOfLine( int line, int *index ) const
+QTextStringChar *QTextParagraph::lineStartOfLine( int line, int *index ) const
{
if ( !isValid() )
- ( (QTextParag*)this )->format();
+ ( (QTextParagraph*)this )->format();
if ( line >= 0 && line < (int)lineStarts.count() ) {
- QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.begin();
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin();
while ( line-- > 0 )
@@ -4149,3 +4166,3 @@ QTextStringChar *QTextParag::lineStartOfLine( int line, int *index ) const
- qWarning( "QTextParag::lineStartOfLine: couldn't find %d", line );
+ qWarning( "QTextParagraph::lineStartOfLine: couldn't find %d", line );
return 0;
@@ -4153,6 +4170,6 @@ QTextStringChar *QTextParag::lineStartOfLine( int line, int *index ) const
-int QTextParag::leftGap() const
+int QTextParagraph::leftGap() const
{
if ( !isValid() )
- ( (QTextParag*)this )->format();
+ ( (QTextParagraph*)this )->format();
@@ -4161,3 +4178,3 @@ int QTextParag::leftGap() const
if ( str->isBidi() ) {
- for ( int i = 1; i < str->length(); ++i )
+ for ( int i = 1; i < str->length()-1; ++i )
x = QMIN(x, str->at(i).x);
@@ -4166,3 +4183,3 @@ int QTextParag::leftGap() const
- QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.begin();
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin();
while (line < (int)lineStarts.count()) {
@@ -4176,3 +4193,3 @@ int QTextParag::leftGap() const
-void QTextParag::setFormat( int index, int len, QTextFormat *f, bool useCollection, int flags )
+void QTextParagraph::setFormat( int index, int len, QTextFormat *f, bool useCollection, int flags )
{
@@ -4214,5 +4231,5 @@ void QTextParag::setFormat( int index, int len, QTextFormat *f, bool useCollecti
-void QTextParag::indent( int *oldIndent, int *newIndent )
+void QTextParagraph::indent( int *oldIndent, int *newIndent )
{
- if ( !hasdoc || !document()->indent() || style() && style()->displayMode() != QStyleSheetItem::DisplayBlock ) {
+ if ( !hasdoc || !document()->indent() || isListItem() ) {
if ( oldIndent )
@@ -4228,3 +4245,3 @@ void QTextParag::indent( int *oldIndent, int *newIndent )
-void QTextParag::paint( QPainter &painter, const QColorGroup &cg, QTextCursor *cursor, bool drawSelections,
+void QTextParagraph::paint( QPainter &painter, const QColorGroup &cg, QTextCursor *cursor, bool drawSelections,
int clipx, int clipy, int clipw, int cliph )
@@ -4233,72 +4250,64 @@ void QTextParag::paint( QPainter &painter, const QColorGroup &cg, QTextCursor *c
return;
- QTextStringChar *chr = at( 0 );
- int i = 0;
- int h = 0;
- int baseLine = 0, lastBaseLine = 0;
- QTextStringChar *formatChar = 0;
- int lastY = -1;
- int startX = 0;
- int bw = 0;
- int cy = 0;
- int curx = -1, cury = 0, curh = 0;
- bool lastDirection = chr->rightToLeft;
- const int full_sel_width = (hasdoc ? document()->width() : r.width());
-#if 0 // seems we don't need that anymore
- int tw = 0;
-#endif
-
+ QTextStringChar *chr = 0;
+ int i, y, h, baseLine, xstart, xend;
+ i = y =h = baseLine = 0;
+ QRect cursorRect;
+ drawSelections &= ( mSelections != 0 );
+ // macintosh full-width selection style
+ bool fullWidthStyle = FALSE;
+ int fullSelectionWidth = 0;
+ if ( drawSelections && fullWidthStyle )
+ fullSelectionWidth = (hasdoc ? document()->width() : r.width());
+
QString qstr = str->toString();
- // ### workaround so that \n are not drawn, actually this should be
- // fixed in QFont somewhere (under Windows you get ugly boxes
+ // ### workaround so that \n are not drawn, actually this should
+ // be fixed in QFont somewhere (under Windows you get ugly boxes
// otherwise)
QChar* uc = (QChar*) qstr.unicode();
- for ( uint ii = 0; ii < qstr.length(); ii++ ) {
- if ( uc[(int)ii]== '\n' )
+ for ( uint ii = 0; ii < qstr.length(); ii++ )
+ if ( uc[(int)ii]== '\n' || uc[(int)ii] == QChar_linesep || uc[(int)ii] == '\t' )
uc[(int)ii] = 0x20;
- }
-
-
- const int nSels = hasdoc ? document()->numSelections() : 1;
- QMemArray<int> selectionStarts( nSels );
- QMemArray<int> selectionEnds( nSels );
- if ( drawSelections ) {
- bool hasASelection = FALSE;
- for ( i = 0; i < nSels; ++i ) {
- if ( !hasSelection( i ) ) {
- selectionStarts[ i ] = -1;
- selectionEnds[ i ] = -1;
- } else {
- hasASelection = TRUE;
- selectionStarts[ i ] = selectionStart( i );
- int end = selectionEnd( i );
- if ( end == length() - 1 && n && n->hasSelection( i ) )
- end++;
- selectionEnds[ i ] = end;
- }
- }
- if ( !hasASelection )
- drawSelections = FALSE;
- }
int line = -1;
- int cw;
- bool didListLabel = FALSE;
int paintStart = 0;
- int paintEnd = -1;
- int lasth = 0;
+ int selection = -1;
for ( i = 0; i < length(); i++ ) {
chr = at( i );
-#if 0 // seems we don't need that anymore
- if ( !str->isBidi() && is_printer( &painter ) ) { // ### fix our broken ps-printer
- if ( !chr->lineStart )
- chr->x = QMAX( chr->x, tw );
- else
- tw = 0;
+
+ // we flush at end of document
+ bool flush = i== length()-1;
+ bool selectionStateChanged = FALSE;
+ if ( !flush ) {
+ QTextStringChar *nextchr = at( i+1 );
+ // we flush at end of line
+ flush |= nextchr->lineStart;
+ // we flush on format changes
+ flush |= ( nextchr->format() != chr->format() );
+ // we flush on anchor changes
+ flush |= ( nextchr->isAnchor() != chr->isAnchor() );
+ // we flush on start of run
+ flush |= nextchr->startOfRun;
+ // we flush on bidi changes
+ flush |= ( nextchr->rightToLeft != chr->rightToLeft );
+ // we flush on tab
+ flush |= ( chr->c == '\t' );
+ // we flush on soft hypens
+ flush |= ( chr->c.unicode() == 0xad );
+ // we flush on custom items
+ flush |= chr->isCustom();
+ // we flush before custom items
+ flush |= nextchr->isCustom();
+ // when painting justified, we flush on spaces
+ if ((alignment() & Qt3::AlignJustify) == Qt3::AlignJustify )
+ flush |= QTextFormatter::isBreakable( str, i );
+ // we flush when the string is getting too long
+ flush |= ( i - paintStart >= 256 );
+ // we flush when the selection state changes
+ if ( drawSelections ) {
+ for ( QMap<int, QTextParagraphSelection>::ConstIterator it = mSelections->begin();
+ it != mSelections->end(); ++it )
+ selectionStateChanged |=( (*it).start == i || (*it).start == i+1 || (*it).end == i+1 );
+ flush |= selectionStateChanged;
+ }
}
-#endif
- cw = string()->width( i );
- if ( chr->c == '\t' && i < length() - 1 )
- cw = at( i + 1 )->x - chr->x + 1;
- if ( chr->c.unicode() == 0xad && i < length() - 1 )
- cw = 0;
@@ -4306,18 +4315,17 @@ void QTextParag::paint( QPainter &painter, const QColorGroup &cg, QTextCursor *c
if ( chr->lineStart ) {
-#if 0 // seems we don't need that anymore
- tw = 0;
-#endif
+ if (fullWidthStyle && drawSelections && selection >= 0)
+ painter.fillRect( xend, y, fullSelectionWidth - xend, h,
+ (selection == QTextDocument::Standard || !hasdoc) ?
+ cg.color( QColorGroup::Highlight ) :
+ document()->selectionColor( selection ) );
++line;
- lineInfo( line, cy, h, baseLine );
- lasth = h;
- if ( clipy != -1 && cy > clipy - r.y() + cliph ) // outside clip area, leave
+ paintStart = i;
+ lineInfo( line, y, h, baseLine );
+ if ( clipy != -1 && cliph != 0 && y + r.y() - h > clipy + cliph ) { // outside clip area, leave
break;
- if ( lastBaseLine == 0 )
- lastBaseLine = baseLine;
- }
+ }
- // draw bullet list items
- if ( !didListLabel && line == 0 && style() && style()->displayMode() == QStyleSheetItem::DisplayListItem ) {
- didListLabel = TRUE;
- drawLabel( &painter, chr->x, cy, 0, 0, baseLine, cg );
+ // if this is the first line and we are a list item, draw the the bullet label
+ if ( line == 0 && isListItem() )
+ drawLabel( &painter, chr->x, y, 0, 0, baseLine, cg );
}
@@ -4325,140 +4333,75 @@ void QTextParag::paint( QPainter &painter, const QColorGroup &cg, QTextCursor *c
// check for cursor mark
- if ( cursor && this == cursor->parag() && i == cursor->index() ) {
- curx = cursor->x();
- QTextStringChar *c = chr;
- if ( i > 0 )
- --c;
- curh = c->format()->height();
- cury = cy + baseLine - c->format()->ascent();
- }
-
- // first time - start again...
- if ( !formatChar || lastY == -1 ) {
- formatChar = chr;
- lastY = cy;
- startX = chr->x;
- if ( !chr->isCustom() && chr->c != '\n' )
- paintEnd = i;
- bw = cw;
- if ( !chr->isCustom() )
- continue;
+ if ( cursor && this == cursor->paragraph() && i == cursor->index() ) {
+ QTextStringChar *c = i == 0 ? chr : chr - 1;
+ cursorRect.setRect( cursor->x() , y + baseLine - c->format()->ascent(),
+ 1, c->format()->height() );
}
- // check if selection state changed
- bool selectionChange = FALSE;
+ // check if we are in a selection and store which one it is
+ selection = -1;
if ( drawSelections ) {
- for ( int j = 0; j < nSels; ++j ) {
- selectionChange = selectionStarts[ j ] == i || selectionEnds[ j ] == i;
- if ( selectionChange )
+ for ( QMap<int, QTextParagraphSelection>::ConstIterator it = mSelections->begin();
+ it != mSelections->end(); ++it )
+ if ( (*it).start <= i && i < (*it).end + ( (*it).end == length()-1 && n && n->hasSelection(it.key()) ) ? 1:0
+ // exclude the standard selection from printing
+ && (it.key() != QTextDocument::Standard || !is_printer( &painter) ) ) {
+ selection = it.key();
break;
- }
+ }
}
- //if something (format, etc.) changed, draw what we have so far
- if ( ( ( ( alignment() & Qt3::AlignJustify ) == Qt3::AlignJustify && at(paintEnd)->c.isSpace() ) ||
- lastDirection != (bool)chr->rightToLeft ||
- chr->startOfRun ||
- lastY != cy || chr->format() != formatChar->format() || chr->isAnchor() != formatChar->isAnchor() ||
- ( paintEnd != -1 && at( paintEnd )->c =='\t' ) || chr->c == '\t' ||
- ( paintEnd != -1 && at( paintEnd )->c.unicode() == 0xad ) || chr->c.unicode() == 0xad ||
- selectionChange || chr->isCustom() ) ) {
- if ( paintStart <= paintEnd ) {
- // ### temporary hack until I get the new placement/shaping stuff working
- int x = startX;
- if ( ( alignment() & Qt3::AlignJustify ) == Qt3::AlignJustify && paintEnd != -1 &&
- paintEnd > 1 && at( paintEnd )->c.isSpace() ) {
- int add = str->at(paintEnd).x - str->at(paintEnd-1).x - str->width(paintEnd-1);
- bw += ( lastDirection ? 0 : add );
- }
- drawParagString( painter, qstr, paintStart, paintEnd - paintStart + 1, x, lastY,
- lastBaseLine, bw, lasth, drawSelections,
- formatChar, i, selectionStarts, selectionEnds, cg, lastDirection );
- }
-#if 0 // seems we don't need that anymore
- if ( !str->isBidi() && is_printer( &painter ) ) { // ### fix our broken ps-printer
- if ( !chr->lineStart ) {
- // ### the next line doesn't look 100% correct for arabic
- tw = startX + painter.fontMetrics().width( qstr.mid(paintStart, paintEnd - paintStart +1) );
- chr->x = QMAX( chr->x, tw );
- } else {
- tw = 0;
- }
- }
-#endif
- if ( !chr->isCustom() ) {
- if ( chr->c != '\n' ) {
- paintStart = i;
- paintEnd = i;
- } else {
- paintStart = i+1;
- paintEnd = -1;
- }
- formatChar = chr;
- lastY = cy;
- startX = chr->x;
- bw = cw;
+ if ( flush ) { // something changed, draw what we have so far
+ if ( chr->rightToLeft ) {
+ xstart = chr->x;
+ xend = at( paintStart )->x + str->width( paintStart );
} else {
- if ( chr->customItem()->placement() == QTextCustomItem::PlaceInline ) {
- chr->customItem()->draw( &painter, chr->x, cy, clipx - r.x(), clipy - r.y(), clipw, cliph, cg,
- nSels && selectionStarts[ 0 ] <= i && selectionEnds[ 0 ] >= i );
- paintStart = i+1;
- paintEnd = -1;
- formatChar = chr;
- lastY = cy;
- startX = chr->x + string()->width( i );
- bw = 0;
- } else {
- chr->customItem()->resize( chr->customItem()->width );
- paintStart = i+1;
- paintEnd = -1;
- formatChar = chr;
- lastY = cy;
- startX = chr->x + string()->width( i );
- bw = 0;
- }
+ xstart = at( paintStart )->x;
+ if ( !selectionStateChanged && i < length() - 1 && !str->at( i + 1 ).lineStart )
+ xend = str->at( i + 1 ).x;
+ else
+ xend = chr->x + str->width( i );
}
- } else {
- if ( chr->c != '\n' ) {
- if( chr->rightToLeft ) {
- startX = chr->x;
- }
- paintEnd = i;
+
+ if ( (clipx == -1 || clipw == -1) || (xend >= clipx && xstart <= clipx + clipw) ) {
+ if ( !chr->isCustom() )
+ drawString( painter, qstr, paintStart, i - paintStart + 1, xstart, y,
+ baseLine, xend-xstart, h, selection,
+ chr, cg, chr->rightToLeft );
+ else if ( chr->customItem()->placement() == QTextCustomItem::PlaceInline )
+ chr->customItem()->draw( &painter, chr->x, y,
+ clipx == -1 ? clipx : (clipx - r.x()),
+ clipy == -1 ? clipy : (clipy - r.y()),
+ clipw, cliph, cg, selection >= 0 );
}
- bw += cw;
+ paintStart = i+1;
}
- lastBaseLine = baseLine;
- lasth = h;
- lastDirection = chr->rightToLeft;
+
}
- // if we are through the parag, but still have some stuff left to draw, draw it now
- if ( paintStart <= paintEnd ) {
- bool selectionChange = FALSE;
- if ( drawSelections ) {
- for ( int j = 0; j < nSels; ++j ) {
- selectionChange = selectionStarts[ j ] == i || selectionEnds[ j ] == i;
- if ( selectionChange )
- break;
+ if (fullWidthStyle && drawSelections && selection >= 0 && next() && next()->mSelections)
+ for ( QMap<int, QTextParagraphSelection>::ConstIterator it = next()->mSelections->begin();
+ it != next()->mSelections->end(); ++it )
+ if (((*it).start) == 0) {
+ painter.fillRect( xend, y, fullSelectionWidth - xend, h,
+ (selection == QTextDocument::Standard || !hasdoc) ?
+ cg.color( QColorGroup::Highlight ) :
+ document()->selectionColor( selection ) );
+ break;
}
- }
- int x = startX;
- drawParagString( painter, qstr, paintStart, paintEnd-paintStart+1, x, lastY,
- lastBaseLine, bw, h, drawSelections,
- formatChar, i, selectionStarts, selectionEnds, cg, lastDirection );
- }
- // if we should draw a cursor, draw it now
- if ( curx != -1 && cursor ) {
- painter.fillRect( QRect( curx, cury, 1, curh - lineSpacing() ), cg.color( QColorGroup::Text ) );
+ // time to draw the cursor
+ const int cursor_extent = 4;
+ if ( !cursorRect.isNull() && cursor &&
+ ((clipx == -1 || clipw == -1) || (cursorRect.right()+cursor_extent >= clipx && cursorRect.left()-cursor_extent <= clipx + clipw)) ) {
+ painter.fillRect( cursorRect, cg.color( QColorGroup::Text ) );
painter.save();
if ( string()->isBidi() ) {
- const int d = 4;
if ( at( cursor->index() )->rightToLeft ) {
painter.setPen( Qt::black );
- painter.drawLine( curx, cury, curx - d / 2, cury + d / 2 );
- painter.drawLine( curx, cury + d, curx - d / 2, cury + d / 2 );
+ painter.drawLine( cursorRect.x(), cursorRect.y(), cursorRect.x() - cursor_extent / 2, cursorRect.y() + cursor_extent / 2 );
+ painter.drawLine( cursorRect.x(), cursorRect.y() + cursor_extent, cursorRect.x() - cursor_extent / 2, cursorRect.y() + cursor_extent / 2 );
} else {
painter.setPen( Qt::black );
- painter.drawLine( curx, cury, curx + d / 2, cury + d / 2 );
- painter.drawLine( curx, cury + d, curx + d / 2, cury + d / 2 );
+ painter.drawLine( cursorRect.x(), cursorRect.y(), cursorRect.x() + cursor_extent / 2, cursorRect.y() + cursor_extent / 2 );
+ painter.drawLine( cursorRect.x(), cursorRect.y() + cursor_extent, cursorRect.x() + cursor_extent / 2, cursorRect.y() + cursor_extent / 2 );
}
@@ -4471,7 +4414,8 @@ void QTextParag::paint( QPainter &painter, const QColorGroup &cg, QTextCursor *c
-void QTextParag::drawParagString( QPainter &painter, const QString &s, int start, int len, int startX,
- int lastY, int baseLine, int bw, int h, bool drawSelections,
- QTextStringChar *formatChar, int i, const QMemArray<int> &selectionStarts,
- const QMemArray<int> &selectionEnds, const QColorGroup &cg, bool rightToLeft )
+void QTextParagraph::drawString( QPainter &painter, const QString &s, int start, int len, int xstart,
+ int y, int baseLine, int w, int h, int selection,
+ QTextStringChar *formatChar, const QColorGroup& cg,
+ bool rightToLeft )
{
+ int i = start + len - 1;
bool plainText = hasdoc ? document()->textFormat() == Qt::PlainText : FALSE;
@@ -4501,15 +4445,8 @@ void QTextParag::drawParagString( QPainter &painter, const QString &s, int start
- if ( drawSelections ) {
- const int nSels = hasdoc ? document()->numSelections() : 1;
- const int startSel = is_printer( 0 ) ? 1 : 0;
- for ( int j = startSel; j < nSels; ++j ) {
- if ( i > selectionStarts[ j ] && i <= selectionEnds[ j ] ) {
- if ( !hasdoc || document()->invertSelectionText( j ) )
- painter.setPen( QPen( cg.color( QColorGroup::HighlightedText ) ) );
- if ( j == QTextDocument::Standard )
- painter.fillRect( startX, lastY, bw, h, cg.color( QColorGroup::Highlight ) );
- else
- painter.fillRect( startX, lastY, bw, h, hasdoc ? document()->selectionColor( j ) : cg.color( QColorGroup::Highlight ) );
- }
- }
+ if ( selection >= 0 ) {
+ if ( !hasdoc || document()->invertSelectionText( selection ) )
+ painter.setPen( cg.color( QColorGroup::HighlightedText ) );
+ painter.fillRect( xstart, y, w, h,
+ (selection == QTextDocument::Standard || !hasdoc) ?
+ cg.color( QColorGroup::Highlight ) : document()->selectionColor( selection ) );
}
@@ -4518,3 +4455,3 @@ void QTextParag::drawParagString( QPainter &painter, const QString &s, int start
if ( format->vAlign() == QTextFormat::AlignNormal ) {
- painter.drawText( startX, lastY + baseLine, str.mid( start ), len );
+ painter.drawText( xstart, y + baseLine, str.mid( start ), len );
#ifdef BIDI_DEBUG
@@ -4522,4 +4459,4 @@ void QTextParag::drawParagString( QPainter &painter, const QString &s, int start
painter.setPen ( Qt::red );
- painter.drawLine( startX, lastY, startX, lastY + baseLine );
- painter.drawLine( startX, lastY + baseLine/2, startX + 10, lastY + baseLine/2 );
+ painter.drawLine( xstart, y, xstart, y + baseLine );
+ painter.drawLine( xstart, y + baseLine/2, xstart + 10, y + baseLine/2 );
int w = 0;
@@ -4529,4 +4466,4 @@ void QTextParag::drawParagString( QPainter &painter, const QString &s, int start
painter.setPen ( Qt::blue );
- painter.drawLine( startX + w - 1, lastY, startX + w - 1, lastY + baseLine );
- painter.drawLine( startX + w - 1, lastY + baseLine/2, startX + w - 1 - 10, lastY + baseLine/2 );
+ painter.drawLine( xstart + w - 1, y, xstart + w - 1, y + baseLine );
+ painter.drawLine( xstart + w - 1, y + baseLine/2, xstart + w - 1 - 10, y + baseLine/2 );
painter.restore();
@@ -4540,4 +4477,4 @@ void QTextParag::drawParagString( QPainter &painter, const QString &s, int start
painter.setFont( f );
- painter.drawText( startX, lastY + baseLine - ( painter.fontMetrics().height() / 2 ),
- str.mid( start ), len );
+ painter.drawText( xstart, y + baseLine - ( painter.fontMetrics().height() / 2 ),
+ str.mid( start ), len );
} else if ( format->vAlign() == QTextFormat::AlignSubScript ) {
@@ -4549,3 +4486,3 @@ void QTextParag::drawParagString( QPainter &painter, const QString &s, int start
painter.setFont( f );
- painter.drawText( startX, lastY + baseLine + painter.fontMetrics().height() / 6, str.mid( start ), len );
+ painter.drawText( xstart, y + baseLine + painter.fontMetrics().height() / 6, str.mid( start ), len );
}
@@ -4553,3 +4490,3 @@ void QTextParag::drawParagString( QPainter &painter, const QString &s, int start
if ( i + 1 < length() && at( i + 1 )->lineStart && at( i )->c.unicode() == 0xad ) {
- painter.drawText( startX + bw, lastY + baseLine, "\xad" );
+ painter.drawText( xstart + w, y + baseLine, "\xad" );
}
@@ -4558,3 +4495,3 @@ void QTextParag::drawParagString( QPainter &painter, const QString &s, int start
painter.setPen( QPen( Qt::red, 1, Qt::DotLine ) );
- painter.drawLine( startX, lastY + baseLine + 1, startX + bw, lastY + baseLine + 1 );
+ painter.drawLine( xstart, y + baseLine + 1, xstart + w, y + baseLine + 1 );
painter.restore();
@@ -4570,3 +4507,3 @@ void QTextParag::drawParagString( QPainter &painter, const QString &s, int start
document()->focusIndicator.start + document()->focusIndicator.len >= i + len ) ) {
- painter.drawWinFocusRect( QRect( startX, lastY, bw, h ) );
+ painter.drawWinFocusRect( QRect( xstart, y, w, h ) );
}
@@ -4575,6 +4512,4 @@ void QTextParag::drawParagString( QPainter &painter, const QString &s, int start
-void QTextParag::drawLabel( QPainter* p, int x, int y, int w, int h, int base, const QColorGroup& cg )
+void QTextParagraph::drawLabel( QPainter* p, int x, int y, int w, int h, int base, const QColorGroup& cg )
{
- if ( !style() )
- return;
QRect r ( x, y, w, h );
@@ -4583,15 +4518,7 @@ void QTextParag::drawLabel( QPainter* p, int x, int y, int w, int h, int base, c
p->save();
- p->setPen( defFormat->color() );
-
- QFont font2( defFormat->font() );
- if ( length() > 0 ) {
- QTextFormat *format = at( 0 )->format();
- if ( format ) {
- if ( format->fontSizesInPixels() )
- font2.setPixelSize( at( 0 )->format()->font().pixelSize() );
- else
- font2.setPointSize( at( 0 )->format()->font().pointSize() );
- }
+ QTextFormat *format = at( 0 )->format();
+ if ( format ) {
+ p->setPen( format->color() );
+ p->setFont( format->font() );
}
- p->setFont( font2 );
QFontMetrics fm( p->fontMetrics() );
@@ -4604,3 +4531,18 @@ void QTextParag::drawLabel( QPainter* p, int x, int y, int w, int h, int base, c
{
- int n = numberOfSubParagraph();
+ if ( list_val == -1 ) { // uninitialised list value, calcluate the right one
+ int depth = listDepth();
+ list_val--;
+ // ### evil, square and expensive. This needs to be done when formatting, not when painting
+ QTextParagraph* s = prev();
+ int depth_s;
+ while ( s && (depth_s = s->listDepth()) >= depth ) {
+ if ( depth_s == depth && s->isListItem() )
+ list_val--;
+ s = s->prev();
+ }
+ }
+
+ int n = list_val;
+ if ( n < -1 )
+ n = -n - 1;
QString l;
@@ -4629,3 +4571,3 @@ void QTextParag::drawLabel( QPainter* p, int x, int y, int w, int h, int base, c
QRect er( r.right() - size * 2, r.top() + fm.height() / 2 - size / 2, size, size );
- p->fillRect( er , cg.brush( QColorGroup::Foreground ) );
+ p->fillRect( er , cg.brush( QColorGroup::Text ) );
}
@@ -4641,3 +4583,3 @@ void QTextParag::drawLabel( QPainter* p, int x, int y, int w, int h, int base, c
{
- p->setBrush( cg.brush( QColorGroup::Foreground ));
+ p->setBrush( cg.brush( QColorGroup::Text ));
QRect er( r.right()-size*2, r.top() + fm.height() / 2 - size / 2, size, size);
@@ -4652,61 +4594,14 @@ void QTextParag::drawLabel( QPainter* p, int x, int y, int w, int h, int base, c
-void QTextParag::setStyleSheetItems( const QPtrVector<QStyleSheetItem> &vec )
-{
- styleSheetItemsVec() = vec;
- invalidate( 0 );
- lm = rm = tm = bm = flm = -1;
- numSubParag = -1;
-}
-
-void QTextParag::setList( bool b, int listStyle )
+void QTextParagraph::readStyleInformation( QDataStream& stream )
{
- if ( !hasdoc )
- return;
-
- if ( !style() ) {
- styleSheetItemsVec().resize( 2 );
- mStyleSheetItemsVec->insert( 0, document()->styleSheet()->item( "html" ) );
- mStyleSheetItemsVec->insert( 1, document()->styleSheet()->item( "p" ) );
- }
-
- if ( b ) {
- if ( style()->displayMode() != QStyleSheetItem::DisplayListItem || this->listStyle() != listStyle ) {
- styleSheetItemsVec().remove( styleSheetItemsVec().size() - 1 );
- QStyleSheetItem *item = (*mStyleSheetItemsVec)[ mStyleSheetItemsVec->size() - 1 ];
- if ( item )
- mStyleSheetItemsVec->remove( mStyleSheetItemsVec->size() - 1 );
- mStyleSheetItemsVec->insert( mStyleSheetItemsVec->size() - 1,
- listStyle == QStyleSheetItem::ListDisc || listStyle == QStyleSheetItem::ListCircle
- || listStyle == QStyleSheetItem::ListSquare ?
- document()->styleSheet()->item( "ul" ) : document()->styleSheet()->item( "ol" ) );
- mStyleSheetItemsVec->insert( mStyleSheetItemsVec->size() - 1, document()->styleSheet()->item( "li" ) );
- setListStyle( (QStyleSheetItem::ListStyle)listStyle );
- } else {
- return;
- }
- } else {
- if ( style()->displayMode() != QStyleSheetItem::DisplayBlock ) {
- styleSheetItemsVec().remove( styleSheetItemsVec().size() - 1 );
- if ( mStyleSheetItemsVec->size() >= 2 ) {
- mStyleSheetItemsVec->remove( mStyleSheetItemsVec->size() - 2 );
- mStyleSheetItemsVec->resize( mStyleSheetItemsVec->size() - 2 );
- } else {
- mStyleSheetItemsVec->resize( mStyleSheetItemsVec->size() - 1 );
- }
- } else {
- return;
- }
- }
- invalidate( 0 );
- lm = rm = tm = bm = flm = -1;
- numSubParag = -1;
- if ( next() ) {
- QTextParag *s = next();
- while ( s ) {
- s->numSubParag = -1;
- s->lm = s->rm = s->tm = s->bm = flm = -1;
- s->numSubParag = -1;
- s->invalidate( 0 );
- s = s->next();
- }
+ int int_align, int_lstyle;
+ uchar uchar_litem, uchar_rtext, uchar_dir;
+ stream >> int_align >> int_lstyle >> utm >> ubm >> ulm >> urm >> uflm
+ >> ulinespacing >> ldepth >> uchar_litem >> uchar_rtext >> uchar_dir;
+ align = int_align; lstyle = (QStyleSheetItem::ListStyle) int_lstyle;
+ litem = uchar_litem; rtext = uchar_rtext; str->setDirection( (QChar::Direction)uchar_dir );
+ QTextParagraph* s = prev() ? prev() : this;
+ while ( s ) {
+ s->invalidate( 0 );
+ s = s->next();
}
@@ -4714,68 +4609,21 @@ void QTextParag::setList( bool b, int listStyle )
-void QTextParag::incDepth()
+void QTextParagraph::writeStyleInformation( QDataStream& stream ) const
{
- if ( !style() || !hasdoc )
- return;
- if ( style()->displayMode() != QStyleSheetItem::DisplayListItem )
- return;
- styleSheetItemsVec().resize( styleSheetItemsVec().size() + 1 );
- mStyleSheetItemsVec->insert( mStyleSheetItemsVec->size() - 1, (*mStyleSheetItemsVec)[ mStyleSheetItemsVec->size() - 2 ] );
- mStyleSheetItemsVec->insert( mStyleSheetItemsVec->size() - 2,
- listStyle() == QStyleSheetItem::ListDisc || listStyle() == QStyleSheetItem::ListCircle ||
- listStyle() == QStyleSheetItem::ListSquare ?
- document()->styleSheet()->item( "ul" ) : document()->styleSheet()->item( "ol" ) );
- invalidate( 0 );
- lm = -1;
- flm = -1;
+ stream << (int) align << (int) lstyle << utm << ubm << ulm << urm << uflm << ulinespacing << ldepth << (uchar)litem << (uchar)rtext << (uchar)str->direction();
}
-void QTextParag::decDepth()
-{
- if ( !style() || !hasdoc )
- return;
- if ( style()->displayMode() != QStyleSheetItem::DisplayListItem )
- return;
- int numLists = 0;
- QStyleSheetItem *lastList = 0;
- int lastIndex = 0;
- int i;
- if ( mStyleSheetItemsVec ) {
- for ( i = 0; i < (int)mStyleSheetItemsVec->size(); ++i ) {
- QStyleSheetItem *item = (*mStyleSheetItemsVec)[ i ];
- if ( item->name() == "ol" || item->name() == "ul" ) {
- lastList = item;
- lastIndex = i;
- numLists++;
- }
- }
- }
- if ( !lastList )
- return;
- styleSheetItemsVec().remove( lastIndex );
- for ( i = lastIndex; i < (int)mStyleSheetItemsVec->size() - 1; ++i )
- mStyleSheetItemsVec->insert( i, (*mStyleSheetItemsVec)[ i + 1 ] );
- mStyleSheetItemsVec->resize( mStyleSheetItemsVec->size() - 1 );
- if ( numLists == 1 )
- setList( FALSE, -1 );
- invalidate( 0 );
- lm = -1;
- flm = -1;
-}
-int QTextParag::listDepth() const
-{
- int numLists = 0;
- int i;
- if ( mStyleSheetItemsVec ) {
- for ( i = 0; i < (int)mStyleSheetItemsVec->size(); ++i ) {
- QStyleSheetItem *item = (*mStyleSheetItemsVec)[ i ];
- if ( item->name() == "ol" || item->name() == "ul" )
- numLists++;
- }
+void QTextParagraph::setListDepth( int depth ) {
+ if ( !hasdoc || depth == ldepth )
+ return;
+ ldepth = depth;
+ QTextParagraph* s = prev() ? prev() : this;
+ while ( s ) {
+ s->invalidate( 0 );
+ s = s->next();
}
- return numLists - 1;
}
-int *QTextParag::tabArray() const
+int *QTextParagraph::tabArray() const
{
@@ -4787,3 +4635,3 @@ int *QTextParag::tabArray() const
-int QTextParag::nextTab( int, int x )
+int QTextParagraph::nextTab( int, int x )
{
@@ -4813,3 +4661,3 @@ int QTextParag::nextTab( int, int x )
-void QTextParag::adjustToPainter( QPainter *p )
+void QTextParagraph::adjustToPainter( QPainter *p )
{
@@ -4821,3 +4669,3 @@ void QTextParag::adjustToPainter( QPainter *p )
-QTextFormatCollection *QTextParag::formatCollection() const
+QTextFormatCollection *QTextParagraph::formatCollection() const
{
@@ -4833,3 +4681,3 @@ QTextFormatCollection *QTextParag::formatCollection() const
-QString QTextParag::richText() const
+QString QTextParagraph::richText() const
{
@@ -4838,5 +4686,10 @@ QString QTextParag::richText() const
QString spaces;
- bool lastCharWasSpace = FALSE;
- int firstcol = 0;
- for ( int i = 0; i < length()-1; ++i ) {
+ bool doStart = richTextExportStart && richTextExportStart->paragraph() == this;
+ bool doEnd = richTextExportEnd && richTextExportEnd->paragraph() == this;
+ int i;
+ for ( i = 0; i < length()-1; ++i ) {
+ if ( doStart && i && richTextExportStart->index() == i )
+ s += "<selstart/>";
+ if ( doEnd && richTextExportEnd->index() == i )
+ s += "<selend/>";
QTextStringChar *c = &str->at( i );
@@ -4852,59 +4705,26 @@ QString QTextParag::richText() const
if ( !formatChar ) {
- s += c->format()->makeFormatChangeTags( 0, QString::null, c->anchorHref() );
+ s += c->format()->makeFormatChangeTags( formatCollection()->defaultFormat(),
+ 0, QString::null, c->anchorHref() );
formatChar = c;
} else if ( ( formatChar->format()->key() != c->format()->key() ) ||
- (formatChar->isAnchor() != c->isAnchor() &&
- (!c->anchorHref().isEmpty() || !formatChar->anchorHref().isEmpty() ) ) ) {// lisp was here
-
- if ( !spaces.isEmpty() ) {
- if ( spaces[0] == '\t' || lastCharWasSpace )
- s += "<wsp>" + spaces + "</wsp>";
- else if ( spaces.length() > 1 )
- s += "<wsp>" + spaces.mid(1) + "</wsp> ";
- else
- s += spaces;
- lastCharWasSpace = TRUE;
- spaces = QString::null;
- }
- s += c->format()->makeFormatChangeTags( formatChar->format() , formatChar->anchorHref(), c->anchorHref() );
+ (c->anchorHref() != formatChar->anchorHref() ) ) {
+ s += c->format()->makeFormatChangeTags( formatCollection()->defaultFormat(),
+ formatChar->format() , formatChar->anchorHref(), c->anchorHref() );
formatChar = c;
}
-
- if ( c->c == ' ' || c->c == '\t' ) {
- spaces += c->c;
- continue;
- } else if ( !spaces.isEmpty() ) {
- if ( spaces[0] == '\t' || lastCharWasSpace )
- s += "<wsp>" + spaces + "</wsp>";
- else if ( spaces.length() > 1 )
- s += "<wsp>" + spaces.mid(1) + "</wsp> ";
- else
- s += spaces;
- spaces = QString::null;
- if ( s.length() - firstcol > 60 ) {
- s += '\n';
- firstcol = s.length();
- }
- }
-
- lastCharWasSpace = FALSE;
- if ( c->c == '<' ) {
+ if ( c->c == '<' )
s += "&lt;";
- } else if ( c->c == '>' ) {
+ else if ( c->c == '>' )
s += "&gt;";
- } else if ( c->isCustom() ) {
+ else if ( c->isCustom() )
s += c->customItem()->richText();
- } else {
- s += c->c;
- }
- }
- if ( !spaces.isEmpty() ) {
- if ( spaces.length() > 1 || spaces[0] == '\t' || lastCharWasSpace )
- s += "<wsp>" + spaces + "</wsp>";
+ else if ( c->c == '\n' || c->c == QChar_linesep )
+ s += "<br />"; // space on purpose for compatibility with Netscape, Lynx & Co.
else
- s += spaces;
+ s += c->c;
}
-
+ if ( doEnd && richTextExportEnd->index() == i )
+ s += "<selend/>";
if ( formatChar )
- s += formatChar->format()->makeFormatEndTags( formatChar->anchorHref() );
+ s += formatChar->format()->makeFormatEndTags( formatCollection()->defaultFormat(), formatChar->anchorHref() );
return s;
@@ -4912,3 +4732,3 @@ QString QTextParag::richText() const
-void QTextParag::addCommand( QTextCommand *cmd )
+void QTextParagraph::addCommand( QTextCommand *cmd )
{
@@ -4920,3 +4740,3 @@ void QTextParag::addCommand( QTextCommand *cmd )
-QTextCursor *QTextParag::undo( QTextCursor *c )
+QTextCursor *QTextParagraph::undo( QTextCursor *c )
{
@@ -4927,3 +4747,3 @@ QTextCursor *QTextParag::undo( QTextCursor *c )
-QTextCursor *QTextParag::redo( QTextCursor *c )
+QTextCursor *QTextParagraph::redo( QTextCursor *c )
{
@@ -4934,167 +4754,66 @@ QTextCursor *QTextParag::redo( QTextCursor *c )
-int QTextParag::topMargin() const
+int QTextParagraph::topMargin() const
{
- if ( !p && ( !hasdoc || !document()->addMargins() ) )
- return 0;
- if ( tm != -1 )
- return tm;
- QStyleSheetItem *item = style();
- if ( !item ) {
- ( (QTextParag*)this )->tm = 0;
- return 0;
- }
-
int m = 0;
- if ( item->margin( QStyleSheetItem::MarginTop ) != QStyleSheetItem::Undefined )
- m = item->margin( QStyleSheetItem::MarginTop );
- if ( mStyleSheetItemsVec ) {
- QStyleSheetItem *it = 0;
- QStyleSheetItem *p = prev() ? prev()->style() : 0;
- for ( int i = (int)mStyleSheetItemsVec->size() - 2 ; i >= 0; --i ) {
- it = (*mStyleSheetItemsVec)[ i ];
- if ( it != p )
- break;
- int mar = it->margin( QStyleSheetItem::MarginTop );
- m += (mar != QStyleSheetItem::Undefined) ? mar : 0;
- if ( it->displayMode() != QStyleSheetItem::DisplayInline )
- break;
- }
+ if ( rtext ) {
+ m = isListItem() ? (document()->li_tm/QMAX(1,listDepth())) : document()->par_tm;
+ if ( listDepth() == 1 &&( !prev() || prev()->listDepth() < listDepth() ) )
+ m = QMAX( m, document()->list_tm );
}
- m = scale( m, QTextFormat::painter() );
-
- ( (QTextParag*)this )->tm = m;
- return tm;
+ m += utm;
+ return scale( m, QTextFormat::painter() );
}
-int QTextParag::bottomMargin() const
+int QTextParagraph::bottomMargin() const
{
- if ( bm != -1 )
- return bm;
- QStyleSheetItem *item = style();
- if ( !item || !next() ) {
- ( (QTextParag*)this )->bm = 0;
- return 0;
- }
-
int m = 0;
- if ( item->margin( QStyleSheetItem::MarginBottom ) != QStyleSheetItem::Undefined )
- m = item->margin( QStyleSheetItem::MarginBottom );
- if ( mStyleSheetItemsVec ) {
- QStyleSheetItem *it = 0;
- QStyleSheetItem *n = next() ? next()->style() : 0;
- for ( int i =(int)mStyleSheetItemsVec->size() - 2 ; i >= 0; --i ) {
- it = (*mStyleSheetItemsVec)[ i ];
- if ( it != n )
- break;
- int mar = it->margin( QStyleSheetItem::MarginBottom );
- m += mar != QStyleSheetItem::Undefined ? mar : 0;
- if ( it->displayMode() != QStyleSheetItem::DisplayInline )
- break;
- }
+ if ( rtext ) {
+ m = isListItem() ? (document()->li_bm/QMAX(1,listDepth())) : document()->par_bm;
+ if ( listDepth() == 1 &&( !next() || next()->listDepth() < listDepth() ) )
+ m = QMAX( m, document()->list_bm );
}
- m = scale ( m, QTextFormat::painter() );
-
- ( (QTextParag*)this )->bm = m;
- return bm;
+ m += ubm;
+ return scale( m, QTextFormat::painter() );
}
-int QTextParag::leftMargin() const
+int QTextParagraph::leftMargin() const
{
- if ( lm != -1 )
- return lm;
- QStyleSheetItem *item = style();
- if ( !item ) {
- ( (QTextParag*)this )->lm = 0;
- return 0;
- }
- int m = 0;
- if ( mStyleSheetItemsVec ) {
- for ( int i = 0; i < (int)mStyleSheetItemsVec->size(); ++i ) {
- item = (*mStyleSheetItemsVec)[ i ];
- int mar = item->margin( QStyleSheetItem::MarginLeft );
- m += mar != QStyleSheetItem::Undefined ? mar : 0;
- if ( item->name() == "ol" || item->name() == "ul" ) {
- QPainter* oldPainter = QTextFormat::painter();
- QTextFormat::setPainter( 0 );
- m += defFormat->width( '1' ) +
- defFormat->width( '2' ) +
- defFormat->width( '3' ) +
- defFormat->width( '.' );
- QTextFormat::setPainter( oldPainter );
- }
- }
- }
-
- m = scale ( m, QTextFormat::painter() );
-
- ( (QTextParag*)this )->lm = m;
- return lm;
+ int m = ulm;
+ if ( listDepth() )
+ m += listDepth() * document()->list_lm;
+ return scale( m, QTextFormat::painter() );
}
-int QTextParag::firstLineMargin() const
+int QTextParagraph::firstLineMargin() const
{
- if ( flm != -1 )
- return lm;
- QStyleSheetItem *item = style();
- if ( !item ) {
- ( (QTextParag*)this )->flm = 0;
- return 0;
- }
- int m = 0;
- if ( mStyleSheetItemsVec ) {
- for ( int i = 0; i < (int)mStyleSheetItemsVec->size(); ++i ) {
- item = (*mStyleSheetItemsVec)[ i ];
- int mar = item->margin( QStyleSheetItem::MarginFirstLine );
- m += mar != QStyleSheetItem::Undefined ? mar : 0;
- }
- }
-
- m = scale( m, QTextFormat::painter() );
-
- ( (QTextParag*)this )->flm = m;
- return flm;
+ int m = uflm;
+ return scale( m, QTextFormat::painter() );
}
-int QTextParag::rightMargin() const
+int QTextParagraph::rightMargin() const
{
- if ( rm != -1 )
- return rm;
- QStyleSheetItem *item = style();
- if ( !item ) {
- ( (QTextParag*)this )->rm = 0;
- return 0;
- }
- int m = 0;
- if ( mStyleSheetItemsVec ) {
- for ( int i = 0; i < (int)mStyleSheetItemsVec->size(); ++i ) {
- item = (*mStyleSheetItemsVec)[ i ];
- int mar = item->margin( QStyleSheetItem::MarginRight );
- m += mar != QStyleSheetItem::Undefined ? mar : 0;
- }
- }
- m = scale( m, QTextFormat::painter() );
-
- ( (QTextParag*)this )->rm = m;
- return rm;
+ int m = urm;
+ return scale( m, QTextFormat::painter() );
}
-int QTextParag::lineSpacing() const
+int QTextParagraph::lineSpacing() const
{
- QStyleSheetItem *item = style();
- if ( !item )
- return 0;
-
- int ls = item->lineSpacing();
- if ( ls == QStyleSheetItem::Undefined )
- return 0;
- ls = scale( ls, QTextFormat::painter() );
-
- return ls;
+ int l = ulinespacing;
+ l = scale( l, QTextFormat::painter() );
+ return l;
}
-void QTextParag::copyParagData( QTextParag *parag )
+void QTextParagraph::copyParagData( QTextParagraph *parag )
{
- setStyleSheetItems( parag->styleSheetItems() );
- setListStyle( parag->listStyle() );
- setAlignment( parag->alignment() );
+ rtext = parag->rtext;
+ lstyle = parag->lstyle;
+ ldepth = parag->ldepth;
+ litem = parag->litem;
+ align = parag->align;
+ utm = parag->utm;
+ ubm = parag->ubm;
+ urm = parag->urm;
+ ulm = parag->ulm;
+ uflm = parag->uflm;
+ ulinespacing = parag->ulinespacing;
QColor *c = parag->backgroundColor();
@@ -5102,5 +4821,6 @@ void QTextParag::copyParagData( QTextParag *parag )
setBackgroundColor( *c );
+ str->setDirection( parag->str->direction() );
}
-void QTextParag::show()
+void QTextParagraph::show()
{
@@ -5111,3 +4831,3 @@ void QTextParag::show()
-void QTextParag::hide()
+void QTextParagraph::hide()
{
@@ -5118,3 +4838,3 @@ void QTextParag::hide()
-void QTextParag::setDirection( QChar::Direction d )
+void QTextParagraph::setDirection( QChar::Direction d )
{
@@ -5126,3 +4846,3 @@ void QTextParag::setDirection( QChar::Direction d )
-QChar::Direction QTextParag::direction() const
+QChar::Direction QTextParagraph::direction() const
{
@@ -5131,3 +4851,3 @@ QChar::Direction QTextParag::direction() const
-void QTextParag::setChanged( bool b, bool recursive )
+void QTextParagraph::setChanged( bool b, bool recursive )
{
@@ -5135,4 +4855,4 @@ void QTextParag::setChanged( bool b, bool recursive )
if ( recursive ) {
- if ( document() && document()->parentParag() )
- document()->parentParag()->setChanged( b, recursive );
+ if ( document() && document()->parentParagraph() )
+ document()->parentParagraph()->setChanged( b, recursive );
}
@@ -5154,5 +4874,3 @@ QTextFormatter::QTextFormatter()
-/* only used for bidi or complex text reordering
- */
-QTextParagLineStart *QTextFormatter::formatLine( QTextParag *parag, QTextString *string, QTextParagLineStart *line,
+QTextLineStart *QTextFormatter::formatLine( QTextParagraph *parag, QTextString *string, QTextLineStart *line,
QTextStringChar *startChar, QTextStringChar *lastChar, int align, int space )
@@ -5163,3 +4881,2 @@ QTextParagLineStart *QTextFormatter::formatLine( QTextParag *parag, QTextString
#endif
- space = QMAX( space, 0 ); // #### with nested tables this gets negative because of a bug I didn't find yet, so workaround for now. This also means non-left aligned nested tables do not work at the moment
int start = (startChar - &string->at(0));
@@ -5174,3 +4891,9 @@ QTextParagLineStart *QTextFormatter::formatLine( QTextParag *parag, QTextString
int numSpaces = 0;
- for ( int j = start; j < last; ++j ) {
+ // End at "last-1", the last space ends up with a width of 0
+ for ( int j = last-1; j >= start; --j ) {
+ // Start at last tab, if any.
+ if ( string->at( j ).c == '\t' ) {
+ start = j+1;
+ break;
+ }
if( isBreakable( string, j ) ) {
@@ -5196,3 +4919,3 @@ QTextParagLineStart *QTextFormatter::formatLine( QTextParag *parag, QTextString
- return new QTextParagLineStart();
+ return new QTextLineStart();
}
@@ -5206,3 +4929,3 @@ QTextParagLineStart *QTextFormatter::formatLine( QTextParag *parag, QTextString
// collects one line of the paragraph and transforms it to visual order
-QTextParagLineStart *QTextFormatter::bidiReorderLine( QTextParag * /*parag*/, QTextString *text, QTextParagLineStart *line,
+QTextLineStart *QTextFormatter::bidiReorderLine( QTextParagraph * /*parag*/, QTextString *text, QTextLineStart *line,
QTextStringChar *startChar, QTextStringChar *lastChar, int align, int space )
@@ -5211,3 +4934,2 @@ QTextParagLineStart *QTextFormatter::bidiReorderLine( QTextParag * /*parag*/, QT
int last = (lastChar - &text->at(0) );
- //qDebug("doing BiDi reordering from %d to %d!", start, last);
@@ -5245,3 +4967,9 @@ QTextParagLineStart *QTextFormatter::bidiReorderLine( QTextParag * /*parag*/, QT
else if ( align & Qt3::AlignJustify ) {
- for ( int j = start; j < last; ++j ) {
+ // End at "last-1", the last space ends up with a width of 0
+ for ( int j = last-1; j >= start; --j ) {
+ // Start at last tab, if any.
+ if ( text->at( j ).c == '\t' ) {
+ start = j+1;
+ break;
+ }
if( isBreakable( text, j ) ) {
@@ -5307,3 +5035,2 @@ QTextParagLineStart *QTextFormatter::bidiReorderLine( QTextParag * /*parag*/, QT
}
- //qDebug("setting char %d at pos %d", pos, x);
if ( xmax < x + toAdd + ww ) xmax = x + toAdd + ww;
@@ -5318,3 +5045,3 @@ QTextParagLineStart *QTextFormatter::bidiReorderLine( QTextParag * /*parag*/, QT
line->w = xmax + 10;
- QTextParagLineStart *ls = new QTextParagLineStart( control->context, control->status );
+ QTextLineStart *ls = new QTextLineStart( control->context, control->status );
delete control;
@@ -5325,3 +5052,3 @@ QTextParagLineStart *QTextFormatter::bidiReorderLine( QTextParag * /*parag*/, QT
-bool QTextFormatter::isBreakable( QTextString *string, int pos ) const
+bool QTextFormatter::isBreakable( QTextString *string, int pos )
{
@@ -5329,2 +5056,4 @@ bool QTextFormatter::isBreakable( QTextString *string, int pos ) const
char ch = c.latin1();
+ if ( c == QChar_linesep )
+ return TRUE;
if ( c.isSpace() && ch != '\n' && c.unicode() != 0x00a0U )
@@ -5376,3 +5105,3 @@ bool QTextFormatter::isBreakable( QTextString *string, int pos ) const
-void QTextFormatter::insertLineStart( QTextParag *parag, int index, QTextParagLineStart *ls )
+void QTextFormatter::insertLineStart( QTextParagraph *parag, int index, QTextLineStart *ls )
{
@@ -5382,3 +5111,3 @@ void QTextFormatter::insertLineStart( QTextParag *parag, int index, QTextParagLi
}
- QMap<int, QTextParagLineStart*>::Iterator it;
+ QMap<int, QTextLineStart*>::Iterator it;
if ( ( it = parag->lineStartList().find( index ) ) == parag->lineStartList().end() ) {
@@ -5396,10 +5125,10 @@ void QTextFormatter::insertLineStart( QTextParag *parag, int index, QTextParagLi
*/
-int QTextFormatter::formatVertically( QTextDocument* doc, QTextParag* parag )
+int QTextFormatter::formatVertically( QTextDocument* doc, QTextParagraph* parag )
{
int oldHeight = parag->rect().height();
- QMap<int, QTextParagLineStart*>& lineStarts = parag->lineStartList();
- QMap<int, QTextParagLineStart*>::Iterator it = lineStarts.begin();
- int h = doc->addMargins() ? parag->topMargin() : 0;
+ QMap<int, QTextLineStart*>& lineStarts = parag->lineStartList();
+ QMap<int, QTextLineStart*>::Iterator it = lineStarts.begin();
+ int h = parag->prev() ? QMAX(parag->prev()->bottomMargin(),parag->topMargin() ) / 2: 0;
for ( ; it != lineStarts.end() ; ++it ) {
- QTextParagLineStart * ls = it.data();
+ QTextLineStart * ls = it.data();
ls->y = h;
@@ -5422,6 +5151,6 @@ int QTextFormatter::formatVertically( QTextDocument* doc, QTextParag* parag )
int m = parag->bottomMargin();
- if ( parag->next() && doc && !doc->addMargins() )
- m = QMAX( m, parag->next()->topMargin() );
- if ( parag->next() && parag->next()->isLineBreak() )
+ if ( !parag->next() )
m = 0;
+ else
+ m = QMAX(m, parag->next()->topMargin() ) / 2;
h += m;
@@ -5437,4 +5166,6 @@ QTextFormatterBreakInWords::QTextFormatterBreakInWords()
-int QTextFormatterBreakInWords::format( QTextDocument *doc,QTextParag *parag,
- int start, const QMap<int, QTextParagLineStart*> & )
+#define SPACE(s) doc?(s>0?s:0):s
+
+int QTextFormatterBreakInWords::format( QTextDocument *doc,QTextParagraph *parag,
+ int start, const QMap<int, QTextLineStart*> & )
{
@@ -5442,6 +5173,6 @@ int QTextFormatterBreakInWords::format( QTextDocument *doc,QTextParag *parag,
QTextStringChar *firstChar = 0;
- int left = doc ? parag->leftMargin() + doc->leftMargin() : 4;
+ int left = doc ? parag->leftMargin() + doc->leftMargin() : 0;
int x = left + ( doc ? parag->firstLineMargin() : 0 );
int dw = parag->documentVisibleWidth() - ( doc ? doc->rightMargin() : 0 );
- int y = doc && doc->addMargins() ? parag->topMargin() : 0;
+ int y = parag->prev() ? QMAX(parag->prev()->bottomMargin(),parag->topMargin()) / 2: 0;
int h = y;
@@ -5462,3 +5193,3 @@ int QTextFormatterBreakInWords::format( QTextDocument *doc,QTextParag *parag,
int i = start;
- QTextParagLineStart *lineStart = new QTextParagLineStart( y, y, 0 );
+ QTextLineStart *lineStart = new QTextLineStart( y, y, 0 );
insertLineStart( parag, 0, lineStart );
@@ -5503,3 +5234,3 @@ int QTextFormatterBreakInWords::format( QTextDocument *doc,QTextParag *parag,
h = c->height();
- lineStart = new QTextParagLineStart( y, h, h );
+ lineStart = new QTextLineStart( y, h, h );
insertLineStart( parag, i, lineStart );
@@ -5513,4 +5244,3 @@ int QTextFormatterBreakInWords::format( QTextDocument *doc,QTextParag *parag,
( wrapAtColumn() == -1 && x + ww > w ||
- wrapAtColumn() != -1 && col >= wrapAtColumn() ) ||
- parag->isNewLinesAllowed() && lastChr == '\n' ) {
+ wrapAtColumn() != -1 && col >= wrapAtColumn() ) ) {
x = doc ? parag->document()->flow()->adjustLMargin( y + parag->rect().y(), parag->rect().height(), left, 4 ) : left;
@@ -5519,3 +5249,3 @@ int QTextFormatterBreakInWords::format( QTextDocument *doc,QTextParag *parag,
h = c->height();
- lineStart = formatLine( parag, parag->string(), lineStart, firstChar, c-1 );
+ lineStart = formatLine( parag, parag->string(), lineStart, firstChar, SPACE(c-1) );
lineStart->y = y;
@@ -5541,8 +5271,10 @@ int QTextFormatterBreakInWords::format( QTextDocument *doc,QTextParag *parag,
int m = parag->bottomMargin();
- if ( parag->next() && doc && !doc->addMargins() )
- m = QMAX( m, parag->next()->topMargin() );
- parag->setFullWidth( fullWidth );
- if ( parag->next() && parag->next()->isLineBreak() )
+ if ( !parag->next() )
m = 0;
+ else
+ m = QMAX(m, parag->next()->topMargin() ) / 2;
+ parag->setFullWidth( fullWidth );
y += h + m;
+ if ( doc )
+ minw += doc->rightMargin();
if ( !wrapEnabled )
@@ -5568,4 +5300,4 @@ QTextFormatterBreakWords::QTextFormatterBreakWords()
-int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
- int start, const QMap<int, QTextParagLineStart*> & )
+int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParagraph *parag,
+ int start, const QMap<int, QTextLineStart*> & )
{
@@ -5576,3 +5308,3 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
int x = left + ( doc ? parag->firstLineMargin() : 0 );
- int y = doc && doc->addMargins() ? parag->topMargin() : 0;
+ int y = parag->prev() ? QMAX(parag->prev()->bottomMargin(),parag->topMargin()) / 2: 0;
int h = y;
@@ -5592,3 +5324,3 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
int tminw = marg;
- int linespace = doc ? parag->lineSpacing() : 0;
+ int linespacing = doc ? parag->lineSpacing() : 0;
bool wrapEnabled = isWrapEnabled( parag );
@@ -5600,3 +5332,3 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
int i = start;
- QTextParagLineStart *lineStart = new QTextParagLineStart( y, y, 0 );
+ QTextLineStart *lineStart = new QTextLineStart( y, y, 0 );
insertLineStart( parag, 0, lineStart );
@@ -5656,3 +5388,3 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
w = dw - ( doc ? doc->flow()->adjustRMargin( y + parag->rect().y(), parag->rect().height(), rm, 4 ) : 0 );
- QTextParagLineStart *lineStart2 = formatLine( parag, string, lineStart, firstChar, c-1, align, w - x );
+ QTextLineStart *lineStart2 = formatLine( parag, string, lineStart, firstChar, c-1, align, SPACE(w - x) );
ci->resize( w - x);
@@ -5668,4 +5400,4 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
if ( i == 0 || !isBreakable( string, i - 1 ) || string->at( i - 1 ).lineStart == 0 ) {
- y += QMAX( h, tmph );
- tmph = c->height() + linespace;
+ y += QMAX( h, QMAX( tmph, linespacing ) );
+ tmph = c->height();
h = tmph;
@@ -5677,3 +5409,3 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
} else {
- tmph = c->height() + linespace;
+ tmph = c->height();
h = tmph;
@@ -5688,3 +5420,3 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
- int tw = ci->minimumWidth();
+ int tw = ci->minimumWidth() + ( doc ? doc->leftMargin() : 0 );
if ( tw < QWIDGETSIZE_MAX )
@@ -5701,11 +5433,26 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
- if ( wrapEnabled && ( !c->c.isSpace() || lastBreak == -2 )
- && ( lastBreak != -1 || allowBreakInWords() ) &&
- ( wrapAtColumn() == -1 && x + ww > w && lastBreak != -1 ||
- wrapAtColumn() == -1 && x + ww > w - 4 && lastBreak == -1 && allowBreakInWords() ||
- wrapAtColumn() != -1 && col >= wrapAtColumn() ) ||
- parag->isNewLinesAllowed() && lastChr == '\n' && firstChar < c ) {
+ bool lastWasOwnLineCustomItem = lastBreak == -2;
+ bool hadBreakableChar = lastBreak != -1;
+ bool lastWasHardBreak = lastChr == QChar_linesep;
+
+ // we break if
+ // 1. the last character was a hard break (QChar_linesep) or
+ // 2. the last charater was a own-line custom item (eg. table or ruler) or
+ // 3. wrapping was enabled, it was not a space and following
+ // condition is true: We either had a breakable character
+ // previously or we ar allowed to break in words and - either
+ // we break at w pixels and the current char would exceed that
+ // or - we break at a column and the current character would
+ // exceed that.
+ if ( lastWasHardBreak || lastWasOwnLineCustomItem ||
+ ( wrapEnabled &&
+ ( (!c->c.isSpace() && (hadBreakableChar || allowBreakInWords()) &&
+ ( (wrapAtColumn() == -1 && x + ww > w) ||
+ (wrapAtColumn() != -1 && col >= wrapAtColumn()) ) ) )
+ )
+ ) {
if ( wrapAtColumn() != -1 )
minw = QMAX( minw, x + ww );
- if ( lastBreak < 0 ) {
+ // if a break was forced (no breakable char, hard break or own line custom item), break immediately....
+ if ( !hadBreakableChar || lastWasHardBreak || lastWasOwnLineCustomItem ) {
if ( lineStart ) {
@@ -5716,6 +5463,6 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
}
- lineStart = formatLine( parag, string, lineStart, firstChar, c-1, align, w - x );
+ lineStart = formatLine( parag, string, lineStart, firstChar, c-1, align, SPACE(w - x) );
x = doc ? doc->flow()->adjustLMargin( y + parag->rect().y(), parag->rect().height(), left, 4 ) : left;
w = dw - ( doc ? doc->flow()->adjustRMargin( y + parag->rect().y(), parag->rect().height(), rm, 4 ) : 0 );
- if ( parag->isNewLinesAllowed() && c->c == '\t' ) {
+ if ( !doc && c->c == '\t' ) { // qt_format_text tab handling
int nx = parag->nextTab( i, x - left ) + left;
@@ -5727,4 +5474,4 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
curLeft = x;
- y += h;
- tmph = c->height() + linespace;
+ y += QMAX( h, linespacing );
+ tmph = c->height();
h = 0;
@@ -5739,9 +5486,9 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
col = 0;
- } else {
+ } else { // ... otherwise if we had a breakable char, break there
DO_FLOW( lineStart );
i = lastBreak;
- lineStart = formatLine( parag, string, lineStart, firstChar, parag->at( lastBreak ), align, w - string->at( i ).x );
+ lineStart = formatLine( parag, string, lineStart, firstChar, parag->at( lastBreak ),align, SPACE(w - string->at( i ).x) );
x = doc ? doc->flow()->adjustLMargin( y + parag->rect().y(), parag->rect().height(), left, 4 ) : left;
w = dw - ( doc ? doc->flow()->adjustRMargin( y + parag->rect().y(), parag->rect().height(), rm, 4 ) : 0 );
- if ( parag->isNewLinesAllowed() && c->c == '\t' ) {
+ if ( !doc && c->c == '\t' ) { // qt_format_text tab handling
int nx = parag->nextTab( i, x - left ) + left;
@@ -5753,4 +5500,4 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
curLeft = x;
- y += h;
- tmph = c->height() + linespace;
+ y += QMAX( h, linespacing );
+ tmph = c->height();
h = tmph;
@@ -5768,6 +5515,6 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
}
- } else if ( lineStart && ( isBreakable( string, i ) || parag->isNewLinesAllowed() && c->c == '\n' ) ) {
+ } else if ( lineStart && isBreakable( string, i ) ) {
if ( len <= 2 || i < len - 1 ) {
tmpBaseLine = QMAX( tmpBaseLine, c->ascent() );
- tmph = QMAX( tmph, c->height() + linespace );
+ tmph = QMAX( tmph, c->height() );
}
@@ -5782,3 +5529,3 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
tminw += ww;
- int belowBaseLine = QMAX( tmph - tmpBaseLine, c->height() + linespace - c->ascent() );
+ int belowBaseLine = QMAX( tmph - tmpBaseLine, c->height()- c->ascent() );
tmpBaseLine = QMAX( tmpBaseLine, c->ascent() );
@@ -5792,4 +5539,6 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
- // ### hack. The last char in the paragraph is always invisible, and somehow sometimes has a wrong format. It changes between
- // layouting and printing. This corrects some layouting errors in BiDi mode due to this.
+ // ### hack. The last char in the paragraph is always invisible,
+ // ### and somehow sometimes has a wrong format. It changes
+ // ### between // layouting and printing. This corrects some
+ // ### layouting errors in BiDi mode due to this.
if ( len > 1 && !c->isAnchor() ) {
@@ -5805,6 +5554,6 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
// last line in a paragraph is not justified
- if ( align == Qt3::AlignJustify )
+ if ( align == Qt3::AlignJustify || lastChr == QChar_linesep )
align = Qt3::AlignAuto;
DO_FLOW( lineStart );
- lineStart = formatLine( parag, string, lineStart, firstChar, c, align, w - x );
+ lineStart = formatLine( parag, string, lineStart, firstChar, c, align, SPACE(w - x) );
delete lineStart;
@@ -5813,10 +5562,12 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
minw = QMAX( minw, tminw );
+ if ( doc )
+ minw += doc->rightMargin();
int m = parag->bottomMargin();
- if ( parag->next() && doc && !doc->addMargins() )
- m = QMAX( m, parag->next()->topMargin() );
- parag->setFullWidth( fullWidth );
- if ( parag->next() && parag->next()->isLineBreak() )
+ if ( !parag->next() )
m = 0;
- y += h + m;
+ else
+ m = QMAX(m, parag->next()->topMargin() ) / 2;
+ parag->setFullWidth( fullWidth );
+ y += QMAX( h, linespacing ) + m;
@@ -5825,2 +5576,10 @@ int QTextFormatterBreakWords::format( QTextDocument *doc, QTextParag *parag,
minw = QMAX(minw, wused);
+
+ // This is the case where we are breaking wherever we darn well please
+ // in cases like that, the minw should not be the length of the entire
+ // word, because we necessarily want to show the word on the whole line.
+ // example: word wrap in iconview
+ if ( allowBreakInWords() && minw > wused )
+ minw = wused;
+
thisminw = minw;
@@ -5839,3 +5598,3 @@ QTextIndent::QTextIndent()
QTextFormatCollection::QTextFormatCollection()
- : cKey( 307 ), sheet( 0 )
+ : cKey( 307 )
{
@@ -5857,5 +5616,2 @@ QTextFormat *QTextFormatCollection::format( QTextFormat *f )
if ( f->parent() == this || f == defFormat ) {
-#ifdef DEBUG_COLLECTION
- qDebug( "need '%s', best case!", f->key().latin1() );
-#endif
lastFormat = f;
@@ -5866,5 +5622,2 @@ QTextFormat *QTextFormatCollection::format( QTextFormat *f )
if ( f == lastFormat || ( lastFormat && f->key() == lastFormat->key() ) ) {
-#ifdef DEBUG_COLLECTION
- qDebug( "need '%s', good case!", f->key().latin1() );
-#endif
lastFormat->addRef();
@@ -5875,5 +5628,2 @@ QTextFormat *QTextFormatCollection::format( QTextFormat *f )
if ( fm ) {
-#ifdef DEBUG_COLLECTION
- qDebug( "need '%s', normal case!", f->key().latin1() );
-#endif
lastFormat = fm;
@@ -5886,5 +5636,2 @@ QTextFormat *QTextFormatCollection::format( QTextFormat *f )
-#ifdef DEBUG_COLLECTION
- qDebug( "need '%s', worst case!", f->key().latin1() );
-#endif
lastFormat = createFormat( *f );
@@ -5898,5 +5645,2 @@ QTextFormat *QTextFormatCollection::format( QTextFormat *of, QTextFormat *nf, in
if ( cres && kof == of->key() && knf == nf->key() && cflags == flags ) {
-#ifdef DEBUG_COLLECTION
- qDebug( "mix of '%s' and '%s, best case!", of->key().latin1(), nf->key().latin1() );
-#endif
cres->addRef();
@@ -5915,2 +5659,4 @@ QTextFormat *QTextFormatCollection::format( QTextFormat *of, QTextFormat *nf, in
cres->fn.setUnderline( nf->fn.underline() );
+ if ( flags & QTextFormat::StrikeOut )
+ cres->fn.setStrikeOut( nf->fn.strikeOut() );
if ( flags & QTextFormat::Family )
@@ -5933,5 +5679,2 @@ QTextFormat *QTextFormatCollection::format( QTextFormat *of, QTextFormat *nf, in
if ( !fm ) {
-#ifdef DEBUG_COLLECTION
- qDebug( "mix of '%s' and '%s, worst case!", of->key().latin1(), nf->key().latin1() );
-#endif
cres->collection = this;
@@ -5939,5 +5682,2 @@ QTextFormat *QTextFormatCollection::format( QTextFormat *of, QTextFormat *nf, in
} else {
-#ifdef DEBUG_COLLECTION
- qDebug( "mix of '%s' and '%s, good case!", of->key().latin1(), nf->key().latin1() );
-#endif
delete cres;
@@ -5953,5 +5693,2 @@ QTextFormat *QTextFormatCollection::format( const QFont &f, const QColor &c )
if ( cachedFormat && cfont == f && ccol == c ) {
-#ifdef DEBUG_COLLECTION
- qDebug( "format of font and col '%s' - best case", cachedFormat->key().latin1() );
-#endif
cachedFormat->addRef();
@@ -5966,5 +5703,2 @@ QTextFormat *QTextFormatCollection::format( const QFont &f, const QColor &c )
if ( cachedFormat ) {
-#ifdef DEBUG_COLLECTION
- qDebug( "format of font and col '%s' - good case", cachedFormat->key().latin1() );
-#endif
cachedFormat->addRef();
@@ -5981,5 +5715,2 @@ QTextFormat *QTextFormatCollection::format( const QFont &f, const QColor &c )
qWarning("ASSERT: keys for format not identical: '%s '%s'", cachedFormat->key().latin1(), key.latin1() );
-#ifdef DEBUG_COLLECTION
- qDebug( "format of font and col '%s' - worst case", cachedFormat->key().latin1() );
-#endif
return cachedFormat;
@@ -5998,54 +5729,7 @@ void QTextFormatCollection::remove( QTextFormat *f )
-void QTextFormatCollection::debug()
-{
-#ifdef DEBUG_COLLECTION
- qDebug( "------------ QTextFormatCollection: debug --------------- BEGIN" );
- QDictIterator<QTextFormat> it( cKey );
- for ( ; it.current(); ++it ) {
- qDebug( "format '%s' (%p): refcount: %d", it.current()->key().latin1(),
- it.current(), it.current()->ref );
- }
- qDebug( "------------ QTextFormatCollection: debug --------------- END" );
-#endif
-}
-
-void QTextFormatCollection::updateStyles()
-{
- QDictIterator<QTextFormat> it( cKey );
- QTextFormat *f;
- while ( ( f = it.current() ) ) {
- ++it;
- f->updateStyle();
- }
- updateKeys();
-}
-
-void QTextFormatCollection::updateFontSizes( int base, bool usePixels )
-{
- QDictIterator<QTextFormat> it( cKey );
- QTextFormat *f;
- while ( ( f = it.current() ) ) {
- ++it;
- f->stdSize = base;
- f->usePixelSizes = usePixels;
- if ( usePixels )
- f->fn.setPixelSize( f->stdSize );
- else
- f->fn.setPointSize( f->stdSize );
- styleSheet()->scaleFont( f->fn, f->logicalFontSize );
- f->update();
- }
- f = defFormat;
- f->stdSize = base;
- f->usePixelSizes = usePixels;
- if ( usePixels )
- f->fn.setPixelSize( f->stdSize );
- else
- f->fn.setPointSize( f->stdSize );
- styleSheet()->scaleFont( f->fn, f->logicalFontSize );
- f->update();
- updateKeys();
-}
+#define UPDATE( up, lo, rest ) \
+ if ( font.lo##rest() != defFormat->fn.lo##rest() && fm->fn.lo##rest() == defFormat->fn.lo##rest() ) \
+ fm->fn.set##up##rest( font.lo##rest() )
-void QTextFormatCollection::updateFontAttributes( const QFont &f, const QFont &old )
+void QTextFormatCollection::updateDefaultFormat( const QFont &font, const QColor &color, QStyleSheet *sheet )
{
@@ -6053,26 +5737,33 @@ void QTextFormatCollection::updateFontAttributes( const QFont &f, const QFont &o
QTextFormat *fm;
+ bool usePixels = font.pointSize() == -1;
+ bool changeSize = usePixels ? font.pixelSize() != defFormat->fn.pixelSize() :
+ font.pointSize() != defFormat->fn.pointSize();
+ int base = usePixels ? font.pixelSize() : font.pointSize();
while ( ( fm = it.current() ) ) {
++it;
- if ( fm->fn.family() == old.family() &&
- fm->fn.weight() == old.weight() &&
- fm->fn.italic() == old.italic() &&
- fm->fn.underline() == old.underline() ) {
- fm->fn.setFamily( f.family() );
- fm->fn.setWeight( f.weight() );
- fm->fn.setItalic( f.italic() );
- fm->fn.setUnderline( f.underline() );
- fm->update();
- }
- }
- fm = defFormat;
- if ( fm->fn.family() == old.family() &&
- fm->fn.weight() == old.weight() &&
- fm->fn.italic() == old.italic() &&
- fm->fn.underline() == old.underline() ) {
- fm->fn.setFamily( f.family() );
- fm->fn.setWeight( f.weight() );
- fm->fn.setItalic( f.italic() );
- fm->fn.setUnderline( f.underline() );
+ UPDATE( F, f, amily );
+ UPDATE( W, w, eight );
+ UPDATE( B, b, old );
+ UPDATE( I, i, talic );
+ UPDATE( U, u, nderline );
+ if ( changeSize ) {
+ fm->stdSize = base;
+ fm->usePixelSizes = usePixels;
+ if ( usePixels )
+ fm->fn.setPixelSize( fm->stdSize );
+ else
+ fm->fn.setPointSize( fm->stdSize );
+ sheet->scaleFont( fm->fn, fm->logicalFontSize );
+ }
+ if ( color.isValid() && color != defFormat->col && fm->col == defFormat->col )
+ fm->col = color;
fm->update();
}
+
+ defFormat->fn = font;
+ defFormat->col = color;
+ defFormat->update();
+ defFormat->stdSize = base;
+ defFormat->usePixelSizes = usePixels;
+
updateKeys();
@@ -6080,3 +5771,2 @@ void QTextFormatCollection::updateFontAttributes( const QFont &f, const QFont &o
-
// the keys in cKey have changed, rebuild the hashtable
@@ -6087,3 +5777,3 @@ void QTextFormatCollection::updateKeys()
cKey.setAutoDelete( FALSE );
- QTextFormat** formats = new QTextFormat*[ cKey.count() + 1];
+ QTextFormat** formats = new QTextFormat*[ cKey.count() + 1 ];
QTextFormat **f = formats;
@@ -6098,2 +5788,3 @@ void QTextFormatCollection::updateKeys()
cKey.setAutoDelete( TRUE );
+ delete [] formats;
}
@@ -6144,2 +5835,10 @@ void QTextFormat::setUnderline( bool b )
+void QTextFormat::setStrikeOut( bool b )
+{
+ if ( b == fn.strikeOut() )
+ return;
+ fn.setStrikeOut( b );
+ update();
+}
+
void QTextFormat::setFamily( const QString &f )
@@ -6177,45 +5876,8 @@ void QTextFormat::setColor( const QColor &c )
-static int makeLogicFontSize( int s )
-{
- int defSize = QApplication::font().pointSize();
- if ( s < defSize - 4 )
- return 1;
- if ( s < defSize )
- return 2;
- if ( s < defSize + 4 )
- return 3;
- if ( s < defSize + 8 )
- return 4;
- if ( s < defSize + 12 )
- return 5;
- if (s < defSize + 16 )
- return 6;
- return 7;
-}
-
-static QTextFormat *defaultFormat = 0;
-
-QString QTextFormat::makeFormatChangeTags( QTextFormat *f, const QString& oldAnchorHref, const QString& anchorHref ) const
+QString QTextFormat::makeFormatChangeTags( QTextFormat* defaultFormat, QTextFormat *f,
+ const QString& oldAnchorHref, const QString& anchorHref ) const
{
- if ( !defaultFormat ) // #### wrong, use the document's default format instead
- defaultFormat = new QTextFormat( QApplication::font(),
- QApplication::palette().color( QPalette::Active, QColorGroup::Text ) );
-
QString tag;
- if ( f ) {
- if ( f->font() != defaultFormat->font() ) {
- if ( f->font().family() != defaultFormat->font().family()
- || f->font().pointSize() != defaultFormat->font().pointSize()
- || f->color().rgb() != defaultFormat->color().rgb() )
- tag += "</font>";
- if ( f->font().underline() && f->font().underline() != defaultFormat->font().underline() )
- tag += "</u>";
- if ( f->font().italic() && f->font().italic() != defaultFormat->font().italic() )
- tag += "</i>";
- if ( f->font().bold() && f->font().bold() != defaultFormat->font().bold() )
- tag += "</b>";
- }
- if ( !oldAnchorHref.isEmpty() )
- tag += "</a>";
- }
+ if ( f )
+ tag += f->makeFormatEndTags( defaultFormat, oldAnchorHref );
@@ -6224,23 +5886,29 @@ QString QTextFormat::makeFormatChangeTags( QTextFormat *f, const QString& oldAnc
- if ( font() != defaultFormat->font() ) {
- if ( font().bold() && font().bold() != defaultFormat->font().bold() )
- tag += "<b>";
- if ( font().italic() && font().italic() != defaultFormat->font().italic() )
- tag += "<i>";
- if ( font().underline() && font().underline() != defaultFormat->font().underline() )
- tag += "<u>";
- }
if ( font() != defaultFormat->font()
+ || vAlign() != defaultFormat->vAlign()
|| color().rgb() != defaultFormat->color().rgb() ) {
- QString f;
+ QString s;
if ( font().family() != defaultFormat->font().family() )
- f +=" face=\"" + fn.family() + "\"";
- if ( font().pointSize() != defaultFormat->font().pointSize() ) {
- f +=" size=\"" + QString::number( makeLogicFontSize( fn.pointSize() ) ) + "\"";
- f +=" style=\"font-size:" + QString::number( fn.pointSize() ) + "pt\"";
+ s += QString(!!s?";":"") + "font-family:" + fn.family();
+ if ( font().italic() && font().italic() != defaultFormat->font().italic() )
+ s += QString(!!s?";":"") + "font-style:" + (font().italic() ? "italic" : "normal");
+ if ( font().pointSize() != defaultFormat->font().pointSize() )
+ s += QString(!!s?";":"") + "font-size:" + QString::number( fn.pointSize() ) + "pt";
+ if ( font().weight() != defaultFormat->font().weight() )
+ s += QString(!!s?";":"") + "font-weight:" + QString::number( fn.weight() * 8 );
+ if ( font().underline() != defaultFormat->font().underline() )
+ s += QString(!!s?";":"") + "text-decoration:" + ( font().underline() ? "underline" : "none");
+ if ( vAlign() != defaultFormat->vAlign() ) {
+ s += QString(!!s?";":"") + "vertical-align:";
+ if ( vAlign() == QTextFormat::AlignSuperScript )
+ s += "super";
+ else if ( vAlign() == QTextFormat::AlignSubScript )
+ s += "sub";
+ else
+ s += "normal";
}
if ( color().rgb() != defaultFormat->color().rgb() )
- f +=" color=\"" + col.name() + "\"";
- if ( !f.isEmpty() )
- tag += "<font" + f + ">";
+ s += QString(!!s?";":"") + "color:" + col.name();
+ if ( !s.isEmpty() )
+ tag += "<span style=\"" + s + "\">";
}
@@ -6250,21 +5918,14 @@ QString QTextFormat::makeFormatChangeTags( QTextFormat *f, const QString& oldAnc
-QString QTextFormat::makeFormatEndTags( const QString& anchorHref ) const
+QString QTextFormat::makeFormatEndTags( QTextFormat* defaultFormat, const QString& anchorHref ) const
{
- if ( !defaultFormat )
- defaultFormat = new QTextFormat( QApplication::font(),
- QApplication::palette().color( QPalette::Active, QColorGroup::Text ) );
-
QString tag;
- if ( font() != defaultFormat->font() ) {
- if ( font().family() != defaultFormat->font().family()
- || font().pointSize() != defaultFormat->font().pointSize()
- || color().rgb() != defaultFormat->color().rgb() )
- tag += "</font>";
- if ( font().underline() && font().underline() != defaultFormat->font().underline() )
- tag += "</u>";
- if ( font().italic() && font().italic() != defaultFormat->font().italic() )
- tag += "</i>";
- if ( font().bold() && font().bold() != defaultFormat->font().bold() )
- tag += "</b>";
- }
+ if ( font().family() != defaultFormat->font().family()
+ || font().pointSize() != defaultFormat->font().pointSize()
+ || font().weight() != defaultFormat->font().weight()
+ || font().italic() != defaultFormat->font().italic()
+ || font().underline() != defaultFormat->font().underline()
+ || font().strikeOut() != defaultFormat->font().strikeOut()
+ || vAlign() != defaultFormat->vAlign()
+ || color().rgb() != defaultFormat->color().rgb() )
+ tag += "</span>";
if ( !anchorHref.isEmpty() )
@@ -6274,91 +5935,120 @@ QString QTextFormat::makeFormatEndTags( const QString& anchorHref ) const
-QTextFormat QTextFormat::makeTextFormat( const QStyleSheetItem *style, const QMap<QString,QString>& attr ) const
+QTextFormat QTextFormat::makeTextFormat( const QStyleSheetItem *style, const QMap<QString,QString>& attr, double scaleFontsFactor ) const
{
QTextFormat format(*this);
- if ( style ) {
- format.style = style->name();
- if ( style->name() == "font") {
- if ( attr.contains("color") ) {
- QString s = attr["color"];
- if ( !s.isEmpty() ) {
- format.col.setNamedColor( s );
- format.linkColor = FALSE;
- }
- }
- if ( attr.contains("size") ) {
- QString a = attr["size"];
- int n = a.toInt();
- if ( a[0] == '+' || a[0] == '-' )
- n += format.logicalFontSize;
- format.logicalFontSize = n;
- if ( format.usePixelSizes )
- format.fn.setPixelSize( format.stdSize );
- else
- format.fn.setPointSize( format.stdSize );
- style->styleSheet()->scaleFont( format.fn, format.logicalFontSize );
- }
- if ( attr.contains("style" ) ) {
- QString a = attr["style"];
- if ( a.startsWith( "font-size:" ) ) {
- QString s = a.mid( a.find( ':' ) + 1 );
- int n = s.left( s.length() - 2 ).toInt();
- format.logicalFontSize = 0;
- if ( format.usePixelSizes )
- format.fn.setPixelSize( n );
- else
- format.fn.setPointSize( n );
- }
- }
- if ( attr.contains("face") ) {
- QString a = attr["face"];
- if ( a.contains(',') )
- a = a.left( a.find(',') );
- format.fn.setFamily( a );
- }
- } else {
- if ( !style->isAnchor() && style->color().isValid() ) {
- // the style is not an anchor and defines a color.
- // It might be used inside an anchor and it should
- // override the link color.
+ if (!style )
+ return format;
+
+ if ( !style->isAnchor() && style->color().isValid() ) {
+ // the style is not an anchor and defines a color.
+ // It might be used inside an anchor and it should
+ // override the link color.
+ format.linkColor = FALSE;
+ }
+ switch ( style->verticalAlignment() ) {
+ case QStyleSheetItem::VAlignBaseline:
+ format.setVAlign( QTextFormat::AlignNormal );
+ break;
+ case QStyleSheetItem::VAlignSuper:
+ format.setVAlign( QTextFormat::AlignSuperScript );
+ break;
+ case QStyleSheetItem::VAlignSub:
+ format.setVAlign( QTextFormat::AlignSubScript );
+ break;
+ }
+
+ if ( style->fontWeight() != QStyleSheetItem::Undefined )
+ format.fn.setWeight( style->fontWeight() );
+ if ( style->fontSize() != QStyleSheetItem::Undefined ) {
+ format.fn.setPointSize( style->fontSize() );
+ } else if ( style->logicalFontSize() != QStyleSheetItem::Undefined ) {
+ format.logicalFontSize = style->logicalFontSize();
+ if ( format.usePixelSizes )
+ format.fn.setPixelSize( format.stdSize );
+ else
+ format.fn.setPointSize( format.stdSize );
+ style->styleSheet()->scaleFont( format.fn, format.logicalFontSize );
+ } else if ( style->logicalFontSizeStep() ) {
+ format.logicalFontSize += style->logicalFontSizeStep();
+ if ( format.usePixelSizes )
+ format.fn.setPixelSize( format.stdSize );
+ else
+ format.fn.setPointSize( format.stdSize );
+ style->styleSheet()->scaleFont( format.fn, format.logicalFontSize );
+ }
+ if ( !style->fontFamily().isEmpty() )
+ format.fn.setFamily( style->fontFamily() );
+ if ( style->color().isValid() )
+ format.col = style->color();
+ if ( style->definesFontItalic() )
+ format.fn.setItalic( style->fontItalic() );
+ if ( style->definesFontUnderline() )
+ format.fn.setUnderline( style->fontUnderline() );
+ if ( style->definesFontStrikeOut() )
+ format.fn.setStrikeOut( style->fontStrikeOut() );
+
+
+ if ( style->name() == "font") {
+ if ( attr.contains("color") ) {
+ QString s = attr["color"];
+ if ( !s.isEmpty() ) {
+ format.col.setNamedColor( s );
format.linkColor = FALSE;
}
- switch ( style->verticalAlignment() ) {
- case QStyleSheetItem::VAlignBaseline:
- format.setVAlign( QTextFormat::AlignNormal );
- break;
- case QStyleSheetItem::VAlignSuper:
- format.setVAlign( QTextFormat::AlignSuperScript );
- break;
- case QStyleSheetItem::VAlignSub:
- format.setVAlign( QTextFormat::AlignSubScript );
- break;
- }
-
- if ( style->fontWeight() != QStyleSheetItem::Undefined )
- format.fn.setWeight( style->fontWeight() );
- if ( style->fontSize() != QStyleSheetItem::Undefined ) {
- format.fn.setPointSize( style->fontSize() );
- } else if ( style->logicalFontSize() != QStyleSheetItem::Undefined ) {
- format.logicalFontSize = style->logicalFontSize();
- if ( format.usePixelSizes )
- format.fn.setPixelSize( format.stdSize );
- else
- format.fn.setPointSize( format.stdSize );
- style->styleSheet()->scaleFont( format.fn, format.logicalFontSize );
- } else if ( style->logicalFontSizeStep() ) {
- format.logicalFontSize += style->logicalFontSizeStep();
- if ( format.usePixelSizes )
- format.fn.setPixelSize( format.stdSize );
+ }
+ if ( attr.contains("face") ) {
+ QString a = attr["face"];
+ QString family = QTextDocument::section( a, ",", 0, 0 );
+ if ( !!family )
+ format.fn.setFamily( family );
+ }
+ if ( attr.contains("size") ) {
+ QString a = attr["size"];
+ int n = a.toInt();
+ if ( a[0] == '+' || a[0] == '-' )
+ n += format.logicalFontSize;
+ format.logicalFontSize = n;
+ if ( format.usePixelSizes )
+ format.fn.setPixelSize( format.stdSize );
+ else
+ format.fn.setPointSize( format.stdSize );
+ style->styleSheet()->scaleFont( format.fn, format.logicalFontSize );
+ }
+ }
+ if ( attr.contains("style" ) ) {
+ QString a = attr["style"];
+ for ( int s = 0; s < a.contains(';')+1; s++ ) {
+ QString style = QTextDocument::section( a, ";", s, s );
+ if ( style.startsWith("font-size:" ) && QTextDocument::endsWith(style, "pt") ) {
+ format.logicalFontSize = 0;
+ format.setPointSize( int( scaleFontsFactor * style.mid( 10, style.length() - 12 ).toInt() ) );
+ } if ( style.startsWith("font-style:" ) ) {
+ QString s = style.mid( 11 ).stripWhiteSpace();
+ if ( s == "normal" )
+ format.fn.setItalic( FALSE );
+ else if ( s == "italic" || s == "oblique" )
+ format.fn.setItalic( TRUE );
+ } else if ( style.startsWith("font-weight:" ) ) {
+ QString s = style.mid( 12 );
+ bool ok = TRUE;
+ int n = s.toInt( &ok );
+ if ( ok )
+ format.fn.setWeight( n/8 );
+ } else if ( style.startsWith("font-family:" ) ) {
+ format.fn.setFamily( QTextDocument::section(style.mid(12),",",0,0).stripWhiteSpace() );
+ } else if ( style.startsWith("text-decoration:" ) ) {
+ QString s = style.mid( 16 ).stripWhiteSpace();
+ format.fn.setUnderline( s == "underline" );
+ } else if ( style.startsWith("vertical-align:" ) ) {
+ QString s = style.mid( 15 ).stripWhiteSpace();
+ if ( s == "sub" )
+ format.setVAlign( QTextFormat::AlignSubScript );
+ else if ( s == "super" )
+ format.setVAlign( QTextFormat::AlignSuperScript );
else
- format.fn.setPointSize( format.stdSize );
- style->styleSheet()->scaleFont( format.fn, format.logicalFontSize );
+ format.setVAlign( QTextFormat::AlignNormal );
+ } else if ( style.startsWith("color:" ) ) {
+ format.col.setNamedColor( style.mid(6) );
+ format.linkColor = FALSE;
}
- if ( !style->fontFamily().isEmpty() )
- format.fn.setFamily( style->fontFamily() );
- if ( style->color().isValid() )
- format.col = style->color();
- if ( style->definesFontItalic() )
- format.fn.setItalic( style->fontItalic() );
- if ( style->definesFontUnderline() )
- format.fn.setUnderline( style->fontUnderline() );
}
@@ -6383,6 +6073,2 @@ QTextImage::QTextImage( QTextDocument *p, const QMap<QString, QString> &attr, co
{
-#if defined(PARSER_DEBUG)
- qDebug( debug_indent + "new QTextImage (pappi: %p)", p );
-#endif
-
width = height = 0;
@@ -6399,6 +6085,2 @@ QTextImage::QTextImage( QTextDocument *p, const QMap<QString, QString> &attr, co
-#if defined(PARSER_DEBUG)
- qDebug( debug_indent + " .." + imageName );
-#endif
-
if ( !imageName.isEmpty() ) {
@@ -6489,2 +6171,3 @@ QTextImage::~QTextImage()
}
+ delete reg;
}
@@ -6647,3 +6330,3 @@ static bool qt_is_cell_in_use( QPtrList<QTextTableCell>& cells, int row, int col
QTextCustomItem* QTextDocument::parseTable( const QMap<QString, QString> &attr, const QTextFormat &fmt,
- const QChar* doc, int length, int& pos, QTextParag *curpar )
+ const QChar* doc, int length, int& pos, QTextParagraph *curpar )
{
@@ -6667,5 +6350,2 @@ QTextCustomItem* QTextDocument::parseTable( const QMap<QString, QString> &attr,
if ( tagname == "table" ) {
-#if defined(PARSER_DEBUG)
- debug_indent.remove( debug_indent.length() - 3, 2 );
-#endif
return table;
@@ -6726,6 +6406,6 @@ QTextCustomItem* QTextDocument::parseTable( const QMap<QString, QString> &attr,
QTextTableCell* cell = new QTextTableCell( table, row, col,
- attr2, s, fmt.makeTextFormat( s, attr2 ),
- contxt, *factory_, sheet_,
- QString( doc, length).mid( pos, end - pos ) );
- cell->richText()->parParag = curpar;
+ attr2, s, fmt.makeTextFormat( s, attr2, scaleFontsFactor ),
+ contxt, *factory_, sheet_,
+ QString( doc, length).mid( pos, end - pos ) );
+ cell->richText()->parentPar = curpar;
if ( cell->colspan() > 1 || cell->rowspan() > 1 )
@@ -6742,5 +6422,2 @@ QTextCustomItem* QTextDocument::parseTable( const QMap<QString, QString> &attr,
}
-#if defined(PARSER_DEBUG)
- debug_indent.remove( debug_indent.length() - 3, 2 );
-#endif
return table;
@@ -7133,15 +6810,6 @@ QChar QTextDocument::parseChar(const QChar* doc, int length, int& pos, QStyleShe
if ( wsm == QStyleSheetItem::WhiteSpacePre ) {
- if ( c == ' ' )
- return QChar::nbsp;
- else
- return c;
- } else if ( wsm == QStyleSheetItem_WhiteSpaceNoCompression ) {
- return c;
- } else if ( wsm == QStyleSheetItem_WhiteSpaceNormalWithNewlines ) {
if ( c == '\n' )
+ return QChar_linesep;
+ else
return c;
- while ( pos< length &&
- doc[pos].isSpace() && doc[pos] != QChar::nbsp && doc[pos] != '\n' )
- pos++;
- return ' ';
} else { // non-pre mode: collapse whitespace except nbsp
@@ -7357,7 +7025,2 @@ QTextTable::QTextTable( QTextDocument *p, const QMap<QString, QString> & attr )
cells.setAutoDelete( FALSE );
-#if defined(PARSER_DEBUG)
- debug_indent += "\t";
- qDebug( debug_indent + "new QTextTable (%p)", this );
- debug_indent += "\t";
-#endif
cellspacing = 2;
@@ -7442,6 +7105,6 @@ QString QTextTable::richText() const
}
- s += "<td ";
+ s += "<td";
it = cell->attributes.begin();
for ( ; it != cell->attributes.end(); ++it )
- s += it.key() + "=" + *it + " ";
+ s += " " + it.key() + "=" + *it;
s += ">";
@@ -7578,8 +7241,2 @@ void QTextTable::draw(QPainter* p, int x, int y, int cx, int cy, int cw, int ch,
-#if defined(DEBUG_TABLE_RENDERING)
- p->save();
- p->setPen( Qt::red );
- p->drawRect( x, y, width, height );
- p->restore();
-#endif
}
@@ -7645,3 +7302,3 @@ void QTextTable::addCell( QTextTableCell* cell )
-bool QTextTable::enter( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, bool atEnd )
+bool QTextTable::enter( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy, bool atEnd )
{
@@ -7654,3 +7311,3 @@ bool QTextTable::enter( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag,
-bool QTextTable::enterAt( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, const QPoint &pos )
+bool QTextTable::enterAt( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy, const QPoint &pos )
{
@@ -7694,3 +7351,3 @@ bool QTextTable::enterAt( QTextCursor *c, QTextDocument *&doc, QTextParag *&para
doc = cell->richText();
- parag = doc->firstParag();
+ parag = doc->firstParagraph();
idx = 0;
@@ -7701,3 +7358,3 @@ bool QTextTable::enterAt( QTextCursor *c, QTextDocument *&doc, QTextParag *&para
-bool QTextTable::next( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+bool QTextTable::next( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy )
{
@@ -7727,3 +7384,3 @@ bool QTextTable::next( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag,
doc = cell->richText();
- parag = doc->firstParag();
+ parag = doc->firstParagraph();
idx = 0;
@@ -7734,3 +7391,3 @@ bool QTextTable::next( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag,
-bool QTextTable::prev( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+bool QTextTable::prev( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy )
{
@@ -7760,3 +7417,3 @@ bool QTextTable::prev( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag,
doc = cell->richText();
- parag = doc->firstParag();
+ parag = doc->lastParagraph();
idx = parag->length() - 1;
@@ -7767,3 +7424,3 @@ bool QTextTable::prev( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag,
-bool QTextTable::down( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+bool QTextTable::down( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy )
{
@@ -7798,3 +7455,3 @@ bool QTextTable::down( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag,
return FALSE;
- parag = doc->firstParag();
+ parag = doc->firstParagraph();
idx = 0;
@@ -7805,3 +7462,3 @@ bool QTextTable::down( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag,
-bool QTextTable::up( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+bool QTextTable::up( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy )
{
@@ -7836,3 +7493,3 @@ bool QTextTable::up( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, in
return FALSE;
- parag = doc->lastParag();
+ parag = doc->lastParagraph();
idx = parag->length() - 1;
@@ -7851,6 +7508,2 @@ QTextTableCell::QTextTableCell( QTextTable* table,
{
-#if defined(PARSER_DEBUG)
- qDebug( debug_indent + "new QTextTableCell1 (pappi: %p)", table );
- qDebug( debug_indent + doc );
-#endif
cached_width = -1;
@@ -7890,3 +7543,4 @@ QTextTableCell::QTextTableCell( QTextTable* table,
richtext->setStyleSheet( sheet );
- richtext->setDefaultFont( table->parent->formatCollection()->defaultFormat()->font() );
+ richtext->setDefaultFormat( table->parent->formatCollection()->defaultFormat()->font(),
+ table->parent->formatCollection()->defaultFormat()->color() );
richtext->setRichText( doc, context );
@@ -7926,30 +7580,2 @@ QTextTableCell::QTextTableCell( QTextTable* table,
-QTextTableCell::QTextTableCell( QTextTable* table, int row, int column )
-{
-#if defined(PARSER_DEBUG)
- qDebug( debug_indent + "new QTextTableCell2( pappi: %p", table );
-#endif
- maxw = QWIDGETSIZE_MAX;
- minw = 0;
- cached_width = -1;
- cached_sizehint = -1;
-
- parent = table;
- row_ = row;
- col_ = column;
- stretch_ = 0;
- richtext = new QTextDocument( table->parent );
- richtext->setTableCell( this );
- richtext->setFormatter( table->parent->formatter() );
- richtext->setUseFormatCollection( table->parent->useFormatCollection() );
- richtext->setDefaultFont( table->parent->formatCollection()->defaultFormat()->font() );
- richtext->setRichText( "<html></html>", QString::null );
- rowspan_ = 1;
- colspan_ = 1;
- background = 0;
- hasFixedWidth = FALSE;
- parent->addCell( this );
-}
-
-
QTextTableCell::~QTextTableCell()
@@ -8029,3 +7655,3 @@ void QTextTableCell::adjustToPainter( QPainter* p )
{
- QTextParag *parag = richtext->firstParag();
+ QTextParagraph *parag = richtext->firstParagraph();
while ( parag ) {
@@ -8073,5 +7699,2 @@ void QTextTableCell::draw( QPainter* p, int x, int y, int cx, int cy, int cw, in
QRegion r;
- QTextCursor *c = 0;
- if ( richtext->parent()->tmpCursor )
- c = richtext->parent()->tmpCursor;
if ( cx >= 0 && cy >= 0 )
@@ -8079,5 +7702,5 @@ void QTextTableCell::draw( QPainter* p, int x, int y, int cx, int cy, int cw, in
cy - ( y + geom.y() + verticalAlignmentOffset() ),
- cw, ch, g, FALSE, (c != 0), c );
+ cw, ch, g, FALSE, FALSE, 0 );
else
- richtext->draw( p, -1, -1, -1, -1, g, FALSE, (c != 0), c );
+ richtext->draw( p, -1, -1, -1, -1, g, FALSE, FALSE, 0 );
@@ -8085 +7708,137 @@ void QTextTableCell::draw( QPainter* p, int x, int y, int cx, int cy, int cw, in
}
+
+QString QTextDocument::section( QString str, const QString &sep, int start, int end )
+{
+ const QChar *uc = str.unicode();
+ if ( !uc )
+ return QString();
+ QString _sep = sep;
+ const QChar *uc_sep = _sep.unicode();
+ if(!uc_sep)
+ return QString();
+ bool match = FALSE, last_match = TRUE;
+
+ //find start
+ int n = str.length(), sep_len = _sep.length();
+ const QChar *begin = start < 0 ? uc + n : uc;
+ while(start) {
+ match = FALSE;
+ int c = 0;
+ for(const QChar *tmp = start < 0 ? begin - sep_len : begin;
+ c < sep_len && tmp < uc + n && tmp >= uc; tmp++, c++) {
+ if( *tmp != *(uc_sep + c) )
+ break;
+ if(c == sep_len - 1) {
+ match = TRUE;
+ break;
+ }
+ }
+ last_match = match;
+
+ if(start < 0) {
+ if(match) {
+ begin -= sep_len;
+ if(!++start)
+ break;
+ } else {
+ if(start == -1 && begin == uc)
+ break;
+ begin--;
+ }
+ } else {
+ if(match) {
+ if(!--start)
+ break;
+ begin += sep_len;
+ } else {
+ if(start == 1 && begin == uc + n)
+ break;
+ begin++;
+ }
+ }
+ if(begin > uc + n || begin < uc)
+ return QString();
+ }
+ if(match)
+ begin+=sep_len;
+ if(begin > uc + n || begin < uc)
+ return QString();
+
+ //now find last
+ match = FALSE;
+ const QChar *last = end < 0 ? uc + n : uc;
+ if(end == -1) {
+ int c = 0;
+ for(const QChar *tmp = end < 0 ? last - sep_len : last;
+ c < sep_len && tmp < uc + n && tmp >= uc; tmp++, c++) {
+ if( *tmp != *(uc_sep + c) )
+ break;
+ if(c == sep_len - 1) {
+ match = TRUE;
+ break;
+ }
+ }
+ } else {
+ end++;
+ last_match = TRUE;
+ while(end) {
+ match = FALSE;
+ int c = 0;
+ for(const QChar *tmp = end < 0 ? last - sep_len : last;
+ c < sep_len && tmp < uc + n && tmp >= uc; tmp++, c++) {
+ if( *tmp != *(uc_sep + c) )
+ break;
+ if(c == sep_len - 1) {
+ match = TRUE;
+ break;
+ }
+ }
+ last_match = match;
+
+ if(end < 0) {
+ if(match) {
+ if(!++end)
+ break;
+ last -= sep_len;
+ } else {
+ last--;
+ }
+ } else {
+ if(match) {
+ last += sep_len;
+ if(!--end)
+ break;
+ } else {
+ last++;
+ }
+ }
+ if(last >= uc + n) {
+ last = uc + n;
+ break;
+ } else if(last < uc) {
+ return QString();
+ }
+ }
+ }
+ if(match)
+ last -= sep_len;
+ if(last < uc || last > uc + n || begin >= last)
+ return QString();
+
+ //done
+ return QString(begin, last - begin);
+}
+
+bool QTextDocument::endsWith( QString str, const QString &s)
+{
+ if ( str.isNull() )
+ return s.isNull();
+ int pos = str.length() - s.length();
+ if ( pos < 0 )
+ return FALSE;
+ for ( uint i = 0; i < s.length(); i++ ) {
+ if ( str.unicode()[pos+i] != s[(int)i] )
+ return FALSE;
+ }
+ return TRUE;
+}
diff --git a/noncore/apps/opie-write/qrichtext_p.cpp b/noncore/apps/opie-write/qrichtext_p.cpp
index fb20730..6783e0b 100644
--- a/noncore/apps/opie-write/qrichtext_p.cpp
+++ b/noncore/apps/opie-write/qrichtext_p.cpp
@@ -58,26 +58,25 @@ QString QTextCustomItem::richText() const { return QString::null; }
-bool QTextCustomItem::enter( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, bool atEnd )
+bool QTextCustomItem::enter( QTextCursor *, QTextDocument*&, QTextParagraph *&, int &, int &, int &, bool )
{
- doc = doc; parag = parag; idx = idx; ox = ox; oy = oy; Q_UNUSED( atEnd ) return TRUE;
-
+ return TRUE;
}
-bool QTextCustomItem::enterAt( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, const QPoint & )
+bool QTextCustomItem::enterAt( QTextCursor *, QTextDocument *&, QTextParagraph *&, int &, int &, int &, const QPoint & )
{
- doc = doc; parag = parag; idx = idx; ox = ox; oy = oy; return TRUE;
+ return TRUE;
}
-bool QTextCustomItem::next( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+bool QTextCustomItem::next( QTextCursor *, QTextDocument *&, QTextParagraph *&, int &, int &, int & )
{
- doc = doc; parag = parag; idx = idx; ox = ox; oy = oy; return TRUE;
+ return TRUE;
}
-bool QTextCustomItem::prev( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+bool QTextCustomItem::prev( QTextCursor *, QTextDocument *&, QTextParagraph *&, int &, int &, int & )
{
- doc = doc; parag = parag; idx = idx; ox = ox; oy = oy; return TRUE;
+ return TRUE;
}
-bool QTextCustomItem::down( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+bool QTextCustomItem::down( QTextCursor *, QTextDocument *&, QTextParagraph *&, int &, int &, int & )
{
- doc = doc; parag = parag; idx = idx; ox = ox; oy = oy; return TRUE;
+ return TRUE;
}
-bool QTextCustomItem::up( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy )
+bool QTextCustomItem::up( QTextCursor *, QTextDocument *&, QTextParagraph *&, int &, int &, int & )
{
- doc = doc; parag = parag; idx = idx; ox = ox; oy = oy; return TRUE;
+ return TRUE;
}
@@ -91,4 +90,4 @@ void QTextTable::invalidate() { cachewidth = -1; }
-QTextParagData::~QTextParagData() {}
-void QTextParagData::join( QTextParagData * ) {}
+QTextParagraphData::~QTextParagraphData() {}
+void QTextParagraphData::join( QTextParagraphData * ) {}
@@ -102,3 +101,3 @@ int QTextCursor::x() const
{
- QTextStringChar *c = string->at( idx );
+ QTextStringChar *c = para->at( idx );
int curx = c->x;
@@ -107,6 +106,7 @@ int QTextCursor::x() const
idx > 0 &&
- ( string->alignment() & Qt3::AlignJustify ) == Qt3::AlignJustify )
- curx = string->at( idx - 1 )->x + string->string()->width( idx - 1 );
+ !c->lineStart &&
+ ( para->alignment() & Qt3::AlignJustify ) == Qt3::AlignJustify )
+ curx = para->at( idx - 1 )->x + para->string()->width( idx - 1 );
if ( c->rightToLeft )
- curx += string->string()->width( idx );
+ curx += para->string()->width( idx );
return curx;
@@ -117,4 +117,31 @@ int QTextCursor::y() const
int dummy, line;
- string->lineStartOfChar( idx, &dummy, &line );
- return string->lineY( line );
+ para->lineStartOfChar( idx, &dummy, &line );
+ return para->lineY( line );
+}
+
+int QTextCursor::globalX() const { return totalOffsetX() + para->rect().x() + x(); }
+int QTextCursor::globalY() const { return totalOffsetY() + para->rect().y() + y(); }
+
+QTextDocument *QTextCursor::document() const
+{
+ return para ? para->document() : 0;
+}
+
+void QTextCursor::gotoPosition( QTextParagraph* p, int index )
+{
+ if ( para && p != para ) {
+ while ( para->document() != p->document() && !indices.isEmpty() )
+ pop();
+ Q_ASSERT( indices.isEmpty() || para->document() == p->document() );
+ }
+ para = p;
+ if ( index < 0 || index >= para->length() ) {
+#if defined(QT_CHECK_RANGE)
+ qWarning( "QTextCursor::gotoParagraph Index: %d out of range", index );
+#endif
+ index = index < 0 ? 0 : para->length() - 1;
+ }
+
+ tmpIndex = -1;
+ idx = index;
}
@@ -129,7 +156,7 @@ bool QTextDocument::hasSelection( int id, bool visible ) const
-void QTextDocument::setSelectionStart( int id, QTextCursor *cursor )
+void QTextDocument::setSelectionStart( int id, const QTextCursor &cursor )
{
QTextDocumentSelection sel;
- sel.startCursor = *cursor;
- sel.endCursor = *cursor;
+ sel.startCursor = cursor;
+ sel.endCursor = cursor;
sel.swapped = FALSE;
@@ -138,5 +165,5 @@ void QTextDocument::setSelectionStart( int id, QTextCursor *cursor )
-QTextParag *QTextDocument::paragAt( int i ) const
+QTextParagraph *QTextDocument::paragAt( int i ) const
{
- QTextParag* p = curParag;
+ QTextParagraph* p = curParag;
if ( !p || p->paragId() > i )
@@ -155,4 +182,3 @@ QTextFormat::~QTextFormat()
QTextFormat::QTextFormat()
- : fm( QFontMetrics( fn ) ), linkColor( TRUE ), logicalFontSize( 3 ), stdSize( qApp->font().pointSize() ),
- different( NoFlags )
+ : fm( QFontMetrics( fn ) ), linkColor( TRUE ), logicalFontSize( 3 ), stdSize( qApp->font().pointSize() )
{
@@ -165,3 +191,3 @@ QTextFormat::QTextFormat()
}
-
+
missp = FALSE;
@@ -172,4 +198,3 @@ QTextFormat::QTextFormat()
QTextFormat::QTextFormat( const QStyleSheetItem *style )
- : fm( QFontMetrics( fn ) ), linkColor( TRUE ), logicalFontSize( 3 ), stdSize( qApp->font().pointSize() ),
- different( NoFlags )
+ : fm( QFontMetrics( fn ) ), linkColor( TRUE ), logicalFontSize( 3 ), stdSize( qApp->font().pointSize() )
{
@@ -183,3 +208,2 @@ QTextFormat::QTextFormat( const QStyleSheetItem *style )
- this->style = style->name();
missp = FALSE;
@@ -192,2 +216,3 @@ QTextFormat::QTextFormat( const QStyleSheetItem *style )
fn.setUnderline( style->fontUnderline() );
+ fn.setStrikeOut( style->fontStrikeOut() );
col = style->color();
@@ -204,3 +229,2 @@ QTextFormat::QTextFormat( const QStyleSheetItem *style )
addRef();
- updateStyleFlags();
}
@@ -209,3 +233,3 @@ QTextFormat::QTextFormat( const QFont &f, const QColor &c, QTextFormatCollection
: fn( f ), col( c ), fm( QFontMetrics( f ) ), linkColor( TRUE ),
- logicalFontSize( 3 ), stdSize( f.pointSize() ), different( NoFlags )
+ logicalFontSize( 3 ), stdSize( f.pointSize() )
{
@@ -228,3 +252,2 @@ QTextFormat::QTextFormat( const QFont &f, const QColor &c, QTextFormatCollection
addRef();
- updateStyleFlags();
}
@@ -251,4 +274,2 @@ QTextFormat::QTextFormat( const QTextFormat &f )
linkColor = f.linkColor;
- style = f.style;
- different = f.different;
addRef();
@@ -276,4 +297,2 @@ QTextFormat& QTextFormat::operator=( const QTextFormat &f )
linkColor = f.linkColor;
- style = f.style;
- different = f.different;
addRef();
@@ -292,3 +311,2 @@ void QTextFormat::update()
generateKey();
- updateStyleFlags();
}
@@ -374,48 +392,2 @@ QString QTextFormat::getKey( const QFont &fn, const QColor &col, bool misspelled
-void QTextFormat::updateStyle()
-{
- if ( !collection || !collection->styleSheet() )
- return;
- QStyleSheetItem *item = collection->styleSheet()->item( style );
- if ( !item )
- return;
- if ( !( different & Color ) && item->color().isValid() )
- col = item->color();
- if ( !( different & Size ) && item->fontSize() != -1 )
- fn.setPointSize( item->fontSize() );
- if ( !( different & Family ) && !item->fontFamily().isEmpty() )
- fn.setFamily( item->fontFamily() );
- if ( !( different & Bold ) && item->fontWeight() != -1 )
- fn.setWeight( item->fontWeight() );
- if ( !( different & Italic ) && item->definesFontItalic() )
- fn.setItalic( item->fontItalic() );
- if ( !( different & Underline ) && item->definesFontUnderline() )
- fn.setUnderline( item->fontUnderline() );
- generateKey();
- update();
-
-}
-
-void QTextFormat::updateStyleFlags()
-{
- different = NoFlags;
- if ( !collection || !collection->styleSheet() )
- return;
- QStyleSheetItem *item = collection->styleSheet()->item( style );
- if ( !item )
- return;
- if ( item->color() != col )
- different |= Color;
- if ( item->fontSize() != fn.pointSize() )
- different |= Size;
- if ( item->fontFamily() != fn.family() )
- different |= Family;
- if ( item->fontItalic() != fn.italic() )
- different |= Italic;
- if ( item->fontUnderline() != fn.underline() )
- different |= Underline;
- if ( item->fontWeight() != fn.weight() )
- different |= Bold;
-}
-
QString QTextString::toString( const QMemArray<QTextStringChar> &data )
@@ -445,5 +417,5 @@ QString QTextString::toString() const
-void QTextParag::setSelection( int id, int start, int end )
+void QTextParagraph::setSelection( int id, int start, int end )
{
- QMap<int, QTextParagSelection>::ConstIterator it = selections().find( id );
+ QMap<int, QTextParagraphSelection>::ConstIterator it = selections().find( id );
if ( it != mSelections->end() ) {
@@ -453,3 +425,3 @@ void QTextParag::setSelection( int id, int start, int end )
- QTextParagSelection sel;
+ QTextParagraphSelection sel;
sel.start = start;
@@ -460,3 +432,3 @@ void QTextParag::setSelection( int id, int start, int end )
-void QTextParag::removeSelection( int id )
+void QTextParagraph::removeSelection( int id )
{
@@ -469,3 +441,3 @@ void QTextParag::removeSelection( int id )
-int QTextParag::selectionStart( int id ) const
+int QTextParagraph::selectionStart( int id ) const
{
@@ -473,3 +445,3 @@ int QTextParag::selectionStart( int id ) const
return -1;
- QMap<int, QTextParagSelection>::ConstIterator it = mSelections->find( id );
+ QMap<int, QTextParagraphSelection>::ConstIterator it = mSelections->find( id );
if ( it == mSelections->end() )
@@ -479,3 +451,3 @@ int QTextParag::selectionStart( int id ) const
-int QTextParag::selectionEnd( int id ) const
+int QTextParagraph::selectionEnd( int id ) const
{
@@ -483,3 +455,3 @@ int QTextParag::selectionEnd( int id ) const
return -1;
- QMap<int, QTextParagSelection>::ConstIterator it = mSelections->find( id );
+ QMap<int, QTextParagraphSelection>::ConstIterator it = mSelections->find( id );
if ( it == mSelections->end() )
@@ -489,13 +461,8 @@ int QTextParag::selectionEnd( int id ) const
-bool QTextParag::hasSelection( int id ) const
+bool QTextParagraph::hasSelection( int id ) const
{
- if ( !mSelections )
- return FALSE;
- QMap<int, QTextParagSelection>::ConstIterator it = mSelections->find( id );
- if ( it == mSelections->end() )
- return FALSE;
- return ( *it ).start != ( *it ).end || length() == 1;
+ return mSelections ? mSelections->contains( id ) : FALSE;
}
-bool QTextParag::fullSelected( int id ) const
+bool QTextParagraph::fullSelected( int id ) const
{
@@ -503,3 +470,3 @@ bool QTextParag::fullSelected( int id ) const
return FALSE;
- QMap<int, QTextParagSelection>::ConstIterator it = mSelections->find( id );
+ QMap<int, QTextParagraphSelection>::ConstIterator it = mSelections->find( id );
if ( it == mSelections->end() )
@@ -509,6 +476,6 @@ bool QTextParag::fullSelected( int id ) const
-int QTextParag::lineY( int l ) const
+int QTextParagraph::lineY( int l ) const
{
if ( l > (int)lineStarts.count() - 1 ) {
- qWarning( "QTextParag::lineY: line %d out of range!", l );
+ qWarning( "QTextParagraph::lineY: line %d out of range!", l );
return 0;
@@ -517,5 +484,5 @@ int QTextParag::lineY( int l ) const
if ( !isValid() )
- ( (QTextParag*)this )->format();
+ ( (QTextParagraph*)this )->format();
- QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.begin();
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin();
while ( l-- > 0 )
@@ -525,6 +492,6 @@ int QTextParag::lineY( int l ) const
-int QTextParag::lineBaseLine( int l ) const
+int QTextParagraph::lineBaseLine( int l ) const
{
if ( l > (int)lineStarts.count() - 1 ) {
- qWarning( "QTextParag::lineBaseLine: line %d out of range!", l );
+ qWarning( "QTextParagraph::lineBaseLine: line %d out of range!", l );
return 10;
@@ -533,5 +500,5 @@ int QTextParag::lineBaseLine( int l ) const
if ( !isValid() )
- ( (QTextParag*)this )->format();
+ ( (QTextParagraph*)this )->format();
- QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.begin();
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin();
while ( l-- > 0 )
@@ -541,6 +508,6 @@ int QTextParag::lineBaseLine( int l ) const
-int QTextParag::lineHeight( int l ) const
+int QTextParagraph::lineHeight( int l ) const
{
if ( l > (int)lineStarts.count() - 1 ) {
- qWarning( "QTextParag::lineHeight: line %d out of range!", l );
+ qWarning( "QTextParagraph::lineHeight: line %d out of range!", l );
return 15;
@@ -549,5 +516,5 @@ int QTextParag::lineHeight( int l ) const
if ( !isValid() )
- ( (QTextParag*)this )->format();
+ ( (QTextParagraph*)this )->format();
- QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.begin();
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin();
while ( l-- > 0 )
@@ -557,6 +524,6 @@ int QTextParag::lineHeight( int l ) const
-void QTextParag::lineInfo( int l, int &y, int &h, int &bl ) const
+void QTextParagraph::lineInfo( int l, int &y, int &h, int &bl ) const
{
if ( l > (int)lineStarts.count() - 1 ) {
- qWarning( "QTextParag::lineInfo: line %d out of range!", l );
+ qWarning( "QTextParagraph::lineInfo: line %d out of range!", l );
qDebug( "%d %d", (int)lineStarts.count() - 1, l );
@@ -569,5 +536,5 @@ void QTextParag::lineInfo( int l, int &y, int &h, int &bl ) const
if ( !isValid() )
- ( (QTextParag*)this )->format();
+ ( (QTextParagraph*)this )->format();
- QMap<int, QTextParagLineStart*>::ConstIterator it = lineStarts.begin();
+ QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin();
while ( l-- > 0 )
@@ -579,76 +546,12 @@ void QTextParag::lineInfo( int l, int &y, int &h, int &bl ) const
-int QTextParag::alignment() const
-{
- if ( align != -1 )
- return align;
- QStyleSheetItem *item = style();
- if ( !item )
- return Qt3::AlignAuto;
- if ( mStyleSheetItemsVec ) {
- for ( int i = 0; i < (int)mStyleSheetItemsVec->size(); ++i ) {
- item = (*mStyleSheetItemsVec)[ i ];
- if ( item->alignment() != QStyleSheetItem::Undefined )
- return item->alignment();
- }
- }
- return Qt3::AlignAuto;
-}
-QPtrVector<QStyleSheetItem> QTextParag::styleSheetItems() const
+void QTextParagraph::setAlignment( int a )
{
- QPtrVector<QStyleSheetItem> vec;
- if ( mStyleSheetItemsVec ) {
- vec.resize( mStyleSheetItemsVec->size() );
- for ( int i = 0; i < (int)vec.size(); ++i )
- vec.insert( i, (*mStyleSheetItemsVec)[ i ] );
- }
- return vec;
-}
-
-QStyleSheetItem *QTextParag::style() const
-{
- if ( !mStyleSheetItemsVec || mStyleSheetItemsVec->size() == 0 )
- return 0;
- return (*mStyleSheetItemsVec)[ mStyleSheetItemsVec->size() - 1 ];
-}
-
-int QTextParag::numberOfSubParagraph() const
-{
- if ( list_val != -1 )
- return list_val;
- if ( numSubParag != -1 )
- return numSubParag;
- int n = 0;
- QTextParag *p = (QTextParag*)this;
- while ( p && ( styleSheetItemsVec().size() >= p->styleSheetItemsVec().size() &&
- styleSheetItemsVec()[ (int)p->styleSheetItemsVec().size() - 1 ] == p->style() ||
- p->styleSheetItemsVec().size() >= styleSheetItemsVec().size() &&
- p->styleSheetItemsVec()[ (int)styleSheetItemsVec().size() - 1 ] == style() ) ) {
- if ( p->style() == style() && listStyle() != p->listStyle()
- && p->styleSheetItemsVec().size() == styleSheetItemsVec().size() )
- break;
- if ( p->style()->displayMode() == QStyleSheetItem::DisplayListItem
- && p->style() != style() || styleSheetItemsVec().size() == p->styleSheetItemsVec().size() )
- ++n;
- p = p->prev();
- }
- ( (QTextParag*)this )->numSubParag = n;
- return n;
-}
-
-void QTextParag::setFormat( QTextFormat *fm )
-{
- bool doUpdate = FALSE;
- if (defFormat && (defFormat != formatCollection()->defaultFormat()))
- doUpdate = TRUE;
- defFormat = formatCollection()->format( fm );
- if ( !doUpdate )
+ if ( a == (int)align )
return;
- for ( int i = 0; i < length(); ++i ) {
- if ( at( i )->format()->styleName() == defFormat->styleName() )
- at( i )->format()->updateStyle();
- }
+ align = a;
+ invalidate( 0 );
}
-QTextFormatter *QTextParag::formatter() const
+QTextFormatter *QTextParagraph::formatter() const
{
@@ -658,6 +561,6 @@ QTextFormatter *QTextParag::formatter() const
return pseudoDocument()->pFormatter;
- return ( ( (QTextParag*)this )->pseudoDocument()->pFormatter = new QTextFormatterBreakWords );
+ return ( ( (QTextParagraph*)this )->pseudoDocument()->pFormatter = new QTextFormatterBreakWords );
}
-void QTextParag::setTabArray( int *a )
+void QTextParagraph::setTabArray( int *a )
{
@@ -667,3 +570,3 @@ void QTextParag::setTabArray( int *a )
-void QTextParag::setTabStops( int tw )
+void QTextParagraph::setTabStops( int tw )
{
@@ -675,6 +578,6 @@ void QTextParag::setTabStops( int tw )
-QMap<int, QTextParagSelection> &QTextParag::selections() const
+QMap<int, QTextParagraphSelection> &QTextParagraph::selections() const
{
if ( !mSelections )
- ((QTextParag *)this)->mSelections = new QMap<int, QTextParagSelection>;
+ ((QTextParagraph *)this)->mSelections = new QMap<int, QTextParagraphSelection>;
return *mSelections;
@@ -682,13 +585,7 @@ QMap<int, QTextParagSelection> &QTextParag::selections() const
-QPtrVector<QStyleSheetItem> &QTextParag::styleSheetItemsVec() const
-{
- if ( !mStyleSheetItemsVec )
- ((QTextParag *)this)->mStyleSheetItemsVec = new QPtrVector<QStyleSheetItem>;
- return *mStyleSheetItemsVec;
-}
-QPtrList<QTextCustomItem> &QTextParag::floatingItems() const
+QPtrList<QTextCustomItem> &QTextParagraph::floatingItems() const
{
if ( !mFloatingItems )
- ((QTextParag *)this)->mFloatingItems = new QPtrList<QTextCustomItem>;
+ ((QTextParagraph *)this)->mFloatingItems = new QPtrList<QTextCustomItem>;
return *mFloatingItems;
@@ -704,3 +601,3 @@ QTextStringChar::~QTextStringChar()
-QTextParagPseudoDocument::QTextParagPseudoDocument():pFormatter(0),commandHistory(0), minw(0),wused(0){}
-QTextParagPseudoDocument::~QTextParagPseudoDocument(){ delete pFormatter; delete commandHistory; }
+QTextParagraphPseudoDocument::QTextParagraphPseudoDocument():pFormatter(0),commandHistory(0), minw(0),wused(0){}
+QTextParagraphPseudoDocument::~QTextParagraphPseudoDocument(){ delete pFormatter; delete commandHistory; }
diff --git a/noncore/apps/opie-write/qrichtext_p.h b/noncore/apps/opie-write/qrichtext_p.h
index 94ce913..e368edb 100644
--- a/noncore/apps/opie-write/qrichtext_p.h
+++ b/noncore/apps/opie-write/qrichtext_p.h
@@ -53,3 +53,2 @@
#ifndef QT_H
-#include "qt3namespace.h"
#include "qstring.h"
@@ -80,4 +79,2 @@
-//#define DEBUG_COLLECTION
-
namespace Qt3 {
@@ -89,3 +86,3 @@ class QTextFormat;
class QTextCursor;
-class QTextParag;
+class QTextParagraph;
class QTextFormatter;
@@ -127,3 +124,2 @@ public:
void setCustomItem( QTextCustomItem *i );
- QTextStringChar *clone() const;
struct CustomData
@@ -154,3 +150,3 @@ private:
friend class QComplexText;
- friend class QTextParag;
+ friend class QTextParagraph;
};
@@ -159,3 +155,3 @@ private:
// MOC_SKIP_BEGIN
-template class Q_EXPORT QMemArray<QTextStringChar>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QMemArray<QTextStringChar>;
// MOC_SKIP_END
@@ -180,3 +176,4 @@ public:
void insert( int index, const QString &s, QTextFormat *f );
- void insert( int index, QTextStringChar *c );
+ void insert( int index, const QChar *unicode, int len, QTextFormat *f );
+ void insert( int index, QTextStringChar *c, bool doAddRefFormat = FALSE );
void truncate( int index );
@@ -197,3 +194,3 @@ public:
void operator=( const QString &s ) { clear(); insert( 0, s, 0 ); }
- void operator+=( const QString &s );
+ void operator+=( const QString &s ) {insert( length(), s, 0 ); }
void prepend( const QString &s ) { insert( 0, s, 0 ); }
@@ -233,5 +230,5 @@ inline QChar::Direction QTextString::direction() const
// MOC_SKIP_BEGIN
-template class Q_EXPORT QValueStack<int>;
-template class Q_EXPORT QValueStack<QTextParag*>;
-template class Q_EXPORT QValueStack<bool>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QValueStack<int>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QValueStack<QTextParagraph*>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QValueStack<bool>;
// MOC_SKIP_END
@@ -242,4 +239,3 @@ class Q_EXPORT QTextCursor
public:
- QTextCursor( QTextDocument *d );
- QTextCursor();
+ QTextCursor( QTextDocument *d = 0 );
QTextCursor( const QTextCursor &c );
@@ -251,9 +247,9 @@ public:
- QTextDocument *document() const { return doc; }
- void setDocument( QTextDocument *d );
-
- QTextParag *parag() const;
+ QTextParagraph *paragraph() const;
+ void setParagraph( QTextParagraph*p ) { gotoPosition(p, 0 ); }
+ QTextDocument *document() const;
int index() const;
- void setParag( QTextParag *s, bool restore = TRUE );
+ void setIndex( int index ) { gotoPosition(paragraph(), index ); }
+ void gotoPosition( QTextParagraph* p, int index = 0);
void gotoLeft();
@@ -276,5 +272,4 @@ public:
void insert( const QString &s, bool checkNewLine, QMemArray<QTextStringChar> *formatting = 0 );
- void splitAndInsertEmptyParag( bool ind = TRUE, bool updateIds = TRUE );
+ void splitAndInsertEmptyParagraph( bool ind = TRUE, bool updateIds = TRUE );
bool remove();
- void killLine();
void indent();
@@ -284,19 +279,18 @@ public:
- void setIndex( int i, bool restore = TRUE );
-
- void checkIndex();
+ int x() const; // x in current paragraph
+ int y() const; // y in current paragraph
- int offsetX() const { return ox; }
- int offsetY() const { return oy; }
+ int globalX() const;
+ int globalY() const;
- QTextParag *topParag() const { return parags.isEmpty() ? string : parags.first(); }
- int totalOffsetX() const;
- int totalOffsetY() const;
+ QTextParagraph *topParagraph() const { return paras.isEmpty() ? para : paras.first(); }
+ int offsetX() const { return ox; } // inner document offset
+ int offsetY() const { return oy; } // inner document offset
+ int totalOffsetX() const; // total document offset
+ int totalOffsetY() const; // total document offset
- bool place( const QPoint &pos, QTextParag *s ) { return place( pos, s, FALSE ); }
- bool place( const QPoint &pos, QTextParag *s, bool link );
+ bool place( const QPoint &pos, QTextParagraph *s ) { return place( pos, s, FALSE ); }
+ bool place( const QPoint &pos, QTextParagraph *s, bool link );
void restoreState();
- int x() const;
- int y() const;
@@ -316,4 +310,3 @@ private:
- QTextParag *string;
- QTextDocument *doc;
+ QTextParagraph *para;
int idx, tmpIndex;
@@ -321,7 +314,5 @@ private:
QValueStack<int> indices;
- QValueStack<QTextParag*> parags;
+ QValueStack<QTextParagraph*> paras;
QValueStack<int> xOffsets;
QValueStack<int> yOffsets;
- QValueStack<bool> nestedStack;
- uint nested : 1;
uint valid : 1;
@@ -335,3 +326,3 @@ class Q_EXPORT QTextCommand
public:
- enum Commands { Invalid, Insert, Delete, Format, Alignment, ParagType };
+ enum Commands { Invalid, Insert, Delete, Format, Style };
@@ -353,3 +344,3 @@ protected:
// MOC_SKIP_BEGIN
-template class Q_EXPORT QPtrList<QTextCommand>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrList<QTextCommand>;
// MOC_SKIP_END
@@ -423,14 +414,14 @@ public:
- virtual bool enter( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, bool atEnd = FALSE );
- virtual bool enterAt( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, const QPoint & );
- virtual bool next( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
- virtual bool prev( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
- virtual bool down( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
- virtual bool up( QTextCursor *, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
+ virtual bool enter( QTextCursor *, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy, bool atEnd = FALSE );
+ virtual bool enterAt( QTextCursor *, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy, const QPoint & );
+ virtual bool next( QTextCursor *, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy );
+ virtual bool prev( QTextCursor *, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy );
+ virtual bool down( QTextCursor *, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy );
+ virtual bool up( QTextCursor *, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy );
- void setParagraph( QTextParag *p ) { parag = p; }
- QTextParag *paragrapth() const { return parag; }
+ void setParagraph( QTextParagraph *p ) { parag = p; }
+ QTextParagraph *paragraph() const { return parag; }
QTextDocument *parent;
- QTextParag *parag;
+ QTextParagraph *parag;
@@ -441,3 +432,3 @@ public:
// MOC_SKIP_BEGIN
-template class Q_EXPORT QMap<QString, QString>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<QString, QString>;
// MOC_SKIP_END
@@ -491,3 +482,3 @@ private:
// MOC_SKIP_BEGIN
-template class Q_EXPORT QPtrList<QTextCustomItem>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrList<QTextCustomItem>;
// MOC_SKIP_END
@@ -548,3 +539,2 @@ public:
QMimeSourceFactory &factory, QStyleSheet *sheet, const QString& doc );
- QTextTableCell( QTextTable* table, int row, int column );
virtual ~QTextTableCell();
@@ -602,4 +592,4 @@ private:
// MOC_SKIP_BEGIN
-template class Q_EXPORT QPtrList<QTextTableCell>;
-template class Q_EXPORT QMap<QTextCursor*, int>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrList<QTextTableCell>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<QTextCursor*, int>;
// MOC_SKIP_END
@@ -627,8 +617,8 @@ public:
- virtual bool enter( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, bool atEnd = FALSE );
- virtual bool enterAt( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy, const QPoint &pos );
- virtual bool next( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
- virtual bool prev( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
- virtual bool down( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
- virtual bool up( QTextCursor *c, QTextDocument *&doc, QTextParag *&parag, int &idx, int &ox, int &oy );
+ virtual bool enter( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy, bool atEnd = FALSE );
+ virtual bool enterAt( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy, const QPoint &pos );
+ virtual bool next( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy );
+ virtual bool prev( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy );
+ virtual bool down( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy );
+ virtual bool up( QTextCursor *c, QTextDocument *&doc, QTextParagraph *&parag, int &idx, int &ox, int &oy );
@@ -668,3 +658,3 @@ private:
class QTextTableCell;
-class QTextParag;
+class QTextParagraph;
@@ -678,6 +668,6 @@ struct Q_EXPORT QTextDocumentSelection
// MOC_SKIP_BEGIN
-template class Q_EXPORT QMap<int, QColor>;
-template class Q_EXPORT QMap<int, bool>;
-template class Q_EXPORT QMap<int, QTextDocumentSelection>;
-template class Q_EXPORT QPtrList<QTextDocument>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QColor>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, bool>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QTextDocumentSelection>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrList<QTextDocument>;
// MOC_SKIP_END
@@ -692,3 +682,3 @@ class Q_EXPORT QTextDocument : public QObject
friend class QTextEdit;
- friend class QTextParag;
+ friend class QTextParagraph;
@@ -706,3 +696,3 @@ public:
QTextDocument *parent() const { return par; }
- QTextParag *parentParag() const { return parParag; }
+ QTextParagraph *parentParagraph() const { return parentPar; }
@@ -724,3 +714,3 @@ public:
int minimumWidth() const;
- bool setMinimumWidth( int needed, int used = -1, QTextParag *parag = 0 );
+ bool setMinimumWidth( int needed, int used = -1, QTextParagraph *parag = 0 );
@@ -732,6 +722,6 @@ public:
- QTextParag *firstParag() const;
- QTextParag *lastParag() const;
- void setFirstParag( QTextParag *p );
- void setLastParag( QTextParag *p );
+ QTextParagraph *firstParagraph() const;
+ QTextParagraph *lastParagraph() const;
+ void setFirstParagraph( QTextParagraph *p );
+ void setLastParagraph( QTextParagraph *p );
@@ -753,4 +743,4 @@ public:
bool hasSelection( int id, bool visible = FALSE ) const;
- void setSelectionStart( int id, QTextCursor *cursor );
- bool setSelectionEnd( int id, QTextCursor *cursor );
+ void setSelectionStart( int id, const QTextCursor &cursor );
+ bool setSelectionEnd( int id, const QTextCursor &cursor );
void selectAll( int id );
@@ -762,4 +752,2 @@ public:
void setFormat( int id, QTextFormat *f, int flags );
- QTextParag *selectionStart( int id );
- QTextParag *selectionEnd( int id );
int numSelections() const { return nSelections; }
@@ -767,4 +755,3 @@ public:
- QString selectedText( int id, bool withCustom = TRUE ) const;
- void copySelectedText( int id );
+ QString selectedText( int id, bool asRichText = FALSE ) const;
void removeSelectedText( int id, QTextCursor *cursor );
@@ -772,3 +759,3 @@ public:
- QTextParag *paragAt( int i ) const;
+ QTextParagraph *paragAt( int i ) const;
@@ -781,3 +768,3 @@ public:
- bool find( const QString &expr, bool cs, bool wo, bool forward, int *parag, int *index, QTextCursor *cursor );
+ bool find( QTextCursor &cursor, const QString &expr, bool cs, bool wo, bool forward);
@@ -793,5 +780,3 @@ public:
void setStyleSheet( QStyleSheet *s );
- void updateStyles();
- void updateFontSizes( int base, bool usePixels );
- void updateFontAttributes( const QFont &f, const QFont &old );
+ void setDefaultFormat( const QFont &font, const QColor &color );
void setMimeSourceFactory( QMimeSourceFactory *f ) { if ( f ) factory_ = f; }
@@ -799,3 +784,3 @@ public:
- void setUnderlineLinks( bool b ) { underlLinks = b; }
+ void setUnderlineLinks( bool b );
bool underlineLinks() const { return underlLinks; }
@@ -807,6 +792,6 @@ public:
void draw( QPainter *p, const QRect& rect, const QColorGroup &cg, const QBrush *paper = 0 );
- void drawParag( QPainter *p, QTextParag *parag, int cx, int cy, int cw, int ch,
+ void drawParagraph( QPainter *p, QTextParagraph *parag, int cx, int cy, int cw, int ch,
QPixmap *&doubleBuffer, const QColorGroup &cg,
bool drawCursor, QTextCursor *cursor, bool resetChanged = TRUE );
- QTextParag *draw( QPainter *p, int cx, int cy, int cw, int ch, const QColorGroup &cg,
+ QTextParagraph *draw( QPainter *p, int cx, int cy, int cw, int ch, const QColorGroup &cg,
bool onlyChanged = FALSE, bool drawCursor = FALSE, QTextCursor *cursor = 0,
@@ -814,6 +799,4 @@ public:
- void setDefaultFont( const QFont &f );
-
- void registerCustomItem( QTextCustomItem *i, QTextParag *p );
- void unregisterCustomItem( QTextCustomItem *i, QTextParag *p );
+ void registerCustomItem( QTextCustomItem *i, QTextParagraph *p );
+ void unregisterCustomItem( QTextCustomItem *i, QTextParagraph *p );
@@ -833,4 +816,4 @@ public:
void setRichText( const QString &text, const QString &context );
- QString richText( QTextParag *p = 0 ) const;
- QString plainText( QTextParag *p = 0 ) const;
+ QString richText() const;
+ QString plainText() const;
@@ -852,3 +835,3 @@ public:
- virtual QTextParag *createParag( QTextDocument *d, QTextParag *pr = 0, QTextParag *nx = 0, bool updateIds = TRUE );
+ virtual QTextParagraph *createParagraph( QTextDocument *d, QTextParagraph *pr = 0, QTextParagraph *nx = 0, bool updateIds = TRUE );
void insertChild( QObject *o ) { QObject::insertChild( o ); }
@@ -859,5 +842,2 @@ public:
- void setAddMargins( bool b ) { addMargs = b; }
- int addMargins() const { return addMargs; }
-
bool hasFocusParagraph() const;
@@ -867,2 +847,5 @@ public:
+ static QString section( QString str, const QString &sep, int start, int end = 0xffffffff );
+ static bool endsWith( QString str, const QString &s);
+
signals:
@@ -877,3 +860,3 @@ private:
QTextCustomItem* parseTable( const QMap<QString, QString> &attr, const QTextFormat &fmt,
- const QChar* doc, int length, int& pos, QTextParag *curpar );
+ const QChar* doc, int length, int& pos, QTextParagraph *curpar );
bool eatSpace(const QChar* doc, int length, int& pos, bool includeNbsp = FALSE );
@@ -885,3 +868,4 @@ private:
QChar parseChar(const QChar* doc, int length, int& pos, QStyleSheetItem::WhiteSpaceMode wsm );
- void setRichTextInternal( const QString &text );
+ void setRichTextInternal( const QString &text, QTextCursor* cursor = 0 );
+ void setRichTextMarginsInternal( QPtrList< QPtrVector<QStyleSheetItem> >& styles, QTextParagraph* stylesPar );
@@ -889,3 +873,3 @@ private:
struct Q_EXPORT Focus {
- QTextParag *parag;
+ QTextParagraph *parag;
int start, len;
@@ -895,3 +879,3 @@ private:
int cx, cy, cw, vw;
- QTextParag *fParag, *lParag;
+ QTextParagraph *fParag, *lParag;
QTextPreProcessor *pProcessor;
@@ -911,3 +895,2 @@ private:
uint nextDoubleBuffered : 1;
- uint addMargs : 1;
uint oTextValid : 1;
@@ -918,5 +901,4 @@ private:
QTextDocument *par;
- QTextParag *parParag;
+ QTextParagraph *parentPar;
QTextTableCell *tc;
- QTextCursor *tmpCursor;
QBrush *backBrush;
@@ -928,3 +910,3 @@ private:
int rightmargin;
- QTextParag *minwParag, *curParag;
+ QTextParagraph *minwParag, *curParag;
QStyleSheet* sheet_;
@@ -939,3 +921,5 @@ private:
QColor linkColor;
+ double scaleFontsFactor;
+ short list_tm,list_bm, list_lm, li_tm, li_bm, par_tm, par_bm;
};
@@ -949,6 +933,4 @@ public:
QTextDeleteCommand( QTextDocument *d, int i, int idx, const QMemArray<QTextStringChar> &str,
- const QValueList< QPtrVector<QStyleSheetItem> > &os,
- const QValueList<QStyleSheetItem::ListStyle> &ols,
- const QMemArray<int> &oas );
- QTextDeleteCommand( QTextParag *p, int idx, const QMemArray<QTextStringChar> &str );
+ const QByteArray& oldStyle );
+ QTextDeleteCommand( QTextParagraph *p, int idx, const QMemArray<QTextStringChar> &str );
virtual ~QTextDeleteCommand();
@@ -961,7 +943,5 @@ protected:
int id, index;
- QTextParag *parag;
+ QTextParagraph *parag;
QMemArray<QTextStringChar> text;
- QValueList< QPtrVector<QStyleSheetItem> > oldStyles;
- QValueList<QStyleSheetItem::ListStyle> oldListStyles;
- QMemArray<int> oldAligns;
+ QByteArray styleInformation;
@@ -973,7 +953,5 @@ public:
QTextInsertCommand( QTextDocument *d, int i, int idx, const QMemArray<QTextStringChar> &str,
- const QValueList< QPtrVector<QStyleSheetItem> > &os,
- const QValueList<QStyleSheetItem::ListStyle> &ols,
- const QMemArray<int> &oas )
- : QTextDeleteCommand( d, i, idx, str, os, ols, oas ) {}
- QTextInsertCommand( QTextParag *p, int idx, const QMemArray<QTextStringChar> &str )
+ const QByteArray& oldStyleInfo )
+ : QTextDeleteCommand( d, i, idx, str, oldStyleInfo ) {}
+ QTextInsertCommand( QTextParagraph *p, int idx, const QMemArray<QTextStringChar> &str )
: QTextDeleteCommand( p, idx, str ) {}
@@ -1005,9 +983,9 @@ protected:
-class Q_EXPORT QTextAlignmentCommand : public QTextCommand
+class Q_EXPORT QTextStyleCommand : public QTextCommand
{
public:
- QTextAlignmentCommand( QTextDocument *d, int fParag, int lParag, int na, const QMemArray<int> &oa );
- virtual ~QTextAlignmentCommand() {}
+ QTextStyleCommand( QTextDocument *d, int fParag, int lParag, const QByteArray& beforeChange );
+ virtual ~QTextStyleCommand() {}
- Commands type() const { return Alignment; }
+ Commands type() const { return Style; }
QTextCursor *execute( QTextCursor *c );
@@ -1015,20 +993,4 @@ public:
-private:
- int firstParag, lastParag;
- int newAlign;
- QMemArray<int> oldAligns;
-
-};
-
-class Q_EXPORT QTextParagTypeCommand : public QTextCommand
-{
-public:
- QTextParagTypeCommand( QTextDocument *d, int fParag, int lParag, bool l,
- QStyleSheetItem::ListStyle s, const QValueList< QPtrVector<QStyleSheetItem> > &os,
- const QValueList<QStyleSheetItem::ListStyle> &ols );
- virtual ~QTextParagTypeCommand() {}
-
- Commands type() const { return ParagType; }
- QTextCursor *execute( QTextCursor *c );
- QTextCursor *unexecute( QTextCursor *c );
+ static QByteArray readStyleInformation( QTextDocument* d, int fParag, int lParag );
+ static void writeStyleInformation( QTextDocument* d, int fParag, const QByteArray& style );
@@ -1036,7 +998,4 @@ private:
int firstParag, lastParag;
- bool list;
- QStyleSheetItem::ListStyle listStyle;
- QValueList< QPtrVector<QStyleSheetItem> > oldStyles;
- QValueList<QStyleSheetItem::ListStyle> oldListStyles;
-
+ QByteArray before;
+ QByteArray after;
};
@@ -1045,3 +1004,3 @@ private:
-struct Q_EXPORT QTextParagSelection
+struct Q_EXPORT QTextParagraphSelection
{
@@ -1050,5 +1009,5 @@ struct Q_EXPORT QTextParagSelection
-struct Q_EXPORT QTextParagLineStart
+struct Q_EXPORT QTextLineStart
{
- QTextParagLineStart() : y( 0 ), baseLine( 0 ), h( 0 )
+ QTextLineStart() : y( 0 ), baseLine( 0 ), h( 0 )
#ifndef QT_NO_COMPLEXTEXT
@@ -1057,3 +1016,3 @@ struct Q_EXPORT QTextParagLineStart
{ }
- QTextParagLineStart( ushort y_, ushort bl, ushort h_ ) : y( y_ ), baseLine( bl ), h( h_ ),
+ QTextLineStart( ushort y_, ushort bl, ushort h_ ) : y( y_ ), baseLine( bl ), h( h_ ),
w( 0 )
@@ -1064,3 +1023,3 @@ struct Q_EXPORT QTextParagLineStart
#ifndef QT_NO_COMPLEXTEXT
- QTextParagLineStart( QBidiContext *c, QBidiStatus s ) : y(0), baseLine(0), h(0),
+ QTextLineStart( QBidiContext *c, QBidiStatus s ) : y(0), baseLine(0), h(0),
status( s ), bidicontext( c ) { if ( bidicontext ) bidicontext->ref(); }
@@ -1068,3 +1027,3 @@ struct Q_EXPORT QTextParagLineStart
- virtual ~QTextParagLineStart()
+ virtual ~QTextLineStart()
{
@@ -1104,4 +1063,4 @@ private:
// MOC_SKIP_BEGIN
-template class Q_EXPORT QMap<int, QTextParagSelection>;
-template class Q_EXPORT QMap<int, QTextParagLineStart*>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QTextParagraphSelection>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QTextLineStart*>;
// MOC_SKIP_END
@@ -1109,15 +1068,15 @@ template class Q_EXPORT QMap<int, QTextParagLineStart*>;
-class Q_EXPORT QTextParagData
+class Q_EXPORT QTextParagraphData
{
public:
- QTextParagData() {}
- virtual ~QTextParagData();
- virtual void join( QTextParagData * );
+ QTextParagraphData() {}
+ virtual ~QTextParagraphData();
+ virtual void join( QTextParagraphData * );
};
-class Q_EXPORT QTextParagPseudoDocument
+class Q_EXPORT QTextParagraphPseudoDocument
{
public:
- QTextParagPseudoDocument();
- ~QTextParagPseudoDocument();
+ QTextParagraphPseudoDocument();
+ ~QTextParagraphPseudoDocument();
QRect docRect;
@@ -1130,3 +1089,3 @@ public:
//nase
-class Q_EXPORT QTextParag
+class Q_EXPORT QTextParagraph
{
@@ -1136,4 +1095,4 @@ class Q_EXPORT QTextParag
public:
- QTextParag( QTextDocument *d, QTextParag *pr = 0, QTextParag *nx = 0, bool updateIds = TRUE );
- virtual ~QTextParag();
+ QTextParagraph( QTextDocument *d, QTextParagraph *pr = 0, QTextParagraph *nx = 0, bool updateIds = TRUE );
+ virtual ~QTextParagraph();
@@ -1144,17 +1103,17 @@ public:
- void setListStyle( QStyleSheetItem::ListStyle ls );
- QStyleSheetItem::ListStyle listStyle() const;
+ void setListStyle( QStyleSheetItem::ListStyle ls ) { lstyle = ls; changed = TRUE; }
+ QStyleSheetItem::ListStyle listStyle() const { return lstyle; }
+ void setListItem( bool li ) { litem = li; changed = TRUE; }
+ bool isListItem() const { return litem; }
void setListValue( int v ) { list_val = v; }
- int listValue() const { return list_val; }
+ int listValue() const { return list_val > 0 ? list_val : -1; }
- void setList( bool b, int listStyle );
- void incDepth();
- void decDepth();
- int listDepth() const;
+ void setListDepth( int depth );
+ int listDepth() const { return ldepth; }
- void setFormat( QTextFormat *fm );
- QTextFormat *paragFormat() const;
+// void setFormat( QTextFormat *fm );
+// QTextFormat *paragFormat() const;
QTextDocument *document() const;
- QTextParagPseudoDocument *pseudoDocument() const;
+ QTextParagraphPseudoDocument *pseudoDocument() const;
@@ -1166,8 +1125,9 @@ public:
- QTextParag *prev() const;
- QTextParag *next() const;
- void setPrev( QTextParag *s );
- void setNext( QTextParag *s );
+ QTextParagraph *prev() const;
+ QTextParagraph *next() const;
+ void setPrev( QTextParagraph *s );
+ void setNext( QTextParagraph *s );
void insert( int index, const QString &s );
+ void insert( int index, const QChar *unicode, int len );
void append( const QString &s, bool reallyAtEnd = FALSE );
@@ -1175,3 +1135,3 @@ public:
void remove( int index, int len );
- void join( QTextParag *s );
+ void join( QTextParagraph *s );
@@ -1214,6 +1174,6 @@ public:
- void setExtraData( QTextParagData *data );
- QTextParagData *extraData() const;
+ void setExtraData( QTextParagraphData *data );
+ QTextParagraphData *extraData() const;
- QMap<int, QTextParagLineStart*> &lineStartList();
+ QMap<int, QTextLineStart*> &lineStartList();
@@ -1227,6 +1187,2 @@ public:
- void setStyleSheetItems( const QPtrVector<QStyleSheetItem> &vec );
- QPtrVector<QStyleSheetItem> styleSheetItems() const;
- QStyleSheetItem *style() const;
-
virtual int topMargin() const;
@@ -1238,3 +1194,2 @@ public:
- int numberOfSubParagraph() const;
void registerFloatingItem( QTextCustomItem *i );
@@ -1272,3 +1227,3 @@ public:
QTextCommandHistory *commands() const;
- virtual void copyParagData( QTextParag *parag );
+ virtual void copyParagData( QTextParagraph *parag );
@@ -1281,4 +1236,2 @@ public:
- bool isLineBreak() const { return isBr; }
-
void setMovedDown( bool b ) { movedDown = b; }
@@ -1289,18 +1242,22 @@ public:
+ void readStyleInformation( QDataStream& stream );
+ void writeStyleInformation( QDataStream& stream ) const;
+
protected:
virtual void drawLabel( QPainter* p, int x, int y, int w, int h, int base, const QColorGroup& cg );
- virtual void drawParagString( QPainter &painter, const QString &str, int start, int len, int startX,
- int lastY, int baseLine, int bw, int h, bool drawSelections,
- QTextStringChar *formatChar, int i, const QMemArray<int> &selectionStarts,
- const QMemArray<int> &selectionEnds, const QColorGroup &cg, bool rightToLeft );
+ virtual void drawString( QPainter &painter, const QString &str, int start, int len, int xstart,
+ int y, int baseLine, int w, int h, int selection,
+ QTextStringChar *formatChar, const QColorGroup& cg,
+ bool rightToLeft );
private:
- QMap<int, QTextParagSelection> &selections() const;
- QPtrVector<QStyleSheetItem> &styleSheetItemsVec() const;
+ QMap<int, QTextParagraphSelection> &selections() const;
QPtrList<QTextCustomItem> &floatingItems() const;
+ QBrush backgroundBrush( const QColorGroup&cg ) { if ( bgcol ) return *bgcol; return cg.brush( QColorGroup::Base ); }
+ void invalidateStyleCache();
- QMap<int, QTextParagLineStart*> lineStarts;
+ QMap<int, QTextLineStart*> lineStarts;
int invalid;
QRect r;
- QTextParag *p, *n;
+ QTextParagraph *p, *n;
void *docOrPseudo;
@@ -1311,3 +1268,2 @@ private:
uint fullWidth : 1;
- uint newLinesAllowed : 1;
uint lastInFrame : 1;
@@ -1315,3 +1271,2 @@ private:
uint breakable : 1;
- uint isBr : 1;
uint movedDown : 1;
@@ -1319,2 +1274,4 @@ private:
uint hasdoc : 1;
+ uint litem : 1; // whether the paragraph is a list item
+ uint rtext : 1; // whether the paragraph needs rich text margin
int align : 4;
@@ -1322,14 +1279,12 @@ private:
QTextString *str;
- QMap<int, QTextParagSelection> *mSelections;
- QPtrVector<QStyleSheetItem> *mStyleSheetItemsVec;
+ QMap<int, QTextParagraphSelection> *mSelections;
QPtrList<QTextCustomItem> *mFloatingItems;
- QStyleSheetItem::ListStyle listS;
- int numSubParag;
- int tm, bm, lm, rm, flm;
- QTextFormat *defFormat;
+ QStyleSheetItem::ListStyle lstyle;
+ short utm, ubm, ulm, urm, uflm, ulinespacing;
int *tArray;
- int tabStopWidth;
- QTextParagData *eData;
- int list_val;
+ short tabStopWidth;
+ QTextParagraphData *eData;
+ short list_val;
QColor *bgcol;
+ ushort ldepth;
@@ -1345,6 +1300,6 @@ public:
- virtual int format( QTextDocument *doc, QTextParag *parag, int start, const QMap<int, QTextParagLineStart*> &oldLineStarts ) = 0;
- virtual int formatVertically( QTextDocument* doc, QTextParag* parag );
+ virtual int format( QTextDocument *doc, QTextParagraph *parag, int start, const QMap<int, QTextLineStart*> &oldLineStarts ) = 0;
+ virtual int formatVertically( QTextDocument* doc, QTextParagraph* parag );
- bool isWrapEnabled( QTextParag *p ) const { if ( !wrapEnabled ) return FALSE; if ( p && !p->isBreakable() ) return FALSE; return TRUE;}
+ bool isWrapEnabled( QTextParagraph *p ) const { if ( !wrapEnabled ) return FALSE; if ( p && !p->isBreakable() ) return FALSE; return TRUE;}
int wrapAtColumn() const { return wrapColumn;}
@@ -1358,11 +1313,12 @@ public:
+ static bool isBreakable( QTextString *string, int pos );
+
protected:
- virtual QTextParagLineStart *formatLine( QTextParag *parag, QTextString *string, QTextParagLineStart *line, QTextStringChar *start,
+ virtual QTextLineStart *formatLine( QTextParagraph *parag, QTextString *string, QTextLineStart *line, QTextStringChar *start,
QTextStringChar *last, int align = Qt3::AlignAuto, int space = 0 );
#ifndef QT_NO_COMPLEXTEXT
- virtual QTextParagLineStart *bidiReorderLine( QTextParag *parag, QTextString *string, QTextParagLineStart *line, QTextStringChar *start,
+ virtual QTextLineStart *bidiReorderLine( QTextParagraph *parag, QTextString *string, QTextLineStart *line, QTextStringChar *start,
QTextStringChar *last, int align, int space );
#endif
- virtual bool isBreakable( QTextString *string, int pos ) const;
- void insertLineStart( QTextParag *parag, int index, QTextParagLineStart *ls );
+ void insertLineStart( QTextParagraph *parag, int index, QTextLineStart *ls );
@@ -1391,3 +1347,3 @@ public:
- int format( QTextDocument *doc, QTextParag *parag, int start, const QMap<int, QTextParagLineStart*> &oldLineStarts );
+ int format( QTextDocument *doc, QTextParagraph *parag, int start, const QMap<int, QTextLineStart*> &oldLineStarts );
@@ -1403,3 +1359,3 @@ public:
- int format( QTextDocument *doc, QTextParag *parag, int start, const QMap<int, QTextParagLineStart*> &oldLineStarts );
+ int format( QTextDocument *doc, QTextParagraph *parag, int start, const QMap<int, QTextLineStart*> &oldLineStarts );
@@ -1415,3 +1371,3 @@ public:
- virtual void indent( QTextDocument *doc, QTextParag *parag, int *oldIndent = 0, int *newIndent = 0 ) = 0;
+ virtual void indent( QTextDocument *doc, QTextParagraph *parag, int *oldIndent = 0, int *newIndent = 0 ) = 0;
@@ -1431,3 +1387,3 @@ public:
- virtual void process( QTextDocument *doc, QTextParag *, int, bool = TRUE ) = 0;
+ virtual void process( QTextDocument *doc, QTextParagraph *, int, bool = TRUE ) = 0;
virtual QTextFormat *format( int id ) = 0;
@@ -1454,3 +1410,4 @@ public:
VAlign = 128,
- Font = Bold | Italic | Underline | Family | Size,
+ StrikeOut= 256,
+ Font = Bold | Italic | Underline | Family | Size | StrikeOut,
Format = Font | Color | Misspelled | VAlign
@@ -1466,3 +1423,3 @@ public:
QTextFormat( const QTextFormat &fm );
- QTextFormat makeTextFormat( const QStyleSheetItem *style, const QMap<QString,QString>& attr ) const;
+ QTextFormat makeTextFormat( const QStyleSheetItem *style, const QMap<QString,QString>& attr, double scaleFontsFactor ) const;
QTextFormat& operator=( const QTextFormat &fm );
@@ -1485,2 +1442,3 @@ public:
void setUnderline( bool b );
+ void setStrikeOut( bool b );
void setFamily( const QString &f );
@@ -1501,4 +1459,4 @@ public:
- QString makeFormatChangeTags( QTextFormat *f, const QString& oldAnchorHref, const QString& anchorHref ) const;
- QString makeFormatEndTags( const QString& anchorHref ) const;
+ QString makeFormatChangeTags( QTextFormat* defaultFormat, QTextFormat *f, const QString& oldAnchorHref, const QString& anchorHref ) const;
+ QString makeFormatEndTags( QTextFormat* defaultFormat, const QString& anchorHref ) const;
@@ -1506,8 +1464,3 @@ public:
static QPainter* painter();
- void updateStyle();
- void updateStyleFlags();
- void setStyle( const QString &s );
- QString styleName() const { return style; }
- int changed() const { return different; }
bool fontSizesInPixels() { return usePixelSizes; }
@@ -1537,4 +1490,2 @@ private:
static QPainter *pntr;
- QString style;
- int different;
@@ -1546,3 +1497,3 @@ private:
// MOC_SKIP_BEGIN
-template class Q_EXPORT QDict<QTextFormat>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QDict<QTextFormat>;
// MOC_SKIP_END
@@ -1567,9 +1518,4 @@ public:
virtual QTextFormat *createFormat( const QFont &f, const QColor &c ) { return new QTextFormat( f, c, this ); }
- void debug();
- QStyleSheet *styleSheet() const { return sheet; }
- void setStyleSheet( QStyleSheet *s ) { sheet = s; }
- void updateStyles();
- void updateFontSizes( int base, bool usePixels );
- void updateFontAttributes( const QFont &f, const QFont &old );
+ void updateDefaultFormat( const QFont &font, const QColor &c, QStyleSheet *sheet );
QDict<QTextFormat> dict() const { return cKey; }
@@ -1587,4 +1533,2 @@ private:
int cflags;
- QStyleSheet *sheet;
-
};
@@ -1598,8 +1542,3 @@ inline int QTextString::length() const
-inline void QTextString::operator+=( const QString &s )
-{
- insert( length(), s, 0 );
-}
-
-inline int QTextParag::length() const
+inline int QTextParagraph::length() const
{
@@ -1608,3 +1547,3 @@ inline int QTextParag::length() const
-inline QRect QTextParag::rect() const
+inline QRect QTextParagraph::rect() const
{
@@ -1613,5 +1552,5 @@ inline QRect QTextParag::rect() const
-inline QTextParag *QTextCursor::parag() const
+inline QTextParagraph *QTextCursor::paragraph() const
{
- return string;
+ return para;
}
@@ -1623,31 +1562,2 @@ inline int QTextCursor::index() const
-inline void QTextCursor::setIndex( int i, bool restore )
-{
- if ( restore )
- restoreState();
- if ( i < 0 || i >= string->length() ) {
-#if defined(QT_CHECK_RANGE)
- qWarning( "QTextCursor::setIndex: %d out of range", i );
-#endif
- i = i < 0 ? 0 : string->length() - 1;
- }
-
- tmpIndex = -1;
- idx = i;
-}
-
-inline void QTextCursor::setParag( QTextParag *s, bool restore )
-{
- if ( restore )
- restoreState();
- idx = 0;
- string = s;
- tmpIndex = -1;
-}
-
-inline void QTextCursor::checkIndex()
-{
- if ( idx >= string->length() )
- idx = string->length() - 1;
-}
@@ -1675,3 +1585,3 @@ inline int QTextDocument::visibleWidth() const
-inline QTextParag *QTextDocument::firstParag() const
+inline QTextParagraph *QTextDocument::firstParagraph() const
{
@@ -1680,3 +1590,3 @@ inline QTextParag *QTextDocument::firstParag() const
-inline QTextParag *QTextDocument::lastParag() const
+inline QTextParagraph *QTextDocument::lastParagraph() const
{
@@ -1685,3 +1595,3 @@ inline QTextParag *QTextDocument::lastParag() const
-inline void QTextDocument::setFirstParag( QTextParag *p )
+inline void QTextDocument::setFirstParagraph( QTextParagraph *p )
{
@@ -1690,3 +1600,3 @@ inline void QTextDocument::setFirstParag( QTextParag *p )
-inline void QTextDocument::setLastParag( QTextParag *p )
+inline void QTextDocument::setLastParagraph( QTextParagraph *p )
{
@@ -1872,5 +1782,2 @@ inline void QTextFormat::addRef()
ref++;
-#ifdef DEBUG_COLLECTION
- qDebug( "add ref of '%s' to %d (%p)", k.latin1(), ref, this );
-#endif
}
@@ -1884,5 +1791,2 @@ inline void QTextFormat::removeRef()
return;
-#ifdef DEBUG_COLLECTION
- qDebug( "remove ref of '%s' to %d (%p)", k.latin1(), ref, this );
-#endif
if ( ref == 0 )
@@ -1901,7 +1805,2 @@ inline bool QTextFormat::useLinkColor() const
-inline void QTextFormat::setStyle( const QString &s )
-{
- style = s;
- updateStyleFlags();
-}
@@ -1916,3 +1815,3 @@ inline QTextStringChar &QTextString::at( int i ) const
-inline QTextStringChar *QTextParag::at( int i ) const
+inline QTextStringChar *QTextParagraph::at( int i ) const
{
@@ -1921,3 +1820,3 @@ inline QTextStringChar *QTextParag::at( int i ) const
-inline bool QTextParag::isValid() const
+inline bool QTextParagraph::isValid() const
{
@@ -1926,3 +1825,3 @@ inline bool QTextParag::isValid() const
-inline bool QTextParag::hasChanged() const
+inline bool QTextParagraph::hasChanged() const
{
@@ -1931,3 +1830,3 @@ inline bool QTextParag::hasChanged() const
-inline void QTextParag::setBackgroundColor( const QColor & c )
+inline void QTextParagraph::setBackgroundColor( const QColor & c )
{
@@ -1938,3 +1837,3 @@ inline void QTextParag::setBackgroundColor( const QColor & c )
-inline void QTextParag::clearBackgroundColor()
+inline void QTextParagraph::clearBackgroundColor()
{
@@ -1943,3 +1842,3 @@ inline void QTextParag::clearBackgroundColor()
-inline void QTextParag::append( const QString &s, bool reallyAtEnd )
+inline void QTextParagraph::append( const QString &s, bool reallyAtEnd )
{
@@ -1951,3 +1850,3 @@ inline void QTextParag::append( const QString &s, bool reallyAtEnd )
-inline QTextParag *QTextParag::prev() const
+inline QTextParagraph *QTextParagraph::prev() const
{
@@ -1956,3 +1855,3 @@ inline QTextParag *QTextParag::prev() const
-inline QTextParag *QTextParag::next() const
+inline QTextParagraph *QTextParagraph::next() const
{
@@ -1961,3 +1860,3 @@ inline QTextParag *QTextParag::next() const
-inline bool QTextParag::hasAnySelection() const
+inline bool QTextParagraph::hasAnySelection() const
{
@@ -1966,3 +1865,3 @@ inline bool QTextParag::hasAnySelection() const
-inline void QTextParag::setEndState( int s )
+inline void QTextParagraph::setEndState( int s )
{
@@ -1973,3 +1872,3 @@ inline void QTextParag::setEndState( int s )
-inline int QTextParag::endState() const
+inline int QTextParagraph::endState() const
{
@@ -1978,3 +1877,3 @@ inline int QTextParag::endState() const
-inline void QTextParag::setParagId( int i )
+inline void QTextParagraph::setParagId( int i )
{
@@ -1983,3 +1882,3 @@ inline void QTextParag::setParagId( int i )
-inline int QTextParag::paragId() const
+inline int QTextParagraph::paragId() const
{
@@ -1990,3 +1889,3 @@ inline int QTextParag::paragId() const
-inline bool QTextParag::firstPreProcess() const
+inline bool QTextParagraph::firstPreProcess() const
{
@@ -1995,3 +1894,3 @@ inline bool QTextParag::firstPreProcess() const
-inline void QTextParag::setFirstPreProcess( bool b )
+inline void QTextParagraph::setFirstPreProcess( bool b )
{
@@ -2000,3 +1899,3 @@ inline void QTextParag::setFirstPreProcess( bool b )
-inline QMap<int, QTextParagLineStart*> &QTextParag::lineStartList()
+inline QMap<int, QTextLineStart*> &QTextParagraph::lineStartList()
{
@@ -2005,3 +1904,3 @@ inline QMap<int, QTextParagLineStart*> &QTextParag::lineStartList()
-inline QTextString *QTextParag::string() const
+inline QTextString *QTextParagraph::string() const
{
@@ -2010,3 +1909,3 @@ inline QTextString *QTextParag::string() const
-inline QTextDocument *QTextParag::document() const
+inline QTextDocument *QTextParagraph::document() const
{
@@ -2017,3 +1916,3 @@ inline QTextDocument *QTextParag::document() const
-inline QTextParagPseudoDocument *QTextParag::pseudoDocument() const
+inline QTextParagraphPseudoDocument *QTextParagraph::pseudoDocument() const
{
@@ -2021,3 +1920,3 @@ inline QTextParagPseudoDocument *QTextParag::pseudoDocument() const
return 0;
- return (QTextParagPseudoDocument*) docOrPseudo;
+ return (QTextParagraphPseudoDocument*) docOrPseudo;
}
@@ -2025,3 +1924,3 @@ inline QTextParagPseudoDocument *QTextParag::pseudoDocument() const
-inline QTextTableCell *QTextParag::tableCell() const
+inline QTextTableCell *QTextParagraph::tableCell() const
{
@@ -2030,3 +1929,3 @@ inline QTextTableCell *QTextParag::tableCell() const
-inline QTextCommandHistory *QTextParag::commands() const
+inline QTextCommandHistory *QTextParagraph::commands() const
{
@@ -2036,27 +1935,8 @@ inline QTextCommandHistory *QTextParag::commands() const
-inline void QTextParag::setAlignment( int a )
-{
- if ( a == (int)align )
- return;
- align = a;
- invalidate( 0 );
-}
-
-inline void QTextParag::setListStyle( QStyleSheetItem::ListStyle ls )
-{
- listS = ls;
- invalidate( 0 );
-}
-
-inline QStyleSheetItem::ListStyle QTextParag::listStyle() const
-{
- return listS;
-}
-
-inline QTextFormat *QTextParag::paragFormat() const
+inline int QTextParagraph::alignment() const
{
- return defFormat;
+ return align;
}
-inline void QTextParag::registerFloatingItem( QTextCustomItem *i )
+inline void QTextParagraph::registerFloatingItem( QTextCustomItem *i )
{
@@ -2065,3 +1945,3 @@ inline void QTextParag::registerFloatingItem( QTextCustomItem *i )
-inline void QTextParag::unregisterFloatingItem( QTextCustomItem *i )
+inline void QTextParagraph::unregisterFloatingItem( QTextCustomItem *i )
{
@@ -2070,3 +1950,3 @@ inline void QTextParag::unregisterFloatingItem( QTextCustomItem *i )
-inline QBrush *QTextParag::background() const
+inline QBrush *QTextParagraph::background() const
{
@@ -2075,3 +1955,3 @@ inline QBrush *QTextParag::background() const
-inline int QTextParag::documentWidth() const
+inline int QTextParagraph::documentWidth() const
{
@@ -2080,3 +1960,3 @@ inline int QTextParag::documentWidth() const
-inline int QTextParag::documentVisibleWidth() const
+inline int QTextParagraph::documentVisibleWidth() const
{
@@ -2085,3 +1965,3 @@ inline int QTextParag::documentVisibleWidth() const
-inline int QTextParag::documentX() const
+inline int QTextParagraph::documentX() const
{
@@ -2090,3 +1970,3 @@ inline int QTextParag::documentX() const
-inline int QTextParag::documentY() const
+inline int QTextParagraph::documentY() const
{
@@ -2095,3 +1975,3 @@ inline int QTextParag::documentY() const
-inline void QTextParag::setExtraData( QTextParagData *data )
+inline void QTextParagraph::setExtraData( QTextParagraphData *data )
{
@@ -2100,3 +1980,3 @@ inline void QTextParag::setExtraData( QTextParagData *data )
-inline QTextParagData *QTextParag::extraData() const
+inline QTextParagraphData *QTextParagraph::extraData() const
{
@@ -2105,12 +1985,2 @@ inline QTextParagData *QTextParag::extraData() const
-inline void QTextParag::setNewLinesAllowed( bool b )
-{
- newLinesAllowed = b;
-}
-
-inline bool QTextParag::isNewLinesAllowed() const
-{
- return newLinesAllowed;
-}
-
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/noncore/apps/opie-write/qstylesheet.cpp b/noncore/apps/opie-write/qstylesheet.cpp
index 7ab9ec6..67cd828 100644
--- a/noncore/apps/opie-write/qstylesheet.cpp
+++ b/noncore/apps/opie-write/qstylesheet.cpp
@@ -56,2 +56,3 @@ public:
int fontunderline;
+ int fontstrikeout;
int fontweight;
@@ -80,22 +81,25 @@ public:
/*!
- \class QStyleSheetItem qstylesheet.h
- \ingroup text
- \brief The QStyleSheetItem class provides an encapsulation of a set of text styles.
-
- A style sheet item consists of a name and a set of attributes that
- specifiy its font, color, etc. When used in a \link QStyleSheet
- style sheet\endlink (see styleSheet()), items define the name() of a
- rich text tag and the display property changes associated with it.
-
- The \link QStyleSheetItem::DisplayMode display mode\endlink
- attribute indicates whether the item is a block, an inline element
- or a list element; see setDisplayMode(). The treatment of whitespace
- is controlled by the \link QStyleSheetItem::WhiteSpaceMode white
- space mode\endlink; see setWhiteSpaceMode(). An item's margins are
- set with setMargin(), and line spacing is set with setLineSpacing().
- In the case of list items, the list style is set with
- setListStyle(). An item may be a hypertext link anchor; see
- setAnchor(). Other attributes are set with setAlignment(),
- setVerticalAlignment(), setFontFamily(), setFontSize(),
- setFontWeight(), setFontItalic(), setFontUnderline() and setColor().
+ \class QStyleSheetItem qstylesheet.h
+ \brief The QStyleSheetItem class provides an encapsulation of a set of text styles.
+
+ \ingroup text
+
+ A style sheet item consists of a name and a set of attributes that
+ specifiy its font, color, etc. When used in a \link QStyleSheet
+ style sheet\endlink (see styleSheet()), items define the name() of
+ a rich text tag and the display property changes associated with
+ it.
+
+ The \link QStyleSheetItem::DisplayMode display mode\endlink
+ attribute indicates whether the item is a block, an inline element
+ or a list element; see setDisplayMode(). The treatment of
+ whitespace is controlled by the \link
+ QStyleSheetItem::WhiteSpaceMode white space mode\endlink; see
+ setWhiteSpaceMode(). An item's margins are set with setMargin(),
+ In the case of list items, the list style is set with
+ setListStyle(). An item may be a hypertext link anchor; see
+ setAnchor(). Other attributes are set with setAlignment(),
+ setVerticalAlignment(), setFontFamily(), setFontSize(),
+ setFontWeight(), setFontItalic(), setFontUnderline(),
+ setFontStrikeOut and setColor().
*/
@@ -106,15 +110,17 @@ public:
-/*! \enum QStyleSheetItem::WhiteSpaceMode
+/*!
+ \enum QStyleSheetItem::WhiteSpaceMode
- This enum defines the ways in which QStyleSheet can treat whitespace. There are three values at present:
+ This enum defines the ways in which QStyleSheet can treat
+ whitespace.
- \value WhiteSpaceNormal any sequence of whitespace (including
- line-breaks) is equivalent to a single space.
+ \value WhiteSpaceNormal any sequence of whitespace (including
+ line-breaks) is equivalent to a single space.
- \value WhiteSpacePre whitespace must be output exactly as given
- in the input.
+ \value WhiteSpacePre whitespace must be output exactly as given
+ in the input.
- \value WhiteSpaceNoWrap multiple spaces are collapsed as with
- WhiteSpaceNormal, but no automatic line-breaks occur. To break lines manually,
- use the \c{<br>} tag.
+ \value WhiteSpaceNoWrap multiple spaces are collapsed as with
+ WhiteSpaceNormal, but no automatic line-breaks occur. To break
+ lines manually, use the \c{<br>} tag.
@@ -122,12 +128,14 @@ public:
-/*! \enum QStyleSheetItem::Margin
-
- \value MarginLeft left margin
- \value MarginRight right margin
- \value MarginTop top margin
- \value MarginBottom bottom margin
- \value MarginAll all margins (left, right, top and bottom)
- \value MarginVertical top and bottom margins
- \value MarginHorizontal left and right margins
- \value MarginFirstLine margin (indentation) of the first line of a paragarph (in addition to the MarginLeft of the paragraph)
+/*!
+ \enum QStyleSheetItem::Margin
+
+ \value MarginLeft left margin
+ \value MarginRight right margin
+ \value MarginTop top margin
+ \value MarginBottom bottom margin
+ \value MarginAll all margins (left, right, top and bottom)
+ \value MarginVertical top and bottom margins
+ \value MarginHorizontal left and right margins
+ \value MarginFirstLine margin (indentation) of the first line of
+ a paragarph (in addition to the MarginLeft of the paragraph)
*/
@@ -135,7 +143,8 @@ public:
/*!
- Constructs a new style named \a name for the stylesheet \a parent.
+ Constructs a new style called \a name for the stylesheet \a
+ parent.
- All properties in QStyleSheetItem are initially in the "do not change" state,
- except \link QStyleSheetItem::DisplayMode display mode\endlink, which defaults
- to \c DisplayInline.
+ All properties in QStyleSheetItem are initially in the "do not
+ change" state, except \link QStyleSheetItem::DisplayMode display
+ mode\endlink, which defaults to \c DisplayInline.
*/
@@ -152,5 +161,5 @@ QStyleSheetItem::QStyleSheetItem( QStyleSheet* parent, const QString& name )
/*!
- Copy constructor. Constructs a copy of \a other that is
- not bound to any style sheet.
- */
+ Copy constructor. Constructs a copy of \a other that is not bound
+ to any style sheet.
+*/
QStyleSheetItem::QStyleSheetItem( const QStyleSheetItem & other )
@@ -163,5 +172,5 @@ QStyleSheetItem::QStyleSheetItem( const QStyleSheetItem & other )
/*!
- Destroys the style. Note that QStyleSheetItem objects become owned
- by QStyleSheet when they are created.
- */
+ Destroys the style. Note that QStyleSheetItem objects become
+ owned by QStyleSheet when they are created.
+*/
QStyleSheetItem::~QStyleSheetItem()
@@ -174,4 +183,4 @@ QStyleSheetItem::~QStyleSheetItem()
/*!
- Returns the style sheet this item is in.
- */
+ Returns the style sheet this item is in.
+*/
QStyleSheet* QStyleSheetItem::styleSheet()
@@ -183,4 +192,5 @@ QStyleSheet* QStyleSheetItem::styleSheet()
\overload
- Returns the style sheet this item is in.
- */
+
+ Returns the style sheet this item is in.
+*/
const QStyleSheet* QStyleSheetItem::styleSheet() const
@@ -200,2 +210,3 @@ void QStyleSheetItem::init()
d->fontunderline = Undefined;
+ d->fontstrikeout = Undefined;
d->fontweight = Undefined;
@@ -214,4 +225,4 @@ void QStyleSheetItem::init()
d->margin[4] = Undefined;
- d->list = QStyleSheetItem::ListDisc;
- d->whitespacemode = QStyleSheetItem::WhiteSpaceNormal;
+ d->list = (ListStyle) Undefined;
+ d->whitespacemode = (WhiteSpaceMode) Undefined;
d->selfnest = TRUE;
@@ -221,3 +232,3 @@ void QStyleSheetItem::init()
/*!
- Returns the name of the style item.
+ Returns the name of the style item.
*/
@@ -229,7 +240,7 @@ QString QStyleSheetItem::name() const
/*!
- Returns the \link QStyleSheetItem::DisplayMode display mode\endlink
- of the style.
+ Returns the \link QStyleSheetItem::DisplayMode display
+ mode\endlink of the style.
- \sa setDisplayMode()
- */
+ \sa setDisplayMode()
+*/
QStyleSheetItem::DisplayMode QStyleSheetItem::displayMode() const
@@ -239,16 +250,17 @@ QStyleSheetItem::DisplayMode QStyleSheetItem::displayMode() const
-/*! \enum QStyleSheetItem::DisplayMode
+/*!
+ \enum QStyleSheetItem::DisplayMode
- This enum type defines the way adjacent elements are displayed. The possible values are:
+ This enum type defines the way adjacent elements are displayed.
- \value DisplayBlock elements are displayed as a rectangular block
- (e.g. \c{<p>...</p>}).
+ \value DisplayBlock elements are displayed as a rectangular block
+ (e.g. \c{<p>...</p>}).
- \value DisplayInline elements are displayed in a horizontally flowing
- sequence (e.g. \c{<em>...</em>}).
+ \value DisplayInline elements are displayed in a horizontally
+ flowing sequence (e.g. \c{<em>...</em>}).
- \value DisplayListItem elements are displayed in a vertical sequence
- (e.g. \c{<li>...</li>}).
+ \value DisplayListItem elements are displayed in a vertical
+ sequence (e.g. \c{<li>...</li>}).
- \value DisplayNone elements are not displayed at all.
+ \value DisplayNone elements are not displayed at all.
*/
@@ -256,5 +268,5 @@ QStyleSheetItem::DisplayMode QStyleSheetItem::displayMode() const
/*!
- Sets the display mode of the style to \a m.
+ Sets the display mode of the style to \a m.
- \sa displayMode()
+ \sa displayMode()
*/
@@ -267,7 +279,8 @@ void QStyleSheetItem::setDisplayMode(DisplayMode m)
/*!
- Returns the alignment of this style. Possible values are AlignAuto, AlignLeft,
- AlignRight, AlignCenter and AlignJustify.
+ Returns the alignment of this style. Possible values are \c
+ AlignAuto, \c AlignLeft, \c AlignRight, \c AlignCenter or \c
+ AlignJustify.
- \sa setAlignment(), Qt::AlignmentFlags
- */
+ \sa setAlignment(), Qt::AlignmentFlags
+*/
int QStyleSheetItem::alignment() const
@@ -278,9 +291,9 @@ int QStyleSheetItem::alignment() const
/*!
- Sets the alignment to \a f. This only makes sense for styles with a
- \link QStyleSheetItem::DisplayMode display mode\endlink of
- DisplayBlock. Possible values are AlignAuto, AlignLeft, AlignRight,
- AlignCenter and AlignJustify.
+ Sets the alignment to \a f. This only makes sense for styles with
+ a \link QStyleSheetItem::DisplayMode display mode\endlink of
+ DisplayBlock. Possible values are \c AlignAuto, \c AlignLeft,
+ \c AlignRight, \c AlignCenter or \c AlignJustify.
- \sa alignment(), displayMode(), Qt::AlignmentFlags
- */
+ \sa alignment(), displayMode(), Qt::AlignmentFlags
+*/
void QStyleSheetItem::setAlignment( int f )
@@ -292,7 +305,7 @@ void QStyleSheetItem::setAlignment( int f )
/*!
- Returns the vertical alignment of the style. Possible values are
- VAlignBaseline, VAlignSub and VAlignSuper.
+ Returns the vertical alignment of the style. Possible values are
+ \c VAlignBaseline, \c VAlignSub or \c VAlignSuper.
- psa setVerticalAlignment()
- */
+ \sa setVerticalAlignment()
+*/
QStyleSheetItem::VerticalAlignment QStyleSheetItem::verticalAlignment() const
@@ -302,14 +315,15 @@ QStyleSheetItem::VerticalAlignment QStyleSheetItem::verticalAlignment() const
-/*! \enum QStyleSheetItem::VerticalAlignment
+/*!
+ \enum QStyleSheetItem::VerticalAlignment
- This enum type defines the way elements are aligned vertically. This
- is supported for text elements only. The possible values are:
+ This enum type defines the way elements are aligned vertically.
+ This is only supported for text elements.
- \value VAlignBaseline align the baseline of the element (or the
- bottom, if the element doesn't have a baseline) with the baseline of
- the parent
+ \value VAlignBaseline align the baseline of the element (or the
+ bottom, if the element doesn't have a baseline) with the
+ baseline of the parent
- \value VAlignSub subscript the element
+ \value VAlignSub subscript the element
- \value VAlignSuper superscript the element
+ \value VAlignSuper superscript the element
@@ -319,9 +333,9 @@ QStyleSheetItem::VerticalAlignment QStyleSheetItem::verticalAlignment() const
/*!
- Sets the vertical alignment to \a valign. Possible values are
- VAlignBaseline, VAlignSub and VAlignSuper.
+ Sets the vertical alignment to \a valign. Possible values are
+ \c VAlignBaseline, \c VAlignSub or \c VAlignSuper.
- The vertical alignment property is not inherited.
+ The vertical alignment property is not inherited.
- \sa verticalAlignment()
- */
+ \sa verticalAlignment()
+*/
void QStyleSheetItem::setVerticalAlignment( VerticalAlignment valign )
@@ -333,6 +347,7 @@ void QStyleSheetItem::setVerticalAlignment( VerticalAlignment valign )
/*!
- Returns TRUE if the style sets an italic font; otherwise returns FALSE.
+ Returns TRUE if the style sets an italic font; otherwise returns
+ FALSE.
- \sa setFontItalic(), definesFontItalic()
- */
+ \sa setFontItalic(), definesFontItalic()
+*/
bool QStyleSheetItem::fontItalic() const
@@ -346,4 +361,4 @@ bool QStyleSheetItem::fontItalic() const
- \sa fontItalic(), definesFontItalic()
- */
+ \sa fontItalic(), definesFontItalic()
+*/
void QStyleSheetItem::setFontItalic(bool italic)
@@ -354,7 +369,8 @@ void QStyleSheetItem::setFontItalic(bool italic)
/*!
- Returns whether the style defines a font shape. A style
- does not define any shape until setFontItalic() is called.
+ Returns TRUE if the style defines a font shape; otherwise returns
+ FALSE. A style does not define any shape until setFontItalic() is
+ called.
- \sa setFontItalic(), fontItalic()
- */
+ \sa setFontItalic(), fontItalic()
+*/
bool QStyleSheetItem::definesFontItalic() const
@@ -365,6 +381,7 @@ bool QStyleSheetItem::definesFontItalic() const
/*!
- Returns TRUE if the style sets an underlined font; otherwise returns FALSE.
+ Returns TRUE if the style sets an underlined font; otherwise
+ returns FALSE.
- \sa setFontUnderline(), definesFontUnderline()
- */
+ \sa setFontUnderline(), definesFontUnderline()
+*/
bool QStyleSheetItem::fontUnderline() const
@@ -375,7 +392,7 @@ bool QStyleSheetItem::fontUnderline() const
/*!
- If \a underline is TRUE sets underline for the style; otherwise sets
- no underline.
+ If \a underline is TRUE, sets underline for the style; otherwise
+ sets no underline.
- \sa fontUnderline(), definesFontUnderline()
- */
+ \sa fontUnderline(), definesFontUnderline()
+*/
void QStyleSheetItem::setFontUnderline(bool underline)
@@ -386,7 +403,8 @@ void QStyleSheetItem::setFontUnderline(bool underline)
/*!
- Returns whether the style defines a setting for the underline
- property of the font. A style does not define this until
- setFontUnderline() is called.
+ Returns TRUE if the style defines a setting for the underline
+ property of the font; otherwise returns FALSE. A style does not
+ define this until setFontUnderline() is called.
- \sa setFontUnderline(), fontUnderline() */
+ \sa setFontUnderline(), fontUnderline()
+*/
bool QStyleSheetItem::definesFontUnderline() const
@@ -398,7 +416,42 @@ bool QStyleSheetItem::definesFontUnderline() const
/*!
- Returns the font weight setting of the style. This is either a
- valid QFont::Weight or the value QStyleSheetItem::Undefined.
+ Returns TRUE if the style sets a strike out font; otherwise
+ returns FALSE.
- \sa setFontWeight(), QFont
- */
+ \sa setFontStrikeOut(), definesFontStrikeOut()
+*/
+bool QStyleSheetItem::fontStrikeOut() const
+{
+ return d->fontstrikeout > 0;
+}
+
+/*!
+ If \a strikeOut is TRUE, sets strike out for the style; otherwise
+ sets no strike out.
+
+ \sa fontStrikeOut(), definesFontStrikeOut()
+*/
+void QStyleSheetItem::setFontStrikeOut(bool strikeOut)
+{
+ d->fontstrikeout = strikeOut?1:0;
+}
+
+/*!
+ Returns TRUE if the style defines a setting for the strikeOut
+ property of the font; otherwise returns FALSE. A style does not
+ define this until setFontStrikeOut() is called.
+
+ \sa setFontStrikeOut(), fontStrikeOut()
+*/
+bool QStyleSheetItem::definesFontStrikeOut() const
+{
+ return d->fontstrikeout != Undefined;
+}
+
+
+/*!
+ Returns the font weight setting of the style. This is either a
+ valid \c QFont::Weight or the value \c QStyleSheetItem::Undefined.
+
+ \sa setFontWeight(), QFont
+*/
int QStyleSheetItem::fontWeight() const
@@ -409,7 +462,7 @@ int QStyleSheetItem::fontWeight() const
/*!
- Sets the font weight setting of the style to \a w. Valid values are
- those defined by QFont::Weight.
+ Sets the font weight setting of the style to \a w. Valid values
+ are those defined by \c QFont::Weight.
- \sa QFont, fontWeight()
- */
+ \sa QFont, fontWeight()
+*/
void QStyleSheetItem::setFontWeight(int w)
@@ -420,7 +473,7 @@ void QStyleSheetItem::setFontWeight(int w)
/*!
- Returns the logical font size setting of the style. This is either a valid
- size between 1 and 7 or QStyleSheetItem::Undefined.
+ Returns the logical font size setting of the style. This is either
+ a valid size between 1 and 7 or \c QStyleSheetItem::Undefined.
- \sa setLogicalFontSize(), setLogicalFontSizeStep(), QFont::pointSize(), QFont::setPointSize()
- */
+ \sa setLogicalFontSize(), setLogicalFontSizeStep(), QFont::pointSize(), QFont::setPointSize()
+*/
int QStyleSheetItem::logicalFontSize() const
@@ -432,7 +485,7 @@ int QStyleSheetItem::logicalFontSize() const
/*!
- Sets the logical font size setting of the style to \a s.
- Valid logical sizes are 1 to 7.
+ Sets the logical font size setting of the style to \a s. Valid
+ logical sizes are 1 to 7.
- \sa logicalFontSize(), QFont::pointSize(), QFont::setPointSize()
- */
+ \sa logicalFontSize(), QFont::pointSize(), QFont::setPointSize()
+*/
void QStyleSheetItem::setLogicalFontSize(int s)
@@ -443,9 +496,9 @@ void QStyleSheetItem::setLogicalFontSize(int s)
/*!
- Returns the logical font size step of this style.
+ Returns the logical font size step of this style.
- The default is 0. Tags such as \c big define \c +1; \c small defines
- \c -1.
+ The default is 0. Tags such as \c big define \c +1; \c small
+ defines \c -1.
- \sa setLogicalFontSizeStep()
- */
+ \sa setLogicalFontSizeStep()
+*/
int QStyleSheetItem::logicalFontSizeStep() const
@@ -456,6 +509,6 @@ int QStyleSheetItem::logicalFontSizeStep() const
/*!
- Sets the logical font size step of this style to \a s.
+ Sets the logical font size step of this style to \a s.
- \sa logicalFontSizeStep()
- */
+ \sa logicalFontSizeStep()
+*/
void QStyleSheetItem::setLogicalFontSizeStep( int s )
@@ -468,6 +521,6 @@ void QStyleSheetItem::setLogicalFontSizeStep( int s )
/*!
- Sets the font size setting of the style to \a s points.
+ Sets the font size setting of the style to \a s points.
- \sa fontSize(), QFont::pointSize(), QFont::setPointSize()
- */
+ \sa fontSize(), QFont::pointSize(), QFont::setPointSize()
+*/
void QStyleSheetItem::setFontSize(int s)
@@ -478,7 +531,7 @@ void QStyleSheetItem::setFontSize(int s)
/*!
- Returns the font size setting of the style. This is either a valid
- point size or QStyleSheetItem::Undefined.
+ Returns the font size setting of the style. This is either a valid
+ point size or \c QStyleSheetItem::Undefined.
- \sa setFontSize(), QFont::pointSize(), QFont::setPointSize()
- */
+ \sa setFontSize(), QFont::pointSize(), QFont::setPointSize()
+*/
int QStyleSheetItem::fontSize() const
@@ -490,7 +543,7 @@ int QStyleSheetItem::fontSize() const
/*!
- Returns the font family setting of the style. This is either a valid
- font family or QString::null if no family has been set.
+ Returns the font family setting of the style. This is either a
+ valid font family or QString::null if no family has been set.
- \sa setFontFamily(), QFont::family(), QFont::setFamily()
- */
+ \sa setFontFamily(), QFont::family(), QFont::setFamily()
+*/
QString QStyleSheetItem::fontFamily() const
@@ -501,6 +554,6 @@ QString QStyleSheetItem::fontFamily() const
/*!
- Sets the font family setting of the style to \a fam.
+ Sets the font family setting of the style to \a fam.
- \sa fontFamily(), QFont::family(), QFont::setFamily()
- */
+ \sa fontFamily(), QFont::family(), QFont::setFamily()
+*/
void QStyleSheetItem::setFontFamily( const QString& fam)
@@ -524,3 +577,3 @@ int QStyleSheetItem::numberOfColumns() const
/*!\obsolete
- Sets the number of columns for this style. Elements in the style
+ Sets the number of columns for this style. Elements in the style
are divided into columns.
@@ -540,7 +593,7 @@ void QStyleSheetItem::setNumberOfColumns(int ncols)
/*!
- Returns the text color of this style or an invalid color
- if no color has been set.
+ Returns the text color of this style or an invalid color if no
+ color has been set.
- \sa setColor() QColor::isValid()
- */
+ \sa setColor() QColor::isValid()
+*/
QColor QStyleSheetItem::color() const
@@ -551,6 +604,6 @@ QColor QStyleSheetItem::color() const
/*!
- Sets the text color of this style to \a c.
+ Sets the text color of this style to \a c.
- \sa color()
- */
+ \sa color()
+*/
void QStyleSheetItem::setColor( const QColor &c)
@@ -561,6 +614,6 @@ void QStyleSheetItem::setColor( const QColor &c)
/*!
- Returns whether this style is an anchor.
+ Returns whether this style is an anchor.
- \sa setAnchor()
- */
+ \sa setAnchor()
+*/
bool QStyleSheetItem::isAnchor() const
@@ -571,8 +624,8 @@ bool QStyleSheetItem::isAnchor() const
/*!
- If \a anc is TRUE sets this style to be an anchor (hypertext link);
- otherwise sets it to not be an anchor. Elements in this style have
- connections to other documents or anchors.
+ If \a anc is TRUE, sets this style to be an anchor (hypertext
+ link); otherwise sets it to not be an anchor. Elements in this
+ style link to other documents or anchors.
- \sa isAnchor()
- */
+ \sa isAnchor()
+*/
void QStyleSheetItem::setAnchor(bool anc)
@@ -584,6 +637,6 @@ void QStyleSheetItem::setAnchor(bool anc)
/*!
- Returns the whitespace mode.
+ Returns the whitespace mode.
- \sa setWhiteSpaceMode() WhiteSpaceMode
- */
+ \sa setWhiteSpaceMode() WhiteSpaceMode
+*/
QStyleSheetItem::WhiteSpaceMode QStyleSheetItem::whiteSpaceMode() const
@@ -594,5 +647,6 @@ QStyleSheetItem::WhiteSpaceMode QStyleSheetItem::whiteSpaceMode() const
/*!
- Sets the whitespace mode to \a m.
- \sa WhiteSpaceMode
- */
+ Sets the whitespace mode to \a m.
+
+ \sa WhiteSpaceMode
+*/
void QStyleSheetItem::setWhiteSpaceMode(WhiteSpaceMode m)
@@ -604,10 +658,10 @@ void QStyleSheetItem::setWhiteSpaceMode(WhiteSpaceMode m)
/*!
- Returns the width of margin \a m in pixels.
+ Returns the width of margin \a m in pixels.
- The margin, \a m, can be \c MarginLeft, \c MarginRight,
- \c MarginTop, \c MarginBottom, \c MarginAll, \c MarginVertical or \c
- MarginHorizontal.
+ The margin, \a m, can be \c MarginLeft, \c MarginRight, \c
+ MarginTop, \c MarginBottom, \c MarginAll, \c MarginVertical or \c
+ MarginHorizontal.
- \sa setMargin() Margin
- */
+ \sa setMargin() Margin
+*/
int QStyleSheetItem::margin(Margin m) const
@@ -619,10 +673,10 @@ int QStyleSheetItem::margin(Margin m) const
/*!
- Sets the width of margin \a m to \a v pixels.
+ Sets the width of margin \a m to \a v pixels.
- The margin, \a m, can be \c MarginLeft, \c MarginRight,
- \c MarginTop, \c MarginBottom, \c MarginAll, \c MarginVertical or \c
- MarginHorizontal. The value \a v must be >= 0.
+ The margin, \a m, can be \c MarginLeft, \c MarginRight, \c
+ MarginTop, \c MarginBottom, \c MarginAll, \c MarginVertical or \c
+ MarginHorizontal. The value \a v must be >= 0.
- \sa margin()
- */
+ \sa margin()
+*/
void QStyleSheetItem::setMargin(Margin m, int v)
@@ -648,5 +702,5 @@ void QStyleSheetItem::setMargin(Margin m, int v)
/*!
- Returns the list style of the style.
+ Returns the list style of the style.
- \sa setListStyle() ListStyle
+ \sa setListStyle() ListStyle
*/
@@ -657,22 +711,24 @@ QStyleSheetItem::ListStyle QStyleSheetItem::listStyle() const
-/*! \enum QStyleSheetItem::ListStyle
+/*!
+ \enum QStyleSheetItem::ListStyle
- This enum type defines how the items in a list are prefixed when
- displayed. The currently defined values are:
+ This enum type defines how the items in a list are prefixed when
+ displayed.
- \value ListDisc a filled circle (i.e. a bullet)
- \value ListCircle an unfilled circle
- \value ListSquare a filled square
- \value ListDecimal an integer in base 10: \e 1, \e 2, \e 3, ...
- \value ListLowerAlpha a lowercase letter: \e a, \e b, \e c, ...
- \value ListUpperAlpha an uppercase letter: \e A, \e B, \e C, ...
+ \value ListDisc a filled circle (i.e. a bullet)
+ \value ListCircle an unfilled circle
+ \value ListSquare a filled square
+ \value ListDecimal an integer in base 10: \e 1, \e 2, \e 3, ...
+ \value ListLowerAlpha a lowercase letter: \e a, \e b, \e c, ...
+ \value ListUpperAlpha an uppercase letter: \e A, \e B, \e C, ...
*/
+
/*!
- Sets the list style of the style to \a s.
+ Sets the list style of the style to \a s.
- This is used by nested elements that have a display mode of
- \c DisplayListItem.
+ This is used by nested elements that have a display mode of \c
+ DisplayListItem.
- \sa listStyle() DisplayMode ListStyle
- */
+ \sa listStyle() DisplayMode ListStyle
+*/
void QStyleSheetItem::setListStyle(ListStyle s)
@@ -683,9 +739,10 @@ void QStyleSheetItem::setListStyle(ListStyle s)
-/*! Returns a space-separated list of names of styles that may
- contain elements of this style. If nothing has been set, contexts()
- returns an empty string, which indicates that this style can be
- nested everywhere.
+/*!
+ Returns a space-separated list of names of styles that may contain
+ elements of this style. If nothing has been set, contexts()
+ returns an empty string, which indicates that this style can be
+ nested everywhere.
- \sa setContexts()
- */
+ \sa setContexts()
+*/
QString QStyleSheetItem::contexts() const
@@ -696,8 +753,8 @@ QString QStyleSheetItem::contexts() const
/*!
- Sets a space-separated list of names of styles that may contain
- elements of this style. If \a c is empty, the style can be nested
- everywhere.
+ Sets a space-separated list of names of styles that may contain
+ elements of this style. If \a c is empty, the style can be nested
+ everywhere.
- \sa contexts()
- */
+ \sa contexts()
+*/
void QStyleSheetItem::setContexts( const QString& c)
@@ -708,7 +765,7 @@ void QStyleSheetItem::setContexts( const QString& c)
/*!
- Returns TRUE if this style can be nested into an element
- of style \a s; otherwise returns FALSE.
+ Returns TRUE if this style can be nested into an element of style
+ \a s; otherwise returns FALSE.
- \sa contexts(), setContexts()
- */
+ \sa contexts(), setContexts()
+*/
bool QStyleSheetItem::allowedInContext( const QStyleSheetItem* s) const
@@ -722,7 +779,7 @@ bool QStyleSheetItem::allowedInContext( const QStyleSheetItem* s) const
/*!
- Returns TRUE if this style has self-nesting enabled; otherwise
- returns FALSE.
+ Returns TRUE if this style has self-nesting enabled; otherwise
+ returns FALSE.
- \sa setSelfNesting()
- */
+ \sa setSelfNesting()
+*/
bool QStyleSheetItem::selfNesting() const
@@ -733,10 +790,10 @@ bool QStyleSheetItem::selfNesting() const
/*!
- Sets the self-nesting property for this style to \a nesting.
+ Sets the self-nesting property for this style to \a nesting.
- In order to support "dirty" HTML, paragraphs \c{<p>} and list items
- \c{<li>} are not self-nesting. This means that starting a new
- paragraph or list item automatically closes the previous one.
+ In order to support "dirty" HTML, paragraphs \c{<p>} and list
+ items \c{<li>} are not self-nesting. This means that starting a
+ new paragraph or list item automatically closes the previous one.
- \sa selfNesting()
- */
+ \sa selfNesting()
+*/
void QStyleSheetItem::setSelfNesting( bool nesting )
@@ -746,3 +803,11 @@ void QStyleSheetItem::setSelfNesting( bool nesting )
-/*! Sets the linespacing to be \a ls pixels */
+/*
+ Sets the linespacing to be at least \a ls pixels.
+
+ For compatibility with previous Qt releases, small values get
+ treated differently: If \a ls is smaller than the default font
+ line spacing in pixels at parse time, the resulting line spacing
+ is the sum of the default line spacing plus \a ls. We recommend
+ not relying on this behavior.
+*/
@@ -753,3 +818,7 @@ void QStyleSheetItem::setLineSpacing( int ls )
-/*! Returns the linespacing */
+/*!
+ \obsolete
+
+ Returns the linespacing
+*/
@@ -769,220 +838,218 @@ int QStyleSheetItem::lineSpacing() const
/*!
- \class QStyleSheet qstylesheet.h
- \ingroup text
- \brief The QStyleSheet class is a collection of styles for rich text
- rendering and a generator of tags.
-
- \ingroup graphics
- \ingroup helpsystem
-
- By creating QStyleSheetItem objects for a style sheet you build a
- definition of a set of tags. This definition will be used by the
- internal rich text rendering system to parse and display text
- documents to which the style sheet applies. Rich text is normally
- visualized in a QTextView or a QTextBrowser. However, QLabel,
- QWhatsThis and QMessageBox also support it, and other classes are
- likely to follow. With QSimpleRichText it is possible to use the
- rich text renderer for custom widgets as well.
-
- The default QStyleSheet object has the following style bindings,
- sorted by structuring bindings, anchors, character style bindings
- (i.e. inline styles), special elements such as horizontal lines or
- images, and other tags. In addition, rich text supports simple HTML
- tables.
-
- The structuring tags are
- \list
- \i \c{<qt>}...\c{</qt>}
- - A Qt rich text document. It understands the following attributes:
- \list
- \i title
- - The caption of the document. This attribute is easily accessible with
- QTextView::documentTitle().
- \i type
- - The type of the document. The default type is \c page . It
- indicates that the document is displayed in a page of its
- own. Another style is \c detail, which can be used to
- explain certain expressions in more detail in a few
- sentences. The QTextBrowser will then keep the current page
- and display the new document in a small popup similar to
- QWhatsThis. Note that links will not work in documents with
- \c{<qt type="detail">...</qt>}.
- \i bgcolor
- - The background color, for example \c bgcolor="yellow" or \c
- bgcolor="#0000FF".
- \i background
- - The background pixmap, for example \c
- background="granit.xpm". The pixmap name will be resolved by
- a QMimeSourceFactory().
- \i text
- - The default text color, for example \c text="red".
- \i link
- - The link color, for example \c link="green".
- \endlist
- \i \c{<h1>...</h1>}
- - A top-level heading.
- \i \c{<h2>...</h2>}
- - A sublevel heading.
- \i \c{<h3>...</h3>}
- - A sub-sublevel heading.
- \i \c{<p>...</p>}
- - A left-aligned paragraph. Adjust the alignment with
- the \c align attribute. Possible values are
- \c left, \c right and \c center.
- \i \c{<center>...</center>}
- - A centered paragraph.
- \i \c{<blockquote>...</blockquote>}
- - An indented paragraph that is useful for quotes.
- \i \c{<ul>...</ul>}
- - An unordered list. You can also pass a type argument to
- define the bullet style. The default is \c type=disc; other
- types are \c circle and \c square.
- \i \c{<ol>...</ol>}
- - An ordered list. You can also pass a type argument to define
- the enumeration label style. The default is \c type="1"; other
- types are \c "a" and \c "A".
- \i <tt>&lt;li&gt;</tt>...<tt>&lt;/li&gt;</tt>
- - A list item. This tag can be used only within the context of
- \c ol or \c ul.
- \i \c{<pre>...</pre>}
- - For larger chunks of code. Whitespaces in the contents are preserved.
- For small bits of code use the inline-style \c code.
- \endlist
-
- Anchors and links are done with a single tag:
- \list
- \i \c{<a>...</a>}
- - An anchor or link. The reference target is defined in the \c
- href attribute of the tag as in \c{<a
- href="target.qml">...</a>}. You can also specify an
- additional anchor within the specified target document, for
- example \c{<a href="target.qml#123">...</a>}. If \c a is
- meant to be an anchor, the reference source is given in the
- \c name attribute.
- \endlist
-
- The default character style bindings are
- \list
- \i \c{<em>...</em>}
- - Emphasized. By default this is the same as
- \c{<i>...</i>} (italic).
- \i \c{<strong>...</strong>}
- - Strong. By default this is the same as
- \c{<b>...</b>} (bold).
- \i \c{<i>...</i>}
- - Italic font style.
- \i \c{<b>...</b>}
- - Bold font style.
- \i \c{<u>...</u>}
- - Underlined font style.
- \i \c{<big>...</big>}
- - A larger font size.
- \i \c{<small>...</small>}
- - A smaller font size.
- \i \c{<code>...</code>}
- - Indicates code. By default this is the same as
- \c{<tt>...</tt>} (typewriter). For
- larger junks of code use the block-tag \c pre.
- \i \c{<tt>...</tt>}
- - Typewriter font style.
- \i \c{<font>...</font>}
- - Customizes the font size, family and text color. The tag understands
- the following attributes:
- \list
- \i color
- - The text color, for example \c color="red" or \c color="#FF0000".
- \i size
- - The logical size of the font. Logical sizes 1 to 7 are supported.
- The value may either be absolute (for example,
- \c size=3) or relative (\c size=-2). In the latter case the sizes
- are simply added.
- \i face
- - The family of the font, for example \c face=times.
- \endlist
- \endlist
-
- Special elements are:
- \list
- \i \c{<img>}
- - An image. The image name for the mime source
- factory is given in the source attribute, for example
- \c{<img src="qt.xpm">}
- The image tag also understands the attributes \c width and \c
- height that determine the size of the image. If the pixmap
- does not fit the specified size it will be scaled
- automatically (by using QImage::smoothScale()).
-
- The \c align attribute determines where the image is
- placed. By default, an image is placed inline just like a
- normal character. Specify \c left or \c right to place the
- image at the respective side.
- \i \c{<hr>}
- - A horizonal line.
- \i \c{<br>}
- - A line break.
- \endlist
-
- Another tag not in any of the above cathegories is
- \list
- \i \c{<nobr>...</nobr>}
- - No break. Prevents word wrap.
- \endlist
-
- In addition, rich text supports simple HTML tables. A table consists
- of one or more rows each of which contains one or more cells. Cells
- are either data cells or header cells, depending on their
- content. Cells which span rows and columns are supported.
-
- \list
- \i \c{<table>...</table>}
- - A table. Tables support the following attributes:
- \list
- \i bgcolor
- - The background color.
- \i width
- - The table width. This is either an absolute pixel width or a relative
- percentage of the table's width, for example \c width=80%.
- \i border
- - The width of the table border. The default is 0 (= no border).
- \i cellspacing
- - Additional space around the table cells. The default is 2.
- \i cellpadding
- - Additional space around the contents of table cells. The default is 1.
- \endlist
- \i \c{<tr>...</tr>}
- - A table row. This is only valid within a \c table. Rows support
- the following attribute:
- \list
- \i bgcolor
- - The background color.
- \endlist
- \i \c{<th>...</th>}
- - A table header cell. Similar to \c td, but defaults to center alignment
- and a bold font.
- \i \c{<td>...</td>}
- - A table data cell. This is only valid within a \c tr. Cells
- support the following attributes:
- \list
- \i bgcolor
- - The background color.
- \i width
- - The cell width. This is either an absolute pixel width or a relative
- percentage of table's width, for example \c width=50%.
- \i colspan
- - Specifies how many columns this cell spans. The default is 1.
- \i rowspan
- - Specifies how many rows this cell spans. The default is 1.
- \i align
- - Alignment; possible values are \c left, \c right, and \c center. The
- default is left.
- \endlist
- \endlist
-*/
-
-/*!
- Creates a style sheet with parent \a parent and name \a name. Like
- any QObject it will be deleted when its parent is
- destroyed (if the child still exists).
-
- By default the style sheet has the tag definitions defined above.
+ \class QStyleSheet qstylesheet.h
+ \ingroup text
+ \brief The QStyleSheet class is a collection of styles for rich text
+ rendering and a generator of tags.
+
+ \ingroup graphics
+ \ingroup helpsystem
+
+ By creating QStyleSheetItem objects for a style sheet you build a
+ definition of a set of tags. This definition will be used by the
+ internal rich text rendering system to parse and display text
+ documents to which the style sheet applies. Rich text is normally
+ visualized in a QTextView or a QTextBrowser. However, QLabel,
+ QWhatsThis and QMessageBox also support it, and other classes are
+ likely to follow. With QSimpleRichText it is possible to use the
+ rich text renderer for custom widgets as well.
+
+ The default QStyleSheet object has the following style bindings,
+ sorted by structuring bindings, anchors, character style bindings
+ (i.e. inline styles), special elements such as horizontal lines or
+ images, and other tags. In addition, rich text supports simple
+ HTML tables.
+
+ The structuring tags are
+ \table
+ \header \i Structuring tags \i Notes
+ \row \i \c{<qt>}...\c{</qt>}
+ \i A Qt rich text document. It understands the following
+ attributes:
+ \list
+ \i \c title -- The caption of the document. This attribute is
+ easily accessible with QTextView::documentTitle().
+ \i \c type -- The type of the document. The default type is \c
+ page. It indicates that the document is displayed in a
+ page of its own. Another style is \c detail, which can be
+ used to explain certain expressions in more detail in a
+ few sentences. For \c detail, QTextBrowser will then keep
+ the current page and display the new document in a small
+ popup similar to QWhatsThis. Note that links will not work
+ in documents with \c{<qt type="detail">...</qt>}.
+ \i \c bgcolor -- The background color, for example \c
+ bgcolor="yellow" or \c bgcolor="#0000FF".
+ \i \c background -- The background pixmap, for example \c
+ background="granite.xpm". The pixmap name will be resolved
+ by a QMimeSourceFactory().
+ \i \c text -- The default text color, for example \c text="red".
+ \i \c link -- The link color, for example \c link="green".
+ \endlist
+ \row \i \c{<h1>...</h1>}
+ \i A top-level heading.
+ \row \i \c{<h2>...</h2>}
+ \i A sublevel heading.
+ \row \i \c{<h3>...</h3>}
+ \i A sub-sublevel heading.
+ \row \i \c{<p>...</p>}
+ \i A left-aligned paragraph. Adjust the alignment with the \c
+ align attribute. Possible values are \c left, \c right and
+ \c center.
+ \row \i \c{<center>...}<br>\c{</center>}
+ \i A centered paragraph.
+ \row \i \c{<blockquote>...}<br>\c{</blockquote>}
+ \i An indented paragraph that is useful for quotes.
+ \row \i \c{<ul>...</ul>}
+ \i An unordered list. You can also pass a type argument to
+ define the bullet style. The default is \c type=disc;
+ other types are \c circle and \c square.
+ \row \i \c{<ol>...</ol>}
+ \i An ordered list. You can also pass a type argument to
+ define the enumeration label style. The default is \c
+ type="1"; other types are \c "a" and \c "A".
+ \row \i \c{<li>...</li>}
+ \i A list item. This tag can be used only within the context
+ of \c{<ol>} or \c{<ul>}.
+ \row \i \c{<pre>...</pre>}
+ \i For larger chunks of code. Whitespaces in the contents are
+ preserved. For small bits of code use the inline-style \c
+ code.
+ \endtable
+
+ Anchors and links are done with a single tag:
+ \table
+ \header \i Anchor tags \i Notes
+ \row \i \c{<a>...</a>}
+ \i An anchor or link.
+ \list
+ \i A link is created by using an \c href
+ attribute, for example
+ <br>\c{<a href="target.qml">Link Text</a>}. Links to
+ targets within a document are achieved in the same way
+ as for HTML, e.g.
+ <br>\c{<a href="target.qml#subtitle">Link Text</a>}.
+ \i A target is created by using a \c name
+ attribute, for example
+ <br>\c{<a name="subtitle"><h2>Sub Title</h2></a>}.
+ \endlist
+ \endtable
+
+ The default character style bindings are
+ \table
+ \header \i Style tags \i Notes
+ \row \i \c{<em>...</em>}
+ \i Emphasized. By default this is the same as \c{<i>...</i>}
+ (italic).
+ \row \i \c{<strong>...</strong>}
+ \i Strong. By default this is the same as \c{<b>...</b>}
+ (bold).
+ \row \i \c{<i>...</i>}
+ \i Italic font style.
+ \row \i \c{<b>...</b>}
+ \i Bold font style.
+ \row \i \c{<u>...</u>}
+ \i Underlined font style.
+ \row \i \c{<s>...</s>}
+ \i Strike out font style.
+ \row \i \c{<big>...</big>}
+ \i A larger font size.
+ \row \i \c{<small>...</small>}
+ \i A smaller font size.
+ \row \i \c{<code>...</code>}
+ \i Indicates code. By default this is the same as
+ \c{<tt>...</tt>} (typewriter). For larger junks of code
+ use the block-tag \c{<}\c{pre>}.
+ \row \i \c{<tt>...</tt>}
+ \i Typewriter font style.
+ \row \i \c{<font>...</font>}
+ \i Customizes the font size, family and text color. The tag
+ understands the following attributes:
+ \list
+ \i \c color -- The text color, for example \c color="red" or
+ \c color="#FF0000".
+ \i \c size -- The logical size of the font. Logical sizes 1
+ to 7 are supported. The value may either be absolute
+ (for example, \c size=3) or relative (\c size=-2). In
+ the latter case the sizes are simply added.
+ \i \c face -- The family of the font, for example \c face=times.
+ \endlist
+ \endtable
+
+ Special elements are:
+ \table
+ \header \i Special tags \i Notes
+ \row \i \c{<img>}
+ \i An image. The image name for the mime source factory is
+ given in the source attribute, for example
+ \c{<img src="qt.xpm">} The image tag also understands the
+ attributes \c width and \c height that determine the size
+ of the image. If the pixmap does not fit the specified
+ size it will be scaled automatically (by using
+ QImage::smoothScale()).
+ <br>
+ The \c align attribute determines where the image is
+ placed. By default, an image is placed inline just like a
+ normal character. Specify \c left or \c right to place the
+ image at the respective side.
+ \row \i \c{<hr>}
+ \i A horizonal line.
+ \row \i \c{<br>}
+ \i A line break.
+ \row \i \c{<nobr>...</nobr>}
+ \i No break. Prevents word wrap.
+ \endtable
+
+ In addition, rich text supports simple HTML tables. A table
+ consists of one or more rows each of which contains one or more
+ cells. Cells are either data cells or header cells, depending on
+ their content. Cells which span rows and columns are supported.
+
+ \table
+ \header \i Table tags \i Notes
+ \row \i \c{<table>...</table>}
+ \i A table. Tables support the following attributes:
+ \list
+ \i \c bgcolor -- The background color.
+ \i \c width -- The table width. This is either an absolute
+ pixel width or a relative percentage of the table's
+ width, for example \c width=80%.
+ \i \c border -- The width of the table border. The default is
+ 0 (= no border).
+ \i \c cellspacing -- Additional space around the table cells.
+ The default is 2.
+ \i \c cellpadding -- Additional space around the contents of
+ table cells. The default is 1.
+ \endlist
+ \row \i \c{<tr>...</tr>}
+ \i A table row. This is only valid within a \c table. Rows
+ support the following attribute:
+ \list
+ \i \c bgcolor -- The background color.
+ \endlist
+ \row \i \c{<th>...</th>}
+ \i A table header cell. Similar to \c td, but defaults to
+ center alignment and a bold font.
+ \row \i \c{<td>...</td>}
+ \i A table data cell. This is only valid within a \c tr.
+ Cells support the following attributes:
+ \list
+ \i \c bgcolor -- The background color.
+ \i \c width -- The cell width. This is either an absolute
+ pixel width or a relative percentage of table's width,
+ for example \c width=50%.
+ \i \c colspan -- Specifies how many columns this cell spans.
+ The default is 1.
+ \i \c rowspan -- Specifies how many rows this cell spans. The
+ default is 1.
+ \i \c align -- Alignment; possible values are \c left, \c
+ right, and \c center. The default is left.
+ \endlist
+ \endtable
+*/
+
+/*!
+ Creates a style sheet called \a name, with parent \a parent. Like
+ any QObject it will be deleted when its parent is destroyed (if
+ the child still exists).
+
+ By default the style sheet has the tag definitions defined above.
*/
@@ -995,4 +1062,4 @@ QStyleSheet::QStyleSheet( QObject *parent, const char *name )
/*!
- Destroys the style sheet. All styles inserted into the style sheet
- will be deleted.
+ Destroys the style sheet. All styles inserted into the style sheet
+ will be deleted.
*/
@@ -1020,3 +1087,2 @@ void QStyleSheet::init()
style->setDisplayMode( QStyleSheetItem::DisplayBlock );
- //style->setMargin( QStyleSheetItem::MarginAll, 4 );
@@ -1049,4 +1115,4 @@ void QStyleSheet::init()
style->setDisplayMode(QStyleSheetItem::DisplayBlock);
- style-> setMargin(QStyleSheetItem::MarginTop, 12);
- style-> setMargin(QStyleSheetItem::MarginBottom, 6);
+ style-> setMargin(QStyleSheetItem::MarginTop, 18);
+ style-> setMargin(QStyleSheetItem::MarginBottom, 12);
@@ -1056,4 +1122,4 @@ void QStyleSheet::init()
style->setDisplayMode(QStyleSheetItem::DisplayBlock);
- style-> setMargin(QStyleSheetItem::MarginTop, 10);
- style-> setMargin(QStyleSheetItem::MarginBottom, 5);
+ style-> setMargin(QStyleSheetItem::MarginTop, 16);
+ style-> setMargin(QStyleSheetItem::MarginBottom, 12);
@@ -1063,4 +1129,4 @@ void QStyleSheet::init()
style->setDisplayMode(QStyleSheetItem::DisplayBlock);
- style-> setMargin(QStyleSheetItem::MarginTop, 8);
- style-> setMargin(QStyleSheetItem::MarginBottom, 4);
+ style-> setMargin(QStyleSheetItem::MarginTop, 14);
+ style-> setMargin(QStyleSheetItem::MarginBottom, 12);
@@ -1070,4 +1136,3 @@ void QStyleSheet::init()
style->setDisplayMode(QStyleSheetItem::DisplayBlock);
- style-> setMargin(QStyleSheetItem::MarginTop, 8);
- style-> setMargin(QStyleSheetItem::MarginBottom, 4);
+ style-> setMargin(QStyleSheetItem::MarginVertical, 12);
@@ -1077,3 +1142,3 @@ void QStyleSheet::init()
style->setDisplayMode(QStyleSheetItem::DisplayBlock);
- style-> setMargin(QStyleSheetItem::MarginTop, 8);
+ style-> setMargin(QStyleSheetItem::MarginTop, 12);
style-> setMargin(QStyleSheetItem::MarginBottom, 4);
@@ -1082,3 +1147,3 @@ void QStyleSheet::init()
style->setDisplayMode(QStyleSheetItem::DisplayBlock);
- style-> setMargin(QStyleSheetItem::MarginVertical, 8);
+ style-> setMargin(QStyleSheetItem::MarginVertical, 12);
style->setSelfNesting( FALSE );
@@ -1099,3 +1164,5 @@ void QStyleSheet::init()
style->setDisplayMode(QStyleSheetItem::DisplayBlock);
- style-> setMargin(QStyleSheetItem::MarginVertical, 4);
+ style->setListStyle( QStyleSheetItem::ListDisc );
+ style-> setMargin(QStyleSheetItem::MarginVertical, 12);
+ style->setMargin( QStyleSheetItem::MarginLeft, 40 );
@@ -1104,3 +1171,4 @@ void QStyleSheet::init()
style->setListStyle( QStyleSheetItem::ListDecimal );
- style-> setMargin(QStyleSheetItem::MarginVertical, 4);
+ style-> setMargin(QStyleSheetItem::MarginVertical, 12);
+ style->setMargin( QStyleSheetItem::MarginLeft, 40 );
@@ -1109,4 +1177,2 @@ void QStyleSheet::init()
style->setSelfNesting( FALSE );
- style->setContexts(QString::fromLatin1("ol ul"));
- style-> setMargin(QStyleSheetItem::MarginVertical, 4);
@@ -1121,2 +1187,3 @@ void QStyleSheet::init()
new QStyleSheetItem(this, QString::fromLatin1("hr"));
+
style = new QStyleSheetItem(this, QString::fromLatin1("sub"));
@@ -1137,5 +1204,9 @@ void QStyleSheet::init()
style->setDisplayMode(QStyleSheetItem::DisplayNone);
+ style = new QStyleSheetItem( this, QString::fromLatin1("body") );
+ style->setDisplayMode(QStyleSheetItem::DisplayBlock);
style = new QStyleSheetItem( this, QString::fromLatin1("div") );
style->setDisplayMode(QStyleSheetItem::DisplayBlock) ;
+ style = new QStyleSheetItem( this, QString::fromLatin1("span") );
style = new QStyleSheetItem( this, QString::fromLatin1("dl") );
+ style-> setMargin(QStyleSheetItem::MarginVertical, 8);
style->setDisplayMode(QStyleSheetItem::DisplayBlock);
@@ -1150,6 +1221,11 @@ void QStyleSheet::init()
style->setFontUnderline( TRUE);
+ style = new QStyleSheetItem( this, QString::fromLatin1("s") );
+ style->setFontStrikeOut( TRUE);
style = new QStyleSheetItem( this, QString::fromLatin1("nobr") );
style->setWhiteSpaceMode( QStyleSheetItem::WhiteSpaceNoWrap );
- style = new QStyleSheetItem( this, QString::fromLatin1("wsp") ); // qt extension for QTextEdit
- style->setWhiteSpaceMode( (QStyleSheetItem::WhiteSpaceMode) 3 ); // WhiteSpaceModeNoCompression
+
+ // compatibily with some minor 3.0.x Qt versions that had an
+ // undocumented <wsp> tag. ### Remove 3.1
+ style = new QStyleSheetItem( this, QString::fromLatin1("wsp") );
+ style->setWhiteSpaceMode( QStyleSheetItem::WhiteSpacePre );
@@ -1175,10 +1251,10 @@ static QSingleCleanupHandler<QStyleSheet> qt_cleanup_stylesheet;
/*!
- Returns the application-wide default style sheet. This style sheet is
- used by rich text rendering classes such as QSimpleRichText,
- QWhatsThis and QMessageBox to define the rendering style and
- available tags within rich text documents. It serves also as initial
- style sheet for the more complex render widgets QTextEdit and
- QTextBrowser.
-
- \sa setDefaultSheet()
+ Returns the application-wide default style sheet. This style sheet
+ is used by rich text rendering classes such as QSimpleRichText,
+ QWhatsThis and QMessageBox to define the rendering style and
+ available tags within rich text documents. It also serves as the
+ initial style sheet for the more complex render widgets, QTextEdit
+ and QTextBrowser.
+
+ \sa setDefaultSheet()
*/
@@ -1194,7 +1270,7 @@ QStyleSheet* QStyleSheet::defaultSheet()
/*!
- Sets the application-wide default style sheet to \a sheet, deleting
- any style sheet previously set. The ownership is transferred to
- QStyleSheet.
+ Sets the application-wide default style sheet to \a sheet,
+ deleting any style sheet previously set. The ownership is
+ transferred to QStyleSheet.
- \sa defaultSheet()
+ \sa defaultSheet()
*/
@@ -1213,4 +1289,4 @@ void QStyleSheet::setDefaultSheet( QStyleSheet* sheet)
/*!\internal
- Inserts \a style. Any tags generated after this time will be
- bound to this style. Note that \a style becomes owned by the
+ Inserts \a style. Any tags generated after this time will be
+ bound to this style. Note that \a style becomes owned by the
style sheet and will be deleted when the style sheet is destroyed.
@@ -1224,4 +1300,4 @@ void QStyleSheet::insert( QStyleSheetItem* style )
/*!
- Returns the style with name \a name or 0 if there is no such style.
- */
+ Returns the style called \a name or 0 if there is no such style.
+*/
QStyleSheetItem* QStyleSheet::item( const QString& name)
@@ -1235,4 +1311,6 @@ QStyleSheetItem* QStyleSheet::item( const QString& name)
\overload
- Returns the style with name \a name or 0 if there is no such style (const version)
- */
+
+ Returns the style called \a name or 0 if there is no such style
+ (const version)
+*/
const QStyleSheetItem* QStyleSheet::item( const QString& name) const
@@ -1247,17 +1325,18 @@ const QStyleSheetItem* QStyleSheet::item( const QString& name) const
\preliminary
- Generates an internal object for the tag called \a name, given the
- attributes \a attr, and using additional information provided
- by the mime source factory \a factory.
- \a context is the optional context of the document, i.e. the path to
- look for relative links. This becomes important if the text contains
- relative references, for example within image tags. QSimpleRichText
- always uses the default mime source factory (see
- \l{QMimeSourceFactory::defaultFactory()}) to resolve these references.
- The context will then be used to calculate the absolute path. See
- QMimeSourceFactory::makeAbsolute() for details.
+ Generates an internal object for the tag called \a name, given the
+ attributes \a attr, and using additional information provided by
+ the mime source factory \a factory.
- \a emptyTag and \a doc are for internal use only.
+ \a context is the optional context of the document, i.e. the path
+ to look for relative links. This becomes important if the text
+ contains relative references, for example within image tags.
+ QSimpleRichText always uses the default mime source factory (see
+ \l{QMimeSourceFactory::defaultFactory()}) to resolve these
+ references. The context will then be used to calculate the
+ absolute path. See QMimeSourceFactory::makeAbsolute() for details.
- This function should not (yet) be used in application code.
+ \a emptyTag and \a doc are for internal use only.
+
+ This function should not be used in application code.
*/
@@ -1269,5 +1348,2 @@ QTextCustomItem* QStyleSheet::tag( const QString& name,
{
- static QString s_img = QString::fromLatin1("img");
- static QString s_hr = QString::fromLatin1("hr");
-
const QStyleSheetItem* style = item( name );
@@ -1276,5 +1352,5 @@ QTextCustomItem* QStyleSheet::tag( const QString& name,
return 0;
- if ( style->name() == s_img )
+ if ( style->name() == "img" )
return new QTextImage( doc, attr, context, (QMimeSourceFactory&)factory );
- if ( style->name() == s_hr )
+ if ( style->name() == "hr" )
return new QTextHorizontalLine( doc, attr, context, (QMimeSourceFactory&)factory );
@@ -1284,13 +1360,12 @@ QTextCustomItem* QStyleSheet::tag( const QString& name,
-/*!
- Auxiliary function. Converts the plain text string \a plain to a
- rich text formatted paragraph while preserving its look.
+/*! Auxiliary function. Converts the plain text string \a plain to a
+ rich text formatted paragraph while preserving most of its look.
- \a mode defines the whitespace mode. Possible values are \c
- QStyleSheetItem::WhiteSpacePre (no wrapping, all whitespaces
- preserved) and \c QStyleSheetItem::WhiteSpaceNormal (wrapping,
- simplified whitespaces).
+ \a mode defines the whitespace mode. Possible values are \c
+ QStyleSheetItem::WhiteSpacePre (no wrapping, all whitespaces
+ preserved) and \c QStyleSheetItem::WhiteSpaceNormal (wrapping,
+ simplified whitespaces).
- \sa escape()
- */
+ \sa escape()
+*/
QString QStyleSheet::convertFromPlainText( const QString& plain, QStyleSheetItem::WhiteSpaceMode mode )
@@ -1302,28 +1377,40 @@ QString QStyleSheet::convertFromPlainText( const QString& plain, QStyleSheetItem
if ( plain[i] == '\n' ){
- if ( col == 1 )
- rich += "<p></p>";
- else
- rich += "<br>";
+ int c = 1;
+ while ( i+1 < int(plain.length()) && plain[i+1] == '\n' ) {
+ i++;
+ c++;
+ }
+ if ( c == 1)
+ rich += "<br>\n";
+ else {
+ rich += "</p>\n";
+ while ( --c > 1 )
+ rich += "<br>\n";
+ rich += "<p>";
+ }
col = 0;
- }
- else if ( mode == QStyleSheetItem::WhiteSpacePre && plain[i] == '\t' ){
- rich += 0x00a0U;
- while ( col % 4 ) {
+ } else {
+ if ( mode == QStyleSheetItem::WhiteSpacePre && plain[i] == '\t' ){
rich += 0x00a0U;
++col;
+ while ( col % 8 ) {
+ rich += 0x00a0U;
+ ++col;
+ }
}
+ else if ( mode == QStyleSheetItem::WhiteSpacePre && plain[i].isSpace() )
+ rich += 0x00a0U;
+ else if ( plain[i] == '<' )
+ rich +="&lt;";
+ else if ( plain[i] == '>' )
+ rich +="&gt;";
+ else if ( plain[i] == '&' )
+ rich +="&amp;";
+ else
+ rich += plain[i];
+ ++col;
}
- else if ( mode == QStyleSheetItem::WhiteSpacePre && plain[i].isSpace() )
- rich += 0x00a0U;
- else if ( plain[i] == '<' )
- rich +="&lt;";
- else if ( plain[i] == '>' )
- rich +="&gt;";
- else if ( plain[i] == '&' )
- rich +="&amp;";
- else
- rich += plain[i];
- ++col;
}
- rich += "</p>";
+ if ( col != 0 )
+ rich += "</p>";
return rich;
@@ -1332,7 +1419,7 @@ QString QStyleSheet::convertFromPlainText( const QString& plain, QStyleSheetItem
/*!
- Auxiliary function. Converts the plain text string \a plain to a
- rich text formatted string with any HTML meta-characters escaped.
+ Auxiliary function. Converts the plain text string \a plain to a
+ rich text formatted string with any HTML meta-characters escaped.
- \sa convertFromPlainText()
- */
+ \sa convertFromPlainText()
+*/
QString QStyleSheet::escape( const QString& plain)
@@ -1356,18 +1443,19 @@ QString QStyleSheet::escape( const QString& plain)
/*!
- \enum Qt::TextFormat
+ \enum Qt::TextFormat
- This enum is used in widgets that can display both plain text and
- rich text, e.g. QLabel. It is used for deciding whether a text
- string should be interpreted as one or the other. This is
- normally done by passing one of the enum values to a setTextFormat()
- function.
+ This enum is used in widgets that can display both plain text and
+ rich text, e.g. QLabel. It is used for deciding whether a text
+ string should be interpreted as one or the other. This is normally
+ done by passing one of the enum values to a setTextFormat()
+ function.
- \value PlainText The text string is interpreted as a plain text string.
+ \value PlainText The text string is interpreted as a plain text
+ string.
- \value RichText The text string is interpreted as a rich text string
- using the current QStyleSheet::defaultSheet().
+ \value RichText The text string is interpreted as a rich text
+ string using the current QStyleSheet::defaultSheet().
- \value AutoText The text string is interpreted as for \c RichText if
- QStyleSheet::mightBeRichText() returns TRUE, otherwise as for \c
- PlainText.
+ \value AutoText The text string is interpreted as for \c RichText
+ if QStyleSheet::mightBeRichText() returns TRUE, otherwise as
+ \c PlainText.
*/
@@ -1375,9 +1463,9 @@ QString QStyleSheet::escape( const QString& plain)
/*!
- Returns TRUE if the string \a text is likely to be rich text;
- otherwise returns FALSE.
+ Returns TRUE if the string \a text is likely to be rich text;
+ otherwise returns FALSE.
- Note: The function uses a fast and therefore simple heuristic. It
- mainly checks whether there is something that looks like a tag
- before the first line break. Although the result may be correct for
- most common cases, there is no guarantee.
+ This function uses a fast and therefore simple heuristic. It
+ mainly checks whether there is something that looks like a tag
+ before the first line break. Although the result may be correct
+ for common cases, there is no guarantee.
*/
@@ -1415,13 +1503,14 @@ bool QStyleSheet::mightBeRichText( const QString& text)
-/*! \fn void QStyleSheet::error( const QString& msg) const
+/*!
+ \fn void QStyleSheet::error( const QString& msg) const
- This virtual function is called when an error occurs when
- processing rich text. Reimplement it if you need to catch
- error messages.
+ This virtual function is called when an error occurs when
+ processing rich text. Reimplement it if you need to catch error
+ messages.
- Errors might occur if some rich text strings contain tags that are
- not understood by the stylesheet, if some tags are nested incorrectly, or
- if tags are not closed properly.
+ Errors might occur if some rich text strings contain tags that are
+ not understood by the stylesheet, if some tags are nested
+ incorrectly, or if tags are not closed properly.
- \a msg is the error message.
+ \a msg is the error message.
*/
@@ -1433,12 +1522,11 @@ void QStyleSheet::error( const QString& ) const
/*!
- Scales the font \a font to the appropriate physical point size
- corresponding to the logical font size \a logicalSize.
+ Scales the font \a font to the appropriate physical point size
+ corresponding to the logical font size \a logicalSize.
- When calling this function, \a font has a point size corresponding to
- the logical font size 3.
+ When calling this function, \a font has a point size corresponding
+ to the logical font size 3.
- Logical font sizes range from 1 to 7, with 1 being the smallest.
+ Logical font sizes range from 1 to 7, with 1 being the smallest.
- \sa QStyleSheetItem::logicalFontSize(),
- QStyleSheetItem::logicalFontSizeStep(), QFont::setPointSize()
+ \sa QStyleSheetItem::logicalFontSize(), QStyleSheetItem::logicalFontSizeStep(), QFont::setPointSize()
*/
diff --git a/noncore/apps/opie-write/qstylesheet.h b/noncore/apps/opie-write/qstylesheet.h
index bb209fa..cb786f5 100644
--- a/noncore/apps/opie-write/qstylesheet.h
+++ b/noncore/apps/opie-write/qstylesheet.h
@@ -83,3 +83,3 @@ public:
void setAlignment( int f);
-
+
enum VerticalAlignment {
@@ -89,3 +89,3 @@ public:
};
-
+
VerticalAlignment verticalAlignment() const;
@@ -122,2 +122,6 @@ public:
+ bool fontStrikeOut() const;
+ void setFontStrikeOut( bool );
+ bool definesFontStrikeOut() const;
+
bool isAnchor() const;
@@ -173,6 +177,6 @@ private:
// MOC_SKIP_BEGIN
-template class Q_EXPORT QDict<QStyleSheetItem>;
-template class Q_EXPORT QValueList< QPtrVector<QStyleSheetItem> >;
-template class Q_EXPORT QPtrVector<QStyleSheetItem>;
-template class Q_EXPORT QValueList<QStyleSheetItem::ListStyle>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QDict<QStyleSheetItem>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QValueList< QPtrVector<QStyleSheetItem> >;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrVector<QStyleSheetItem>;
+Q_TEMPLATE_EXTERN template class Q_EXPORT QValueList<QStyleSheetItem::ListStyle>;
// MOC_SKIP_END
diff --git a/noncore/apps/opie-write/qt3namespace.h b/noncore/apps/opie-write/qt3namespace.h
index 81c5020..557131a 100644
--- a/noncore/apps/opie-write/qt3namespace.h
+++ b/noncore/apps/opie-write/qt3namespace.h
@@ -4,2 +4,3 @@
#include <qnamespace.h>
+#include <qstring.h>
diff --git a/noncore/apps/opie-write/qtextedit.cpp b/noncore/apps/opie-write/qtextedit.cpp
index 9c5ea79..82401c6 100644
--- a/noncore/apps/opie-write/qtextedit.cpp
+++ b/noncore/apps/opie-write/qtextedit.cpp
@@ -68,2 +68,4 @@ using namespace Qt3;
+static bool qt_enable_richtext_copy = FALSE;
+
struct QUndoRedoInfoPrivate
@@ -79,3 +81,7 @@ public:
QTextEditPrivate()
- :preeditStart(-1),preeditLength(-1),ensureCursorVisibleInShowEvent(FALSE) {}
+ :preeditStart(-1),preeditLength(-1),ensureCursorVisibleInShowEvent(FALSE)
+ {
+ for ( int i=0; i<7; i++ )
+ id[i] = 0;
+ }
int id[ 7 ];
@@ -84,2 +90,3 @@ public:
bool ensureCursorVisibleInShowEvent;
+ QString scrollToAnchor; // used to deferr scrollToAnchor() until the show event when we are resized
};
@@ -92,3 +99,3 @@ static bool block_set_alignment = FALSE;
\class QTextEdit qtextedit.h
- \brief The QTextEdit widget provides a sophisticated single-page rich text editor.
+ \brief The QTextEdit widget provides a powerful single-page rich text editor.
@@ -98,5 +105,50 @@ static bool block_set_alignment = FALSE;
- QTextEdit is an advanced WYSIWYG editor supporting rich text
- formatting. It is optimized to handle large documents and to
- respond quickly to user input.
+ \tableofcontents
+
+ \section1 Introduction and Concepts
+
+ QTextEdit is an advanced WYSIWYG viewer/editor supporting rich
+ text formatting using HTML-style tags. It is optimized to handle
+ large documents and to respond quickly to user input.
+
+ QTextEdit has three modes of operation:
+ \table
+ \header \i Mode \i Command \i Notes
+ \row \i Plain Text Editor \i setTextFormat(PlainText)
+ \i Set text with setText(); text() returns plain text. Text
+ attributes (e.g. colors) can be set, but plain text is always
+ returned.<sup>1.</sup>
+ \row \i Rich Text Editor \i setTextFormat(RichText)
+ \i Set text with setText(); text() returns rich text. Rich
+ text editing is fairly limited. You can't set margins or
+ insert images for example (although you can read and
+ correctly display files that have margins set and that
+ include images). This mode is mostly useful for editing small
+ amounts of rich text. <sup>2.</sup>
+ \row \i Text Viewer<sup>3.</sup> \i setReadOnly(TRUE)
+ \i Set text with setText() or append() (which has no undo
+ history so is faster and uses less memory); text() returns
+ plain or rich text depending on the textFormat(). This mode
+ can correctly display a large subset of HTML tags.
+ \endtable
+
+ <sup>1.</sup><small>We do \e not recommend using QTextEdit to
+ create syntax highlighting editors because the current API is
+ insufficient for this purpose. We hope to release a more complete
+ API that will support syntax highlighting in a later
+ release.</small>
+
+ <sup>2.</sup><small>A more complete API that supports setting
+ margins, images, etc., is planned for a later Qt release.</small>
+
+ <sup>3.</sup><small>Qt 3.1 will provide a Log Viewer mode which is
+ optimised for the fast and memory efficient display of large
+ amounts of read only text.</small>
+
+ We recommend that you always call setTextFormat() to set the mode
+ you want to use. If you use \c AutoText then setText() and
+ append() will try to determine whether the text they are given is
+ plain text or rich text. If you use \c RichText then setText() and
+ append() will assume that the text they are given is rich text.
+ insert() simply inserts the text it is given.
@@ -104,8 +156,19 @@ static bool block_set_alignment = FALSE;
formatted string which is word-wrapped to fit into the width of
- the widget. A document consists of zero or more paragraphs,
- indexed from 0. Characters are indexed on a per-paragraph basis,
- also indexed from 0. The words in the paragraph are aligned in
- accordance with the paragraph's alignment(). Paragraphs are
- separated by hard line breaks. Each character within a paragraph
- has its own attributes, for example, font and color.
+ the widget. By default when reading plain text, two newlines
+ signify a paragraph. A document consists of zero or more
+ paragraphs, indexed from 0. Characters are indexed on a
+ per-paragraph basis, also indexed from 0. The words in the
+ paragraph are aligned in accordance with the paragraph's
+ alignment(). Paragraphs are separated by hard line breaks. Each
+ character within a paragraph has its own attributes, for example,
+ font and color.
+
+ The text edit documentation uses the following concepts:
+ \list
+ \i \e{current format} --
+ this is the format at the current cursor position, \e and it
+ is the format of the selected text if any.
+ \i \e{current paragraph} -- the paragraph which contains the
+ cursor.
+ \endlist
@@ -116,3 +179,4 @@ static bool block_set_alignment = FALSE;
rendering style and the set of valid tags are defined by a
- styleSheet(). Change the style sheet with \l{setStyleSheet()}; see
+ styleSheet(). Custom tags can be created and placed in a custom
+ style sheet. Change the style sheet with \l{setStyleSheet()}; see
QStyleSheet for details. The images identified by image tags are
@@ -136,10 +200,12 @@ static bool block_set_alignment = FALSE;
- The text edit documentation uses the following concepts:
- \list
- \i <i>current format</i> --
- this is the format at the current cursor position, \e and it
- is the format of the selected text if any.
- \i <i>current paragraph</i> -- the paragraph which contains the
- cursor.
- \endlist
+ Note that we do not intend to add a full-featured web browser
+ widget to Qt (because that would easily double Qt's size and only
+ a few applications would benefit from it). The rich
+ text support in Qt is designed to provide a fast, portable and
+ efficient way to add reasonable online help facilities to
+ applications, and to provide a basis for rich text editors.
+ \section1 Using QTextEdit as a Display Widget
+
+ QTextEdit can display a large HTML subset, including tables and
+ images.
@@ -147,49 +213,12 @@ static bool block_set_alignment = FALSE;
existing text and replaces it with the text passed in the
- setText() call. Text can be inserted with insert(), paste() and
- pasteSubType(). Text can also be cut(). The entire text is deleted
- with clear() and the selected text is deleted with
- removeSelectedText(). Selected (marked) text can also be deleted
- with del() (which will delete the character to the right of the
- cursor if no text is selected).
-
- The current format's attributes are set with setItalic(),
- setBold(), setUnderline(), setFamily() (font family),
- setPointSize(), setColor() and setCurrentFont(). The current
- paragraph's style is set with setParagType() and its alignment is
- set with setAlignment().
-
- Use setSelection() to select text. The setSelectionAttributes()
- function is used to indicate how selected text should be
- displayed. Use hasSelectedText() to find out if any text is
- selected. The currently selected text's position is available
- using getSelection() and the selected text itself is returned by
- selectedText(). The selection can be copied to the clipboard with
- copy(), or cut to the clipboard with cut(). It can be deleted with
- removeSelectedText(). The entire text can be selected (or
- unselected) using selectAll(). QTextEdit supports multiple
- selections. Most of the selection functions operate on the default
- selection, selection 0. If the user presses a non-selecting key,
- e.g. a cursor key without also holding down Shift, all selections
- are cleared.
-
- Set and get the position of the cursor with setCursorPosition()
- and getCursorPosition() respectively. When the cursor is moved,
- the signals currentFontChanged(), currentColorChanged() and
- currentAlignmentChanged() are emitted to reflect the font, color
- and alignment at the new cursor position.
-
- If the text changes, the textChanged() signal is emitted, and if
- the user inserts a new line by pressing Return or Enter,
- returnPressed() is emitted. The isModified() function will return
- TRUE if the text has been modified.
-
- QTextEdit provides command-based undo and redo. To set the depth
- of the command history use setUndoDepth() which defaults to 100
- steps. To undo or redo the last operation call undo() or redo().
- The signals undoAvailable() and redoAvailable() indicate whether
- the undo and redo operations can be executed.
-
- The indent() function is used to reindent a paragraph. It is
- useful for code editors, for example in <em>Qt Designer</em>'s
- code editor \e{Ctrl+I} invokes the indent() function.
+ setText() call. If you call setText() with legacy HTML (with
+ setTextFormat(RichText) in force), and then call text(), the text
+ that is returned may have different markup, but will render the
+ same. Text can be inserted with insert(), paste(), pasteSubType()
+ and append(). Text that is appended does not go into the undo
+ history; this makes append() faster and consumes less memory. Text
+ can also be cut(). The entire text is deleted with clear() and the
+ selected text is deleted with removeSelectedText(). Selected
+ (marked) text can also be deleted with del() (which will delete
+ the character to the right of the cursor if no text is selected).
@@ -245,2 +274,81 @@ static bool block_set_alignment = FALSE;
+ A read-only QTextEdit provides the same functionality as the
+ (obsolete) QTextView. (QTextView is still supplied for
+ compatibility with old code.)
+
+ \section2 Read-only key bindings
+
+ When QTextEdit is used read-only the key-bindings are limited to
+ navigation, and text may only be selected with the mouse:
+ \table
+ \header \i Keypresses \i Action
+ \row \i \e{UpArrow} \i Move one line up
+ \row \i \e{DownArrow} \i Move one line down
+ \row \i \e{LeftArrow} \i Move one character left
+ \row \i \e{RightArrow} \i Move one character right
+ \row \i \e{PageUp} \i Move one (viewport) page up
+ \row \i \e{PageDown} \i Move one (viewport) page down
+ \row \i \e{Home} \i Move to the beginning of the text
+ \row \i \e{End} \i Move to the end of the text
+ \row \i \e{Shift+Wheel} \i Scroll the page horizontally (the Wheel is the mouse wheel)
+ \row \i \e{Ctrl+Wheel} \i Zoom the text
+ \endtable
+
+ The text edit may be able to provide some meta-information. For
+ example, the documentTitle() function will return the text from
+ within HTML \c{<title>} tags.
+
+ The text displayed in a text edit has a \e context. The context is
+ a path which the text edit's QMimeSourceFactory uses to resolve
+ the locations of files and images. It is passed to the
+ mimeSourceFactory() when quering data. (See QTextEdit() and
+ \l{context()}.)
+
+ \section1 Using QTextEdit as an Editor
+
+ All the information about using QTextEdit as a display widget also
+ applies here.
+
+ The current format's attributes are set with setItalic(),
+ setBold(), setUnderline(), setFamily() (font family),
+ setPointSize(), setColor() and setCurrentFont(). The current
+ paragraph's alignment is set with setAlignment().
+
+ Use setSelection() to select text. The setSelectionAttributes()
+ function is used to indicate how selected text should be
+ displayed. Use hasSelectedText() to find out if any text is
+ selected. The currently selected text's position is available
+ using getSelection() and the selected text itself is returned by
+ selectedText(). The selection can be copied to the clipboard with
+ copy(), or cut to the clipboard with cut(). It can be deleted with
+ removeSelectedText(). The entire text can be selected (or
+ unselected) using selectAll(). QTextEdit supports multiple
+ selections. Most of the selection functions operate on the default
+ selection, selection 0. If the user presses a non-selecting key,
+ e.g. a cursor key without also holding down Shift, all selections
+ are cleared.
+
+ Set and get the position of the cursor with setCursorPosition()
+ and getCursorPosition() respectively. When the cursor is moved,
+ the signals currentFontChanged(), currentColorChanged() and
+ currentAlignmentChanged() are emitted to reflect the font, color
+ and alignment at the new cursor position.
+
+ If the text changes, the textChanged() signal is emitted, and if
+ the user inserts a new line by pressing Return or Enter,
+ returnPressed() is emitted. The isModified() function will return
+ TRUE if the text has been modified.
+
+ QTextEdit provides command-based undo and redo. To set the depth
+ of the command history use setUndoDepth() which defaults to 100
+ steps. To undo or redo the last operation call undo() or redo().
+ The signals undoAvailable() and redoAvailable() indicate whether
+ the undo and redo operations can be executed.
+
+ The indent() function is used to reindent a paragraph. It is
+ useful for code editors, for example in <em>Qt Designer</em>'s
+ code editor \e{Ctrl+I} invokes the indent() function.
+
+ \section2 Editing key bindings
+
The list of key-bindings which are implemented for editing:
@@ -297,39 +405,2 @@ static bool block_set_alignment = FALSE;
- QTextEdit can also be used as read-only text viewer. Call
- setReadOnly( TRUE ) to disable editing. A read-only QTextEdit
- provides the same functionality as the (obsolete) QTextView.
- (QTextView is still supplied for compatibility with old code.)
-
- When QTextEdit is used read-only the key-bindings are limited to
- navigation, and text may only be selected with the mouse:
- \table
- \header \i Keypresses \i Action
- \row \i \e{UpArrow} \i Move one line up
- \row \i \e{DownArrow} \i Move one line down
- \row \i \e{LeftArrow} \i Move one character left
- \row \i \e{RightArrow} \i Move one character right
- \row \i \e{PageUp} \i Move one (viewport) page up
- \row \i \e{PageDown} \i Move one (viewport) page down
- \row \i \e{Home} \i Move to the beginning of the text
- \row \i \e{End} \i Move to the end of the text
- \row \i \e{Shift+Wheel} \i Scroll the page horizontally (the Wheel is the mouse wheel)
- \row \i \e{Ctrl+Wheel} \i Zoom the text
- \endtable
-
- The text edit may be able to provide some meta-information. For
- example, the documentTitle() function will return the text from
- within HTML \c{<title>} tags.
-
- The text displayed in a text edit has a \e context. The context is
- a path which the text edit's QMimeSourceFactory uses to resolve
- the locations of files and images. It is passed to the
- mimeSourceFactory() when quering data. (See QTextEdit() and
- \l{context()}.)
-
- Note that we do not intend to add a full-featured web browser
- widget to Qt (because that would easily double Qt's size and only
- a few applications would benefit from it). The rich
- text support in Qt is designed to provide a fast, portable and
- efficient way to add reasonable online help facilities to
- applications, and to provide a basis for rich text editors.
*/
@@ -642,2 +713,4 @@ void QTextEdit::init()
doc->setFormatter( new QTextFormatterBreakWords );
+ doc->formatCollection()->defaultFormat()->setFont( QScrollView::font() );
+ doc->formatCollection()->defaultFormat()->setColor( colorGroup().color( QColorGroup::Text ) );
currentFormat = doc->formatCollection()->defaultFormat();
@@ -647,4 +720,4 @@ void QTextEdit::init()
viewport()->setAcceptDrops( TRUE );
- resizeContents( 0, doc->lastParag() ?
- ( doc->lastParag()->paragId() + 1 ) * doc->formatCollection()->defaultFormat()->height() : 0 );
+ resizeContents( 0, doc->lastParagraph() ?
+ ( doc->lastParagraph()->paragId() + 1 ) * doc->formatCollection()->defaultFormat()->height() : 0 );
@@ -660,3 +733,3 @@ void QTextEdit::init()
this, SLOT( formatMore() ) );
- lastFormatted = doc->firstParag();
+ lastFormatted = doc->firstParagraph();
@@ -715,6 +788,6 @@ void QTextEdit::paintDocument( bool drawAll, QPainter *p, int cx, int cy, int cw
- if ( lastFormatted == doc->lastParag() )
+ if ( lastFormatted == doc->lastParagraph() )
resizeContents( contentsWidth(), doc->height() );
- if ( contentsHeight() < visibleHeight() && ( !doc->lastParag() || doc->lastParag()->isValid() ) && drawAll )
+ if ( contentsHeight() < visibleHeight() && ( !doc->lastParagraph() || doc->lastParagraph()->isValid() ) && drawAll )
p->fillRect( 0, contentsHeight(), visibleWidth(),
@@ -815,6 +888,12 @@ bool QTextEdit::event( QEvent *e )
- if ( e->type() == QEvent::Show && d->ensureCursorVisibleInShowEvent ) {
- sync();
- ensureCursorVisible();
- d->ensureCursorVisibleInShowEvent = FALSE;
+ if ( e->type() == QEvent::Show ) {
+ if ( d->ensureCursorVisibleInShowEvent ) {
+ sync();
+ ensureCursorVisible();
+ d->ensureCursorVisibleInShowEvent = FALSE;
+ }
+ if ( !d->scrollToAnchor.isEmpty() ) {
+ scrollToAnchor( d->scrollToAnchor );
+ d->scrollToAnchor = QString::null;
+ }
}
@@ -847,3 +926,3 @@ void QTextEdit::keyPressEvent( QKeyEvent *e )
if ( selChanged ) {
- cursor->parag()->document()->nextDoubleBuffered = TRUE;
+ cursor->paragraph()->document()->nextDoubleBuffered = TRUE;
repaintChanged();
@@ -860,3 +939,3 @@ void QTextEdit::keyPressEvent( QKeyEvent *e )
CursorAction a;
- if ( cursor->parag()->string()->isRightToLeft() == (e->key() == Key_Right) )
+ if ( cursor->paragraph()->string()->isRightToLeft() == (e->key() == Key_Right) )
a = e->state() & ControlButton ? MoveWordBackward : MoveBackward;
@@ -888,8 +967,13 @@ void QTextEdit::keyPressEvent( QKeyEvent *e )
removeSelectedText();
+ if ( textFormat() == Qt::RichText && ( e->state() & ControlButton ) ) {
+ // Ctrl-Enter inserts a line break in rich text mode
+ insert( QString( QChar( 0x2028) ), TRUE, FALSE, TRUE );
+ } else {
#ifndef QT_NO_CURSOR
- viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
+ viewport()->setCursor( isReadOnly() ? arrowCursor : ibeamCursor );
#endif
- clearUndoRedoInfo = FALSE;
- doKeyboardAction( ActionReturn );
- emit returnPressed();
+ clearUndoRedoInfo = FALSE;
+ doKeyboardAction( ActionReturn );
+ emit returnPressed();
+ }
break;
@@ -913,2 +997,6 @@ void QTextEdit::keyPressEvent( QKeyEvent *e )
paste();
+#if defined (Q_WS_WIN)
+ else if ( e->state() & ControlButton )
+ copy();
+#endif
break;
@@ -920,6 +1008,2 @@ void QTextEdit::keyPressEvent( QKeyEvent *e )
- if ( !cursor->parag()->prev() &&
- cursor->atParagStart() )
- break;
-
doKeyboardAction( ActionBackspace );
@@ -945,7 +1029,10 @@ void QTextEdit::keyPressEvent( QKeyEvent *e )
if ( e->key() == Key_Tab ) {
- if ( textFormat() == Qt::RichText &&
- cursor->index() == 0 && cursor->parag()->style() &&
- cursor->parag()->style()->displayMode() ==
- QStyleSheetItem::DisplayListItem ) {
- cursor->parag()->incDepth();
+ if ( textFormat() == Qt::RichText && cursor->paragraph()->isListItem() ) {
+ clearUndoRedo();
+ undoRedoInfo.type = UndoRedoInfo::Style;
+ undoRedoInfo.id = cursor->paragraph()->paragId();
+ undoRedoInfo.eid = undoRedoInfo.id;
+ undoRedoInfo.styleInformation = QTextStyleCommand::readStyleInformation( doc, undoRedoInfo.id, undoRedoInfo.eid );
+ cursor->paragraph()->setListDepth( cursor->paragraph()->listDepth() +1 );
+ clearUndoRedo();
drawCursor( FALSE );
@@ -956,26 +1043,32 @@ void QTextEdit::keyPressEvent( QKeyEvent *e )
}
- if ( textFormat() == Qt::RichText && ( !cursor->parag()->style() ||
- cursor->parag()->style()->displayMode() == QStyleSheetItem::DisplayBlock ) &&
- cursor->index() == 0 && ( e->text()[0] == '-' || e->text()[0] == '*' ) ) {
- setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListDisc );
- cursor->parag()->incDepth();
- drawCursor( FALSE );
- repaintChanged();
- drawCursor( TRUE );
- } else {
- if ( overWrite && !cursor->atParagEnd() )
- cursor->remove();
- QString t = e->text();
- QTextParag *p = cursor->parag();
- if ( p && p->string() && p->string()->isRightToLeft() ) {
- QChar *c = (QChar *)t.unicode();
- int l = t.length();
- while( l-- ) {
- if ( c->mirrored() )
- *c = c->mirroredChar();
- c++;
- }
+
+ if ( textFormat() == Qt::RichText && !cursor->paragraph()->isListItem() ) {
+ if ( cursor->index() == 0 && ( e->text()[0] == '-' || e->text()[0] == '*' ) ) {
+ clearUndoRedo();
+ undoRedoInfo.type = UndoRedoInfo::Style;
+ undoRedoInfo.id = cursor->paragraph()->paragId();
+ undoRedoInfo.eid = undoRedoInfo.id;
+ undoRedoInfo.styleInformation = QTextStyleCommand::readStyleInformation( doc, undoRedoInfo.id, undoRedoInfo.eid );
+ setParagType( QStyleSheetItem::DisplayListItem, QStyleSheetItem::ListDisc );
+ clearUndoRedo();
+ drawCursor( FALSE );
+ repaintChanged();
+ drawCursor( TRUE );
+ break;
+ }
+ }
+ if ( overWrite && !cursor->atParagEnd() )
+ cursor->remove();
+ QString t = e->text();
+ QTextParagraph *p = cursor->paragraph();
+ if ( p && p->string() && p->string()->isRightToLeft() ) {
+ QChar *c = (QChar *)t.unicode();
+ int l = t.length();
+ while( l-- ) {
+ if ( c->mirrored() )
+ *c = c->mirroredChar();
+ c++;
}
- insert( t, TRUE, FALSE, TRUE );
}
+ insert( t, TRUE, FALSE, TRUE );
break;
@@ -1021,3 +1114,3 @@ void QTextEdit::keyPressEvent( QKeyEvent *e )
}
- if ( !cursor->parag()->prev() &&
+ if ( !cursor->paragraph()->prev() &&
cursor->atParagStart() )
@@ -1038,3 +1131,6 @@ void QTextEdit::keyPressEvent( QKeyEvent *e )
case Key_Z:
- undo();
+ if(e->state() & ShiftButton)
+ redo();
+ else
+ undo();
break;
@@ -1065,3 +1161,3 @@ void QTextEdit::keyPressEvent( QKeyEvent *e )
emit cursorPositionChanged( cursor );
- emit cursorPositionChanged( cursor->parag()->paragId(), cursor->index() );
+ emit cursorPositionChanged( cursor->paragraph()->paragId(), cursor->index() );
if ( clearUndoRedoInfo )
@@ -1086,3 +1182,3 @@ void QTextEdit::doKeyboardAction( KeyboardAction action )
- lastFormatted = cursor->parag();
+ lastFormatted = cursor->paragraph();
drawCursor( FALSE );
@@ -1091,28 +1187,34 @@ void QTextEdit::doKeyboardAction( KeyboardAction action )
switch ( action ) {
- case ActionDelete: {
- checkUndoRedoInfo( UndoRedoInfo::Delete );
- if ( !undoRedoInfo.valid() ) {
- undoRedoInfo.id = cursor->parag()->paragId();
- undoRedoInfo.index = cursor->index();
- undoRedoInfo.d->text = QString::null;
- }
- undoRedoInfo.d->text += cursor->parag()->at( cursor->index() )->c;
- if ( cursor->parag()->at( cursor->index() )->format() ) {
- cursor->parag()->at( cursor->index() )->format()->addRef();
- undoRedoInfo.d->text.at( undoRedoInfo.d->text.length() - 1 ).setFormat( cursor->parag()->at( cursor->index() )->format() );
- }
- QTextParag *old = cursor->parag();
- if ( cursor->remove() ) {
- if ( old != cursor->parag() && lastFormatted == old )
- lastFormatted = cursor->parag() ? cursor->parag()->prev() : 0;
- undoRedoInfo.d->text += "\n";
+ case ActionDelete:
+ if ( !cursor->atParagEnd() ) {
+ checkUndoRedoInfo( UndoRedoInfo::Delete );
+ if ( !undoRedoInfo.valid() ) {
+ undoRedoInfo.id = cursor->paragraph()->paragId();
+ undoRedoInfo.index = cursor->index();
+ undoRedoInfo.d->text = QString::null;
+ }
+ undoRedoInfo.d->text.insert( undoRedoInfo.d->text.length(), cursor->paragraph()->at( cursor->index() ), TRUE );
+ cursor->remove();
+ } else {
+ clearUndoRedo();
+ doc->setSelectionStart( QTextDocument::Temp, *cursor );
+ cursor->gotoNextLetter();
+ doc->setSelectionEnd( QTextDocument::Temp, *cursor );
+ removeSelectedText( QTextDocument::Temp );
}
- } break;
+ break;
case ActionBackspace:
- if ( textFormat() == Qt::RichText &&
- cursor->parag()->style() &&
- cursor->parag()->style()->displayMode() == QStyleSheetItem::DisplayListItem &&
- cursor->index() == 0 ) {
- cursor->parag()->decDepth();
- lastFormatted = cursor->parag();
+ if ( textFormat() == Qt::RichText && cursor->paragraph()->isListItem() && cursor->index() == 0 ) {
+ clearUndoRedo();
+ undoRedoInfo.type = UndoRedoInfo::Style;
+ undoRedoInfo.id = cursor->paragraph()->paragId();
+ undoRedoInfo.eid = undoRedoInfo.id;
+ undoRedoInfo.styleInformation = QTextStyleCommand::readStyleInformation( doc, undoRedoInfo.id, undoRedoInfo.eid );
+ int ldepth = cursor->paragraph()->listDepth();
+ ldepth = QMAX( ldepth-1, 0 );
+ cursor->paragraph()->setListDepth( ldepth );
+ if ( ldepth == 0 )
+ cursor->paragraph()->setListItem( FALSE );
+ clearUndoRedo();
+ lastFormatted = cursor->paragraph();
repaintChanged();
@@ -1121,27 +1223,26 @@ void QTextEdit::doKeyboardAction( KeyboardAction action )
}
- checkUndoRedoInfo( UndoRedoInfo::Delete );
- if ( !undoRedoInfo.valid() ) {
- undoRedoInfo.id = cursor->parag()->paragId();
- undoRedoInfo.index = cursor->index();
- undoRedoInfo.d->text = QString::null;
- }
- cursor->gotoPreviousLetter();
- undoRedoInfo.d->text.prepend( QString( cursor->parag()->at( cursor->index() )->c ) );
- if ( cursor->parag()->at( cursor->index() )->format() ) {
- cursor->parag()->at( cursor->index() )->format()->addRef();
- undoRedoInfo.d->text.at( 0 ).setFormat( cursor->parag()->at( cursor->index() )->format() );
- }
- undoRedoInfo.index = cursor->index();
- if ( cursor->remove() ) {
- undoRedoInfo.d->text.remove( 0, 1 );
- undoRedoInfo.d->text.prepend( "\n" );
+ if ( !cursor->atParagStart() ) {
+ checkUndoRedoInfo( UndoRedoInfo::Delete );
+ if ( !undoRedoInfo.valid() ) {
+ undoRedoInfo.id = cursor->paragraph()->paragId();
+ undoRedoInfo.index = cursor->index();
+ undoRedoInfo.d->text = QString::null;
+ }
+ cursor->gotoPreviousLetter();
+ undoRedoInfo.d->text.insert( 0, cursor->paragraph()->at( cursor->index() ), TRUE );
undoRedoInfo.index = cursor->index();
- undoRedoInfo.id = cursor->parag()->paragId();
+ cursor->remove();
+ lastFormatted = cursor->paragraph();
+ } else if ( cursor->paragraph()->prev() ){
+ clearUndoRedo();
+ doc->setSelectionStart( QTextDocument::Temp, *cursor );
+ cursor->gotoPreviousLetter();
+ doc->setSelectionEnd( QTextDocument::Temp, *cursor );
+ removeSelectedText( QTextDocument::Temp );
}
- lastFormatted = cursor->parag();
break;
- case ActionReturn: {
+ case ActionReturn:
checkUndoRedoInfo( UndoRedoInfo::Return );
if ( !undoRedoInfo.valid() ) {
- undoRedoInfo.id = cursor->parag()->paragId();
+ undoRedoInfo.id = cursor->paragraph()->paragId();
undoRedoInfo.index = cursor->index();
@@ -1150,5 +1251,5 @@ void QTextEdit::doKeyboardAction( KeyboardAction action )
undoRedoInfo.d->text += "\n";
- cursor->splitAndInsertEmptyParag();
- if ( cursor->parag()->prev() ) {
- lastFormatted = cursor->parag()->prev();
+ cursor->splitAndInsertEmptyParagraph();
+ if ( cursor->paragraph()->prev() ) {
+ lastFormatted = cursor->paragraph()->prev();
lastFormatted->invalidate( 0 );
@@ -1156,35 +1257,13 @@ void QTextEdit::doKeyboardAction( KeyboardAction action )
doUpdateCurrentFormat = FALSE;
- } break;
- case ActionKill:
- checkUndoRedoInfo( UndoRedoInfo::Delete );
- if ( !undoRedoInfo.valid() ) {
- undoRedoInfo.id = cursor->parag()->paragId();
- undoRedoInfo.index = cursor->index();
- undoRedoInfo.d->text = QString::null;
- }
- if ( cursor->atParagEnd() ) {
- undoRedoInfo.d->text += cursor->parag()->at( cursor->index() )->c;
- if ( cursor->parag()->at( cursor->index() )->format() ) {
- cursor->parag()->at( cursor->index() )->format()->addRef();
- undoRedoInfo.d->text.at( undoRedoInfo.d->text.length() - 1 ).setFormat( cursor->parag()->at( cursor->index() )->format() );
- }
- QTextParag *old = cursor->parag();
- if ( cursor->remove() ) {
- if ( old != cursor->parag() && lastFormatted == old )
- lastFormatted = cursor->parag() ? cursor->parag()->prev() : 0;
- undoRedoInfo.d->text += "\n";
- }
- } else {
- int oldLen = undoRedoInfo.d->text.length();
- undoRedoInfo.d->text += cursor->parag()->string()->toString().mid( cursor->index() );
- for ( int i = cursor->index(); i < cursor->parag()->length(); ++i ) {
- if ( cursor->parag()->at( i )->format() ) {
- cursor->parag()->at( i )->format()->addRef();
- undoRedoInfo.d->text.at( oldLen + i - cursor->index() ).setFormat( cursor->parag()->at( i )->format() );
- }
- }
- undoRedoInfo.d->text.remove( undoRedoInfo.d->text.length() - 1, 1 );
- cursor->killLine();
- }
break;
+ case ActionKill:
+ clearUndoRedo();
+ doc->setSelectionStart( QTextDocument::Temp, *cursor );
+ if ( cursor->atParagEnd() )
+ cursor->gotoNextLetter();
+ else
+ cursor->setIndex( cursor->paragraph()->length() - 1 );
+ doc->setSelectionEnd( QTextDocument::Temp, *cursor );
+ removeSelectedText( QTextDocument::Temp );
+ break;
}
@@ -1195,12 +1274,3 @@ void QTextEdit::doKeyboardAction( KeyboardAction action )
drawCursor( TRUE );
-
- if ( hasFocus() || viewport()->hasFocus() ) {
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
- if ( !readonly ) {
- QFont f = cursor->parag()->at( cursor->index() )->format()->font();
- setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
- cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE );
- }
- }
-
+ updateMicroFocusHint();
if ( doUpdateCurrentFormat )
@@ -1211,58 +1281,34 @@ void QTextEdit::doKeyboardAction( KeyboardAction action )
-void QTextEdit::readFormats( QTextCursor &c1, QTextCursor &c2, int oldLen, QTextString &text, bool fillStyles )
+void QTextEdit::readFormats( QTextCursor &c1, QTextCursor &c2, QTextString &text, bool fillStyles )
{
+ QDataStream styleStream( undoRedoInfo.styleInformation, IO_WriteOnly );
c2.restoreState();
c1.restoreState();
- if ( c1.parag() == c2.parag() ) {
- for ( int i = c1.index(); i < c2.index(); ++i ) {
- if ( c1.parag()->at( i )->format() ) {
- c1.parag()->at( i )->format()->addRef();
- text.at( oldLen + i - c1.index() ).setFormat( c1.parag()->at( i )->format() );
- }
- }
+ int lastIndex = text.length();
+ if ( c1.paragraph() == c2.paragraph() ) {
+ for ( int i = c1.index(); i < c2.index(); ++i )
+ text.insert( lastIndex + i - c1.index(), c1.paragraph()->at( i ), TRUE );
if ( fillStyles ) {
- undoRedoInfo.oldAligns[ 0 ] = c1.parag()->alignment();
- undoRedoInfo.oldStyles << c1.parag()->styleSheetItems();
- undoRedoInfo.oldListStyles << c1.parag()->listStyle();
+ styleStream << (int) 1;
+ c1.paragraph()->writeStyleInformation( styleStream );
}
} else {
- int lastIndex = oldLen;
int i;
- for ( i = c1.index(); i < c1.parag()->length(); ++i ) {
- if ( c1.parag()->at( i )->format() ) {
- c1.parag()->at( i )->format()->addRef();
- text.at( lastIndex ).setFormat( c1.parag()->at( i )->format() );
- lastIndex++;
- }
- }
- QTextParag *p = c1.parag()->next();
- while ( p && p != c2.parag() ) {
- for ( int i = 0; i < p->length(); ++i ) {
- if ( p->at( i )->format() ) {
- p->at( i )->format()->addRef();
- text.at( i + lastIndex ).setFormat( p->at( i )->format() );
- }
- }
- lastIndex += p->length();
+ for ( i = c1.index(); i < c1.paragraph()->length()-1; ++i )
+ text.insert( lastIndex++, c1.paragraph()->at( i ), TRUE );
+ int num = 2; // start and end, being different
+ text += "\n"; lastIndex++;
+ QTextParagraph *p = c1.paragraph()->next();
+ while ( p && p != c2.paragraph() ) {
+ for ( i = 0; i < p->length()-1; ++i )
+ text.insert( lastIndex++ , p->at( i ), TRUE );
+ text += "\n"; num++; lastIndex++;
p = p->next();
}
- for ( i = 0; i < c2.index(); ++i ) {
- if ( c2.parag()->at( i )->format() ) {
- c2.parag()->at( i )->format()->addRef();
- text.at( i + lastIndex ).setFormat( c2.parag()->at( i )->format() );
- }
- }
+ for ( i = 0; i < c2.index(); ++i )
+ text.insert( i + lastIndex, c2.paragraph()->at( i ), TRUE );
if ( fillStyles ) {
- QTextParag *p = c1.parag();
- i = 0;
- while ( p ) {
- if ( i < (int)undoRedoInfo.oldAligns.size() )
- undoRedoInfo.oldAligns[ i ] = p->alignment();
- undoRedoInfo.oldStyles << p->styleSheetItems();
- undoRedoInfo.oldListStyles << p->listStyle();
- if ( p == c2.parag() )
- break;
- p = p->next();
- ++i;
- }
+ styleStream << num;
+ for ( QTextParagraph *p = c1.paragraph(); --num >= 0; p = p->next() )
+ p->writeStyleInformation( styleStream );
}
@@ -1296,5 +1342,7 @@ void QTextEdit::removeSelectedText( int selNum )
QTextCursor c1 = doc->selectionStartCursor( selNum );
+ c1.restoreState();
QTextCursor c2 = doc->selectionEndCursor( selNum );
+ c2.restoreState();
- // ### no support for editing tables yet
+ // ### no support for editing tables yet, plus security for broken selections
if ( c1.nestedDepth() || c2.nestedDepth() )
@@ -1314,6 +1362,5 @@ void QTextEdit::removeSelectedText( int selNum )
}
- int oldLen = undoRedoInfo.d->text.length();
- undoRedoInfo.d->text = doc->selectedText( selNum, FALSE );
- undoRedoInfo.oldAligns.resize( undoRedoInfo.oldAligns.size() + QMAX( 0, c2.parag()->paragId() - c1.parag()->paragId() + 1 ) );
- readFormats( c1, c2, oldLen, undoRedoInfo.d->text, TRUE );
+ readFormats( c1, c2, undoRedoInfo.d->text, TRUE );
+
+
doc->removeSelectedText( selNum, cursor );
@@ -1321,3 +1368,3 @@ void QTextEdit::removeSelectedText( int selNum )
ensureCursorVisible();
- lastFormatted = cursor->parag();
+ lastFormatted = cursor->paragraph();
formatMore();
@@ -1336,14 +1383,6 @@ void QTextEdit::removeSelectedText( int selNum )
#endif
- if ( hasFocus() || viewport()->hasFocus() ) {
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
- if ( !readonly ) {
- QFont f = cursor->parag()->at( cursor->index() )->format()->font();
- setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
- cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE );
- }
- }
+ updateMicroFocusHint();
} else {
- cursor->setDocument( doc );
- cursor->setParag( doc->firstParag() );
- cursor->setIndex( 0 );
+ delete cursor;
+ cursor = new QTextCursor( doc );
drawCursor( TRUE );
@@ -1367,6 +1406,6 @@ void QTextEdit::moveCursor( CursorAction action, bool select )
if ( !doc->hasSelection( QTextDocument::Standard ) )
- doc->setSelectionStart( QTextDocument::Standard, cursor );
+ doc->setSelectionStart( QTextDocument::Standard, *cursor );
moveCursor( action );
- if ( doc->setSelectionEnd( QTextDocument::Standard, cursor ) ) {
- cursor->parag()->document()->nextDoubleBuffered = TRUE;
+ if ( doc->setSelectionEnd( QTextDocument::Standard, *cursor ) ) {
+ cursor->paragraph()->document()->nextDoubleBuffered = TRUE;
repaintChanged();
@@ -1385,3 +1424,3 @@ void QTextEdit::moveCursor( CursorAction action, bool select )
} else {
- cursor->parag()->document()->nextDoubleBuffered = TRUE;
+ cursor->paragraph()->document()->nextDoubleBuffered = TRUE;
repaintChanged();
@@ -1401,10 +1440,3 @@ void QTextEdit::moveCursor( CursorAction action, bool select )
updateCurrentFormat();
- if ( hasFocus() || viewport()->hasFocus() ) {
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
- if ( !readonly ) {
- QFont f = cursor->parag()->at( cursor->index() )->format()->font();
- setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
- cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE );
- }
- }
+ updateMicroFocusHint();
}
@@ -1451,3 +1483,3 @@ void QTextEdit::moveCursor( CursorAction action )
case MoveEnd:
- ensureFormatted( doc->lastParag() );
+ ensureFormatted( doc->lastParagraph() );
cursor->gotoEnd();
@@ -1455,11 +1487,3 @@ void QTextEdit::moveCursor( CursorAction action )
}
-
- if ( hasFocus() || viewport()->hasFocus() ) {
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
- if ( !readonly ) {
- QFont f = cursor->parag()->at( cursor->index() )->format()->font();
- setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
- cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE );
- }
- }
+ updateMicroFocusHint();
updateCurrentFormat();
@@ -1472,2 +1496,4 @@ void QTextEdit::resizeEvent( QResizeEvent *e )
QScrollView::resizeEvent( e );
+ if ( doc->visibleWidth() == 0 )
+ doResize();
}
@@ -1479,8 +1505,11 @@ void QTextEdit::viewportResizeEvent( QResizeEvent *e )
QScrollView::viewportResizeEvent( e );
- if ( e->oldSize().width() != e->size().width() )
+ if ( e->oldSize().width() != e->size().width() ) {
+ bool stayAtBottom = e->oldSize().height() != e->size().height() &&
+ contentsY() > 0 && contentsY() >= doc->height() - e->oldSize().height();
doResize();
+ if ( stayAtBottom )
+ scrollToBottom();
+ }
}
-static bool blockEnsureCursorVisible = FALSE;
-
/*!
@@ -1494,4 +1523,2 @@ void QTextEdit::ensureCursorVisible()
{
- if ( blockEnsureCursorVisible )
- return;
if ( !isVisible() ) {
@@ -1500,10 +1527,10 @@ void QTextEdit::ensureCursorVisible()
}
- lastFormatted = cursor->parag();
+ lastFormatted = cursor->paragraph();
formatMore();
- QTextStringChar *chr = cursor->parag()->at( cursor->index() );
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
- int x = cursor->parag()->rect().x() + chr->x + cursor->offsetX();
+ QTextStringChar *chr = cursor->paragraph()->at( cursor->index() );
+ int h = cursor->paragraph()->lineHeightOfChar( cursor->index() );
+ int x = cursor->paragraph()->rect().x() + chr->x + cursor->offsetX();
int y = 0; int dummy;
- cursor->parag()->lineHeightOfChar( cursor->index(), &dummy, &y );
- y += cursor->parag()->rect().y() + cursor->offsetY();
+ cursor->paragraph()->lineHeightOfChar( cursor->index(), &dummy, &y );
+ y += cursor->paragraph()->rect().y() + cursor->offsetY();
int w = 1;
@@ -1519,4 +1546,4 @@ void QTextEdit::drawCursor( bool visible )
!viewport()->isUpdatesEnabled() ||
- !cursor->parag() ||
- !cursor->parag()->isValid() ||
+ !cursor->paragraph() ||
+ !cursor->paragraph()->isValid() ||
!selectedText().isEmpty() ||
@@ -1527,4 +1554,4 @@ void QTextEdit::drawCursor( bool visible )
QPainter p( viewport() );
- QRect r( cursor->topParag()->rect() );
- cursor->parag()->setChanged( TRUE );
+ QRect r( cursor->topParagraph()->rect() );
+ cursor->paragraph()->setChanged( TRUE );
p.translate( -contentsX() + cursor->totalOffsetX(), -contentsY() + cursor->totalOffsetY() );
@@ -1532,4 +1559,4 @@ void QTextEdit::drawCursor( bool visible )
QColorGroup cg( colorGroup() );
- if ( cursor->parag()->background() )
- cg.setBrush( QColorGroup::Base, *cursor->parag()->background() );
+ if ( cursor->paragraph()->background() )
+ cg.setBrush( QColorGroup::Base, *cursor->paragraph()->background() );
else if ( doc->paper() )
@@ -1537,7 +1564,7 @@ void QTextEdit::drawCursor( bool visible )
p.setBrushOrigin( -contentsX(), -contentsY() );
- cursor->parag()->document()->nextDoubleBuffered = TRUE;
+ cursor->paragraph()->document()->nextDoubleBuffered = TRUE;
if ( !cursor->nestedDepth() ) {
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ int h = cursor->paragraph()->lineHeightOfChar( cursor->index() );
int dist = 5;
- if ( ( cursor->parag()->alignment() & Qt3::AlignJustify ) == Qt3::AlignJustify )
+ if ( ( cursor->paragraph()->alignment() & Qt3::AlignJustify ) == Qt3::AlignJustify )
dist = 50;
@@ -1547,6 +1574,6 @@ void QTextEdit::drawCursor( bool visible )
r.y() - cursor->totalOffsetY() + cursor->y() - contentsY(), 2 * dist, h ) );
- doc->drawParag( &p, cursor->parag(), x,
+ doc->drawParagraph( &p, cursor->paragraph(), x,
r.y() - cursor->totalOffsetY() + cursor->y(), 2 * dist, h, pix, cg, visible, cursor );
} else {
- doc->drawParag( &p, cursor->parag(), r.x() - cursor->totalOffsetX(),
+ doc->drawParagraph( &p, cursor->paragraph(), r.x() - cursor->totalOffsetX(),
r.y() - cursor->totalOffsetY(), r.width(), r.height(),
@@ -1604,5 +1631,5 @@ void QTextEdit::contentsMousePressEvent( QMouseEvent *e )
placeCursor( e->pos(), &c, TRUE );
- if ( c.parag() && c.parag()->at( c.index() ) &&
- c.parag()->at( c.index() )->isAnchor() ) {
- pressedLink = c.parag()->at( c.index() )->anchorHref();
+ if ( c.paragraph() && c.paragraph()->at( c.index() ) &&
+ c.paragraph()->at( c.index() )->isAnchor() ) {
+ pressedLink = c.paragraph()->at( c.index() )->anchorHref();
}
@@ -1624,5 +1651,5 @@ void QTextEdit::contentsMousePressEvent( QMouseEvent *e )
redraw = doc->removeSelection( QTextDocument::Standard );
- doc->setSelectionStart( QTextDocument::Standard, cursor );
+ doc->setSelectionStart( QTextDocument::Standard, *cursor );
} else {
- redraw = doc->setSelectionEnd( QTextDocument::Standard, cursor ) || redraw;
+ redraw = doc->setSelectionEnd( QTextDocument::Standard, *cursor ) || redraw;
}
@@ -1630,6 +1657,6 @@ void QTextEdit::contentsMousePressEvent( QMouseEvent *e )
if ( isReadOnly() || !( e->state() & ShiftButton ) ) {
- doc->setSelectionStart( QTextDocument::Standard, cursor );
+ doc->setSelectionStart( QTextDocument::Standard, *cursor );
} else {
- doc->setSelectionStart( QTextDocument::Standard, &c );
- redraw = doc->setSelectionEnd( QTextDocument::Standard, cursor ) || redraw;
+ doc->setSelectionStart( QTextDocument::Standard, c );
+ redraw = doc->setSelectionEnd( QTextDocument::Standard, *cursor ) || redraw;
}
@@ -1716,3 +1743,3 @@ void QTextEdit::contentsMouseReleaseEvent( QMouseEvent * e )
emit cursorPositionChanged( cursor );
- emit cursorPositionChanged( cursor->parag()->paragId(), cursor->index() );
+ emit cursorPositionChanged( cursor->paragraph()->paragId(), cursor->index() );
if ( oldCursor != *cursor )
@@ -1746,9 +1773,9 @@ void QTextEdit::contentsMouseDoubleClickEvent( QMouseEvent * )
QTextCursor c2 = *cursor;
- if ( cursor->index() > 0 && !cursor->parag()->at( cursor->index()-1 )->c.isSpace() )
+ if ( cursor->index() > 0 && !cursor->paragraph()->at( cursor->index()-1 )->c.isSpace() )
c1.gotoPreviousWord();
- if ( !cursor->parag()->at( cursor->index() )->c.isSpace() && !cursor->atParagEnd() )
+ if ( !cursor->paragraph()->at( cursor->index() )->c.isSpace() && !cursor->atParagEnd() )
c2.gotoNextWord();
- doc->setSelectionStart( QTextDocument::Standard, &c1 );
- doc->setSelectionEnd( QTextDocument::Standard, &c2 );
+ doc->setSelectionStart( QTextDocument::Standard, c1 );
+ doc->setSelectionEnd( QTextDocument::Standard, c2 );
@@ -1808,5 +1835,38 @@ void QTextEdit::contentsDropEvent( QDropEvent *e )
if ( QTextDrag::decode( e, text ) ) {
- if ( ( e->source() == this ||
- e->source() == viewport() ) &&
- e->action() == QDropEvent::Move ) {
+ bool hasSel = doc->hasSelection( QTextDocument::Standard );
+ bool internalDrag = e->source() == this || e->source() == viewport();
+ int dropId, dropIndex;
+ QTextCursor insertCursor = *cursor;
+ dropId = cursor->paragraph()->paragId();
+ dropIndex = cursor->index();
+ if ( hasSel && internalDrag ) {
+ QTextCursor c1, c2;
+ int selStartId, selStartIndex;
+ int selEndId, selEndIndex;
+ c1 = doc->selectionStartCursor( QTextDocument::Standard );
+ c1.restoreState();
+ c2 = doc->selectionEndCursor( QTextDocument::Standard );
+ c2.restoreState();
+ selStartId = c1.paragraph()->paragId();
+ selStartIndex = c1.index();
+ selEndId = c2.paragraph()->paragId();
+ selEndIndex = c2.index();
+ if ( ( ( dropId > selStartId ) ||
+ ( dropId == selStartId && dropIndex > selStartIndex ) ) &&
+ ( ( dropId < selEndId ) ||
+ ( dropId == selEndId && dropIndex <= selEndIndex ) ) )
+ insertCursor = c1;
+ if ( dropId == selEndId && dropIndex > selEndIndex ) {
+ insertCursor = c1;
+ if ( selStartId == selEndId ) {
+ insertCursor.setIndex( dropIndex -
+ ( selEndIndex - selStartIndex ) );
+ } else {
+ insertCursor.setIndex( dropIndex - selEndIndex +
+ selStartIndex );
+ }
+ }
+ }
+
+ if ( internalDrag && e->action() == QDropEvent::Move ) {
removeSelectedText();
@@ -1820,3 +1880,4 @@ void QTextEdit::contentsDropEvent( QDropEvent *e )
drawCursor( FALSE );
- placeCursor( e->pos(), cursor );
+ cursor->setParagraph( insertCursor.paragraph() );
+ cursor->setIndex( insertCursor.index() );
drawCursor( TRUE );
@@ -1861,9 +1922,9 @@ void QTextEdit::handleMouseMove( const QPoint& pos )
- int diff = QABS( oldCursor.parag()->at( oldCursor.index() )->x - mousePos.x() );
- int ldiff = QABS( cl.parag()->at( cl.index() )->x - mousePos.x() );
- int rdiff = QABS( cr.parag()->at( cr.index() )->x - mousePos.x() );
+ int diff = QABS( oldCursor.paragraph()->at( oldCursor.index() )->x - mousePos.x() );
+ int ldiff = QABS( cl.paragraph()->at( cl.index() )->x - mousePos.x() );
+ int rdiff = QABS( cr.paragraph()->at( cr.index() )->x - mousePos.x() );
- if ( cursor->parag()->lineStartOfChar( cursor->index() ) !=
- oldCursor.parag()->lineStartOfChar( oldCursor.index() ) )
+ if ( cursor->paragraph()->lineStartOfChar( cursor->index() ) !=
+ oldCursor.paragraph()->lineStartOfChar( oldCursor.index() ) )
diff = 0xFFFFFF;
@@ -1882,3 +1943,3 @@ void QTextEdit::handleMouseMove( const QPoint& pos )
if ( doc->hasSelection( QTextDocument::Standard ) ) {
- redraw = doc->setSelectionEnd( QTextDocument::Standard, cursor ) || redraw;
+ redraw = doc->setSelectionEnd( QTextDocument::Standard, *cursor ) || redraw;
}
@@ -1892,5 +1953,5 @@ void QTextEdit::handleMouseMove( const QPoint& pos )
- if ( currentFormat && currentFormat->key() != cursor->parag()->at( cursor->index() )->format()->key() ) {
+ if ( currentFormat && currentFormat->key() != cursor->paragraph()->at( cursor->index() )->format()->key() ) {
currentFormat->removeRef();
- currentFormat = doc->formatCollection()->format( cursor->parag()->at( cursor->index() )->format() );
+ currentFormat = doc->formatCollection()->format( cursor->paragraph()->at( cursor->index() )->format() );
if ( currentFormat->isMisspelled() ) {
@@ -1904,4 +1965,4 @@ void QTextEdit::handleMouseMove( const QPoint& pos )
- if ( currentAlignment != cursor->parag()->alignment() ) {
- currentAlignment = cursor->parag()->alignment();
+ if ( currentAlignment != cursor->paragraph()->alignment() ) {
+ currentAlignment = cursor->paragraph()->alignment();
block_set_alignment = TRUE;
@@ -1927,10 +1988,20 @@ void QTextEdit::placeCursor( const QPoint &pos, QTextCursor *c, bool link )
c->restoreState();
- QTextParag *s = doc->firstParag();
+ QTextParagraph *s = doc->firstParagraph();
c->place( pos, s, link );
+ updateMicroFocusHint();
+}
+
+
+void QTextEdit::updateMicroFocusHint()
+{
+ QTextCursor c( *cursor );
+ if ( d->preeditStart != -1 )
+ c.setIndex( d->preeditStart );
+
if ( hasFocus() || viewport()->hasFocus() ) {
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
+ int h = c.paragraph()->lineHeightOfChar( cursor->index() );
if ( !readonly ) {
- QFont f = cursor->parag()->at( cursor->index() )->format()->font();
- setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
- cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE );
+ QFont f = c.paragraph()->at( c.index() )->format()->font();
+ setMicroFocusHint( c.x() - contentsX() + frameWidth(),
+ c.y() + cursor->paragraph()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE );
}
@@ -1939,2 +2010,4 @@ void QTextEdit::placeCursor( const QPoint &pos, QTextCursor *c, bool link )
+
+
void QTextEdit::formatMore()
@@ -1946,3 +2019,3 @@ void QTextEdit::formatMore()
int lastBottom = -1;
- int to = !sender() ? 2 : 20;
+ int to = 20;
bool firstVisible = FALSE;
@@ -1963,6 +2036,10 @@ void QTextEdit::formatMore()
- if ( bottom > contentsHeight() )
+ if ( bottom > contentsHeight() ) {
resizeContents( contentsWidth(), QMAX( doc->height(), bottom ) );
- else if ( lastBottom != -1 && lastBottom < contentsHeight() )
- resizeContents( contentsWidth(), QMAX( doc->height(), lastBottom ) );
+ } else if ( lastBottom != -1 && lastBottom < contentsHeight() ) {
+ resizeContents( contentsWidth(), QMAX( doc->height(), lastBottom ) );
+ if ( contentsHeight() < visibleHeight() )
+ updateContents( 0, contentsHeight(), visibleWidth(),
+ visibleHeight() - contentsHeight() );
+ }
@@ -1982,3 +2059,3 @@ void QTextEdit::doResize()
doc->invalidate();
- lastFormatted = doc->firstParag();
+ lastFormatted = doc->firstParagraph();
interval = 0;
@@ -2003,12 +2080,3 @@ bool QTextEdit::eventFilter( QObject *o, QEvent *e )
drawCursor( TRUE );
-
- if ( !readonly ) {
- // make sure the micro focus hint is updated...
- QFont f = cursor->parag()->at( cursor->index() )->format()->font();
- setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
- cursor->y() + cursor->parag()->rect().y() -
- contentsY() + frameWidth(), 0,
- cursor->parag()->lineHeightOfChar( cursor->index() ),
- TRUE );
- }
+ updateMicroFocusHint();
} else if ( e->type() == QEvent::FocusOut ) {
@@ -2022,10 +2090,10 @@ bool QTextEdit::eventFilter( QObject *o, QEvent *e )
-/*!
- Inserts \a text at the current cursor position. If \a indent is TRUE,
- the paragraph is re-indented. If \a checkNewLine is TRUE, newline
- characters in \a text result in hard line breaks (i.e. new
- paragraphs). If \a checkNewLine is FALSE the behaviour of the editor
- is undefined if the \a text contains newlines. If \a removeSelected is
- TRUE, any selected text (in selection 0) is removed before the text is
- inserted.
+/*! Inserts \a text at the current cursor position. If \a indent is
+ TRUE, the paragraph is re-indented. If \a checkNewLine is TRUE,
+ newline characters in \a text result in hard line breaks (i.e. new
+ paragraphs). If \a checkNewLine is FALSE and there are newlines in
+ \a text, the behavior is undefined. If \a checkNewLine is FALSE the
+ behaviour of the editor is undefined if the \a text contains
+ newlines. If \a removeSelected is TRUE, any selected text (in
+ selection 0) is removed before the text is inserted.
@@ -2048,3 +2116,3 @@ void QTextEdit::insert( const QString &text, bool indent, bool checkNewLine, boo
if ( !undoRedoInfo.valid() ) {
- undoRedoInfo.id = cursor->parag()->paragId();
+ undoRedoInfo.id = cursor->paragraph()->paragId();
undoRedoInfo.index = cursor->index();
@@ -2055,4 +2123,4 @@ void QTextEdit::insert( const QString &text, bool indent, bool checkNewLine, boo
- lastFormatted = checkNewLine && cursor->parag()->prev() ?
- cursor->parag()->prev() : cursor->parag();
+ lastFormatted = checkNewLine && cursor->paragraph()->prev() ?
+ cursor->paragraph()->prev() : cursor->paragraph();
QTextCursor oldCursor = *cursor;
@@ -2060,4 +2128,4 @@ void QTextEdit::insert( const QString &text, bool indent, bool checkNewLine, boo
if ( doc->useFormatCollection() ) {
- doc->setSelectionStart( QTextDocument::Temp, &oldCursor );
- doc->setSelectionEnd( QTextDocument::Temp, cursor );
+ doc->setSelectionStart( QTextDocument::Temp, oldCursor );
+ doc->setSelectionEnd( QTextDocument::Temp, *cursor );
doc->setFormat( QTextDocument::Temp, currentFormat, QTextFormat::Format );
@@ -2077,5 +2145,5 @@ void QTextEdit::insert( const QString &text, bool indent, bool checkNewLine, boo
for ( int i = 0; i < (int)txt.length(); ++i ) {
- if ( txt[ i ] != '\n' && c2.parag()->at( c2.index() )->format() ) {
- c2.parag()->at( c2.index() )->format()->addRef();
- undoRedoInfo.d->text.setFormat( oldLen + i, c2.parag()->at( c2.index() )->format(), TRUE );
+ if ( txt[ i ] != '\n' && c2.paragraph()->at( c2.index() )->format() ) {
+ c2.paragraph()->at( c2.index() )->format()->addRef();
+ undoRedoInfo.d->text.setFormat( oldLen + i, c2.paragraph()->at( c2.index() )->format(), TRUE );
}
@@ -2086,17 +2154,10 @@ void QTextEdit::insert( const QString &text, bool indent, bool checkNewLine, boo
- setModified();
- emit textChanged();
if ( !removeSelected ) {
- doc->setSelectionStart( QTextDocument::Standard, &oldCursor );
- doc->setSelectionEnd( QTextDocument::Standard, cursor );
+ doc->setSelectionStart( QTextDocument::Standard, oldCursor );
+ doc->setSelectionEnd( QTextDocument::Standard, *cursor );
repaintChanged();
}
- if ( hasFocus() || viewport()->hasFocus() ) {
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
- if ( !readonly ) {
- QFont f = cursor->parag()->at( cursor->index() )->format()->font();
- setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
- cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE );
- }
- }
+ updateMicroFocusHint();
+ setModified();
+ emit textChanged();
}
@@ -2107,3 +2168,4 @@ void QTextEdit::insertAt( const QString &text, int para, int index )
{
- QTextParag *p = doc->paragAt( para );
+ removeSelection( QTextDocument::Standard );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
@@ -2111,3 +2173,3 @@ void QTextEdit::insertAt( const QString &text, int para, int index )
QTextCursor tmp = *cursor;
- cursor->setParag( p );
+ cursor->setParagraph( p );
cursor->setIndex( index );
@@ -2124,9 +2186,9 @@ void QTextEdit::insertParagraph( const QString &text, int para )
{
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( p ) {
QTextCursor tmp( doc );
- tmp.setParag( p );
+ tmp.setParagraph( p );
tmp.setIndex( 0 );
tmp.insert( text, TRUE );
- tmp.splitAndInsertEmptyParag();
+ tmp.splitAndInsertEmptyParagraph();
repaintChanged();
@@ -2141,3 +2203,3 @@ void QTextEdit::removeParagraph( int para )
{
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
@@ -2147,3 +2209,3 @@ void QTextEdit::removeParagraph( int para )
- if ( p == doc->firstParag() && p == doc->lastParag() ) {
+ if ( p == doc->firstParagraph() && p == doc->lastParagraph() ) {
p->remove( 0, p->length() - 1 );
@@ -2153,3 +2215,3 @@ void QTextEdit::removeParagraph( int para )
drawCursor( FALSE );
- bool resetCursor = cursor->parag() == p;
+ bool resetCursor = cursor->paragraph() == p;
if ( p->prev() )
@@ -2157,3 +2219,3 @@ void QTextEdit::removeParagraph( int para )
else
- doc->setFirstParag( p->next() );
+ doc->setFirstParagraph( p->next() );
if ( p->next() )
@@ -2161,4 +2223,4 @@ void QTextEdit::removeParagraph( int para )
else
- doc->setLastParag( p->prev() );
- QTextParag *start = p->next();
+ doc->setLastParagraph( p->prev() );
+ QTextParagraph *start = p->next();
int h = p->rect().height();
@@ -2176,3 +2238,3 @@ void QTextEdit::removeParagraph( int para )
if ( resetCursor ) {
- cursor->setParag( doc->firstParag() );
+ cursor->setParagraph( doc->firstParagraph() );
cursor->setIndex( 0 );
@@ -2219,12 +2281,5 @@ void QTextEdit::undo()
drawCursor( TRUE );
+ updateMicroFocusHint();
setModified();
emit textChanged();
- if ( hasFocus() || viewport()->hasFocus() ) {
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
- if ( !readonly ) {
- QFont f = cursor->parag()->at( cursor->index() )->format()->font();
- setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
- cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE );
- }
- }
}
@@ -2264,12 +2319,5 @@ void QTextEdit::redo()
drawCursor( TRUE );
+ updateMicroFocusHint();
setModified();
emit textChanged();
- if ( hasFocus() || viewport()->hasFocus() ) {
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
- if ( !readonly ) {
- QFont f = cursor->parag()->at( cursor->index() )->format()->font();
- setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
- cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE );
- }
- }
}
@@ -2291,10 +2339,3 @@ void QTextEdit::paste()
pasteSubType( "plain" );
- if ( hasFocus() || viewport()->hasFocus() ) {
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
- if ( !readonly ) {
- QFont f = cursor->parag()->at( cursor->index() )->format()->font();
- setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
- cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE );
- }
- }
+ updateMicroFocusHint();
#endif
@@ -2339,14 +2380,9 @@ void QTextEdit::cut()
- if ( doc->hasSelection( QTextDocument::Standard ) ) {
- doc->copySelectedText( QTextDocument::Standard );
+ QString t;
+ if ( doc->hasSelection( QTextDocument::Standard ) &&
+ !( t = doc->selectedText( QTextDocument::Standard, qt_enable_richtext_copy ) ).isEmpty() ) {
+ QApplication::clipboard()->setText( t );
removeSelectedText();
}
- if ( hasFocus() || viewport()->hasFocus() ) {
- int h = cursor->parag()->lineHeightOfChar( cursor->index() );
- if ( !readonly ) {
- QFont f = cursor->parag()->at( cursor->index() )->format()->font();
- setMicroFocusHint( cursor->x() - contentsX() + frameWidth(),
- cursor->y() + cursor->parag()->rect().y() - contentsY() + frameWidth(), 0, h, TRUE );
- }
- }
+ updateMicroFocusHint();
}
@@ -2360,4 +2396,6 @@ void QTextEdit::copy()
{
- if ( !doc->selectedText( QTextDocument::Standard ).isEmpty() )
- doc->copySelectedText( QTextDocument::Standard );
+ QString t = doc->selectedText( QTextDocument::Standard, qt_enable_richtext_copy );
+ if ( doc->hasSelection( QTextDocument::Standard ) &&
+ !t.isEmpty() && t.simplifyWhiteSpace() != "<selstart/>" )
+ QApplication::clipboard()->setText( t );
}
@@ -2414,13 +2452,13 @@ void QTextEdit::setFormat( QTextFormat *f, int flags )
drawCursor( FALSE );
- QString str = doc->selectedText( QTextDocument::Standard );
QTextCursor c1 = doc->selectionStartCursor( QTextDocument::Standard );
+ c1.restoreState();
QTextCursor c2 = doc->selectionEndCursor( QTextDocument::Standard );
+ c2.restoreState();
clearUndoRedo();
undoRedoInfo.type = UndoRedoInfo::Format;
- undoRedoInfo.id = c1.parag()->paragId();
+ undoRedoInfo.id = c1.paragraph()->paragId();
undoRedoInfo.index = c1.index();
- undoRedoInfo.eid = c2.parag()->paragId();
+ undoRedoInfo.eid = c2.paragraph()->paragId();
undoRedoInfo.eindex = c2.index();
- undoRedoInfo.d->text = str;
- readFormats( c1, c2, 0, undoRedoInfo.d->text );
+ readFormats( c1, c2, undoRedoInfo.d->text );
undoRedoInfo.format = f;
@@ -2445,8 +2483,8 @@ void QTextEdit::setFormat( QTextFormat *f, int flags )
emit currentVerticalAlignmentChanged( (VerticalAlignment)currentFormat->vAlign() );
- if ( cursor->index() == cursor->parag()->length() - 1 ) {
+ if ( cursor->index() == cursor->paragraph()->length() - 1 ) {
currentFormat->addRef();
- cursor->parag()->string()->setFormat( cursor->index(), currentFormat, TRUE );
- if ( cursor->parag()->length() == 1 ) {
- cursor->parag()->invalidate( 0 );
- cursor->parag()->format();
+ cursor->paragraph()->string()->setFormat( cursor->index(), currentFormat, TRUE );
+ if ( cursor->paragraph()->length() == 1 ) {
+ cursor->paragraph()->invalidate( 0 );
+ cursor->paragraph()->format();
repaintChanged();
@@ -2469,3 +2507,8 @@ void QTextEdit::setPalette( const QPalette &p )
-/*!
+/*! \internal
+
+ \warning In Qt 3.1 we will provide a cleaer API for the
+ functionality which is provided by this function and in Qt 4.0 this
+ function will go away.
+
Sets the paragraph style of the current paragraph
@@ -2483,45 +2526,33 @@ void QTextEdit::setParagType( QStyleSheetItem::DisplayMode dm, QStyleSheetItem::
drawCursor( FALSE );
- if ( !doc->hasSelection( QTextDocument::Standard ) ) {
- clearUndoRedo();
- undoRedoInfo.type = UndoRedoInfo::ParagType;
- QValueList< QPtrVector<QStyleSheetItem> > oldStyles;
- undoRedoInfo.oldStyles.clear();
- undoRedoInfo.oldStyles << cursor->parag()->styleSheetItems();
- undoRedoInfo.oldListStyles.clear();
- undoRedoInfo.oldListStyles << cursor->parag()->listStyle();
- undoRedoInfo.list = dm == QStyleSheetItem::DisplayListItem;
- undoRedoInfo.listStyle = listStyle;
- undoRedoInfo.id = cursor->parag()->paragId();
- undoRedoInfo.eid = cursor->parag()->paragId();
- undoRedoInfo.d->text = " ";
- undoRedoInfo.index = 1;
- clearUndoRedo();
- cursor->parag()->setList( dm == QStyleSheetItem::DisplayListItem, listStyle );
- repaintChanged();
- } else {
- QTextParag *start = doc->selectionStart( QTextDocument::Standard );
- QTextParag *end = doc->selectionEnd( QTextDocument::Standard );
- lastFormatted = start;
- clearUndoRedo();
- undoRedoInfo.type = UndoRedoInfo::ParagType;
- undoRedoInfo.id = start->paragId();
- undoRedoInfo.eid = end->paragId();
- undoRedoInfo.list = dm == QStyleSheetItem::DisplayListItem;
- undoRedoInfo.listStyle = listStyle;
- undoRedoInfo.oldStyles.clear();
- undoRedoInfo.oldListStyles.clear();
- while ( start ) {
- undoRedoInfo.oldStyles << start->styleSheetItems();
- undoRedoInfo.oldListStyles << start->listStyle();
- start->setList( dm == QStyleSheetItem::DisplayListItem, listStyle );
- if ( start == end )
- break;
- start = start->next();
+ QTextParagraph *start = cursor->paragraph();
+ QTextParagraph *end = start;
+ if ( doc->hasSelection( QTextDocument::Standard ) ) {
+ start = doc->selectionStartCursor( QTextDocument::Standard ).topParagraph();
+ end = doc->selectionEndCursor( QTextDocument::Standard ).topParagraph();
+ if ( end->paragId() < start->paragId() )
+ return; // do not trust our selections
+ }
+
+ clearUndoRedo();
+ undoRedoInfo.type = UndoRedoInfo::Style;
+ undoRedoInfo.id = start->paragId();
+ undoRedoInfo.eid = end->paragId();
+ undoRedoInfo.styleInformation = QTextStyleCommand::readStyleInformation( doc, undoRedoInfo.id, undoRedoInfo.eid );
+
+ while ( start != end->next() ) {
+ start->setListStyle( listStyle );
+ if ( dm == QStyleSheetItem::DisplayListItem ) {
+ start->setListItem( TRUE );
+ if( start->listDepth() == 0 )
+ start->setListDepth( 1 );
+ } else if ( start->isListItem() ) {
+ start->setListItem( FALSE );
+ start->setListDepth( QMAX( start->listDepth()-1, 0 ) );
}
- undoRedoInfo.d->text = " ";
- undoRedoInfo.index = 1;
- clearUndoRedo();
- repaintChanged();
- formatMore();
+ start = start->next();
}
+
+ clearUndoRedo();
+ repaintChanged();
+ formatMore();
drawCursor( TRUE );
@@ -2536,3 +2567,2 @@ void QTextEdit::setParagType( QStyleSheetItem::DisplayMode dm, QStyleSheetItem::
- \sa setParagType()
*/
@@ -2545,46 +2575,25 @@ void QTextEdit::setAlignment( int a )
drawCursor( FALSE );
- if ( !doc->hasSelection( QTextDocument::Standard ) ) {
- if ( cursor->parag()->alignment() != a ) {
- clearUndoRedo();
- undoRedoInfo.type = UndoRedoInfo::Alignment;
- QMemArray<int> oa( 1 );
- oa[ 0 ] = cursor->parag()->alignment();
- undoRedoInfo.oldAligns = oa;
- undoRedoInfo.newAlign = a;
- undoRedoInfo.id = cursor->parag()->paragId();
- undoRedoInfo.eid = cursor->parag()->paragId();
- undoRedoInfo.d->text = " ";
- undoRedoInfo.index = 1;
- clearUndoRedo();
- cursor->parag()->setAlignment( a );
- repaintChanged();
- }
- } else {
- QTextParag *start = doc->selectionStart( QTextDocument::Standard );
- QTextParag *end = doc->selectionEnd( QTextDocument::Standard );
- lastFormatted = start;
- int len = end->paragId() - start->paragId() + 1;
- clearUndoRedo();
- undoRedoInfo.type = UndoRedoInfo::Alignment;
- undoRedoInfo.id = start->paragId();
- undoRedoInfo.eid = end->paragId();
- QMemArray<int> oa( QMAX( 0, len ) );
- int i = 0;
- while ( start ) {
- if ( i < (int)oa.size() )
- oa[ i ] = start->alignment();
- start->setAlignment( a );
- if ( start == end )
- break;
- start = start->next();
- ++i;
- }
- undoRedoInfo.oldAligns = oa;
- undoRedoInfo.newAlign = a;
- undoRedoInfo.d->text = " ";
- undoRedoInfo.index = 1;
- clearUndoRedo();
- repaintChanged();
- formatMore();
+ QTextParagraph *start = cursor->paragraph();
+ QTextParagraph *end = start;
+ if ( doc->hasSelection( QTextDocument::Standard ) ) {
+ start = doc->selectionStartCursor( QTextDocument::Standard ).topParagraph();
+ end = doc->selectionEndCursor( QTextDocument::Standard ).topParagraph();
+ if ( end->paragId() < start->paragId() )
+ return; // do not trust our selections
}
+
+ clearUndoRedo();
+ undoRedoInfo.type = UndoRedoInfo::Style;
+ undoRedoInfo.id = start->paragId();
+ undoRedoInfo.eid = end->paragId();
+ undoRedoInfo.styleInformation = QTextStyleCommand::readStyleInformation( doc, undoRedoInfo.id, undoRedoInfo.eid );
+
+ while ( start != end->next() ) {
+ start->setAlignment( a );
+ start = start->next();
+ }
+
+ clearUndoRedo();
+ repaintChanged();
+ formatMore();
drawCursor( TRUE );
@@ -2604,6 +2613,6 @@ void QTextEdit::updateCurrentFormat()
if ( doc->useFormatCollection() &&
- ( !currentFormat || currentFormat->key() != cursor->parag()->at( i )->format()->key() ) ) {
+ ( !currentFormat || currentFormat->key() != cursor->paragraph()->at( i )->format()->key() ) ) {
if ( currentFormat )
currentFormat->removeRef();
- currentFormat = doc->formatCollection()->format( cursor->parag()->at( i )->format() );
+ currentFormat = doc->formatCollection()->format( cursor->paragraph()->at( i )->format() );
if ( currentFormat->isMisspelled() ) {
@@ -2617,4 +2626,4 @@ void QTextEdit::updateCurrentFormat()
- if ( currentAlignment != cursor->parag()->alignment() ) {
- currentAlignment = cursor->parag()->alignment();
+ if ( currentAlignment != cursor->paragraph()->alignment() ) {
+ currentAlignment = cursor->paragraph()->alignment();
block_set_alignment = TRUE;
@@ -2780,3 +2789,4 @@ void QTextEdit::setText( const QString &text, const QString &context )
{
- if ( !isModified() && this->context() == context && this->text() == text )
+ if ( !isModified() && isReadOnly() &&
+ this->context() == context && this->text() == text )
return;
@@ -2801,6 +2811,5 @@ void QTextEdit::setText( const QString &text, const QString &context )
- cursor->setDocument( doc );
- lastFormatted = doc->firstParag();
- cursor->setParag( doc->firstParag() );
- cursor->setIndex( 0 );
+ lastFormatted = doc->firstParagraph();
+ delete cursor;
+ cursor = new QTextCursor( doc );
updateContents( contentsX(), contentsY(), visibleWidth(), visibleHeight() );
@@ -2812,2 +2821,3 @@ void QTextEdit::setText( const QString &text, const QString &context )
updateCurrentFormat();
+ d->scrollToAnchor = QString::null;
}
@@ -2849,5 +2859,5 @@ void QTextEdit::setText( const QString &text, const QString &context )
If \a para and \a index are both null the search begins from the
- start of the text. If \a para and \a index are both not null, the
- search begins from the \e *\a index character position in the \e
- *\a para paragraph.
+ current cursor position. If \a para and \a index are both not
+ null, the search begins from the \e *\a index character position
+ in the \e *\a para paragraph.
@@ -2875,3 +2885,2 @@ bool QTextEdit::find( const QString &expr, bool cs, bool wo, bool forward,
drawCursor( FALSE );
- doc->removeSelection( QTextDocument::Standard );
#ifndef QT_NO_CURSOR
@@ -2879,6 +2888,27 @@ bool QTextEdit::find( const QString &expr, bool cs, bool wo, bool forward,
#endif
- bool found = doc->find( expr, cs, wo, forward, para, index, cursor );
- ensureCursorVisible();
+ QTextCursor findcur = *cursor;
+ if ( para && index ) {
+ if ( doc->paragAt( *para ) )
+ findcur.gotoPosition( doc->paragAt(*para), *index );
+ else
+ findcur.gotoEnd();
+ } else if ( doc->hasSelection( QTextDocument::Standard ) ){
+ // maks sure we do not find the same selection again
+ if ( forward )
+ findcur.gotoNextLetter();
+ else
+ findcur.gotoPreviousLetter();
+ }
+ removeSelection( QTextDocument::Standard );
+ bool found = doc->find( findcur, expr, cs, wo, forward );
+ if ( found ) {
+ if ( para )
+ *para = findcur.paragraph()->paragId();
+ if ( index )
+ *index = findcur.index();
+ *cursor = findcur;
+ repaintChanged();
+ ensureCursorVisible();
+ }
drawCursor( TRUE );
- repaintChanged();
return found;
@@ -2904,3 +2934,3 @@ void QTextEdit::setCursorPosition( int para, int index )
{
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
@@ -2912,3 +2942,3 @@ void QTextEdit::setCursorPosition( int para, int index )
drawCursor( FALSE );
- cursor->setParag( p );
+ cursor->setParagraph( p );
cursor->setIndex( index );
@@ -2916,4 +2946,5 @@ void QTextEdit::setCursorPosition( int para, int index )
drawCursor( TRUE );
+ updateCurrentFormat();
emit cursorPositionChanged( cursor );
- emit cursorPositionChanged( cursor->parag()->paragId(), cursor->index() );
+ emit cursorPositionChanged( cursor->paragraph()->paragId(), cursor->index() );
}
@@ -2932,3 +2963,3 @@ void QTextEdit::getCursorPosition( int *para, int *index ) const
return;
- *para = cursor->parag()->paragId();
+ *para = cursor->paragraph()->paragId();
*index = cursor->index();
@@ -2960,6 +2991,6 @@ void QTextEdit::setSelection( int paraFrom, int indexFrom,
doc->addSelection( selNum );
- QTextParag *p1 = doc->paragAt( paraFrom );
+ QTextParagraph *p1 = doc->paragAt( paraFrom );
if ( !p1 )
return;
- QTextParag *p2 = doc->paragAt( paraTo );
+ QTextParagraph *p2 = doc->paragAt( paraTo );
if ( !p2 )
@@ -2975,8 +3006,8 @@ void QTextEdit::setSelection( int paraFrom, int indexFrom,
QTextCursor oldCursor = *cursor;
- c.setParag( p1 );
+ c.setParagraph( p1 );
c.setIndex( indexFrom );
- cursor->setParag( p2 );
+ cursor->setParagraph( p2 );
cursor->setIndex( indexTo );
- doc->setSelectionStart( selNum, &c );
- doc->setSelectionEnd( selNum, cursor );
+ doc->setSelectionStart( selNum, c );
+ doc->setSelectionEnd( selNum, *cursor );
repaintChanged();
@@ -3058,3 +3089,3 @@ int QTextEdit::paragraphs() const
{
- return doc->lastParag()->paragId() + 1;
+ return doc->lastParagraph()->paragId() + 1;
}
@@ -3068,3 +3099,3 @@ int QTextEdit::linesOfParagraph( int para ) const
{
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
@@ -3081,3 +3112,3 @@ int QTextEdit::paragraphLength( int para ) const
{
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
@@ -3097,3 +3128,3 @@ int QTextEdit::lines() const
{
- QTextParag *p = doc->firstParag();
+ QTextParagraph *p = doc->firstParagraph();
int l = 0;
@@ -3117,3 +3148,3 @@ int QTextEdit::lineOfChar( int para, int index )
{
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
@@ -3250,3 +3281,3 @@ void QTextEdit::startDrag()
inDoubleClick = FALSE;
- QDragObject *drag = new QTextDrag( doc->selectedText( QTextDocument::Standard ), viewport() );
+ QDragObject *drag = new QTextDrag( doc->selectedText( QTextDocument::Standard, qt_enable_richtext_copy ), viewport() );
if ( isReadOnly() ) {
@@ -3287,12 +3318,12 @@ void QTextEdit::UndoRedoInfo::clear()
if ( type == Insert || type == Return )
- doc->addCommand( new QTextInsertCommand( doc, id, index, d->text.rawData(), oldStyles, oldListStyles, oldAligns ) );
+ doc->addCommand( new QTextInsertCommand( doc, id, index, d->text.rawData(), styleInformation ) );
else if ( type == Format )
doc->addCommand( new QTextFormatCommand( doc, id, index, eid, eindex, d->text.rawData(), format, flags ) );
- else if ( type == Alignment )
- doc->addCommand( new QTextAlignmentCommand( doc, id, eid, newAlign, oldAligns ) );
- else if ( type == ParagType )
- doc->addCommand( new QTextParagTypeCommand( doc, id, eid, list, listStyle, oldStyles, oldListStyles ) );
- else if ( type != Invalid )
- doc->addCommand( new QTextDeleteCommand( doc, id, index, d->text.rawData(), oldStyles, oldListStyles, oldAligns ) );
+ else if ( type == Style )
+ doc->addCommand( new QTextStyleCommand( doc, id, eid, styleInformation ) );
+ else if ( type != Invalid ) {
+ doc->addCommand( new QTextDeleteCommand( doc, id, index, d->text.rawData(), styleInformation ) );
+ }
}
+ type = Invalid;
d->text = QString::null;
@@ -3300,5 +3331,3 @@ void QTextEdit::UndoRedoInfo::clear()
index = -1;
- oldStyles.clear();
- oldListStyles.clear();
- oldAligns.resize( 0 );
+ styleInformation = QByteArray();
}
@@ -3342,3 +3371,3 @@ bool QTextEdit::UndoRedoInfo::valid() const
{
- return d->text.length() > 0 && id >= 0 && index >= 0;
+ return id >= 0 && type != Invalid;
}
@@ -3411,6 +3440,3 @@ void QTextEdit::setLinkUnderline( bool b )
{
- if ( b == doc->underlineLinks() )
- return;
doc->setUnderlineLinks( b );
- updateStyles();
}
@@ -3467,6 +3493,5 @@ void QTextEdit::append( const QString &text )
// flush and clear the undo/redo stack if necessary
- if ( isReadOnly() && undoRedoInfo.valid() ) {
- undoRedoInfo.clear();
- doc->commands()->clear();
- }
+ undoRedoInfo.clear();
+ doc->commands()->clear();
+
doc->removeSelection( QTextDocument::Standard );
@@ -3479,17 +3504,18 @@ void QTextEdit::append( const QString &text )
}
- if ( f == PlainText ) {
- QTextCursor oldc( *cursor );
- ensureFormatted( doc->lastParag() );
- bool scrollToEnd = contentsY() >= contentsHeight() - visibleHeight() -
- ( horizontalScrollBar()->isVisible() ? horizontalScrollBar()->height() : 0 );
- if ( !scrollToEnd )
- blockEnsureCursorVisible = TRUE;
- cursor->gotoEnd();
- if ( cursor->index() > 0 )
- cursor->splitAndInsertEmptyParag();
- QTextCursor oldCursor2 = *cursor;
- cursor->insert( text, TRUE );
- if ( doc->useFormatCollection() && currentFormat != cursor->parag()->at( cursor->index() )->format() ) {
- doc->setSelectionStart( QTextDocument::Temp, &oldCursor2 );
- doc->setSelectionEnd( QTextDocument::Temp, cursor );
+
+ drawCursor( FALSE );
+ QTextCursor oldc( *cursor );
+ ensureFormatted( doc->lastParagraph() );
+ bool atBottom = contentsY() >= contentsHeight() - visibleHeight();
+ cursor->gotoEnd();
+ if ( cursor->index() > 0 )
+ cursor->splitAndInsertEmptyParagraph();
+ QTextCursor oldCursor2 = *cursor;
+
+ if ( f == Qt::PlainText ) {
+ cursor->insert( text, TRUE );
+ if ( doc->useFormatCollection() &&
+ currentFormat != cursor->paragraph()->at( cursor->index() )->format() ) {
+ doc->setSelectionStart( QTextDocument::Temp, oldCursor2 );
+ doc->setSelectionEnd( QTextDocument::Temp, *cursor );
doc->setFormat( QTextDocument::Temp, currentFormat, QTextFormat::Format );
@@ -3497,13 +3523,14 @@ void QTextEdit::append( const QString &text )
}
- formatMore();
- repaintChanged();
- ensureCursorVisible();
- drawCursor( TRUE );
- *cursor = oldc;
- if ( !scrollToEnd )
- blockEnsureCursorVisible = FALSE;
- } else if ( f == RichText ) {
+ } else {
+ if ( cursor->paragraph()->prev() )
+ cursor->paragraph()->prev()->invalidate(0); // vertical margins might have to change
doc->setRichTextInternal( text );
- repaintChanged();
}
+ formatMore();
+ repaintChanged();
+ if ( atBottom )
+ scrollToBottom();
+ *cursor = oldc;
+ if ( !isReadOnly() )
+ cursorVisible = TRUE;
setModified();
@@ -3619,3 +3646,3 @@ QString QTextEdit::documentTitle() const
-void QTextEdit::makeParagVisible( QTextParag *p )
+void QTextEdit::makeParagVisible( QTextParagraph *p )
{
@@ -3632,2 +3659,6 @@ void QTextEdit::scrollToAnchor( const QString& name )
{
+ if ( !isVisible() ) {
+ d->scrollToAnchor = name;
+ return;
+ }
if ( name.isEmpty() )
@@ -3636,5 +3667,5 @@ void QTextEdit::scrollToAnchor( const QString& name )
QTextCursor cursor( doc );
- QTextParag* last = doc->lastParag();
- do {
- QTextStringChar* c = cursor.parag()->at( cursor.index() );
+ QTextParagraph* last = doc->lastParagraph();
+ for (;;) {
+ QTextStringChar* c = cursor.paragraph()->at( cursor.index() );
if( c->isAnchor() ) {
@@ -3643,8 +3674,10 @@ void QTextEdit::scrollToAnchor( const QString& name )
(a.contains( '#' ) && QStringList::split( '#', a ).contains( name ) ) ) {
- setContentsPos( contentsX(), QMIN( cursor.parag()->rect().top() + cursor.totalOffsetY(), contentsHeight() - visibleHeight() ) );
- return;
+ setContentsPos( contentsX(), QMIN( cursor.paragraph()->rect().top() + cursor.totalOffsetY(), contentsHeight() - visibleHeight() ) );
+ break;
}
}
+ if ( cursor.paragraph() == last && cursor.atParagEnd() )
+ break;
cursor.gotoNextLetter();
- } while( cursor.parag() != last || !cursor.atParagEnd() );
+ }
}
@@ -3660,3 +3693,3 @@ QString QTextEdit::anchorAt( const QPoint& pos )
placeCursor( pos, &c );
- return c.parag()->at( c.index() )->anchorHref();
+ return c.paragraph()->at( c.index() )->anchorHref();
}
@@ -3668,5 +3701,5 @@ void QTextEdit::documentWidthChanged( int w )
-/*!
- Updates all the rendering styles used to display the text. You will
- probably want to call this function after calling setStyleSheet().
+/*! \internal
+
+ This function does nothing
*/
@@ -3675,4 +3708,2 @@ void QTextEdit::updateStyles()
{
- doc->updateStyles();
- updateContents( contentsX(), contentsY(), visibleWidth(), visibleHeight() );
}
@@ -3684,4 +3715,6 @@ void QTextEdit::setDocument( QTextDocument *dc )
doc = dc;
- cursor->setDocument( doc );
+ delete cursor;
+ cursor = new QTextCursor( doc );
clearUndoRedo();
+ undoRedoInfo.doc = doc;
lastFormatted = 0;
@@ -3705,3 +3738,48 @@ void QTextEdit::pasteSubType( const QCString& subtype )
QString t = QApplication::clipboard()->text(st);
+ if ( doc->hasSelection( QTextDocument::Standard ) )
+ removeSelectedText();
if ( !t.isEmpty() ) {
+ if ( t.startsWith( "<selstart/>" ) ) {
+ t.remove( 0, 11 );
+ QTextCursor oldC = *cursor;
+ lastFormatted = cursor->paragraph();
+ if ( lastFormatted->prev() )
+ lastFormatted = lastFormatted->prev();
+ doc->setRichTextInternal( t, cursor );
+
+ if ( undoEnabled && !isReadOnly() ) {
+ doc->setSelectionStart( QTextDocument::Temp, oldC );
+ doc->setSelectionEnd( QTextDocument::Temp, *cursor );
+
+ checkUndoRedoInfo( UndoRedoInfo::Insert );
+ if ( !undoRedoInfo.valid() ) {
+ undoRedoInfo.id = oldC.paragraph()->paragId();
+ undoRedoInfo.index = oldC.index();
+ undoRedoInfo.d->text = QString::null;
+ }
+ int oldLen = undoRedoInfo.d->text.length();
+ if ( !doc->preProcessor() ) {
+ QString txt = doc->selectedText( QTextDocument::Temp );
+ undoRedoInfo.d->text += txt;
+ for ( int i = 0; i < (int)txt.length(); ++i ) {
+ if ( txt[ i ] != '\n' && oldC.paragraph()->at( oldC.index() )->format() ) {
+ oldC.paragraph()->at( oldC.index() )->format()->addRef();
+ undoRedoInfo.d->text.
+ setFormat( oldLen + i, oldC.paragraph()->at( oldC.index() )->format(), TRUE );
+ }
+ oldC.gotoNextLetter();
+ }
+ }
+ undoRedoInfo.clear();
+ removeSelection( QTextDocument::Temp );
+ }
+
+ formatMore();
+ setModified();
+ emit textChanged();
+ repaintChanged();
+ ensureCursorVisible();
+ return;
+ }
+
#if defined(Q_OS_WIN32)
@@ -3840,3 +3918,3 @@ void QTextEdit::setWordWrap( WordWrap mode )
updateContents( contentsX(), contentsY(), visibleWidth(), visibleHeight() );
- lastFormatted = doc->firstParag();
+ lastFormatted = doc->firstParagraph();
interval = 0;
@@ -3901,3 +3979,3 @@ void QTextEdit::setWrapColumnOrWidth( int value )
updateContents( contentsX(), contentsY(), visibleWidth(), visibleHeight() );
- lastFormatted = doc->firstParag();
+ lastFormatted = doc->firstParagraph();
interval = 0;
@@ -3954,3 +4032,3 @@ void QTextEdit::setWrapPolicy( WrapPolicy policy )
updateContents( contentsX(), contentsY(), visibleWidth(), visibleHeight() );
- lastFormatted = doc->firstParag();
+ lastFormatted = doc->firstParagraph();
interval = 0;
@@ -3981,5 +4059,4 @@ void QTextEdit::clear()
doc->clear( TRUE );
- cursor->setDocument( doc );
- cursor->setParag( doc->firstParag() );
- cursor->setIndex( 0 );
+ delete cursor;
+ cursor = new QTextCursor( doc );
lastFormatted = 0;
@@ -3988,3 +4065,3 @@ void QTextEdit::clear()
emit cursorPositionChanged( cursor );
- emit cursorPositionChanged( cursor->parag()->paragId(), cursor->index() );
+ emit cursorPositionChanged( cursor->paragraph()->paragId(), cursor->index() );
}
@@ -4027,3 +4104,3 @@ void QTextEdit::setTabStopWidth( int ts )
doc->invalidate();
- lastFormatted = doc->firstParag();
+ lastFormatted = doc->firstParagraph();
interval = 0;
@@ -4048,3 +4125,9 @@ void QTextEdit::clearUndoRedo()
-/*! This function gets the format of the character at position \a
+/*! \internal
+
+ \warning In Qt 3.1 we will provide a cleaer API for the
+ functionality which is provided by this function and in Qt 4.0 this
+ function will go away.
+
+ This function gets the format of the character at position \a
index in paragraph \a para. Sets \a font to the character's font, \a
@@ -4061,3 +4144,3 @@ bool QTextEdit::getFormat( int para, int index, QFont *font, QColor *color, Vert
return FALSE;
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
@@ -4072,3 +4155,9 @@ bool QTextEdit::getFormat( int para, int index, QFont *font, QColor *color, Vert
-/*! This function gets the format of the paragraph \a para. Sets \a
+/*! \internal
+
+ \warning In Qt 3.1 we will provide a cleaer API for the
+ functionality which is provided by this function and in Qt 4.0 this
+ function will go away.
+
+ This function gets the format of the paragraph \a para. Sets \a
font to the paragraphs's font, \a color to the paragraph's color, \a
@@ -4092,10 +4181,10 @@ bool QTextEdit::getParagraphFormat( int para, QFont *font, QColor *color,
return FALSE;
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
return FALSE;
- *font = p->paragFormat()->font();
- *color = p->paragFormat()->color();
- *verticalAlignment = (VerticalAlignment)p->paragFormat()->vAlign();
+ *font = p->at(0)->format()->font();
+ *color = p->at(0)->format()->color();
+ *verticalAlignment = (VerticalAlignment)p->at(0)->format()->vAlign();
*alignment = p->alignment();
- *displayMode = p->style() ? p->style()->displayMode() : QStyleSheetItem::DisplayBlock;
+ *displayMode = p->isListItem() ? QStyleSheetItem::DisplayListItem : QStyleSheetItem::DisplayBlock;
*listStyle = p->listStyle();
@@ -4157,2 +4246,3 @@ QPopupMenu *QTextEdit::createPopupMenu( const QPoint& pos )
/*! \overload
+ \obsolete
This function is called to create a right mouse button popup menu.
@@ -4161,2 +4251,5 @@ QPopupMenu *QTextEdit::createPopupMenu( const QPoint& pos )
transferred to the caller.
+
+ This function is only called if createPopupMenu( const QPoint & )
+ returns 0.
*/
@@ -4175,17 +4268,4 @@ void QTextEdit::setFont( const QFont &f )
doc->setMinimumWidth( -1 );
-
- // ### that is a bit hacky
- static short diff = 1;
- diff *= -1;
- doc->setWidth( visibleWidth() + diff );
-
- int s = f.pointSize();
- bool usePixels = FALSE;
- if ( s == -1 ) {
- s = f.pixelSize();
- usePixels = TRUE;
- }
- doc->updateFontSizes( s, usePixels );
- doc->updateFontAttributes( f, old );
- lastFormatted = doc->firstParag();
+ doc->setDefaultFormat( f, doc->formatCollection()->defaultFormat()->color() );
+ lastFormatted = doc->firstParagraph();
formatMore();
@@ -4275,6 +4355,5 @@ void QTextEdit::sync()
{
- QTextParag *p = lastFormatted;
- while ( p ) {
- p->format();
- p = p->next();
+ while ( lastFormatted ) {
+ lastFormatted->format();
+ lastFormatted = lastFormatted->next();
}
@@ -4362,3 +4441,3 @@ QRect QTextEdit::paragraphRect( int para ) const
that->sync();
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
@@ -4376,5 +4455,5 @@ int QTextEdit::paragraphAt( const QPoint &pos ) const
QTextCursor c( doc );
- c.place( pos, doc->firstParag() );
- if ( c.parag() )
- return c.parag()->paragId();
+ c.place( pos, doc->firstParagraph() );
+ if ( c.paragraph() )
+ return c.paragraph()->paragId();
return -1;
@@ -4392,6 +4471,6 @@ int QTextEdit::charAt( const QPoint &pos, int *para ) const
QTextCursor c( doc );
- c.place( pos, doc->firstParag() );
- if ( c.parag() ) {
+ c.place( pos, doc->firstParagraph() );
+ if ( c.paragraph() ) {
if ( para )
- *para = c.parag()->paragId();
+ *para = c.paragraph()->paragId();
return c.index();
@@ -4405,3 +4484,3 @@ void QTextEdit::setParagraphBackgroundColor( int para, const QColor &bg )
{
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
@@ -4418,3 +4497,3 @@ void QTextEdit::clearParagraphBackground( int para )
{
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
@@ -4432,3 +4511,3 @@ QColor QTextEdit::paragraphBackgroundColor( int para ) const
{
- QTextParag *p = doc->paragAt( para );
+ QTextParagraph *p = doc->paragAt( para );
if ( !p )
@@ -4471,3 +4550,3 @@ bool QTextEdit::isRedoAvailable() const
-void QTextEdit::ensureFormatted( QTextParag *p )
+void QTextEdit::ensureFormatted( QTextParagraph *p )
{
@@ -4488,7 +4567,7 @@ void QTextEdit::updateCursor( const QPoint & pos )
#ifndef QT_NO_NETWORKPROTOCOL
- if ( c.parag() && c.parag()->at( c.index() ) &&
- c.parag()->at( c.index() )->isAnchor() &&
- !c.parag()->at( c.index() )->anchorHref().isEmpty() ) {
- if ( c.index() < c.parag()->length() - 1 )
- onLink = c.parag()->at( c.index() )->anchorHref();
+ if ( c.paragraph() && c.paragraph()->at( c.index() ) &&
+ c.paragraph()->at( c.index() )->isAnchor() &&
+ !c.paragraph()->at( c.index() )->anchorHref().isEmpty() ) {
+ if ( c.index() < c.paragraph()->length() - 1 )
+ onLink = c.paragraph()->at( c.index() )->anchorHref();
else
diff --git a/noncore/apps/opie-write/qtextedit.h b/noncore/apps/opie-write/qtextedit.h
index b4e5701..64e8f45 100644
--- a/noncore/apps/opie-write/qtextedit.h
+++ b/noncore/apps/opie-write/qtextedit.h
@@ -63,5 +63,7 @@ class QTextCursor;
class QTextCommand;
-class QTextParag;
+class QTextParagraph;
class QTextFormat;
+class QTextEdit;
class QTextBrowser;
+class QTextString;
class QTextEditPrivate;
@@ -198,3 +200,6 @@ public:
int undoDepth() const;
+
+ // do not use, will go away
virtual bool getFormat( int para, int index, QFont *font, QColor *color, VerticalAlignment *verticalAlignment );
+ // do not use, will go away
virtual bool getParagraphFormat( int para, QFont *font, QColor *color,
@@ -204,2 +209,4 @@ public:
int *listDepth );
+
+
bool isOverwriteMode() const { return overWrite; }
@@ -259,3 +266,6 @@ public slots:
virtual void setAlignment( int a );
+
+ // do not use, will go away
virtual void setParagType( QStyleSheetItem::DisplayMode dm, QStyleSheetItem::ListStyle listStyle );
+
virtual void setCursorPosition( int parag, int index );
@@ -348,3 +358,3 @@ private:
struct Q_EXPORT UndoRedoInfo {
- enum Type { Invalid, Insert, Delete, Backspace, Return, RemoveSelected, Format, Alignment, ParagType };
+ enum Type { Invalid, Insert, Delete, Backspace, Return, RemoveSelected, Format, Style };
@@ -364,8 +374,3 @@ private:
QTextDocument *doc;
- QMemArray<int> oldAligns;
- int newAlign;
- bool list;
- QStyleSheetItem::ListStyle listStyle;
- QValueList< QPtrVector<QStyleSheetItem> > oldStyles;
- QValueList<QStyleSheetItem::ListStyle> oldListStyles;
+ QByteArray styleInformation;
};
@@ -381,3 +386,3 @@ private:
bool handleReadOnlyKeyEvent( QKeyEvent *e );
- void makeParagVisible( QTextParag *p );
+ void makeParagVisible( QTextParagraph *p );
#ifndef QT_NO_MIME
@@ -393,3 +398,3 @@ private:
- void readFormats( QTextCursor &c1, QTextCursor &c2, int oldLen, QTextString &text, bool fillStyles = FALSE );
+ void readFormats( QTextCursor &c1, QTextCursor &c2, QTextString &text, bool fillStyles = FALSE );
void clearUndoRedo();
@@ -397,4 +402,5 @@ private:
void moveCursor( CursorAction action );
- void ensureFormatted( QTextParag *p );
+ void ensureFormatted( QTextParagraph *p );
void placeCursor( const QPoint &pos, QTextCursor *c, bool link );
+ void updateMicroFocusHint();
@@ -404,3 +410,3 @@ private:
QTimer *formatTimer, *scrollTimer, *changeIntervalTimer, *blinkTimer, *dragStartTimer;
- QTextParag *lastFormatted;
+ QTextParagraph *lastFormatted;
int interval;