ZLTextMark ZLTextWordCursor::position() const { if (myParagraphCursor.isNull()) { return ZLTextMark(); } const ZLTextParagraphCursor ¶graph = *myParagraphCursor; size_t paragraphLength = paragraph.paragraphLength(); unsigned int elementIndex = myElementIndex; while ((elementIndex != paragraphLength) && (paragraph[elementIndex].kind() != ZLTextElement::WORD_ELEMENT)) { ++elementIndex; } if (elementIndex != paragraphLength) { return ZLTextMark(paragraph.index(), ((ZLTextWord&)paragraph[elementIndex]).ParagraphOffset, 0); } return ZLTextMark(paragraph.index() + 1, 0, 0); }
ZLTextMark ZLTextModel::previousMark(ZLTextMark position) const { if (marks().empty()) { return ZLTextMark(); } std::vector<ZLTextMark>::const_iterator it = std::lower_bound(marks().begin(), marks().end(), position); if (it == marks().end()) { --it; } if (*it >= position) { if (it == marks().begin()) { return ZLTextMark(); } --it; } return *it; }
ZLTextParagraphBuilder::ZLTextParagraphBuilder(const std::string &language, const ZLTextParagraph ¶graph, const std::vector<ZLTextMark> &marks, int paragraphIndex, ZLTextElementVector &elements) : myParagraph(paragraph), myElements(elements), myLanguage(language), myBaseBidiLevel(ZLLanguageUtil::isRTLLanguage(language) ? 1 : 0) { myFirstMark = std::lower_bound(marks.begin(), marks.end(), ZLTextMark(paragraphIndex, 0, 0)); myLastMark = myFirstMark; for (; (myLastMark != marks.end()) && (myLastMark->ParagraphIndex == paragraphIndex); ++myLastMark) { } myOffset = 0; static bool lineBreakInitialized = false; if (!lineBreakInitialized) { init_linebreak(); lineBreakInitialized = true; } }
ZLTextParagraphCursor::Builder::Builder(ZLTextParagraphCursor &cursor) : myParagraph(*cursor.myModel[cursor.myIndex]), myElements(cursor.myElements), myLanguage(cursor.myModel.language()), myBaseBidiLevel(cursor.myModel.isRtl() ? 1 : 0) { const int paragraphIndex = cursor.myIndex; const std::vector<ZLTextMark> &marks = cursor.myModel.marks(); myFirstMark = std::lower_bound(marks.begin(), marks.end(), ZLTextMark(paragraphIndex, 0, 0)); myLastMark = myFirstMark; for (; (myLastMark != marks.end()) && (myLastMark->ParagraphIndex == paragraphIndex); ++myLastMark) { } myOffset = 0; static bool lineBreakInitialized = false; if (!lineBreakInitialized) { init_linebreak(); lineBreakInitialized = true; } }
void ZLTextModel::search(const std::string &text, size_t startIndex, size_t endIndex, bool ignoreCase) const { ZLSearchPattern pattern(text, ignoreCase); myMarks.clear(); std::vector<ZLTextParagraph*>::const_iterator start = (startIndex < myParagraphs.size()) ? myParagraphs.begin() + startIndex : myParagraphs.end(); std::vector<ZLTextParagraph*>::const_iterator end = (endIndex < myParagraphs.size()) ? myParagraphs.begin() + endIndex : myParagraphs.end(); for (std::vector<ZLTextParagraph*>::const_iterator it = start; it < end; ++it) { int offset = 0; for (ZLTextParagraph::Iterator jt = **it; !jt.isEnd(); jt.next()) { if (jt.entryKind() == ZLTextParagraphEntry::TEXT_ENTRY) { const ZLTextEntry& textEntry = (ZLTextEntry&)*jt.entry(); const char *str = textEntry.data(); const size_t len = textEntry.dataLength(); for (int pos = ZLSearchUtil::find(str, len, pattern); pos != -1; pos = ZLSearchUtil::find(str, len, pattern, pos + 1)) { myMarks.push_back(ZLTextMark(it - myParagraphs.begin(), offset + pos, pattern.length())); } offset += len; } } } }
ZLTextMark ZLTextModel::nextMark(ZLTextMark position) const { std::vector<ZLTextMark>::const_iterator it = std::upper_bound(marks().begin(), marks().end(), position); return (it != marks().end()) ? *it : ZLTextMark(); }
ZLTextMark ZLTextModel::lastMark() const { return marks().empty() ? ZLTextMark() : marks().back(); }
ZLTextMark ZLTextModel::firstMark() const { return marks().empty() ? ZLTextMark() : marks().front(); }
void ZLTextModel::selectParagraph(size_t index) const { if (index < paragraphsNumber()) { myMarks.push_back(ZLTextMark(index, 0, (*this)[index]->textLength())); } }