35 #include <QtGui/QTextDocumentFragment>
36 #include <QtGui/QMouseEvent>
43 class KRichTextEditPrivate :
public QObject
49 nestedListHelper =
new NestedListHelper(q);
52 ~KRichTextEditPrivate() {
53 delete nestedListHelper;
63 void selectLinkText()
const;
69 void activateRichText();
72 void mergeFormatOnWordOrSelection(
const QTextCharFormat &format);
74 void setTextCursor(QTextCursor &cursor);
82 NestedListHelper *nestedListHelper;
86 void KRichTextEditPrivate::activateRichText()
89 q->setAcceptRichText(
true);
91 emit q->textModeChanged(mMode);
95 void KRichTextEditPrivate::setTextCursor(QTextCursor &cursor)
97 q->setTextCursor(cursor);
100 void KRichTextEditPrivate::mergeFormatOnWordOrSelection(
const QTextCharFormat &format)
102 QTextCursor cursor = q->textCursor();
103 QTextCursor wordStart(cursor);
104 QTextCursor wordEnd(cursor);
106 wordStart.movePosition(QTextCursor::StartOfWord);
107 wordEnd.movePosition(QTextCursor::EndOfWord);
109 cursor.beginEditBlock();
110 if (!cursor.hasSelection() && cursor.position() != wordStart.position() && cursor.position() != wordEnd.position())
111 cursor.select(QTextCursor::WordUnderCursor);
112 cursor.mergeCharFormat(format);
113 q->mergeCurrentCharFormat(format);
114 cursor.endEditBlock();
119 :
KTextEdit(text, parent), d(new KRichTextEditPrivate(this))
125 :
KTextEdit(parent), d(new KRichTextEditPrivate(this))
136 void KRichTextEditPrivate::init()
138 q->setAcceptRichText(
false);
145 d->nestedListHelper->handleOnBulletType(-_styleIndex);
147 d->activateRichText();
152 d->nestedListHelper->handleOnIndentMore();
153 d->activateRichText();
158 d->nestedListHelper->handleOnIndentLess();
163 QTextCursor cursor = textCursor();
164 QTextBlockFormat bf = cursor.blockFormat();
165 QTextCharFormat cf = cursor.charFormat();
167 cursor.beginEditBlock();
168 cursor.insertHtml(
"<hr>");
169 cursor.insertBlock(bf, cf);
170 setTextCursor(cursor);
171 d->activateRichText();
172 cursor.endEditBlock();
177 setAlignment(Qt::AlignLeft);
179 d->activateRichText();
184 setAlignment(Qt::AlignHCenter);
186 d->activateRichText();
191 setAlignment(Qt::AlignRight);
193 d->activateRichText();
198 setAlignment(Qt::AlignJustify);
200 d->activateRichText();
205 QTextBlockFormat format;
206 format.setLayoutDirection(Qt::RightToLeft);
207 QTextCursor cursor = textCursor();
208 cursor.mergeBlockFormat(format);
209 setTextCursor(cursor);
211 d->activateRichText();
216 QTextBlockFormat format;
217 format.setLayoutDirection(Qt::LeftToRight);
218 QTextCursor cursor = textCursor();
219 cursor.mergeBlockFormat(format);
220 setTextCursor(cursor);
222 d->activateRichText();
228 fmt.setFontWeight(bold ? QFont::Bold : QFont::Normal);
229 d->mergeFormatOnWordOrSelection(fmt);
231 d->activateRichText();
237 fmt.setFontItalic(italic);
238 d->mergeFormatOnWordOrSelection(fmt);
240 d->activateRichText();
246 fmt.setFontUnderline(underline);
247 d->mergeFormatOnWordOrSelection(fmt);
249 d->activateRichText();
255 fmt.setFontStrikeOut(strikeOut);
256 d->mergeFormatOnWordOrSelection(fmt);
258 d->activateRichText();
264 fmt.setForeground(color);
265 d->mergeFormatOnWordOrSelection(fmt);
267 d->activateRichText();
273 fmt.setBackground(color);
274 d->mergeFormatOnWordOrSelection(fmt);
276 d->activateRichText();
282 fmt.setFontFamily(fontFamily);
283 d->mergeFormatOnWordOrSelection(fmt);
285 d->activateRichText();
291 fmt.setFontPointSize(size);
292 d->mergeFormatOnWordOrSelection(fmt);
294 d->activateRichText();
301 d->mergeFormatOnWordOrSelection(fmt);
303 d->activateRichText();
308 if (d->mMode ==
Rich) {
311 document()->setPlainText(document()->toPlainText());
312 setAcceptRichText(
false);
320 fmt.setVerticalAlignment(superscript ? QTextCharFormat::AlignSuperScript : QTextCharFormat::AlignNormal);
321 d->mergeFormatOnWordOrSelection(fmt);
323 d->activateRichText();
329 fmt.setVerticalAlignment(subscript ? QTextCharFormat::AlignSubScript : QTextCharFormat::AlignNormal);
330 d->mergeFormatOnWordOrSelection(fmt);
332 d->activateRichText();
337 d->activateRichText();
350 return toPlainText();
356 if (Qt::mightBeRichText(text)) {
358 d->activateRichText();
368 QTextCursor cursor = textCursor();
370 return cursor.selectedText();
375 QTextCursor cursor = textCursor();
377 d->setTextCursor(cursor);
383 if (cursor->charFormat().isAnchor()) {
384 QString aHref = cursor->charFormat().anchorHref();
387 while (cursor->charFormat().anchorHref() == aHref) {
388 if (cursor->atStart())
390 cursor->setPosition(cursor->position() - 1);
392 if (cursor->charFormat().anchorHref() != aHref)
393 cursor->setPosition(cursor->position() + 1, QTextCursor::KeepAnchor);
396 while (cursor->charFormat().anchorHref() == aHref) {
399 cursor->setPosition(cursor->position() + 1, QTextCursor::KeepAnchor);
401 if (cursor->charFormat().anchorHref() != aHref)
402 cursor->setPosition(cursor->position() - 1, QTextCursor::KeepAnchor);
403 }
else if (cursor->hasSelection()) {
408 cursor->movePosition(QTextCursor::StartOfWord);
409 cursor->movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
415 return textCursor().charFormat().anchorHref();
422 QTextCursor cursor = textCursor();
423 cursor.beginEditBlock();
425 if (!cursor.hasSelection()) {
426 cursor.select(QTextCursor::WordUnderCursor);
429 QTextCharFormat format = cursor.charFormat();
432 const QTextCharFormat originalFormat = format;
433 if (!linkUrl.isEmpty()) {
435 format.setAnchor(
true);
436 format.setAnchorHref(linkUrl);
440 format.setUnderlineStyle(QTextCharFormat::SingleUnderline);
443 d->activateRichText();
446 format.setAnchor(
false);
447 format.setAnchorHref(
QString());
451 QTextDocument defaultTextDocument;
452 QTextCharFormat defaultCharFormat = defaultTextDocument.begin().charFormat();
454 format.setUnderlineStyle( defaultCharFormat.underlineStyle() );
455 format.setUnderlineColor( defaultCharFormat.underlineColor() );
456 format.setForeground( defaultCharFormat.foreground() );
461 if (!linkText.isEmpty()) {
462 _linkText = linkText;
466 cursor.insertText(_linkText, format);
471 if (!linkUrl.isEmpty() && cursor.atBlockEnd()) {
472 cursor.setPosition(cursor.selectionEnd());
473 cursor.setCharFormat(originalFormat);
474 cursor.insertText(
QString(
" "));
477 cursor.endEditBlock();
482 bool handled =
false;
483 if (textCursor().currentList()) {
486 handled = d->nestedListHelper->handleBeforeKeyPressEvent(event);
493 if (textCursor().currentList()) {
494 d->nestedListHelper->handleAfterKeyPressEvent(event);
496 emit cursorPositionChanged();
515 return d->nestedListHelper->canIndent();
520 return d->nestedListHelper->canDedent();
527 static const QString EMPTYLINEHTML = QLatin1String(
528 "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; "
529 "margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; \"> </p>" );
533 static const QString EMPTYLINEREGEX = QLatin1String(
534 "<p style=\"-qt-paragraph-type:empty;(.*)</p>" );
536 static const QString OLLISTPATTERNQT = QLatin1String(
537 "<ol style=\"margin-top: 0px; margin-bottom: 0px; margin-left: 0px;" );
539 static const QString ULLISTPATTERNQT = QLatin1String(
540 "<ul style=\"margin-top: 0px; margin-bottom: 0px; margin-left: 0px;" );
542 static const QString ORDEREDLISTHTML = QLatin1String(
543 "<ol style=\"margin-top: 0px; margin-bottom: 0px;" );
545 static const QString UNORDEREDLISTHTML = QLatin1String(
546 "<ul style=\"margin-top: 0px; margin-bottom: 0px;" );
553 QRegExp emptyLineFinder( EMPTYLINEREGEX );
554 emptyLineFinder.setMinimal(
true );
557 int offset = emptyLineFinder.indexIn( result, 0 );
558 while (offset != -1) {
560 result.replace( offset, emptyLineFinder.matchedLength(), EMPTYLINEHTML );
562 offset += EMPTYLINEHTML.length();
564 offset = emptyLineFinder.indexIn( result, offset );
569 result.replace(OLLISTPATTERNQT, ORDEREDLISTHTML);
573 result.replace(ULLISTPATTERNQT, UNORDEREDLISTHTML);
578 #include "krichtextedit.moc"