Diffstat (limited to 'noncore/apps/opie-write/qrichtext.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/opie-write/qrichtext.cpp | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/noncore/apps/opie-write/qrichtext.cpp b/noncore/apps/opie-write/qrichtext.cpp index b77a0fc..c27eb1e 100644 --- a/noncore/apps/opie-write/qrichtext.cpp +++ b/noncore/apps/opie-write/qrichtext.cpp | |||
@@ -16,53 +16,59 @@ | |||
16 | ** This file may be distributed and/or modified under the terms of the | 16 | ** This file may be distributed and/or modified under the terms of the |
17 | ** GNU General Public License version 2 as published by the Free Software | 17 | ** GNU General Public License version 2 as published by the Free Software |
18 | ** Foundation and appearing in the file LICENSE.GPL included in the | 18 | ** Foundation and appearing in the file LICENSE.GPL included in the |
19 | ** packaging of this file. | 19 | ** packaging of this file. |
20 | ** | 20 | ** |
21 | ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition | 21 | ** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition |
22 | ** licenses may use this file in accordance with the Qt Commercial License | 22 | ** licenses may use this file in accordance with the Qt Commercial License |
23 | ** Agreement provided with the Software. | 23 | ** Agreement provided with the Software. |
24 | ** | 24 | ** |
25 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 25 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
26 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 26 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
27 | ** | 27 | ** |
28 | ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for | 28 | ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for |
29 | ** information about Qt Commercial License Agreements. | 29 | ** information about Qt Commercial License Agreements. |
30 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. | 30 | ** See http://www.trolltech.com/qpl/ for QPL licensing information. |
31 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 31 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
32 | ** | 32 | ** |
33 | ** Contact info@trolltech.com if any conditions of this licensing are | 33 | ** Contact info@trolltech.com if any conditions of this licensing are |
34 | ** not clear to you. | 34 | ** not clear to you. |
35 | ** | 35 | ** |
36 | **********************************************************************/ | 36 | **********************************************************************/ |
37 | 37 | ||
38 | #include "qrichtext_p.h" | 38 | #include "qrichtext_p.h" |
39 | 39 | ||
40 | /* OPIE */ | ||
41 | #include <opie2/odebug.h> | ||
42 | using namespace Opie::Core; | ||
43 | |||
44 | /* QT */ | ||
40 | #include "qdragobject.h" | 45 | #include "qdragobject.h" |
41 | #include "qpaintdevicemetrics.h" | 46 | #include "qpaintdevicemetrics.h" |
42 | #include "qdrawutil.h" | 47 | #include "qdrawutil.h" |
43 | #include "qcleanuphandler.h" | 48 | #include "qcleanuphandler.h" |
44 | 49 | ||
50 | /* STD */ | ||
45 | #include <stdlib.h> | 51 | #include <stdlib.h> |
46 | 52 | ||
47 | using namespace Qt3; | 53 | using namespace Qt3; |
48 | 54 | ||
49 | static QTextCursor* richTextExportStart = 0; | 55 | static QTextCursor* richTextExportStart = 0; |
50 | static QTextCursor* richTextExportEnd = 0; | 56 | static QTextCursor* richTextExportEnd = 0; |
51 | 57 | ||
52 | static QTextFormatCollection *qFormatCollection = 0; | 58 | static QTextFormatCollection *qFormatCollection = 0; |
53 | 59 | ||
54 | const int border_tolerance = 2; | 60 | const int border_tolerance = 2; |
55 | 61 | ||
56 | #ifdef Q_WS_WIN | 62 | #ifdef Q_WS_WIN |
57 | #include "qt_windows.h" | 63 | #include "qt_windows.h" |
58 | #endif | 64 | #endif |
59 | 65 | ||
60 | #define QChar_linesep QChar(0x2028U) | 66 | #define QChar_linesep QChar(0x2028U) |
61 | 67 | ||
62 | static inline bool is_printer( QPainter *p ) | 68 | static inline bool is_printer( QPainter *p ) |
63 | { | 69 | { |
64 | if ( !p || !p->device() ) | 70 | if ( !p || !p->device() ) |
65 | return FALSE; | 71 | return FALSE; |
66 | return p->device()->devType() == QInternal::Printer; | 72 | return p->device()->devType() == QInternal::Printer; |
67 | } | 73 | } |
68 | 74 | ||
@@ -163,77 +169,77 @@ QTextDeleteCommand::QTextDeleteCommand( QTextDocument *d, int i, int idx, const | |||
163 | } | 169 | } |
164 | 170 | ||
165 | QTextDeleteCommand::QTextDeleteCommand( QTextParagraph *p, int idx, const QMemArray<QTextStringChar> &str ) | 171 | QTextDeleteCommand::QTextDeleteCommand( QTextParagraph *p, int idx, const QMemArray<QTextStringChar> &str ) |
166 | : QTextCommand( 0 ), id( -1 ), index( idx ), parag( p ), text( str ) | 172 | : QTextCommand( 0 ), id( -1 ), index( idx ), parag( p ), text( str ) |
167 | { | 173 | { |
168 | for ( int i = 0; i < (int)text.size(); ++i ) { | 174 | for ( int i = 0; i < (int)text.size(); ++i ) { |
169 | if ( text[ i ].format() ) | 175 | if ( text[ i ].format() ) |
170 | text[ i ].format()->addRef(); | 176 | text[ i ].format()->addRef(); |
171 | } | 177 | } |
172 | } | 178 | } |
173 | 179 | ||
174 | QTextDeleteCommand::~QTextDeleteCommand() | 180 | QTextDeleteCommand::~QTextDeleteCommand() |
175 | { | 181 | { |
176 | for ( int i = 0; i < (int)text.size(); ++i ) { | 182 | for ( int i = 0; i < (int)text.size(); ++i ) { |
177 | if ( text[ i ].format() ) | 183 | if ( text[ i ].format() ) |
178 | text[ i ].format()->removeRef(); | 184 | text[ i ].format()->removeRef(); |
179 | } | 185 | } |
180 | text.resize( 0 ); | 186 | text.resize( 0 ); |
181 | } | 187 | } |
182 | 188 | ||
183 | QTextCursor *QTextDeleteCommand::execute( QTextCursor *c ) | 189 | QTextCursor *QTextDeleteCommand::execute( QTextCursor *c ) |
184 | { | 190 | { |
185 | QTextParagraph *s = doc ? doc->paragAt( id ) : parag; | 191 | QTextParagraph *s = doc ? doc->paragAt( id ) : parag; |
186 | if ( !s ) { | 192 | if ( !s ) { |
187 | qWarning( "can't locate parag at %d, last parag: %d", id, doc->lastParagraph()->paragId() ); | 193 | owarn << "can't locate parag at " << id << ", last parag: " << doc->lastParagraph()->paragId() << "" << oendl; |
188 | return 0; | 194 | return 0; |
189 | } | 195 | } |
190 | 196 | ||
191 | cursor.setParagraph( s ); | 197 | cursor.setParagraph( s ); |
192 | cursor.setIndex( index ); | 198 | cursor.setIndex( index ); |
193 | int len = text.size(); | 199 | int len = text.size(); |
194 | if ( c ) | 200 | if ( c ) |
195 | *c = cursor; | 201 | *c = cursor; |
196 | if ( doc ) { | 202 | if ( doc ) { |
197 | doc->setSelectionStart( QTextDocument::Temp, cursor ); | 203 | doc->setSelectionStart( QTextDocument::Temp, cursor ); |
198 | for ( int i = 0; i < len; ++i ) | 204 | for ( int i = 0; i < len; ++i ) |
199 | cursor.gotoNextLetter(); | 205 | cursor.gotoNextLetter(); |
200 | doc->setSelectionEnd( QTextDocument::Temp, cursor ); | 206 | doc->setSelectionEnd( QTextDocument::Temp, cursor ); |
201 | doc->removeSelectedText( QTextDocument::Temp, &cursor ); | 207 | doc->removeSelectedText( QTextDocument::Temp, &cursor ); |
202 | if ( c ) | 208 | if ( c ) |
203 | *c = cursor; | 209 | *c = cursor; |
204 | } else { | 210 | } else { |
205 | s->remove( index, len ); | 211 | s->remove( index, len ); |
206 | } | 212 | } |
207 | 213 | ||
208 | return c; | 214 | return c; |
209 | } | 215 | } |
210 | 216 | ||
211 | QTextCursor *QTextDeleteCommand::unexecute( QTextCursor *c ) | 217 | QTextCursor *QTextDeleteCommand::unexecute( QTextCursor *c ) |
212 | { | 218 | { |
213 | QTextParagraph *s = doc ? doc->paragAt( id ) : parag; | 219 | QTextParagraph *s = doc ? doc->paragAt( id ) : parag; |
214 | if ( !s ) { | 220 | if ( !s ) { |
215 | qWarning( "can't locate parag at %d, last parag: %d", id, doc->lastParagraph()->paragId() ); | 221 | owarn << "can't locate parag at " << id << ", last parag: " << doc->lastParagraph()->paragId() << "" << oendl; |
216 | return 0; | 222 | return 0; |
217 | } | 223 | } |
218 | 224 | ||
219 | cursor.setParagraph( s ); | 225 | cursor.setParagraph( s ); |
220 | cursor.setIndex( index ); | 226 | cursor.setIndex( index ); |
221 | QString str = QTextString::toString( text ); | 227 | QString str = QTextString::toString( text ); |
222 | cursor.insert( str, TRUE, &text ); | 228 | cursor.insert( str, TRUE, &text ); |
223 | cursor.setParagraph( s ); | 229 | cursor.setParagraph( s ); |
224 | cursor.setIndex( index ); | 230 | cursor.setIndex( index ); |
225 | if ( c ) { | 231 | if ( c ) { |
226 | c->setParagraph( s ); | 232 | c->setParagraph( s ); |
227 | c->setIndex( index ); | 233 | c->setIndex( index ); |
228 | for ( int i = 0; i < (int)text.size(); ++i ) | 234 | for ( int i = 0; i < (int)text.size(); ++i ) |
229 | c->gotoNextLetter(); | 235 | c->gotoNextLetter(); |
230 | } | 236 | } |
231 | 237 | ||
232 | if ( !styleInformation.isEmpty() ) { | 238 | if ( !styleInformation.isEmpty() ) { |
233 | QDataStream styleStream( styleInformation, IO_ReadOnly ); | 239 | QDataStream styleStream( styleInformation, IO_ReadOnly ); |
234 | int num; | 240 | int num; |
235 | styleStream >> num; | 241 | styleStream >> num; |
236 | QTextParagraph *p = s; | 242 | QTextParagraph *p = s; |
237 | while ( num-- && p ) { | 243 | while ( num-- && p ) { |
238 | p->readStyleInformation( styleStream ); | 244 | p->readStyleInformation( styleStream ); |
239 | p = p->next(); | 245 | p = p->next(); |
@@ -1523,52 +1529,52 @@ void QTextDocument::setRichTextInternal( const QString &text, QTextCursor* curso | |||
1523 | emptyTag = space = TRUE; | 1529 | emptyTag = space = TRUE; |
1524 | int index = QMAX( curpar->length(),1) - 1; | 1530 | int index = QMAX( curpar->length(),1) - 1; |
1525 | QTextFormat format = curtag.format.makeTextFormat( nstyle, attr, scaleFontsFactor ); | 1531 | QTextFormat format = curtag.format.makeTextFormat( nstyle, attr, scaleFontsFactor ); |
1526 | curpar->append( QChar_linesep ); | 1532 | curpar->append( QChar_linesep ); |
1527 | curpar->setFormat( index, 1, &format ); | 1533 | curpar->setFormat( index, 1, &format ); |
1528 | } else if ( tagname == "hr" ) { | 1534 | } else if ( tagname == "hr" ) { |
1529 | emptyTag = space = TRUE; | 1535 | emptyTag = space = TRUE; |
1530 | custom = sheet_->tag( tagname, attr, contxt, *factory_ , emptyTag, this ); | 1536 | custom = sheet_->tag( tagname, attr, contxt, *factory_ , emptyTag, this ); |
1531 | NEWPAR; | 1537 | NEWPAR; |
1532 | } else if ( tagname == "table" ) { | 1538 | } else if ( tagname == "table" ) { |
1533 | emptyTag = space = TRUE; | 1539 | emptyTag = space = TRUE; |
1534 | QTextFormat format = curtag.format.makeTextFormat( nstyle, attr, scaleFontsFactor ); | 1540 | QTextFormat format = curtag.format.makeTextFormat( nstyle, attr, scaleFontsFactor ); |
1535 | curpar->setAlignment( curtag.alignment ); | 1541 | curpar->setAlignment( curtag.alignment ); |
1536 | custom = parseTable( attr, format, doc, length, pos, curpar ); | 1542 | custom = parseTable( attr, format, doc, length, pos, curpar ); |
1537 | } else if ( tagname == "qt" || tagname == "body" ) { | 1543 | } else if ( tagname == "qt" || tagname == "body" ) { |
1538 | if ( attr.contains( "bgcolor" ) ) { | 1544 | if ( attr.contains( "bgcolor" ) ) { |
1539 | QBrush *b = new QBrush( QColor( attr["bgcolor"] ) ); | 1545 | QBrush *b = new QBrush( QColor( attr["bgcolor"] ) ); |
1540 | setPaper( b ); | 1546 | setPaper( b ); |
1541 | } | 1547 | } |
1542 | if ( attr.contains( "background" ) ) { | 1548 | if ( attr.contains( "background" ) ) { |
1543 | QImage img; | 1549 | QImage img; |
1544 | QString bg = attr["background"]; | 1550 | QString bg = attr["background"]; |
1545 | const QMimeSource* m = factory_->data( bg, contxt ); | 1551 | const QMimeSource* m = factory_->data( bg, contxt ); |
1546 | if ( !m ) { | 1552 | if ( !m ) { |
1547 | qWarning("QRichText: no mimesource for %s", bg.latin1() ); | 1553 | owarn << "QRichText: no mimesource for " << bg.latin1() << "" << oendl; |
1548 | } else { | 1554 | } else { |
1549 | if ( !QImageDrag::decode( m, img ) ) { | 1555 | if ( !QImageDrag::decode( m, img ) ) { |
1550 | qWarning("QTextImage: cannot decode %s", bg.latin1() ); | 1556 | owarn << "QTextImage: cannot decode " << bg.latin1() << "" << oendl; |
1551 | } | 1557 | } |
1552 | } | 1558 | } |
1553 | if ( !img.isNull() ) { | 1559 | if ( !img.isNull() ) { |
1554 | QPixmap pm; | 1560 | QPixmap pm; |
1555 | pm.convertFromImage( img ); | 1561 | pm.convertFromImage( img ); |
1556 | QBrush *b = new QBrush( QColor(), pm ); | 1562 | QBrush *b = new QBrush( QColor(), pm ); |
1557 | setPaper( b ); | 1563 | setPaper( b ); |
1558 | } | 1564 | } |
1559 | } | 1565 | } |
1560 | if ( attr.contains( "text" ) ) { | 1566 | if ( attr.contains( "text" ) ) { |
1561 | QColor c( attr["text"] ); | 1567 | QColor c( attr["text"] ); |
1562 | if ( formatCollection()->defaultFormat()->color() != c ) { | 1568 | if ( formatCollection()->defaultFormat()->color() != c ) { |
1563 | QDict<QTextFormat> formats = formatCollection()->dict(); | 1569 | QDict<QTextFormat> formats = formatCollection()->dict(); |
1564 | QDictIterator<QTextFormat> it( formats ); | 1570 | QDictIterator<QTextFormat> it( formats ); |
1565 | while ( it.current() ) { | 1571 | while ( it.current() ) { |
1566 | if ( it.current() == formatCollection()->defaultFormat() ) { | 1572 | if ( it.current() == formatCollection()->defaultFormat() ) { |
1567 | ++it; | 1573 | ++it; |
1568 | continue; | 1574 | continue; |
1569 | } | 1575 | } |
1570 | it.current()->setColor( c ); | 1576 | it.current()->setColor( c ); |
1571 | ++it; | 1577 | ++it; |
1572 | } | 1578 | } |
1573 | formatCollection()->defaultFormat()->setColor( c ); | 1579 | formatCollection()->defaultFormat()->setColor( c ); |
1574 | curtag.format.setColor( c ); | 1580 | curtag.format.setColor( c ); |
@@ -2131,49 +2137,49 @@ static QString margin_to_string( QStyleSheetItem* style, int t, int b, int l, in | |||
2131 | if ( fl > 0 ) | 2137 | if ( fl > 0 ) |
2132 | s += QString(!!s?";":"") + "text-indent:" + QString::number(fl+QMAX(0,style->margin(QStyleSheetItem::MarginFirstLine))) + "px"; | 2138 | s += QString(!!s?";":"") + "text-indent:" + QString::number(fl+QMAX(0,style->margin(QStyleSheetItem::MarginFirstLine))) + "px"; |
2133 | if ( !!s ) | 2139 | if ( !!s ) |
2134 | return " style=\"" + s + "\""; | 2140 | return " style=\"" + s + "\""; |
2135 | return QString::null; | 2141 | return QString::null; |
2136 | } | 2142 | } |
2137 | 2143 | ||
2138 | QString QTextDocument::richText() const | 2144 | QString QTextDocument::richText() const |
2139 | { | 2145 | { |
2140 | QString s = ""; | 2146 | QString s = ""; |
2141 | if ( !par ) { | 2147 | if ( !par ) { |
2142 | s += "<html><head><meta name=\"qrichtext\" content=\"1\" /></head><body style=\"font-size:" ; | 2148 | s += "<html><head><meta name=\"qrichtext\" content=\"1\" /></head><body style=\"font-size:" ; |
2143 | s += QString::number( formatCollection()->defaultFormat()->font().pointSize() ); | 2149 | s += QString::number( formatCollection()->defaultFormat()->font().pointSize() ); |
2144 | s += "pt;font-family:"; | 2150 | s += "pt;font-family:"; |
2145 | s += formatCollection()->defaultFormat()->font().family(); | 2151 | s += formatCollection()->defaultFormat()->font().family(); |
2146 | s +="\">"; | 2152 | s +="\">"; |
2147 | } | 2153 | } |
2148 | QTextParagraph* p = fParag; | 2154 | QTextParagraph* p = fParag; |
2149 | 2155 | ||
2150 | QStyleSheetItem* item_p = styleSheet()->item("p"); | 2156 | QStyleSheetItem* item_p = styleSheet()->item("p"); |
2151 | QStyleSheetItem* item_ul = styleSheet()->item("ul"); | 2157 | QStyleSheetItem* item_ul = styleSheet()->item("ul"); |
2152 | QStyleSheetItem* item_ol = styleSheet()->item("ol"); | 2158 | QStyleSheetItem* item_ol = styleSheet()->item("ol"); |
2153 | QStyleSheetItem* item_li = styleSheet()->item("li"); | 2159 | QStyleSheetItem* item_li = styleSheet()->item("li"); |
2154 | if ( !item_p || !item_ul || !item_ol || !item_li ) { | 2160 | if ( !item_p || !item_ul || !item_ol || !item_li ) { |
2155 | qWarning( "QTextEdit: cannot export HTML due to insufficient stylesheet (lack of p, ul, ol, or li)" ); | 2161 | owarn << "QTextEdit: cannot export HTML due to insufficient stylesheet (lack of p, ul, ol, or li)" << oendl; |
2156 | return QString::null; | 2162 | return QString::null; |
2157 | } | 2163 | } |
2158 | int pastListDepth = 0; | 2164 | int pastListDepth = 0; |
2159 | int listDepth = 0; | 2165 | int listDepth = 0; |
2160 | int futureListDepth = 0; | 2166 | int futureListDepth = 0; |
2161 | QMemArray<int> listStyles(10); | 2167 | QMemArray<int> listStyles(10); |
2162 | 2168 | ||
2163 | while ( p ) { | 2169 | while ( p ) { |
2164 | listDepth = p->listDepth(); | 2170 | listDepth = p->listDepth(); |
2165 | if ( listDepth < pastListDepth ) { | 2171 | if ( listDepth < pastListDepth ) { |
2166 | for ( int i = listDepth+1; i <= pastListDepth; i++ ) | 2172 | for ( int i = listDepth+1; i <= pastListDepth; i++ ) |
2167 | s += list_is_ordered( listStyles[i] ) ? "</ol>" : "</ul>"; | 2173 | s += list_is_ordered( listStyles[i] ) ? "</ol>" : "</ul>"; |
2168 | s += '\n'; | 2174 | s += '\n'; |
2169 | } else if ( listDepth > pastListDepth ) { | 2175 | } else if ( listDepth > pastListDepth ) { |
2170 | s += '\n'; | 2176 | s += '\n'; |
2171 | listStyles.resize( QMAX( (int)listStyles.size(), listDepth+1 ) ); | 2177 | listStyles.resize( QMAX( (int)listStyles.size(), listDepth+1 ) ); |
2172 | QString list_type; | 2178 | QString list_type; |
2173 | listStyles[listDepth] = p->listStyle(); | 2179 | listStyles[listDepth] = p->listStyle(); |
2174 | if ( !list_is_ordered( p->listStyle() ) || item_ol->listStyle() != p->listStyle() ) | 2180 | if ( !list_is_ordered( p->listStyle() ) || item_ol->listStyle() != p->listStyle() ) |
2175 | list_type = " type=" + list_style_to_string( p->listStyle() ); | 2181 | list_type = " type=" + list_style_to_string( p->listStyle() ); |
2176 | for ( int i = pastListDepth; i < listDepth; i++ ) { | 2182 | for ( int i = pastListDepth; i < listDepth; i++ ) { |
2177 | s += list_is_ordered( p->listStyle() ) ? "<ol" : "<ul" ; | 2183 | s += list_is_ordered( p->listStyle() ) ? "<ol" : "<ul" ; |
2178 | s += list_type + ">"; | 2184 | s += list_type + ">"; |
2179 | } | 2185 | } |
@@ -4075,102 +4081,102 @@ void QTextParagraph::format( int start, bool doMove ) | |||
4075 | invalid = -1; | 4081 | invalid = -1; |
4076 | //##### string()->setTextChanged( FALSE ); | 4082 | //##### string()->setTextChanged( FALSE ); |
4077 | } | 4083 | } |
4078 | 4084 | ||
4079 | int QTextParagraph::lineHeightOfChar( int i, int *bl, int *y ) const | 4085 | int QTextParagraph::lineHeightOfChar( int i, int *bl, int *y ) const |
4080 | { | 4086 | { |
4081 | if ( !isValid() ) | 4087 | if ( !isValid() ) |
4082 | ( (QTextParagraph*)this )->format(); | 4088 | ( (QTextParagraph*)this )->format(); |
4083 | 4089 | ||
4084 | QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.end(); | 4090 | QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.end(); |
4085 | --it; | 4091 | --it; |
4086 | for ( ;; ) { | 4092 | for ( ;; ) { |
4087 | if ( i >= it.key() ) { | 4093 | if ( i >= it.key() ) { |
4088 | if ( bl ) | 4094 | if ( bl ) |
4089 | *bl = ( *it )->baseLine; | 4095 | *bl = ( *it )->baseLine; |
4090 | if ( y ) | 4096 | if ( y ) |
4091 | *y = ( *it )->y; | 4097 | *y = ( *it )->y; |
4092 | return ( *it )->h; | 4098 | return ( *it )->h; |
4093 | } | 4099 | } |
4094 | if ( it == lineStarts.begin() ) | 4100 | if ( it == lineStarts.begin() ) |
4095 | break; | 4101 | break; |
4096 | --it; | 4102 | --it; |
4097 | } | 4103 | } |
4098 | 4104 | ||
4099 | qWarning( "QTextParagraph::lineHeightOfChar: couldn't find lh for %d", i ); | 4105 | owarn << "QTextParagraph::lineHeightOfChar: couldn't find lh for " << i << "" << oendl; |
4100 | return 15; | 4106 | return 15; |
4101 | } | 4107 | } |
4102 | 4108 | ||
4103 | QTextStringChar *QTextParagraph::lineStartOfChar( int i, int *index, int *line ) const | 4109 | QTextStringChar *QTextParagraph::lineStartOfChar( int i, int *index, int *line ) const |
4104 | { | 4110 | { |
4105 | if ( !isValid() ) | 4111 | if ( !isValid() ) |
4106 | ( (QTextParagraph*)this )->format(); | 4112 | ( (QTextParagraph*)this )->format(); |
4107 | 4113 | ||
4108 | int l = (int)lineStarts.count() - 1; | 4114 | int l = (int)lineStarts.count() - 1; |
4109 | QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.end(); | 4115 | QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.end(); |
4110 | --it; | 4116 | --it; |
4111 | for ( ;; ) { | 4117 | for ( ;; ) { |
4112 | if ( i >= it.key() ) { | 4118 | if ( i >= it.key() ) { |
4113 | if ( index ) | 4119 | if ( index ) |
4114 | *index = it.key(); | 4120 | *index = it.key(); |
4115 | if ( line ) | 4121 | if ( line ) |
4116 | *line = l; | 4122 | *line = l; |
4117 | return &str->at( it.key() ); | 4123 | return &str->at( it.key() ); |
4118 | } | 4124 | } |
4119 | if ( it == lineStarts.begin() ) | 4125 | if ( it == lineStarts.begin() ) |
4120 | break; | 4126 | break; |
4121 | --it; | 4127 | --it; |
4122 | --l; | 4128 | --l; |
4123 | } | 4129 | } |
4124 | 4130 | ||
4125 | qWarning( "QTextParagraph::lineStartOfChar: couldn't find %d", i ); | 4131 | owarn << "QTextParagraph::lineStartOfChar: couldn't find " << i << "" << oendl; |
4126 | return 0; | 4132 | return 0; |
4127 | } | 4133 | } |
4128 | 4134 | ||
4129 | int QTextParagraph::lines() const | 4135 | int QTextParagraph::lines() const |
4130 | { | 4136 | { |
4131 | if ( !isValid() ) | 4137 | if ( !isValid() ) |
4132 | ( (QTextParagraph*)this )->format(); | 4138 | ( (QTextParagraph*)this )->format(); |
4133 | 4139 | ||
4134 | return (int)lineStarts.count(); | 4140 | return (int)lineStarts.count(); |
4135 | } | 4141 | } |
4136 | 4142 | ||
4137 | QTextStringChar *QTextParagraph::lineStartOfLine( int line, int *index ) const | 4143 | QTextStringChar *QTextParagraph::lineStartOfLine( int line, int *index ) const |
4138 | { | 4144 | { |
4139 | if ( !isValid() ) | 4145 | if ( !isValid() ) |
4140 | ( (QTextParagraph*)this )->format(); | 4146 | ( (QTextParagraph*)this )->format(); |
4141 | 4147 | ||
4142 | if ( line >= 0 && line < (int)lineStarts.count() ) { | 4148 | if ( line >= 0 && line < (int)lineStarts.count() ) { |
4143 | QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin(); | 4149 | QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin(); |
4144 | while ( line-- > 0 ) | 4150 | while ( line-- > 0 ) |
4145 | ++it; | 4151 | ++it; |
4146 | int i = it.key(); | 4152 | int i = it.key(); |
4147 | if ( index ) | 4153 | if ( index ) |
4148 | *index = i; | 4154 | *index = i; |
4149 | return &str->at( i ); | 4155 | return &str->at( i ); |
4150 | } | 4156 | } |
4151 | 4157 | ||
4152 | qWarning( "QTextParagraph::lineStartOfLine: couldn't find %d", line ); | 4158 | owarn << "QTextParagraph::lineStartOfLine: couldn't find " << line << "" << oendl; |
4153 | return 0; | 4159 | return 0; |
4154 | } | 4160 | } |
4155 | 4161 | ||
4156 | int QTextParagraph::leftGap() const | 4162 | int QTextParagraph::leftGap() const |
4157 | { | 4163 | { |
4158 | if ( !isValid() ) | 4164 | if ( !isValid() ) |
4159 | ( (QTextParagraph*)this )->format(); | 4165 | ( (QTextParagraph*)this )->format(); |
4160 | 4166 | ||
4161 | int line = 0; | 4167 | int line = 0; |
4162 | int x = str->at(0).x; /* set x to x of first char */ | 4168 | int x = str->at(0).x; /* set x to x of first char */ |
4163 | if ( str->isBidi() ) { | 4169 | if ( str->isBidi() ) { |
4164 | for ( int i = 1; i < str->length()-1; ++i ) | 4170 | for ( int i = 1; i < str->length()-1; ++i ) |
4165 | x = QMIN(x, str->at(i).x); | 4171 | x = QMIN(x, str->at(i).x); |
4166 | return x; | 4172 | return x; |
4167 | } | 4173 | } |
4168 | 4174 | ||
4169 | QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin(); | 4175 | QMap<int, QTextLineStart*>::ConstIterator it = lineStarts.begin(); |
4170 | while (line < (int)lineStarts.count()) { | 4176 | while (line < (int)lineStarts.count()) { |
4171 | int i = it.key(); /* char index */ | 4177 | int i = it.key(); /* char index */ |
4172 | x = QMIN(x, str->at(i).x); | 4178 | x = QMIN(x, str->at(i).x); |
4173 | ++it; | 4179 | ++it; |
4174 | ++line; | 4180 | ++line; |
4175 | } | 4181 | } |
4176 | return x; | 4182 | return x; |
@@ -5676,49 +5682,49 @@ QTextFormat *QTextFormatCollection::format( QTextFormat *of, QTextFormat *nf, in | |||
5676 | QTextFormat *QTextFormatCollection::format( const QFont &f, const QColor &c ) | 5682 | QTextFormat *QTextFormatCollection::format( const QFont &f, const QColor &c ) |
5677 | { | 5683 | { |
5678 | if ( cachedFormat && cfont == f && ccol == c ) { | 5684 | if ( cachedFormat && cfont == f && ccol == c ) { |
5679 | cachedFormat->addRef(); | 5685 | cachedFormat->addRef(); |
5680 | return cachedFormat; | 5686 | return cachedFormat; |
5681 | } | 5687 | } |
5682 | 5688 | ||
5683 | QString key = QTextFormat::getKey( f, c, FALSE, QTextFormat::AlignNormal ); | 5689 | QString key = QTextFormat::getKey( f, c, FALSE, QTextFormat::AlignNormal ); |
5684 | cachedFormat = cKey.find( key ); | 5690 | cachedFormat = cKey.find( key ); |
5685 | cfont = f; | 5691 | cfont = f; |
5686 | ccol = c; | 5692 | ccol = c; |
5687 | 5693 | ||
5688 | if ( cachedFormat ) { | 5694 | if ( cachedFormat ) { |
5689 | cachedFormat->addRef(); | 5695 | cachedFormat->addRef(); |
5690 | return cachedFormat; | 5696 | return cachedFormat; |
5691 | } | 5697 | } |
5692 | 5698 | ||
5693 | if ( key == defFormat->key() ) | 5699 | if ( key == defFormat->key() ) |
5694 | return defFormat; | 5700 | return defFormat; |
5695 | 5701 | ||
5696 | cachedFormat = createFormat( f, c ); | 5702 | cachedFormat = createFormat( f, c ); |
5697 | cachedFormat->collection = this; | 5703 | cachedFormat->collection = this; |
5698 | cKey.insert( cachedFormat->key(), cachedFormat ); | 5704 | cKey.insert( cachedFormat->key(), cachedFormat ); |
5699 | if ( cachedFormat->key() != key ) | 5705 | if ( cachedFormat->key() != key ) |
5700 | qWarning("ASSERT: keys for format not identical: '%s '%s'", cachedFormat->key().latin1(), key.latin1() ); | 5706 | owarn << "ASSERT: keys for format not identical: '" << cachedFormat->key().latin1() << " '" << key.latin1() << "'" << oendl; |
5701 | return cachedFormat; | 5707 | return cachedFormat; |
5702 | } | 5708 | } |
5703 | 5709 | ||
5704 | void QTextFormatCollection::remove( QTextFormat *f ) | 5710 | void QTextFormatCollection::remove( QTextFormat *f ) |
5705 | { | 5711 | { |
5706 | if ( lastFormat == f ) | 5712 | if ( lastFormat == f ) |
5707 | lastFormat = 0; | 5713 | lastFormat = 0; |
5708 | if ( cres == f ) | 5714 | if ( cres == f ) |
5709 | cres = 0; | 5715 | cres = 0; |
5710 | if ( cachedFormat == f ) | 5716 | if ( cachedFormat == f ) |
5711 | cachedFormat = 0; | 5717 | cachedFormat = 0; |
5712 | cKey.remove( f->key() ); | 5718 | cKey.remove( f->key() ); |
5713 | } | 5719 | } |
5714 | 5720 | ||
5715 | #define UPDATE( up, lo, rest ) \ | 5721 | #define UPDATE( up, lo, rest ) \ |
5716 | if ( font.lo##rest() != defFormat->fn.lo##rest() && fm->fn.lo##rest() == defFormat->fn.lo##rest() ) \ | 5722 | if ( font.lo##rest() != defFormat->fn.lo##rest() && fm->fn.lo##rest() == defFormat->fn.lo##rest() ) \ |
5717 | fm->fn.set##up##rest( font.lo##rest() ) | 5723 | fm->fn.set##up##rest( font.lo##rest() ) |
5718 | 5724 | ||
5719 | void QTextFormatCollection::updateDefaultFormat( const QFont &font, const QColor &color, QStyleSheet *sheet ) | 5725 | void QTextFormatCollection::updateDefaultFormat( const QFont &font, const QColor &color, QStyleSheet *sheet ) |
5720 | { | 5726 | { |
5721 | QDictIterator<QTextFormat> it( cKey ); | 5727 | QDictIterator<QTextFormat> it( cKey ); |
5722 | QTextFormat *fm; | 5728 | QTextFormat *fm; |
5723 | bool usePixels = font.pointSize() == -1; | 5729 | bool usePixels = font.pointSize() == -1; |
5724 | bool changeSize = usePixels ? font.pixelSize() != defFormat->fn.pixelSize() : | 5730 | bool changeSize = usePixels ? font.pixelSize() != defFormat->fn.pixelSize() : |
@@ -6062,53 +6068,53 @@ QTextImage::QTextImage( QTextDocument *p, const QMap<QString, QString> &attr, co | |||
6062 | if ( attr.contains("height") ) | 6068 | if ( attr.contains("height") ) |
6063 | height = attr["height"].toInt(); | 6069 | height = attr["height"].toInt(); |
6064 | 6070 | ||
6065 | reg = 0; | 6071 | reg = 0; |
6066 | QString imageName = attr["src"]; | 6072 | QString imageName = attr["src"]; |
6067 | 6073 | ||
6068 | if (!imageName) | 6074 | if (!imageName) |
6069 | imageName = attr["source"]; | 6075 | imageName = attr["source"]; |
6070 | 6076 | ||
6071 | if ( !imageName.isEmpty() ) { | 6077 | if ( !imageName.isEmpty() ) { |
6072 | imgId = QString( "%1,%2,%3,%4" ).arg( imageName ).arg( width ).arg( height ).arg( (ulong)&factory ); | 6078 | imgId = QString( "%1,%2,%3,%4" ).arg( imageName ).arg( width ).arg( height ).arg( (ulong)&factory ); |
6073 | if ( !pixmap_map ) | 6079 | if ( !pixmap_map ) |
6074 | pixmap_map = new QMap<QString, QPixmapInt>; | 6080 | pixmap_map = new QMap<QString, QPixmapInt>; |
6075 | if ( pixmap_map->contains( imgId ) ) { | 6081 | if ( pixmap_map->contains( imgId ) ) { |
6076 | QPixmapInt& pmi = pixmap_map->operator[](imgId); | 6082 | QPixmapInt& pmi = pixmap_map->operator[](imgId); |
6077 | pm = pmi.pm; | 6083 | pm = pmi.pm; |
6078 | pmi.ref++; | 6084 | pmi.ref++; |
6079 | width = pm.width(); | 6085 | width = pm.width(); |
6080 | height = pm.height(); | 6086 | height = pm.height(); |
6081 | } else { | 6087 | } else { |
6082 | QImage img; | 6088 | QImage img; |
6083 | const QMimeSource* m = | 6089 | const QMimeSource* m = |
6084 | factory.data( imageName, context ); | 6090 | factory.data( imageName, context ); |
6085 | if ( !m ) { | 6091 | if ( !m ) { |
6086 | qWarning("QTextImage: no mimesource for %s", imageName.latin1() ); | 6092 | owarn << "QTextImage: no mimesource for " << imageName.latin1() << "" << oendl; |
6087 | } | 6093 | } |
6088 | else { | 6094 | else { |
6089 | if ( !QImageDrag::decode( m, img ) ) { | 6095 | if ( !QImageDrag::decode( m, img ) ) { |
6090 | qWarning("QTextImage: cannot decode %s", imageName.latin1() ); | 6096 | owarn << "QTextImage: cannot decode " << imageName.latin1() << "" << oendl; |
6091 | } | 6097 | } |
6092 | } | 6098 | } |
6093 | 6099 | ||
6094 | if ( !img.isNull() ) { | 6100 | if ( !img.isNull() ) { |
6095 | if ( width == 0 ) { | 6101 | if ( width == 0 ) { |
6096 | width = img.width(); | 6102 | width = img.width(); |
6097 | if ( height != 0 ) { | 6103 | if ( height != 0 ) { |
6098 | width = img.width() * height / img.height(); | 6104 | width = img.width() * height / img.height(); |
6099 | } | 6105 | } |
6100 | } | 6106 | } |
6101 | if ( height == 0 ) { | 6107 | if ( height == 0 ) { |
6102 | height = img.height(); | 6108 | height = img.height(); |
6103 | if ( width != img.width() ) { | 6109 | if ( width != img.width() ) { |
6104 | height = img.height() * width / img.width(); | 6110 | height = img.height() * width / img.width(); |
6105 | } | 6111 | } |
6106 | } | 6112 | } |
6107 | if ( img.width() != width || img.height() != height ){ | 6113 | if ( img.width() != width || img.height() != height ){ |
6108 | #ifndef QT_NO_IMAGE_SMOOTHSCALE | 6114 | #ifndef QT_NO_IMAGE_SMOOTHSCALE |
6109 | img = img.smoothScale(width, height); | 6115 | img = img.smoothScale(width, height); |
6110 | #endif | 6116 | #endif |
6111 | width = img.width(); | 6117 | width = img.width(); |
6112 | height = img.height(); | 6118 | height = img.height(); |
6113 | } | 6119 | } |
6114 | pm.convertFromImage( img ); | 6120 | pm.convertFromImage( img ); |