On Mon, Jun 04, 2007 at 06:40:07PM +0000, [EMAIL PROTECTED] wrote: > Author: sts > Date: Mon Jun 4 20:40:06 2007 > New Revision: 18667 > > URL: http://www.lyx.org/trac/changeset/18667 > Log: > * Added another isRTL variant which takes a CursorSlice > * Use the isRTL information to compute the cursor position correctly around > insets in RTL text. Those insets are positioned to the right of the cursor > position > in the text. > (fixes issue (3) of bug 3551: Cursor movement in and around insets in RTL > paragraphs) > > Modified: > lyx-devel/trunk/src/Text.cpp > lyx-devel/trunk/src/Text.h > lyx-devel/trunk/src/Text3.cpp > lyx-devel/trunk/src/bufferview_funcs.cpp > > Modified: lyx-devel/trunk/src/Text.cpp > URL: http://www.lyx.org/trac/file/lyx-devel/trunk/src/Text.cpp?rev=18667 > ============================================================================== > --- lyx-devel/trunk/src/Text.cpp (original) > +++ lyx-devel/trunk/src/Text.cpp Mon Jun 4 20:40:06 2007 > @@ -1687,20 +1687,13 @@ > } > > // see correction above > - if (boundary_correction) > - if (getFont(buffer, par, ppos).isVisibleRightToLeft()) > + if (boundary_correction) { > + if (isRTL(buffer, sl, boundary)) > x -= singleWidth(buffer, par, ppos); > else > x += singleWidth(buffer, par, ppos); > - > - // Make sure inside an inset we always count from the left > - // edge (bidi!) -- MV > - if (sl.pos() < par.size()) { > - font = getFont(buffer, par, sl.pos()); > - if (!boundary && font.isVisibleRightToLeft() > - && par.isInset(sl.pos())) > - x -= par.getInset(sl.pos())->width(); > - } > + } > + > return int(x); > } > > > Modified: lyx-devel/trunk/src/Text.h > URL: http://www.lyx.org/trac/file/lyx-devel/trunk/src/Text.h?rev=18667 > ============================================================================== > --- lyx-devel/trunk/src/Text.h (original) > +++ lyx-devel/trunk/src/Text.h Mon Jun 4 20:40:06 2007 > @@ -333,6 +333,8 @@ > docstring getPossibleLabel(Cursor & cur) const; > /// is this paragraph right-to-left? > bool isRTL(Buffer const &, Paragraph const & par) const; > + /// is this position in the paragraph right-to-left? > + bool isRTL(Buffer const & buffer, CursorSlice const & sl, bool > boundary) const; > /// > bool checkAndActivateInset(Cursor & cur, bool front); > > > Modified: lyx-devel/trunk/src/Text3.cpp > URL: http://www.lyx.org/trac/file/lyx-devel/trunk/src/Text3.cpp?rev=18667 > ============================================================================== > --- lyx-devel/trunk/src/Text3.cpp (original) > +++ lyx-devel/trunk/src/Text3.cpp Mon Jun 4 20:40:06 2007 > @@ -296,6 +296,20 @@ > bool Text::isRTL(Buffer const & buffer, Paragraph const & par) const > { > return par.isRightToLeftPar(buffer.params()); > +} > + > + > +bool Text::isRTL(Buffer const & buffer, CursorSlice const & sl, bool > boundary) const > +{ > + if (!sl.text()) > + return false; > + > + int correction = 0; > + if (boundary && sl.pos() > 0) > + correction = -1; > + > + Paragraph const & par = getPar(sl.pit()); > + return getFont(buffer, par, sl.pos() + > correction).isVisibleRightToLeft(); > } > > > > Modified: lyx-devel/trunk/src/bufferview_funcs.cpp > URL: > http://www.lyx.org/trac/file/lyx-devel/trunk/src/bufferview_funcs.cpp?rev=18667 > ============================================================================== > --- lyx-devel/trunk/src/bufferview_funcs.cpp (original) > +++ lyx-devel/trunk/src/bufferview_funcs.cpp Mon Jun 4 20:40:06 2007 > @@ -161,15 +161,34 @@ > { > int x = 0; > int y = 0; > - > - // Contribution of nested insets > - for (size_t i = 1; i != dit.depth(); ++i) { > + int lastw = 0; > + > + // Addup ontribution of nested insets, from inside to outside, > + // keeping the outer paragraph for a special handling below > + for (size_t i = dit.depth() - 1; i >= 1; --i) { > CursorSlice const & sl = dit[i]; > int xx = 0; > int yy = 0; > + > + // get relative position inside sl.inset() > sl.inset().cursorPos(bv, sl, boundary && ((i+1) == > dit.depth()), xx, yy); > + > + // Make relative position inside of the edited inset relative > to sl.inset() > x += xx; > y += yy; > + > + // In case of an RTL inset, the edited inset will be positioned > to the left > + // of xx:yy > + if (sl.text()) { > + bool boundary_i = boundary && i + 1 == dit.depth(); > + bool rtl = sl.text()->isRTL(*bv.buffer(), sl, > boundary_i); > + if (rtl) > + x -= lastw; > + } > + > + // remember width for the case that sl.inset() is positioned in > an RTL inset > + lastw = sl.inset().width(); > + > //lyxerr << "Cursor::getPos, i: " > // << i << " x: " << xx << " y: " << y << endl; > } > @@ -180,6 +199,7 @@ > BOOST_ASSERT(!pm.rows().empty()); > y -= pm.rows()[0].ascent(); > #if 1 > + // FIXME: document this mess > size_t rend; > if (sl.pos() > 0 && dit.depth() == 1) { > int pos = sl.pos(); > @@ -195,8 +215,18 @@ > for (size_t rit = 0; rit != rend; ++rit) > y += pm.rows()[rit].height(); > y += pm.rows()[rend].ascent(); > - x += dit.bottom().text()->cursorX(bv, dit.bottom(), boundary && > dit.depth() == 1); > - > + > + // Make relative position from the nested inset now bufferview absolute. > + int xx = dit.bottom().text()->cursorX(bv, dit.bottom(), boundary && > dit.depth() == 1); > + x += xx; > + > + // In the RTL case place the nested inset at the left of the cursor in > + // the outer paragraph > + bool boundary_1 = boundary && 1 == dit.depth(); > + bool rtl = dit.bottom().text()->isRTL(*bv.buffer(), dit.bottom(), > boundary_1); > + if (rtl) > + x -= lastw; > + > return Point(x, y); > }
Impressive! - Martin
