X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FRow.cpp;h=8d89f64e1c06f17af0e315faecbab718889f4da3;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=53f04ddb038b654a65aceabe66d4eb60076200be;hpb=8e7d0c2002bdc69c95f3a43f7c78d13fe47ce5f3;p=lyx.git diff --git a/src/Row.cpp b/src/Row.cpp index 53f04ddb03..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; @@ -164,7 +163,8 @@ Row::Row() sel_beg(-1), sel_end(-1), begin_margin_sel(false), end_margin_sel(false), changed_(false), crc_(0), - pit_(0), pos_(0), end_(0), right_boundary_(false), flushed_(false) + pit_(0), pos_(0), end_(0), + right_boundary_(false), flushed_(false), rtl_(false) {} @@ -565,6 +565,56 @@ void Row::reverseRTL(bool const rtl_par) // If the paragraph itself is RTL, reverse everything if (rtl_par) reverse(elements_.begin(), elements_.end()); + 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