]> git.lyx.org Git - lyx.git/blobdiff - src/rowpainter.C
the spellcheck cleanup
[lyx.git] / src / rowpainter.C
index 961954ae5f10c186b52f1a2ab08a2b34e95bad35..6e1909b1f35547c00d3ae8cc6dccb919895950a9 100644 (file)
@@ -14,6 +14,7 @@
 #include "rowpainter.h"
 
 #include "buffer.h"
+#include "debug.h"
 #include "bufferparams.h"
 #include "BufferView.h"
 #include "encoding.h"
@@ -80,7 +81,6 @@ private:
        void paintHebrewComposeChar(lyx::pos_type & vpos);
        void paintArabicComposeChar(lyx::pos_type & vpos);
        void paintChars(lyx::pos_type & vpos, bool hebrew, bool arabic);
-       int paintPageBreak(string const & label, int y);
        int paintAppendixStart(int y);
        int paintLengthMarker(string const & prefix, VSpace const & vsp, int start);
        void paintText();
@@ -96,8 +96,6 @@ private:
        /// return the label font for this row
        LyXFont const getLabelFont() const;
 
-       char const transformChar(char c, lyx::pos_type pos) const;
-
        /// return pixel width for the given pos
        int singleWidth(lyx::pos_type pos) const;
        int singleWidth(lyx::pos_type pos, char c) const;
@@ -112,7 +110,8 @@ private:
        LyXText const & text_;
 
        /// The row to paint
-       RowList::iterator row_;
+       RowList::iterator const rit_;
+       Row & row_;
 
        /// Row's paragraph
        mutable ParagraphList::iterator  pit_;
@@ -132,8 +131,13 @@ private:
 RowPainter::RowPainter(BufferView const & bv, LyXText const & text,
      ParagraphList::iterator pit, RowList::iterator rit,
      int y_offset, int x_offset, int y)
-       : bv_(bv), pain_(bv_.painter()), text_(text), row_(rit),
-         pit_(pit), xo_(x_offset), yo_(y_offset), y_(y)
+       : bv_(bv), pain_(bv_.painter()), text_(text), rit_(rit), row_(*rit),
+         pit_(pit), xo_(x_offset), yo_(y_offset),
+               x_(row_.x()), y_(y),
+               width_(text_.workWidth()),
+               separator_(row_.fill_separator()),
+               hfill_(row_.fill_hfill()),
+               label_hfill_(row_.fill_label_hfill())
 {}
 
 
@@ -163,15 +167,9 @@ LyXFont const RowPainter::getLabelFont() const
 }
 
 
-char const RowPainter::transformChar(char c, lyx::pos_type pos) const
-{
-       return text_.transformChar(c, *pit_, pos);
-}
-
-
 int RowPainter::leftMargin() const
 {
-       return text_.leftMargin(pit_, *row_);
+       return text_.leftMargin(pit_, row_);
 }
 
 
@@ -183,14 +181,14 @@ void RowPainter::paintInset(pos_type const pos)
 
        PainterInfo pi(perv(bv_));
        pi.base.font = getFont(pos);
-       inset->draw(pi, int(x_), yo_ + row_->baseline());
+       inset->draw(pi, int(x_), yo_ + row_.baseline());
        x_ += inset->width();
 }
 
 
 void RowPainter::paintHebrewComposeChar(pos_type & vpos)
 {
-       pos_type pos = text_.vis2log(vpos);
+       pos_type pos = text_.bidi.vis2log(vpos);
 
        string str;
 
@@ -207,8 +205,7 @@ void RowPainter::paintHebrewComposeChar(pos_type & vpos)
                c = pit_->getChar(i);
                if (!Encodings::IsComposeChar_hebrew(c)) {
                        if (IsPrintableNonspace(c)) {
-                               int const width2 =
-                                       singleWidth(i, c);
+                               int const width2 = singleWidth(i, c);
                                // dalet / resh
                                dx = (c == 'ø' || c == 'ã')
                                        ? width2 - width
@@ -219,18 +216,18 @@ void RowPainter::paintHebrewComposeChar(pos_type & vpos)
        }
 
        // Draw nikud
-       pain_.text(int(x_) + dx, yo_ + row_->baseline(), str, font);
+       pain_.text(int(x_) + dx, yo_ + row_.baseline(), str, font);
 }
 
 
 void RowPainter::paintArabicComposeChar(pos_type & vpos)
 {
-       pos_type pos = text_.vis2log(vpos);
+       pos_type pos = text_.bidi.vis2log(vpos);
        string str;
 
        // first char
        char c = pit_->getChar(pos);
-       c = transformChar(c, pos);
+       c = pit_->transformChar(c, pos);
        str +=c;
        ++vpos;
 
@@ -242,22 +239,21 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos)
                c = pit_->getChar(i);
                if (!Encodings::IsComposeChar_arabic(c)) {
                        if (IsPrintableNonspace(c)) {
-                               int const width2 =
-                                       singleWidth(i, c);
+                               int const width2 = singleWidth(i, c);
                                dx = (width2 - width) / 2;
                        }
                        break;
                }
        }
        // Draw nikud
-       pain_.text(int(x_) + dx, yo_ + row_->baseline(), str, font);
+       pain_.text(int(x_) + dx, yo_ + row_.baseline(), str, font);
 }
 
 
 void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
 {
-       pos_type pos = text_.vis2log(vpos);
-       pos_type const last = lastPos(*pit_, row_);
+       pos_type pos = text_.bidi.vis2log(vpos);
+       pos_type const end = row_.endpos();
        LyXFont orig_font = getFont(pos);
 
        // first character
@@ -265,16 +261,14 @@ void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
        str += pit_->getChar(pos);
        if (arabic) {
                unsigned char c = str[0];
-               str[0] = transformChar(c, pos);
+               str[0] = pit_->transformChar(c, pos);
        }
 
-       bool prev_struckout(isDeletedText(*pit_, pos));
-       bool prev_newtext(isInsertedText(*pit_, pos));
-
-       ++vpos;
+       bool prev_struckout = isDeletedText(*pit_, pos);
+       bool prev_newtext = isInsertedText(*pit_, pos);
 
        // collect as much similar chars as we can
-       while (vpos <= last && (pos = text_.vis2log(vpos)) >= 0) {
+       for (++vpos; vpos < end && (pos = text_.bidi.vis2log(vpos)) >= 0; ++vpos) {
                char c = pit_->getChar(pos);
 
                if (!IsPrintableNonspace(c))
@@ -288,6 +282,7 @@ void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
 
                if (arabic && Encodings::IsComposeChar_arabic(c))
                        break;
+
                if (hebrew && Encodings::IsComposeChar_hebrew(c))
                        break;
 
@@ -295,21 +290,20 @@ void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
                        break;
 
                if (arabic)
-                       c = transformChar(c, pos);
+                       c = pit_->transformChar(c, pos);
+
                str += c;
-               ++vpos;
        }
 
-       if (prev_struckout) {
+       if (prev_struckout)
                orig_font.setColor(LColor::strikeout);
-       } else if (prev_newtext) {
+       else if (prev_newtext)
                orig_font.setColor(LColor::newtext);
-       }
 
        // Draw text and set the new x position
-       //lyxerr << "paint row: yo_ " << yo_ << " baseline: " << row_->baseline()
+       //lyxerr << "paint row: yo_ " << yo_ << " baseline: " << row_.baseline()
        //      << "\n";
-       pain_.text(int(x_), yo_ + row_->baseline(), str, orig_font);
+       pain_.text(int(x_), yo_ + row_.baseline(), str, orig_font);
        x_ += font_metrics::width(str, orig_font);
 }
 
@@ -323,14 +317,14 @@ void RowPainter::paintForeignMark(double orig_x, LyXFont const & orig_font)
        if (orig_font.language() == bv_.buffer()->params().language)
                return;
 
-       int const y = yo_ + row_->baseline() + 1;
+       int const y = yo_ + row_.baseline() + 1;
        pain_.line(int(orig_x), y, int(x_), y, LColor::language);
 }
 
 
 void RowPainter::paintFromPos(pos_type & vpos)
 {
-       pos_type const pos = text_.vis2log(vpos);
+       pos_type const pos = text_.bidi.vis2log(vpos);
 
        LyXFont const & orig_font = getFont(pos);
 
@@ -375,7 +369,7 @@ void RowPainter::paintBackground()
 {
        int const x = int(xo_);
        int const y = yo_ < 0 ? 0 : yo_;
-       int const h = yo_ < 0 ? row_->height() + yo_ : row_->height();
+       int const h = yo_ < 0 ? row_.height() + yo_ : row_.height();
        pain_.fillRectangle(x, y, width_, h, text_.backgroundColor());
 }
 
@@ -389,30 +383,31 @@ void RowPainter::paintSelection()
        int const endx = text_.selection.end.x();
        int const starty = text_.selection.start.y();
        int const endy = text_.selection.end.y();
-       RowList::iterator startrow = text_.getRow(text_.selection.start);
-       RowList::iterator endrow = text_.getRow(text_.selection.end);
+       ParagraphList::iterator startpit = text_.getPar(text_.selection.start);
+       ParagraphList::iterator endpit = text_.getPar(text_.selection.end);
+       RowList::iterator startrow = startpit->getRow(text_.selection.start.pos());
+       RowList::iterator endrow = endpit->getRow(text_.selection.end.pos());
+       int const h = row_.height();
 
-       if (text_.bidi_same_direction) {
+       if (text_.bidi.same_direction()) {
                int x;
                int y = yo_;
                int w;
-               int h = row_->height();
 
-               if (startrow == row_ && endrow == row_) {
+               if (startrow == rit_ && endrow == rit_) {
                        if (startx < endx) {
                                x = int(xo_) + startx;
                                w = endx - startx;
-                               pain_.fillRectangle(x, y, w, h, LColor::selection);
                        } else {
                                x = int(xo_) + endx;
                                w = startx - endx;
-                               pain_.fillRectangle(x, y, w, h, LColor::selection);
                        }
-               } else if (startrow == row_) {
+                       pain_.fillRectangle(x, y, w, h, LColor::selection);
+               } else if (startrow == rit_) {
                        int const x = is_rtl ? int(xo_) : int(xo_ + startx);
                        int const w = is_rtl ? startx : (width_ - startx);
                        pain_.fillRectangle(x, y, w, h, LColor::selection);
-               } else if (endrow == row_) {
+               } else if (endrow == rit_) {
                        int const x = is_rtl ? int(xo_ + endx) : int(xo_);
                        int const w = is_rtl ? (width_ - endx) : endx;
                        pain_.fillRectangle(x, y, w, h, LColor::selection);
@@ -420,25 +415,26 @@ void RowPainter::paintSelection()
                        pain_.fillRectangle(int(xo_), y, width_, h, LColor::selection);
                }
                return;
-       } else if (startrow != row_ && endrow != row_) {
+       }
+
+       if (startrow != rit_ && endrow != rit_) {
                if (y_ > starty && y_ < endy) {
                        int w = width_;
-                       int h = row_->height();
                        pain_.fillRectangle(int(xo_), yo_, w, h, LColor::selection);
                }
                return;
        }
 
-       if ((startrow != row_ && !is_rtl) || (endrow != row_ && is_rtl))
+       if ((startrow != rit_ && !is_rtl) || (endrow != rit_ && is_rtl))
                pain_.fillRectangle(int(xo_), yo_,
-                       int(x_), row_->height(), LColor::selection);
+                       int(x_), h, LColor::selection);
 
        pos_type const body_pos = pit_->beginningOfBody();
-       pos_type const last = lastPos(*pit_, row_);
+       pos_type const end = row_.endpos();
        double tmpx = x_;
 
-       for (pos_type vpos = row_->pos(); vpos <= last; ++vpos)  {
-               pos_type pos = text_.vis2log(vpos);
+       for (pos_type vpos = row_.pos(); vpos < end; ++vpos)  {
+               pos_type pos = text_.bidi.vis2log(vpos);
                double const old_tmpx = tmpx;
                if (body_pos > 0 && pos == body_pos - 1) {
                        LyXLayout_ptr const & layout = pit_->layout();
@@ -466,34 +462,32 @@ void RowPainter::paintSelection()
                        tmpx += singleWidth(pos);
                }
 
-               if ((startrow != row_ || text_.selection.start.pos() <= pos) &&
-                       (endrow != row_ || pos < text_.selection.end.pos())) {
+               if ((startrow != rit_ || text_.selection.start.pos() <= pos) &&
+                       (endrow != rit_ || pos < text_.selection.end.pos())) {
                        // Here we do not use x_ as xo_ was added to x_.
                        pain_.fillRectangle(int(old_tmpx), yo_,
-                               int(tmpx - old_tmpx + 1),
-                               row_->height(), LColor::selection);
+                               int(tmpx - old_tmpx + 1), h, LColor::selection);
                }
        }
 
-       if ((startrow != row_ && is_rtl) || (endrow != row_ && !is_rtl)) {
+       if ((startrow != rit_ && is_rtl) || (endrow != rit_ && !is_rtl)) {
                pain_.fillRectangle(int(xo_ + tmpx),
-                                     yo_, int(bv_.workWidth() - tmpx),
-                                     row_->height(), LColor::selection);
+                       yo_, int(bv_.workWidth() - tmpx), h, LColor::selection);
        }
 }
 
 
 void RowPainter::paintChangeBar()
 {
-       pos_type const start = row_->pos();
-       pos_type const end = lastPos(*pit_, row_);
+       pos_type const start = row_.pos();
+       pos_type const end = row_.endpos();
 
-       if (!pit_->isChanged(start, end))
+       if (start == end || !pit_->isChanged(start, end - 1))
                return;
 
-       int const height = (row_ == text_.lastRow())
-               ? row_->baseline()
-               : row_->height() + boost::next(row_)->top_of_text();
+       int const height = text_.isLastRow(pit_, row_)
+               ? row_.baseline()
+               : row_.height() + boost::next(rit_)->top_of_text();
 
        pain_.fillRectangle(4, yo_, 5, height, LColor::changebar);
 }
@@ -512,8 +506,8 @@ void RowPainter::paintAppendix()
        if (pit_->params().startOfAppendix())
                y += 2 * defaultRowHeight();
 
-       pain_.line(1, y, 1, yo_ + row_->height(), LColor::appendix);
-       pain_.line(ww - 2, y, ww - 2, yo_ + row_->height(), LColor::appendix);
+       pain_.line(1, y, 1, yo_ + row_.height(), LColor::appendix);
+       pain_.line(ww - 2, y, ww - 2, yo_ + row_.height(), LColor::appendix);
 }
 
 
@@ -525,17 +519,17 @@ void RowPainter::paintDepthBar()
                return;
 
        Paragraph::depth_type prev_depth = 0;
-       if (row_ != text_.firstRow()) {
+       if (!text_.isFirstRow(pit_, row_)) {
                ParagraphList::iterator pit2 = pit_;
-               if (row_ == pit2->rows.begin())
+               if (row_.pos() == 0)
                        --pit2;
                prev_depth = pit2->getDepth();
        }
 
        Paragraph::depth_type next_depth = 0;
-       if (row_ != text_.lastRow()) {
+       if (!text_.isLastRow(pit_, row_)) {
                ParagraphList::iterator pit2 = pit_;
-               if (boost::next(row_) == pit2->rows.end())
+               if (row_.endpos() >= pit2->size())
                        ++pit2;
                next_depth = pit2->getDepth();
        }
@@ -544,9 +538,9 @@ void RowPainter::paintDepthBar()
                int const w = PAPER_MARGIN / 5;
                int x = int(w * i + xo_);
                // only consider the changebar space if we're drawing outer left
-               if (!xo_)
+               if (xo_ == 0)
                        x += CHANGEBAR_MARGIN;
-               int const h = yo_ + row_->height() - 1 - (i - next_depth - 1) * 3;
+               int const h = yo_ + row_.height() - 1 - (i - next_depth - 1) * 3;
 
                pain_.line(x, yo_, x, h, LColor::depthbar);
 
@@ -558,7 +552,8 @@ void RowPainter::paintDepthBar()
 }
 
 
-int RowPainter::paintLengthMarker(string const & prefix, VSpace const & vsp, int start)
+int RowPainter::paintLengthMarker(string const & prefix, VSpace const & vsp,
+       int start)
 {
        if (vsp.kind() == VSpace::NONE)
                return 0;
@@ -624,31 +619,6 @@ int RowPainter::paintLengthMarker(string const & prefix, VSpace const & vsp, int
 }
 
 
-int RowPainter::paintPageBreak(string const & label, int y)
-{
-       LyXFont pb_font;
-       pb_font.setColor(LColor::pagebreak);
-       pb_font.decSize();
-
-       int w = 0;
-       int a = 0;
-       int d = 0;
-       font_metrics::rectText(label, pb_font, w, a, d);
-
-       int const text_start = int(xo_ + (width_ - w) / 2);
-       int const text_end = text_start + w;
-
-       pain_.rectText(text_start, y + d, label, pb_font, LColor::none, LColor::none);
-
-       pain_.line(int(xo_), y, text_start, y,
-                  LColor::pagebreak, Painter::line_onoffdash);
-       pain_.line(text_end, y, int(xo_ + width_), y,
-                  LColor::pagebreak, Painter::line_onoffdash);
-
-       return 3 * defaultRowHeight();
-}
-
-
 int RowPainter::paintAppendixStart(int y)
 {
        LyXFont pb_font;
@@ -684,14 +654,9 @@ void RowPainter::paintFirst()
                y_top += paintAppendixStart(yo_ + y_top + 2 * defaultRowHeight());
 
        // the top margin
-       if (row_ == text_.firstRow() && !text_.isInInset())
+       if (text_.isFirstRow(pit_, row_) && !text_.isInInset())
                y_top += PAPER_MARGIN;
 
-       // draw a top pagebreak
-       if (parparams.pagebreakTop())
-               y_top += paintPageBreak(_("Page Break (top)"),
-                       yo_ + y_top + 2 * defaultRowHeight());
-
        // draw the additional space if needed:
        y_top += paintLengthMarker(_("Space above"), parparams.spaceTop(),
                        yo_ + y_top);
@@ -719,28 +684,15 @@ void RowPainter::paintFirst()
 
        int const ww = bv_.workWidth();
 
-       // draw a top line
-       if (parparams.lineTop()) {
-               int const asc = font_metrics::ascent('x', getFont(0));
-
-               y_top += asc;
-
-               int const w = (text_.isInInset() ? text_.inset_owner->width() : ww);
-               int const xp = static_cast<int>(text_.isInInset() ? xo_ : 0);
-               pain_.line(xp, yo_ + y_top, xp + w, yo_ + y_top,
-                       LColor::topline, Painter::line_solid,
-                       Painter::line_thick);
-
-               y_top += asc;
-       }
-
        bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params());
+       bool const is_seq = isFirstInSequence(pit_, text_.ownerParagraphs());
+       //lyxerr << "paintFirst: " << pit_->id() << " is_seq: " << is_seq << std::endl;
 
        // should we print a label?
        if (layout->labeltype >= LABEL_STATIC
            && (layout->labeltype != LABEL_STATIC
-               || layout->latextype != LATEX_ENVIRONMENT
-               || isFirstInSequence(pit_, text_.ownerParagraphs()))) {
+                     || layout->latextype != LATEX_ENVIRONMENT
+                     || is_seq)) {
 
                LyXFont font = getLabelFont();
                if (!pit_->getLabelstring().empty()) {
@@ -769,8 +721,8 @@ void RowPainter::paintFirst()
                                        }
 
                                        pain_.text(int(x),
-                                               yo_ + row_->baseline() -
-                                               row_->ascent_of_text() - maxdesc,
+                                               yo_ + row_.baseline() -
+                                               row_.ascent_of_text() - maxdesc,
                                                str, font);
                                }
                        } else {
@@ -782,13 +734,13 @@ void RowPainter::paintFirst()
                                                - font_metrics::width(str, font);
                                }
 
-                               pain_.text(int(x), yo_ + row_->baseline(), str, font);
+                               pain_.text(int(x), yo_ + row_.baseline(), str, font);
                        }
                }
 
        // the labels at the top of an environment.
        // More or less for bibliography
-       } else if (isFirstInSequence(pit_, text_.ownerParagraphs()) &&
+       } else if (is_seq &&
                (layout->labeltype == LABEL_TOP_ENVIRONMENT ||
                layout->labeltype == LABEL_BIBLIO ||
                layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)) {
@@ -809,14 +761,14 @@ void RowPainter::paintFirst()
                        double x = x_;
                        if (layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) {
                                x = ((is_rtl ? leftMargin() : x_)
-                                        + ww - text_.rightMargin(pit_, *bv_.buffer(), *row_)) / 2;
+                                        + ww - text_.rightMargin(*pit_, *bv_.buffer())) / 2;
                                x -= font_metrics::width(str, font) / 2;
                        } else if (is_rtl) {
                                x = ww - leftMargin() -
                                        font_metrics::width(str, font);
                        }
                        pain_.text(int(x),
-                           yo_ + row_->baseline() - row_->ascent_of_text() - maxdesc,
+                           yo_ + row_.baseline() - row_.ascent_of_text() - maxdesc,
                                  str, font);
                }
        }
@@ -826,56 +778,33 @@ void RowPainter::paintFirst()
 void RowPainter::paintLast()
 {
        ParagraphParameters const & parparams = pit_->params();
-       int y_bottom = row_->height() - 1;
+       int y_bottom = row_.height() - 1;
 
        // the bottom margin
-       if (row_ == text_.lastRow() && !text_.isInInset())
+       if (text_.isLastRow(pit_, row_) && !text_.isInInset())
                y_bottom -= PAPER_MARGIN;
 
        int const ww = bv_.workWidth();
 
-       // draw a bottom pagebreak
-       if (parparams.pagebreakBottom()) {
-               y_bottom -= paintPageBreak(_("Page Break (bottom)"),
-                       yo_ + y_bottom - 2 * defaultRowHeight());
-       }
-
        // draw the additional space if needed:
        int const height = getLengthMarkerHeight(bv_, parparams.spaceBottom());
        y_bottom -= paintLengthMarker(_("Space below"), parparams.spaceBottom(),
                             yo_ + y_bottom - height);
 
-       // draw a bottom line
-       if (parparams.lineBottom()) {
-               int const asc = font_metrics::ascent('x',
-                       getFont(max(pos_type(0), pit_->size() - 1)));
-
-               y_bottom -= asc;
-
-               int const w = text_.isInInset() ? text_.inset_owner->width() : ww;
-               int const xp = int(text_.isInInset() ? xo_ : 0);
-               int const y = yo_ + y_bottom;
-               pain_.line(xp, y, xp + w, y, LColor::topline, Painter::line_solid,
-                         Painter::line_thick);
-
-               y_bottom -= asc;
-       }
-
        bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params());
        int const endlabel = getEndLabel(pit_, text_.ownerParagraphs());
 
        // draw an endlabel
        switch (endlabel) {
        case END_LABEL_BOX:
-       case END_LABEL_FILLED_BOX:
-       {
+       case END_LABEL_FILLED_BOX: {
                LyXFont const font = getLabelFont();
                int const size = int(0.75 * font_metrics::maxAscent(font));
-               int const y = (yo_ + row_->baseline()) - size;
+               int const y = yo_ + row_.baseline() - size;
                int x = is_rtl ? LEFT_MARGIN : ww - PAPER_MARGIN - size;
 
-               if (row_->fill() <= size)
-                       x += (size - row_->fill() + 1) * (is_rtl ? -1 : 1);
+               if (row_.fill() <= size)
+                       x += (size - row_.fill() + 1) * (is_rtl ? -1 : 1);
 
                if (endlabel == END_LABEL_BOX)
                        pain_.rectangle(x, y, size, size, LColor::eolmarker);
@@ -883,16 +812,17 @@ void RowPainter::paintLast()
                        pain_.fillRectangle(x, y, size, size, LColor::eolmarker);
                break;
        }
-       case END_LABEL_STATIC:
-       {
+
+       case END_LABEL_STATIC: {
                LyXFont font = getLabelFont();
                string const & str = pit_->layout()->endlabelstring();
                double const x = is_rtl ?
                        x_ - font_metrics::width(str, font)
-                       : ww - text_.rightMargin(pit_, *bv_.buffer(), *row_) - row_->fill();
-               pain_.text(int(x), yo_ + row_->baseline(), str, font);
+                       : ww - text_.rightMargin(*pit_, *bv_.buffer()) - row_.fill();
+               pain_.text(int(x), yo_ + row_.baseline(), str, font);
                break;
        }
+
        case END_LABEL_NO_LABEL:
                break;
        }
@@ -901,10 +831,10 @@ void RowPainter::paintLast()
 
 void RowPainter::paintText()
 {
-       pos_type const last = lastPos(*pit_, row_);
+       pos_type const end = row_.endpos();
        pos_type body_pos = pit_->beginningOfBody();
        if (body_pos > 0 &&
-               (body_pos - 1 > last || !pit_->isLineSeparator(body_pos - 1))) {
+               (body_pos > end || !pit_->isLineSeparator(body_pos - 1))) {
                body_pos = 0;
        }
 
@@ -914,11 +844,11 @@ void RowPainter::paintText()
        bool is_struckout = false;
        int last_strikeout_x = 0;
 
-       pos_type vpos = row_->pos();
-       while (vpos <= last) {
+       for (pos_type vpos = row_.pos(); vpos < end; ) {
                if (x_ > bv_.workWidth())
                        break;
-               pos_type pos = text_.vis2log(vpos);
+
+               pos_type pos = text_.bidi.vis2log(vpos);
 
                if (pos >= pit_->size()) {
                        ++vpos;
@@ -944,8 +874,7 @@ void RowPainter::paintText()
                // if we reach the end of a struck out range, paint it
                // we also don't paint across things like tables
                if (running_strikeout && (highly_editable_inset || !is_struckout)) {
-                       int const middle = yo_ + row_->top_of_text()
-                               + (row_->baseline() - row_->top_of_text()) / 2;
+                       int const middle = yo_ + (row_.baseline() + row_.top_of_text()) / 2;
                        pain_.line(last_strikeout_x, middle, int(x_), middle,
                                LColor::strikeout, Painter::line_solid, Painter::line_thin);
                        running_strikeout = false;
@@ -961,7 +890,7 @@ void RowPainter::paintText()
                if (pit_->isHfill(pos)) {
                        x_ += 1;
 
-                       int const y0 = yo_ + row_->baseline();
+                       int const y0 = yo_ + row_.baseline();
                        int const y1 = y0 - defaultRowHeight() / 2;
 
                        pain_.line(int(x_), y1, int(x_), y0, LColor::added_space);
@@ -996,8 +925,7 @@ void RowPainter::paintText()
 
        // if we reach the end of a struck out range, paint it
        if (running_strikeout) {
-               int const middle = yo_ + row_->top_of_text()
-                       + ((row_->baseline() - row_->top_of_text()) / 2);
+               int const middle = yo_ + (row_.baseline() + row_.top_of_text()) / 2;
                pain_.line(last_strikeout_x, middle, int(x_), middle,
                        LColor::strikeout, Painter::line_solid, Painter::line_thin);
                running_strikeout = false;
@@ -1007,18 +935,11 @@ void RowPainter::paintText()
 
 void RowPainter::paint()
 {
-       width_       = text_.workWidth();
-       x_           = row_->x();
-       separator_   = row_->fill_separator();
-       hfill_       = row_->fill_hfill();
-       label_hfill_ = row_->fill_label_hfill();
-
        // FIXME: what is this fixing ?
        if (text_.isInInset() && x_ < 0)
                x_ = 0;
        x_ += xo_;
 
-       // If we're *not* at the top-level of rows, then the
        // background has already been cleared.
        if (&text_ == bv_.text)
                paintBackground();
@@ -1036,10 +957,10 @@ void RowPainter::paint()
        // changebar
        paintChangeBar();
 
-       if (row_->isParStart())
+       if (row_.pos() == 0)
                paintFirst();
 
-       if (isParEnd(*pit_, row_))
+       if (row_.endpos() >= pit_->size())
                paintLast();
 
        // paint text
@@ -1052,7 +973,6 @@ int paintRows(BufferView const & bv, LyXText const & text,
        int xo, int y, int yf, int yo)
 {
        //lyxerr << "  paintRows: rit: " << &*rit << endl;
-       //const_cast<LyXText&>(text).updateRowPositions();
        int const yy = yf - y;
        int const y2 = bv.painter().paperHeight();
 
@@ -1123,9 +1043,7 @@ int getLengthMarkerHeight(BufferView const & bv, VSpace const & vsp)
 
        LyXFont font;
        font.decSize();
-       int const min_size = max(3 * arrow_size,
-               font_metrics::maxAscent(font)
-               + font_metrics::maxDescent(font));
+       int const min_size = max(3 * arrow_size, font_metrics::maxHeight(font));
 
        if (vsp.length().len().value() < 0.0)
                return min_size;