]> git.lyx.org Git - features.git/commitdiff
* Added another isRTL variant which takes a CursorSlice
authorStefan Schimanski <sts@lyx.org>
Mon, 4 Jun 2007 18:40:06 +0000 (18:40 +0000)
committerStefan Schimanski <sts@lyx.org>
Mon, 4 Jun 2007 18:40:06 +0000 (18:40 +0000)
* 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)

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18667 a592a061-630c-0410-9148-cb99ea01b6c8

src/Text.cpp
src/Text.h
src/Text3.cpp
src/bufferview_funcs.cpp

index 58ad897e30f620ed32980ab4709dbd8eaa76904f..b2c20bf073953c766172dc4287dc0517e75ee7d8 100644 (file)
@@ -1687,20 +1687,13 @@ int Text::cursorX(BufferView const & bv, CursorSlice const & sl,
        }
 
        // 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);
 }
 
index e88ef85fcb23268a62998fca906ee25e1a98b7d8..f7c9d9d24fe34a89bd339f698eb6036b5fff3ff8 100644 (file)
@@ -333,6 +333,8 @@ public:
        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);
 
index 746eafb6d13c2697327c26d5917666d846058f7c..4584d6932bc21a488232dbfa0db3a53c9d6e646a 100644 (file)
@@ -299,6 +299,20 @@ bool Text::isRTL(Buffer const & buffer, Paragraph const & par) const
 }
 
 
+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();
+}
+
+
 void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 {
        LYXERR(Debug::ACTION) << "Text::dispatch: cmd: " << cmd << endl;
index 2f3b1d9494d4f882146d9ddb4023a9ec5c3c5a1a..69c160855c34fbd9b7c5b2bd7213732d2f7d65a4 100644 (file)
@@ -161,15 +161,34 @@ Point coordOffset(BufferView const & bv, DocIterator const & dit,
 {
        int x = 0;
        int y = 0;
+       int lastw = 0;
 
-       // Contribution of nested insets
-       for (size_t i = 1; i != dit.depth(); ++i) {
+       // 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 @@ Point coordOffset(BufferView const & bv, DocIterator const & dit,
        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 @@ Point coordOffset(BufferView const & bv, DocIterator const & dit,
        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);
 }