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
  

Reply via email to