/*! \since 4.7 Returns the resolved text direction. If the block has no explicit direction set, it will resolve the direction from the blocks content. Returns either Qt::LeftToRight or Qt::RightToLeft. \sa QTextFormat::layoutDirection(), QString::isRightToLeft(), Qt::LayoutDirection */ Qt::LayoutDirection QTextBlock::textDirection() const { Qt::LayoutDirection dir = blockFormat().layoutDirection(); if (dir != Qt::LayoutDirectionAuto) return dir; dir = p->defaultTextOption.textDirection(); if (dir != Qt::LayoutDirectionAuto) return dir; const QString buffer = p->buffer(); const int pos = position(); QTextDocumentPrivate::FragmentIterator it = p->find(pos); QTextDocumentPrivate::FragmentIterator end = p->find(pos + length() - 1); // -1 to omit the block separator char for (; it != end; ++it) { const QTextFragmentData * const frag = it.value(); const QChar *p = buffer.constData() + frag->stringPosition; const QChar * const end = p + frag->size_array[0]; while (p < end) { switch(QChar::direction(p->unicode())) { case QChar::DirL: return Qt::LeftToRight; case QChar::DirR: case QChar::DirAL: return Qt::RightToLeft; default: break; } ++p; } } return Qt::LeftToRight; }
int QTextCopyHelper::appendFragment(int pos, int endPos, int objectIndex) { QTextDocumentPrivate::FragmentIterator fragIt = src->find(pos); const QTextFragmentData * const frag = fragIt.value(); Q_ASSERT(objectIndex == -1 || (frag->size_array[0] == 1 && src->formatCollection()->format(frag->format).objectIndex() != -1)); int charFormatIndex; if (forceCharFormat) charFormatIndex = primaryCharFormatIndex; else charFormatIndex = convertFormatIndex(frag->format, objectIndex); const int inFragmentOffset = qMax(0, pos - fragIt.position()); int charsToCopy = qMin(int(frag->size_array[0] - inFragmentOffset), endPos - pos); QTextBlock nextBlock = src->blocksFind(pos + 1); int blockIdx = -2; if (nextBlock.position() == pos + 1) { blockIdx = convertFormatIndex(nextBlock.blockFormat()); } else if (pos == 0 && insertPos == 0) { dst->setBlockFormat(dst->blocksBegin(), dst->blocksBegin(), convertFormat(src->blocksBegin().blockFormat()).toBlockFormat()); dst->setCharFormat(-1, 1, convertFormat(src->blocksBegin().charFormat()).toCharFormat()); } QString txtToInsert(originalText.constData() + frag->stringPosition + inFragmentOffset, charsToCopy); if (txtToInsert.length() == 1 && (txtToInsert.at(0) == QChar::ParagraphSeparator || txtToInsert.at(0) == QTextBeginningOfFrame || txtToInsert.at(0) == QTextEndOfFrame ) ) { dst->insertBlock(txtToInsert.at(0), insertPos, blockIdx, charFormatIndex); ++insertPos; } else { if (nextBlock.textList()) { QTextBlock dstBlock = dst->blocksFind(insertPos); if (!dstBlock.textList()) { // insert a new text block with the block and char format from the // source block to make sure that the following text fragments // end up in a list as they should int listBlockFormatIndex = convertFormatIndex(nextBlock.blockFormat()); int listCharFormatIndex = convertFormatIndex(nextBlock.charFormat()); dst->insertBlock(insertPos, listBlockFormatIndex, listCharFormatIndex); ++insertPos; } } dst->insert(insertPos, txtToInsert, charFormatIndex); const int userState = nextBlock.userState(); if (userState != -1) dst->blocksFind(insertPos).setUserState(userState); insertPos += txtToInsert.length(); } return charsToCopy; }
/*! Returns the block's contents as plain text. \sa length() charFormat() blockFormat() */ QString QTextBlock::text() const { if (!p || !n) return QString(); const QString buffer = p->buffer(); QString text; text.reserve(length()); const int pos = position(); QTextDocumentPrivate::FragmentIterator it = p->find(pos); QTextDocumentPrivate::FragmentIterator end = p->find(pos + length() - 1); // -1 to omit the block separator char for (; it != end; ++it) { const QTextFragmentData * const frag = it.value(); text += QString::fromRawData(buffer.constData() + frag->stringPosition, frag->size); } return text; }
bool QTextOdfWriter::writeAll() { if (m_createArchive) m_strategy = new QZipStreamStrategy(m_device); else m_strategy = new QXmlStreamStrategy(m_device); if (!m_device->isWritable() && ! m_device->open(QIODevice::WriteOnly)) { qWarning() << "QTextOdfWriter::writeAll: the device can not be opened for writing"; return false; } QXmlStreamWriter writer(m_strategy->contentStream); #ifndef QT_NO_TEXTCODEC if (m_codec) writer.setCodec(m_codec); #endif // prettyfy writer.setAutoFormatting(true); writer.setAutoFormattingIndent(2); writer.writeNamespace(officeNS, QString::fromLatin1("office")); writer.writeNamespace(textNS, QString::fromLatin1("text")); writer.writeNamespace(styleNS, QString::fromLatin1("style")); writer.writeNamespace(foNS, QString::fromLatin1("fo")); writer.writeNamespace(tableNS, QString::fromLatin1("table")); writer.writeNamespace(drawNS, QString::fromLatin1("draw")); writer.writeNamespace(xlinkNS, QString::fromLatin1("xlink")); writer.writeNamespace(svgNS, QString::fromLatin1("svg")); writer.writeStartDocument(); writer.writeStartElement(officeNS, QString::fromLatin1("document-content")); writer.writeAttribute(officeNS, QString::fromLatin1("version"), QString::fromLatin1("1.2")); // add fragments. (for character formats) QTextDocumentPrivate::FragmentIterator fragIt = m_document->docHandle()->begin(); QSet<int> formats; while (fragIt != m_document->docHandle()->end()) { const QTextFragmentData * const frag = fragIt.value(); formats << frag->format; ++fragIt; } // add blocks (for blockFormats) QTextDocumentPrivate::BlockMap &blocks = m_document->docHandle()->blockMap(); QTextDocumentPrivate::BlockMap::Iterator blockIt = blocks.begin(); while (blockIt != blocks.end()) { const QTextBlockData * const block = blockIt.value(); formats << block->format; ++blockIt; } // add objects for lists, frames and tables QVector<QTextFormat> allFormats = m_document->allFormats(); QList<int> copy = formats.toList(); for (QList<int>::Iterator iter = copy.begin(); iter != copy.end(); ++iter) { QTextObject *object = m_document->objectForFormat(allFormats[*iter]); if (object) formats << object->formatIndex(); } writeFormats(writer, formats); writer.writeStartElement(officeNS, QString::fromLatin1("body")); writer.writeStartElement(officeNS, QString::fromLatin1("text")); QTextFrame *rootFrame = m_document->rootFrame(); writeFrame(writer, rootFrame); writer.writeEndElement(); // text writer.writeEndElement(); // body writer.writeEndElement(); // document-content writer.writeEndDocument(); delete m_strategy; m_strategy = 0; return true; }