X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FRow.cpp;h=8d89f64e1c06f17af0e315faecbab718889f4da3;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=eab4df51ba226755b1849c5fd6b5dbd3e2c16e7d;hpb=57c3a94730ed587ac8261bd67532d2ae08c98ced;p=lyx.git diff --git a/src/Row.cpp b/src/Row.cpp index eab4df51ba..8d89f64e1c 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -115,14 +115,13 @@ pos_type Row::Element::x2pos(int &x) const case SPACE: // those elements contain only one position. Round to // the closest side. - if (x > full_width()) { + if (x > (full_width() + 1) / 2) { x = int(full_width()); i = !isRTL(); } else { x = 0; i = isRTL(); } - } //lyxerr << "=> p=" << pos + i << " x=" << x << endl; return pos + i; @@ -569,4 +568,53 @@ void Row::reverseRTL(bool const rtl_par) rtl_ = rtl_par; } +Row::const_iterator const +Row::findElement(pos_type const pos, bool const boundary, double & x) const +{ + /** + * When boundary is true, position i is in the row element (pos, endpos) + * if + * pos < i <= endpos + * whereas, when boundary is false, the test is + * pos <= i < endpos + * The correction below allows to handle both cases. + */ + int const boundary_corr = (boundary && pos) ? -1 : 0; + + x = left_margin; + + /** Early return in trivial cases + * 1) the row is empty + * 2) the position is the left-most position of the row; there + * is a quirk here however: if the first element is virtual + * (end-of-par marker for example), then we have to look + * closer + */ + if (empty() + || (pos == begin()->left_pos() && !boundary + && !begin()->isVirtual())) + return begin(); + + Row::const_iterator cit = begin(); + for ( ; cit != end() ; ++cit) { + /** Look whether the cursor is inside the element's + * span. Note that it is necessary to take the + * boundary into account, and to accept virtual + * elements, which have pos == endpos. + */ + if (pos + boundary_corr >= cit->pos + && (pos + boundary_corr < cit->endpos || cit->isVirtual())) { + x += cit->pos2x(pos); + break; + } + x += cit->full_width(); + } + + if (cit == end()) + --cit; + + return cit; +} + + } // namespace lyx