virtual void visitBlock(QTextBlock &block, const QTextCursor &caret) { m_formats.clear(); m_cursors.clear(); for (QTextBlock::iterator it = block.begin(); it != block.end(); ++it) { QTextCursor fragmentSelection(caret); fragmentSelection.setPosition(it.fragment().position()); fragmentSelection.setPosition(it.fragment().position() + it.fragment().length(), QTextCursor::KeepAnchor); if (fragmentSelection.anchor() >= fragmentSelection.position()) { continue; } visitFragmentSelection(fragmentSelection); } QTextCursor cursor(caret); cursor.mergeBlockFormat(m_deltaBlockFormat); cursor.mergeBlockCharFormat(m_deltaCharFormat); QList<QTextCharFormat>::Iterator it = m_formats.begin(); foreach(QTextCursor cursor, m_cursors) { cursor.setCharFormat(*it); ++it; }
void TextDocumentModel::fillBlock(const QTextBlock &block, QStandardItem *parent) { for (QTextBlock::iterator it = block.begin(); it != block.end(); ++it) { QStandardItem *item = new QStandardItem(tr("Fragment: %1").arg(it.fragment().text())); const QRectF b = m_document->documentLayout()->blockBoundingRect(block); appendRow(parent, item, it.fragment().charFormat(), b); } }
bool ContactListEdit::isClickOnContact() { _right_click += QPoint(2, 0); int current_position = this->document()->documentLayout()->hitTest( _right_click, Qt::ExactHit ); if(current_position > -1) { QTextBlock current_block = document()->begin(); while(current_block.isValid()) { for(QTextBlock::iterator it = current_block.begin(); !(it.atEnd()); ++it) { QTextFragment current_fragment = it.fragment(); if(current_fragment.isValid()) if(current_fragment.contains(current_position)) { QTextFormat current_format = current_fragment.charFormat(); if(current_format.isImageFormat()) { _image_format = current_format.toImageFormat(); return true; } } } current_block = current_block.next(); } } return false; }
void XmlWriter::readFragment(const QTextBlock ¤tBlock, QDomElement blockElement, QDomDocument *document) { //! [3] //! [4] QTextBlock::iterator it; for (it = currentBlock.begin(); !(it.atEnd()); ++it) { QTextFragment currentFragment = it.fragment(); if (currentFragment.isValid()) //! [3] //! [5] processFragment(currentFragment); //! [4] //! [5] if (currentFragment.isValid()) { QDomElement fragmentElement = document->createElement("fragment"); blockElement.appendChild(fragmentElement); fragmentElement.setAttribute("length", currentFragment.length()); QDomText fragmentText = document->createTextNode(currentFragment.text()); fragmentElement.appendChild(fragmentText); } //! [6] //! [7] } //! [7] //! [6] }
void TextDocument::replaceImageUrl(const QUrl &oldName, const QString &newName) { QList <QPair<int, int> > fragments; QTextBlock block = begin(); while(block.isValid()) { QTextBlock::iterator iterator; for(iterator = block.begin(); !(iterator.atEnd()); ++iterator) { QTextFragment fragment = iterator.fragment(); if(fragment.isValid() && fragment.charFormat().isImageFormat()) { QTextImageFormat format = fragment.charFormat().toImageFormat(); if (QUrl::fromEncoded(format.name().toUtf8()) != oldName) {continue;} fragments.append(QPair<int, int>(fragment.position(), fragment.length())); } } block = block.next(); } QTextCursor cursor(this); cursor.beginEditBlock(); QPair<int, int> pair; foreach (pair, fragments) { cursor.setPosition(pair.first); cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor, pair.second); QTextImageFormat format = cursor.charFormat().toImageFormat(); format.setName(newName); cursor.mergeCharFormat(format); }
QTextDocumentFragment SimpleMessageStyle::textFragmentAt(QWidget *AWidget, const QPoint &APosition) const { StyleViewer *view = qobject_cast<StyleViewer *>(AWidget); if (view) { QTextCursor cursor = view->cursorForPosition(APosition); for (QTextBlock::iterator it = cursor.block().begin(); !it.atEnd(); ++it) { if (it.fragment().contains(cursor.position())) { cursor.setPosition(it.fragment().position()); cursor.movePosition(QTextCursor::NextCharacter,QTextCursor::KeepAnchor,it.fragment().length()); return cursor.selection(); } } } return QTextDocumentFragment(); }
void OdtWriter::writeAutomaticStyles(const QTextDocument* document) { m_xml.writeStartElement(QString::fromLatin1("office:automatic-styles")); QVector<QTextFormat> formats = document->allFormats(); // Find all used styles QVector<int> text_styles; QVector<int> paragraph_styles; int index = 0; for (QTextBlock block = document->begin(); block.isValid(); block = block.next()) { index = block.blockFormatIndex(); if (!paragraph_styles.contains(index)) { int heading = block.blockFormat().property(QTextFormat::UserProperty).toInt(); if (!heading) { paragraph_styles.append(index); } else { m_styles.insert(index, QString("Heading-%1").arg(heading)); } } for (QTextBlock::iterator iter = block.begin(); !(iter.atEnd()); ++iter) { index = iter.fragment().charFormatIndex(); if (!text_styles.contains(index) && formats.at(index).propertyCount()) { text_styles.append(index); } } } // Write text styles int text_style = 1; for (int i = 0; i < text_styles.size(); ++i) { int index = text_styles.at(i); const QTextFormat& format = formats.at(index); QString name = QString::fromLatin1("T") + QString::number(text_style); if (writeTextStyle(format.toCharFormat(), name)) { m_styles.insert(index, name); ++text_style; } } // Write paragraph styles int paragraph_style = 1; for (int i = 0; i < paragraph_styles.size(); ++i) { int index = paragraph_styles.at(i); const QTextFormat& format = formats.at(index); QString name = QString::fromLatin1("P") + QString::number(paragraph_style); if (writeParagraphStyle(format.toBlockFormat(), name)) { m_styles.insert(index, name); ++paragraph_style; } else { m_styles.insert(index, "Normal"); } } m_xml.writeEndElement(); }
void ChangeFollower::processUpdates(const QList<int> &changedStyles) { KoStyleManager *sm = m_styleManager.data(); if (!sm) { // since the stylemanager would be the one calling this method, I doubt this // will ever happen. But better safe than sorry.. deleteLater(); return; } // optimization strategy; store the formatid of the formats we checked into // a qset for 'hits' and 'ignores' and avoid the copying of the format // (fragment.charFormat() / block.blockFormat()) when the formatId is // already checked previosly QTextCursor cursor(m_document); QTextBlock block = cursor.block(); while (block.isValid()) { QTextBlockFormat bf = block.blockFormat(); int id = bf.intProperty(KoParagraphStyle::StyleId); if (id > 0 && changedStyles.contains(id)) { cursor.setPosition(block.position()); KoParagraphStyle *style = sm->paragraphStyle(id); Q_ASSERT(style); style->applyStyle(bf); cursor.setBlockFormat(bf); } QTextCharFormat cf = block.charFormat(); id = cf.intProperty(KoCharacterStyle::StyleId); if (id > 0 && changedStyles.contains(id)) { KoCharacterStyle *style = sm->characterStyle(id); Q_ASSERT(style); style->applyStyle(block); } QTextBlock::iterator iter = block.begin(); while (! iter.atEnd()) { QTextFragment fragment = iter.fragment(); cf = fragment.charFormat(); id = cf.intProperty(KoCharacterStyle::StyleId); if (id > 0 && changedStyles.contains(id)) { // create selection cursor.setPosition(fragment.position()); cursor.setPosition(fragment.position() + fragment.length(), QTextCursor::KeepAnchor); KoCharacterStyle *style = sm->characterStyle(id); Q_ASSERT(style); style->applyStyle(cf); cursor.mergeCharFormat(cf); } iter++; } block = block.next(); } }
void MoveViewController::selectAndMarkAnchor(const QString& link) { QTextBlock block = this->document->begin(); while(block != this->document->end()) { QTextBlock::iterator it; for(it = block.begin(); !it.atEnd(); ++it) { QTextFragment fragment = it.fragment(); if(!fragment.isValid()) { continue; } QTextCharFormat format = fragment.charFormat(); if(format.isAnchor() && format.anchorHref() == link) { QTextCursor cursor = this->textCursor(); cursor.setPosition(fragment.position()); int len = 0; bool finished = false; // we want to mark (highlight) everything from the // start of the anchor until the end of the move // the end of the move is indicated by an empty space // (there is always an empty space after a move) while(!finished && !it.atEnd()) { if(it.fragment().text().startsWith(" ") || len >= 6) { finished = true; } else { len+= it.fragment().text().length(); it++; } } cursor.setPosition(fragment.position() + len, QTextCursor::KeepAnchor); setTextCursor(cursor); ensureCursorVisible(); return; } } block = block.next(); } }
QTextFragment ChatView::getFragmentUnderMouse(const QPoint &pos) const { QTextCursor cursor(cursorForPosition(pos)); QTextBlock block(cursor.block()); QTextBlock::iterator it; for (it = block.begin(); !(it.atEnd()); ++it) { QTextFragment frag = it.fragment(); if (frag.contains(cursor.position())) return frag; } return QTextFragment(); }
virtual void visitBlock(QTextBlock &block, const QTextCursor &caret) { for (QTextBlock::iterator it = block.begin(); it != block.end(); ++it) { QTextCursor fragmentSelection(caret); fragmentSelection.setPosition(it.fragment().position()); fragmentSelection.setPosition(it.fragment().position() + it.fragment().length(), QTextCursor::KeepAnchor); if (fragmentSelection.anchor() >= fragmentSelection.position()) { continue; } visitFragmentSelection(fragmentSelection); } QList<QTextCharFormat>::Iterator it = m_formats.begin(); Q_FOREACH (QTextCursor cursor, m_cursors) { QTextFormat prevFormat(cursor.charFormat()); cursor.setCharFormat(*it); editor()->registerTrackedChange(cursor, KoGenChange::FormatChange, kundo2_i18n("Formatting"), *it, prevFormat, false); ++it; }
FontDia::FontDia(QTextCursor* cursor, QWidget* parent) : KDialog(parent), m_cursor(cursor) { //First find out if we have more than one charFormat in our selection. If so, m_initialFormat/m_style will get initialised with the charFormat at the cursor's position. The tabs will get informed of this. if (m_cursor->hasSelection()) { int begin = qMin(m_cursor->anchor(), m_cursor->position()); int end = qMax(m_cursor->anchor(), m_cursor->position()); QTextBlock block = m_cursor->block().document()->findBlock(begin); m_uniqueFormat = true; QTextCursor caret(*m_cursor); caret.setPosition(begin+1); m_initialFormat = caret.charFormat(); while (block.isValid() && block.position() < end) { QTextBlock::iterator iter = block.begin(); while (! iter.atEnd()) { QTextFragment fragment = iter.fragment(); if (fragment.position() >= end) break; if (fragment.position() + fragment.length() <= begin) { iter++; continue; } if (!(m_uniqueFormat = (fragment.charFormat() == m_initialFormat))) break; iter++; } if (!m_uniqueFormat) break; block = block.next(); } } else { m_initialFormat = cursor->charFormat(); m_uniqueFormat = true; } setCaption(i18n("Select Font")); setModal(true); setButtons(Ok | Cancel | Reset | Apply); setDefaultButton(Ok); m_characterGeneral = new CharacterGeneral(this, m_uniqueFormat); m_characterGeneral->hideStyleName(true); setMainWidget(m_characterGeneral); connect(this, SIGNAL(applyClicked()), this, SLOT(slotApply())); connect(this, SIGNAL(okClicked()), this, SLOT(slotOk())); connect(this, SIGNAL(resetClicked()), this, SLOT(slotReset())); initTabs(); }
int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextEdit *editor = new QTextEdit; QTextDocument *document = new QTextDocument(editor); QTextCursor cursor(document); QTextImageFormat imageFormat; imageFormat.setName(":/images/advert.png"); cursor.insertImage(imageFormat); QTextBlock block = cursor.block(); QTextFragment fragment; QTextBlock::iterator it; for (it = block.begin(); !(it.atEnd()); ++it) { fragment = it.fragment(); if (fragment.contains(cursor.position())) break; } //! [0] if (fragment.isValid()) { QTextImageFormat newImageFormat = fragment.charFormat().toImageFormat(); if (newImageFormat.isValid()) { newImageFormat.setName(":/images/newimage.png"); QTextCursor helper = cursor; helper.setPosition(fragment.position()); helper.setPosition(fragment.position() + fragment.length(), QTextCursor::KeepAnchor); helper.setCharFormat(newImageFormat); //! [0] //! [1] } //! [1] //! [2] } //! [2] cursor.insertBlock(); cursor.insertText("Code less. Create more."); editor->setDocument(document); editor->setWindowTitle(tr("Text Document Image Format")); editor->resize(320, 480); editor->show(); return app.exec(); }
QMimeData *ContactListEdit::createMimeDataFromSelection() const { //QTextEdit::createMimeDataFromSelection(); QString textMime; QMimeData *mimeData = new QMimeData (); QTextCursor cursor = textCursor(); int posStart = cursor.selectionStart(); int posEnd = cursor.selectionEnd(); QTextBlock block = this->document()->findBlock(posStart); QTextBlock endBlock = this->document()->findBlock(posEnd); endBlock = endBlock.next(); while (block.isValid() && block != endBlock) { for (QTextBlock::iterator i = block.begin(); !i.atEnd(); ++i) { int position = i.fragment().position(); //qDebug() << i.fragment().position(); if (position >= posEnd) break; if (position >= posStart) { QTextCharFormat format = i.fragment().charFormat(); bool isImage = format.isImageFormat(); if (isImage) { //qDebug() << format.toImageFormat().name(); textMime += format.toImageFormat().name(); } else textMime += i.fragment().text(); } } block = block.next(); } mimeData->setText(textMime); return mimeData; }
QString MercurialEditor::fileNameFromDiffSpecification(const QTextBlock &diffFileSpec) const { const QString filechangeId(QLatin1String("+++ b/")); QTextBlock::iterator iterator; for (iterator = diffFileSpec.begin(); !(iterator.atEnd()); iterator++) { QTextFragment fragment = iterator.fragment(); if(fragment.isValid()) { if (fragment.text().startsWith(filechangeId)) { const QString filename = fragment.text().remove(0, filechangeId.size()); return findDiffFile(filename, MercurialPlugin::instance()->versionControl()); } } } return QString(); }
/*! Replaces the entire contents of the document with the given HTML-formatted text in the \a text string */ void RichString::setHtml(const QString &text) { QTextDocument doc; doc.setHtml(text); QTextBlock block = doc.firstBlock(); QTextBlock::iterator it; for (it = block.begin(); !(it.atEnd()); ++it) { QTextFragment textFragment = it.fragment(); if (textFragment.isValid()) { Format fmt; fmt.setFont(textFragment.charFormat().font()); fmt.setFontColor(textFragment.charFormat().foreground().color()); addFragment(textFragment.text(), fmt); } } }
QStringList ContactListEdit::getListOfImageNames() const { QStringList image_names; QTextBlock block = document()->begin(); while (block.isValid()) { for (QTextBlock::iterator i = block.begin(); !i.atEnd(); ++i) { QTextCharFormat format = i.fragment().charFormat(); bool isImage = format.isImageFormat(); if (isImage) image_names << format.toImageFormat().name(); } block = block.next(); } return image_names; }
bool ContactListEdit::validateClickPosition(const QPoint& position, bool* isExistingContact, bts::addressbook::wallet_contact* foundContact) const { assert(isExistingContact != nullptr); assert(foundContact != nullptr); *isExistingContact = false; QPoint shiftedPos(position); shiftedPos += QPoint(2, 0); int current_position = document()->documentLayout()->hitTest(shiftedPos, Qt::ExactHit); if(current_position > -1) { QTextBlock current_block = document()->begin(); while(current_block.isValid()) { for(QTextBlock::iterator it = current_block.begin(); !(it.atEnd()); ++it) { QTextFragment current_fragment = it.fragment(); if(current_fragment.isValid() && current_fragment.contains(current_position)) { QTextFormat current_format = current_fragment.charFormat(); if(current_format.isImageFormat()) { QTextImageFormat imageFormat = current_format.toImageFormat(); IMailProcessor::TRecipientPublicKey pk; decodePublicKey(imageFormat, &pk); *isExistingContact = Utils::matchContact(pk, foundContact); return true; } } } current_block = current_block.next(); } } return false; }
QString TextDocumentSerializer::processBlockContent(QTextBlock block) { QTextBlock::iterator it = block.begin(); QString text; while(!it.atEnd()){ QTextFragment currentFragment = it.fragment(); if (currentFragment.isValid()) text += processFragment(currentFragment); ++it; } if(block.textList()) return QString("<li>%1</li>").arg(text); else return QString("%1<br>").arg(text); }
FormattedMessage FormattedMessage::parse(const QTextDocument *document) { FormattedMessage result; QString text; QTextBlock block = document->firstBlock(); bool firstParagraph = true; while (block.isValid()) { bool firstFragment = true; for (QTextBlock::iterator it = block.begin(); !it.atEnd(); ++it) { QTextFragment fragment = it.fragment(); if (!fragment.isValid()) continue; if (!firstParagraph && firstFragment) text = '\n' + fragment.text(); else text = fragment.text(); QTextCharFormat format = fragment.charFormat(); parseImages(result, text, format.font().bold(), format.font().italic(), format.font().underline(), format.foreground().color()); firstFragment = false; } if (firstFragment) parseImages(result, "\n", false, false, false, QColor()); block = block.next(); firstParagraph = false; } return result; }
QString Dialog::toStringFromDocument() { QTextDocument *doc = message()->document(); QString txt; for (QTextBlock bl = doc->begin(); bl != doc->end(); bl = bl.next()) if (bl.isValid()) { for (QTextBlock::iterator it = bl.begin(); !it.atEnd(); ++it) { QTextFragment fragm = it.fragment(); if (fragm.isValid() && fragm.charFormat().isImageFormat()) { QString imgName = fragm.charFormat().toImageFormat().name(); txt += imgName; } else if (fragm.isValid()) txt += fragm.text(); } if (bl != doc->begin()) txt += "\n"; } int i = (int)txt.size() - 1; while (i >= 0 && (txt[i] == ' ' || txt[i] == '\n')) --i; txt.remove(i + 1, txt.size() - i - 1); return txt; }
QString RichTextLineEdit::toSimpleHtml() const { QString html; for (QTextBlock block = document()->begin(); block.isValid(); block = block.next()) { for (QTextBlock::iterator i = block.begin(); !i.atEnd(); ++i) { QTextFragment fragment = i.fragment(); if (fragment.isValid()) { QTextCharFormat format = fragment.charFormat(); QColor color = format.foreground().color(); //QString text = Qt::escape(fragment.text()); //deleted for Qt5 QString text = QString(fragment.text()).toHtmlEscaped(); //added for Qt5 QStringList tags; if (format.verticalAlignment() == QTextCharFormat::AlignSubScript) tags << "sub"; else if (format.verticalAlignment() == QTextCharFormat::AlignSuperScript) tags << "sup"; if (format.fontItalic()) tags << "i"; if (format.fontWeight() > QFont::Normal) tags << "b"; if (format.fontStrikeOut()) tags << "s"; while (!tags.isEmpty()) text = QString("<%1>%2</%1>") .arg(tags.takeFirst()).arg(text); if (color != QColor(Qt::black)) text = QString("<font color=\"%1\">%2</font>") .arg(color.name()).arg(text); html += text; } } } return html; }
QStringList TextEdit::Private::traverse( std::function< QString ( const QString & ) > mapping ) const { QStringList script; QTextBlock block( this->host->document()->begin() ); while( block.isValid() ) { QString line; for( QTextBlock::iterator it = block.begin(); !it.atEnd(); ++it ) { QTextFragment fragment( it.fragment() ); if( !fragment.isValid() ) { continue; } if( fragment.charFormat().isImageFormat() ) { QString name( fragment.charFormat().toImageFormat().name() ); line.append( "\'" + mapping( name ) + "\'" ); } else { line.append( fragment.text() ); } } script.append( line ); block = block.next(); } return script; }
void XmlWriter::processBlock(QDomElement &parent, const QTextBlock &block) { QDomElement blockElement = document->createElement("block"); blockElement.setAttribute("position", block.position()); blockElement.setAttribute("length", block.length()); parent.appendChild(blockElement); QTextBlock::iterator it; for (it = block.begin(); !(it.atEnd()); ++it) { QTextFragment fragment = it.fragment(); if (fragment.isValid()) { QDomElement fragmentElement = document->createElement("fragment"); blockElement.appendChild(fragmentElement); fragmentElement.setAttribute("length", fragment.length()); QDomText fragmentText = document->createTextNode(fragment.text()); fragmentElement.appendChild(fragmentText); } } }
void QSGTextNode::addTextBlock(const QPointF &position, QTextDocument *textDocument, const QTextBlock &block, const QColor &overrideColor, QSGText::TextStyle style, const QColor &styleColor) { if (!block.isValid()) return; QPointF blockPosition = textDocument->documentLayout()->blockBoundingRect(block).topLeft(); QTextBlock::iterator it = block.begin(); while (!it.atEnd()) { QTextFragment fragment = it.fragment(); if (!fragment.text().isEmpty()) { QTextCharFormat charFormat = fragment.charFormat(); QColor color = overrideColor.isValid() ? overrideColor : charFormat.foreground().color(); QList<QGlyphRun> glyphsList = fragment.glyphRuns(); for (int i=0; i<glyphsList.size(); ++i) { QGlyphRun glyphs = glyphsList.at(i); QRawFont font = glyphs.rawFont(); QSGGlyphNode *glyphNode = addGlyphs(position + blockPosition + QPointF(0, font.ascent()), glyphs, color, style, styleColor); int decorations = (glyphs.overline() ? Overline : 0) | (glyphs.strikeOut() ? StrikeOut : 0) | (glyphs.underline() ? Underline : 0); if (decorations) { QPointF baseLine = glyphNode->baseLine(); qreal width = glyphNode->boundingRect().width(); addTextDecorations(Decoration(decorations), baseLine, color, width, font.lineThickness(), font.underlinePosition(), font.ascent()); } } } ++it; } }
void ContactListEdit::GetCollectedContacts(IMailProcessor::TRecipientPublicKeys* storage) const { assert(storage != nullptr); storage->reserve(10); QTextBlock block = document()->begin(); while(block.isValid()) { for(QTextBlock::iterator i = block.begin(); i != block.end(); ++i) { QTextCharFormat format = i.fragment().charFormat(); if(format.isImageFormat()) { QTextImageFormat imgF = format.toImageFormat(); IMailProcessor::TRecipientPublicKey pk; decodePublicKey(imgF, &pk); assert(pk.valid()); storage->push_back(pk); } } block = block.next(); } }
bool RTF::Writer::write(QIODevice* device, QTextDocument* text) { if (m_codec == 0) { return false; } device->write(m_header); for (QTextBlock block = text->begin(); block.isValid(); block = block.next()) { QByteArray par("{\\pard\\plain"); QTextBlockFormat block_format = block.blockFormat(); bool rtl = block_format.layoutDirection() == Qt::RightToLeft; if (rtl) { par += "\\rtlpar"; } Qt::Alignment align = block_format.alignment(); if (rtl && (align & Qt::AlignLeft)) { par += "\\ql"; } else if (align & Qt::AlignRight) { par += "\\qr"; } else if (align & Qt::AlignCenter) { par += "\\qc"; } else if (align & Qt::AlignJustify) { par += "\\qj"; } if (block_format.indent() > 0) { par += "\\li" + QByteArray::number(block_format.indent() * 15); } device->write(par); if (block.begin() != block.end()) { device->write(" "); for (QTextBlock::iterator iter = block.begin(); iter != block.end(); ++iter) { QTextFragment fragment = iter.fragment(); QTextCharFormat char_format = fragment.charFormat(); QByteArray style; if (char_format.fontWeight() == QFont::Bold) { style += "\\b"; } if (char_format.fontItalic()) { style += "\\i"; } if (char_format.fontUnderline()) { style += "\\ul"; } if (char_format.fontStrikeOut()) { style += "\\strike"; } if (char_format.verticalAlignment() == QTextCharFormat::AlignSuperScript) { style += "\\super"; } else if (char_format.verticalAlignment() == QTextCharFormat::AlignSubScript) { style += "\\sub"; } if (!style.isEmpty()) { device->write("{" + style + " " + fromUnicode(fragment.text()) + "}"); } else { device->write(fromUnicode(fragment.text())); } } } device->write("\\par}\n"); } device->write("\n}"); return true; }
void KoTextWriter::saveParagraph(const QTextBlock &block, int from, int to) { QString changeName = QString(); QTextBlockFormat blockFormat = block.blockFormat(); int outlineLevel = blockFormat.intProperty(KoParagraphStyle::OutlineLevel); if (outlineLevel > 0) { d->writer->startElement("text:h", false); d->writer->addAttribute("text:outline-level", outlineLevel); } else d->writer->startElement("text:p", false); QString styleName = saveParagraphStyle(block); if (!styleName.isEmpty()) d->writer->addAttribute("text:style-name", styleName); // Write the fragments and their formats QTextCursor cursor(block); QTextCharFormat blockCharFormat = cursor.blockCharFormat(); QTextCharFormat previousCharFormat; QTextBlock::iterator it; for (it = block.begin(); !(it.atEnd()); ++it) { QTextFragment currentFragment = it.fragment(); const int fragmentStart = currentFragment.position(); const int fragmentEnd = fragmentStart + currentFragment.length(); if (to != -1 && fragmentStart >= to) break; if (currentFragment.isValid()) { QTextCharFormat charFormat = currentFragment.charFormat(); QTextCharFormat compFormat = charFormat; bool identical; previousCharFormat.clearProperty(KoCharacterStyle::ChangeTrackerId); compFormat.clearProperty(KoCharacterStyle::ChangeTrackerId); if (previousCharFormat == compFormat) identical = true; else identical = false; if ( d->changeTracker && d->changeTracker->containsInlineChanges(charFormat) && d->changeTracker->elementById(charFormat.property(KoCharacterStyle::ChangeTrackerId).toInt())->isEnabled()) { KoGenChange change; d->changeTracker->saveInlineChange(charFormat.property(KoCharacterStyle::ChangeTrackerId).toInt(), change); changeName = d->sharedData->genChanges().insert(change); d->writer->startElement("text:change-start", false); d->writer->addAttribute("text:change-id", changeName); d->writer->endElement(); } KoInlineObject *inlineObject = d->layout->inlineTextObjectManager()->inlineTextObject(charFormat); if (currentFragment.length() == 1 && inlineObject && currentFragment.text()[0].unicode() == QChar::ObjectReplacementCharacter) { inlineObject->saveOdf(d->context); } else { QString styleName = saveCharacterStyle(charFormat, blockCharFormat); if (charFormat.isAnchor()) { d->writer->startElement("text:a", false); d->writer->addAttribute("xlink:type", "simple"); d->writer->addAttribute("xlink:href", charFormat.anchorHref()); } else if (!styleName.isEmpty() /*&& !identical*/) { d->writer->startElement("text:span", false); d->writer->addAttribute("text:style-name", styleName); } QString text = currentFragment.text(); int spanFrom = fragmentStart >= from ? 0 : from; int spanTo = to == -1 ? fragmentEnd : (fragmentEnd > to ? to : fragmentEnd); if (spanFrom != fragmentStart || spanTo != fragmentEnd) { // avoid mid, if possible d->writer->addTextSpan(text.mid(spanFrom - fragmentStart, spanTo - spanFrom)); } else { d->writer->addTextSpan(text); } if ((!styleName.isEmpty() /*&& !identical*/) || charFormat.isAnchor()) d->writer->endElement(); } // if (inlineObject) if (!changeName.isEmpty()) { d->writer->startElement("text:change-end", false); d->writer->addAttribute("text:change-id",changeName); d->writer->endElement(); changeName=QString(); } previousCharFormat = charFormat; } // if (fragment.valid()) } // foeach(fragment) d->writer->endElement(); }
void Dialog::appendToHistory(const QString& name, const QDateTime& sendTime, QTextDocument *document, InsertingMode mode) { QListWidgetItem *item = new QListWidgetItem(); QTextEdit *te = new QTextEdit(); lwHistory->addItem(item); te->setReadOnly(true); reloadResource(te); lwHistory->setItemWidget(item, te); QString color; if (name == "You") color = "blue"; else color = "red"; te->append(QString("<font color = \"%1\"> <b>" + name + "</b> (" + sendTime.toString("dd-MM-yyyy hh:mm:ss") + "):</font>").arg(color)); te->moveCursor(QTextCursor::End); te->textCursor().insertBlock(); te->textCursor().insertFragment(QTextDocumentFragment(document)); int heig = 17, widthTe = parentWidget()->width(); int curLine = 0; int mx = 0; for (QTextBlock bl = te->document()->begin(); bl != te->document()->end(); bl = bl.next()) if (bl.isValid()) { if (bl.begin().atEnd()) { heig += 17 + mx;//&&& curLine = mx = 0; continue; } for (QTextBlock::iterator it = bl.begin(); !it.atEnd(); ++it) { QTextFragment fragm = it.fragment(); int curw, curh; if (fragm.isValid() && fragm.charFormat().isImageFormat()) { curw = smiles->width() / W_CNT; curh = smiles->height() / H_CNT; processCalc(heig, mx, curLine, curw, curh); } else if (fragm.isValid()) { QString s = fragm.text(); QFontMetrics me(fragm.charFormat().font()); curh = me.lineSpacing(); for (int j = 0; j < s.size(); ++j) { curw = me.width(s[j]); processCalc(heig, mx, curLine, curw, curh); } } } heig += mx; mx = curLine = 0; } te->setStyleSheet(QString("QFrame {" "border: 2px solid #f3f2f1;" "border-radius: 4px;" "padding: 2px;}")); item->setSizeHint(QSize(0, heig + 18)); te->resize(QSize(widthTe, heig)); lwHistory->scrollToBottom(); if (mode == ReceivedMessage && !dgReadByUser) { setUnreadMessage(unreadMessage + 1); queUnreadWrote.push_back(te); te->setStyleSheet("QTextEdit { background-color: #FFFCCC; }"); } else if (mode == LoadHistory) { if (unreadMessage != 0) { queUnreadWrote.push_back(te); te->setStyleSheet("QTextEdit { background-color: #FFFCCC; }"); if (queUnreadWrote.size() > unreadMessage) { queUnreadWrote.front()->setStyleSheet("QTextEdit { background-color: #FFFFFF; }"); queUnreadWrote.pop_front(); } } if (wroteMessage != 0) { queUnreadWrote.push_back(te); te->setStyleSheet("QTextEdit { background-color: #DFFFCC; }"); if (queUnreadWrote.size() > wroteMessage) { queUnreadWrote.front()->setStyleSheet("QTextEdit { background-color: #FFFFFF; }"); queUnreadWrote.pop_front(); } } } else if (mode == SendMessage) { teMessage->setFocus(); te->setStyleSheet("QTextEdit { background-color: #DFFFCC; }"); wroteMessage++; queUnreadWrote.push_back(te); } }
void QQuickTextNodeEngine::addTextBlock(QTextDocument *textDocument, const QTextBlock &block, const QPointF &position, const QColor &textColor, const QColor &anchorColor, int selectionStart, int selectionEnd) { Q_ASSERT(textDocument); #ifndef QT_NO_IM int preeditLength = block.isValid() ? block.layout()->preeditAreaText().length() : 0; int preeditPosition = block.isValid() ? block.layout()->preeditAreaPosition() : -1; #endif QVarLengthArray<QTextLayout::FormatRange> colorChanges; mergeFormats(block.layout(), &colorChanges); QPointF blockPosition = textDocument->documentLayout()->blockBoundingRect(block).topLeft() + position; if (QTextList *textList = block.textList()) { QPointF pos = blockPosition; QTextLayout *layout = block.layout(); if (layout->lineCount() > 0) { QTextLine firstLine = layout->lineAt(0); Q_ASSERT(firstLine.isValid()); setCurrentLine(firstLine); QRectF textRect = firstLine.naturalTextRect(); pos += textRect.topLeft(); if (block.textDirection() == Qt::RightToLeft) pos.rx() += textRect.width(); const QTextCharFormat charFormat = block.charFormat(); QFont font(charFormat.font()); QFontMetricsF fontMetrics(font); QTextListFormat listFormat = textList->format(); QString listItemBullet; switch (listFormat.style()) { case QTextListFormat::ListCircle: listItemBullet = QChar(0x25E6); // White bullet break; case QTextListFormat::ListSquare: listItemBullet = QChar(0x25AA); // Black small square break; case QTextListFormat::ListDecimal: case QTextListFormat::ListLowerAlpha: case QTextListFormat::ListUpperAlpha: case QTextListFormat::ListLowerRoman: case QTextListFormat::ListUpperRoman: listItemBullet = textList->itemText(block); break; default: listItemBullet = QChar(0x2022); // Black bullet break; }; QSizeF size(fontMetrics.width(listItemBullet), fontMetrics.height()); qreal xoff = fontMetrics.width(QLatin1Char(' ')); if (block.textDirection() == Qt::LeftToRight) xoff = -xoff - size.width(); setPosition(pos + QPointF(xoff, 0)); QTextLayout layout; layout.setFont(font); layout.setText(listItemBullet); // Bullet layout.beginLayout(); QTextLine line = layout.createLine(); line.setPosition(QPointF(0, 0)); layout.endLayout(); QList<QGlyphRun> glyphRuns = layout.glyphRuns(); for (int i=0; i<glyphRuns.size(); ++i) addUnselectedGlyphs(glyphRuns.at(i)); } } int textPos = block.position(); QTextBlock::iterator blockIterator = block.begin(); while (!blockIterator.atEnd()) { QTextFragment fragment = blockIterator.fragment(); QString text = fragment.text(); if (text.isEmpty()) continue; QTextCharFormat charFormat = fragment.charFormat(); QFont font(charFormat.font()); QFontMetricsF fontMetrics(font); int fontHeight = fontMetrics.descent() + fontMetrics.ascent(); int valign = charFormat.verticalAlignment(); if (valign == QTextCharFormat::AlignSuperScript) setPosition(QPointF(blockPosition.x(), blockPosition.y() - fontHeight / 2)); else if (valign == QTextCharFormat::AlignSubScript) setPosition(QPointF(blockPosition.x(), blockPosition.y() + fontHeight / 6)); else setPosition(blockPosition); if (text.contains(QChar::ObjectReplacementCharacter)) { QTextFrame *frame = qobject_cast<QTextFrame *>(textDocument->objectForFormat(charFormat)); if (frame && frame->frameFormat().position() == QTextFrameFormat::InFlow) { int blockRelativePosition = textPos - block.position(); QTextLine line = block.layout()->lineForTextPosition(blockRelativePosition); if (!currentLine().isValid() || line.lineNumber() != currentLine().lineNumber()) { setCurrentLine(line); } QQuickTextNodeEngine::SelectionState selectionState = (selectionStart < textPos + text.length() && selectionEnd >= textPos) ? QQuickTextNodeEngine::Selected : QQuickTextNodeEngine::Unselected; addTextObject(QPointF(), charFormat, selectionState, textDocument, textPos); } textPos += text.length(); } else { if (charFormat.foreground().style() != Qt::NoBrush) setTextColor(charFormat.foreground().color()); else if (charFormat.isAnchor()) setTextColor(anchorColor); else setTextColor(textColor); int fragmentEnd = textPos + fragment.length(); #ifndef QT_NO_IM if (preeditPosition >= 0 && (preeditPosition + block.position()) >= textPos && (preeditPosition + block.position()) <= fragmentEnd) { fragmentEnd += preeditLength; } #endif if (charFormat.background().style() != Qt::NoBrush) { QTextLayout::FormatRange additionalFormat; additionalFormat.start = textPos - block.position(); additionalFormat.length = fragmentEnd - textPos; additionalFormat.format = charFormat; colorChanges << additionalFormat; } textPos = addText(block, charFormat, textColor, colorChanges, textPos, fragmentEnd, selectionStart, selectionEnd); } ++blockIterator; } #ifndef QT_NO_IM if (preeditLength >= 0 && textPos <= block.position() + preeditPosition) { setPosition(blockPosition); textPos = block.position() + preeditPosition; QTextLine line = block.layout()->lineForTextPosition(preeditPosition); if (!currentLine().isValid() || line.lineNumber() != currentLine().lineNumber()) { setCurrentLine(line); } textPos = addText(block, block.charFormat(), textColor, colorChanges, textPos, textPos + preeditLength, selectionStart, selectionEnd); } #endif setCurrentLine(QTextLine()); // Reset current line because the text layout changed m_hasContents = true; }