And the patch.
Index: bufferview_funcs.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/bufferview_funcs.C,v
retrieving revision 1.117
diff -u -p -r1.117 bufferview_funcs.C
--- bufferview_funcs.C  23 Oct 2003 13:28:45 -0000      1.117
+++ bufferview_funcs.C  24 Oct 2003 08:41:03 -0000
@@ -362,12 +362,13 @@ string const currentState(BufferView * b
                }
        }
 #ifdef DEVEL_VERSION
-       state << _(", Paragraph: ") << text->cursorPar()->id();
+       ParagraphList::iterator pit = text->cursorPar();
+       state << _(", Paragraph: ") << pit->id();
        state << _(", Position: ") << text->cursor.pos();
-       RowList::iterator rit = text->cursorRow();
+       RowList::iterator rit = pit->getRow(text->cursor.pos());
        state << bformat(_(", Row b:%1$d e:%2$d"), rit->pos(), rit->endpos());
        state << _(", Inset: ");
-       InsetOld * inset = text->cursorPar()->inInset();
+       InsetOld * inset = pit->inInset();
        if (inset)
                state << inset << " id: " << inset->id()
                      << " text: " << inset->getLyXText(bv, true)
@@ -399,10 +400,11 @@ void toggleAndShow(BufferView * bv, LyXF
        if (font.language() != ignore_language ||
            font.number() != LyXFont::IGNORE) {
                LyXCursor & cursor = text->cursor;
-               text->bidi.computeTables(*text->cursorPar(), *bv->buffer(),
-                       *text->cursorRow());
+               Paragraph & par = *text->cursorPar();
+               text->bidi.computeTables(par, *bv->buffer(),
+                       *par.getRow(cursor.pos()));
                if (cursor.boundary() !=
-                   text->bidi.isBoundary(*bv->buffer(), *text->cursorPar(),
+                   text->bidi.isBoundary(*bv->buffer(), par,
                                          cursor.pos(),
                                          text->real_current_font))
                        text->setCursor(cursor.par(), cursor.pos(),
Index: lyxfunc.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxfunc.C,v
retrieving revision 1.522
diff -u -p -r1.522 lyxfunc.C
--- lyxfunc.C   24 Oct 2003 07:59:02 -0000      1.522
+++ lyxfunc.C   24 Oct 2003 08:41:03 -0000
@@ -956,13 +956,14 @@ void LyXFunc::dispatch(FuncRequest const
 
                        if (result == FINISHED_UP) {
                                LyXText * text = view()->text;
-                               RowList::iterator const rit = text->cursorRow();
-                               if (text->isFirstRow(text->cursorPar(), *rit)) {
+                               ParagraphList::iterator pit = text->cursorPar();
+                               Row const & row = *pit->getRow(text->cursor.pos());
+                               if (text->isFirstRow(pit, row)) {
 #if 1
                                        text->setCursorFromCoordinates(
                                                text->cursor.x() + inset_x,
                                                text->cursor.y() -
-                                               rit->baseline() - 1);
+                                               row.baseline() - 1);
                                        text->cursor.x_fix(text->cursor.x());
 #else
                                        text->cursorUp(view());
@@ -977,14 +978,15 @@ void LyXFunc::dispatch(FuncRequest const
 
                        if (result == FINISHED_DOWN) {
                                LyXText * text = view()->text;
-                               RowList::iterator const rit = text->cursorRow();
-                               if (text->isLastRow(text->cursorPar(), *rit)) {
+                               ParagraphList::iterator pit = text->cursorPar();
+                               Row const & row = *pit->getRow(text->cursor.pos());
+                               if (text->isLastRow(pit, row)) {
 #if 1
                                        text->setCursorFromCoordinates(
                                                text->cursor.x() + inset_x,
                                                text->cursor.y() -
-                                               rit->baseline() +
-                                               rit->height() + 1);
+                                               row.baseline() +
+                                               row.height() + 1);
                                        text->cursor.x_fix(text->cursor.x());
 #else
                                        text->cursorDown(view());
@@ -1024,7 +1026,8 @@ void LyXFunc::dispatch(FuncRequest const
                                goto exit_with_message;
                        case LFUN_DOWN: {
                                LyXText * text = view()->text;
-                               if (text->isLastRow(text->cursorPar(), 
*text->cursorRow()))
+                               ParagraphList::iterator pit = text->cursorPar();
+                               if (text->isLastRow(pit, 
*pit->getRow(text->cursor.pos())))
                                        view()->text->cursorDown(view());
                                else
                                        view()->text->cursorRight(view());
Index: lyxtext.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxtext.h,v
retrieving revision 1.245
diff -u -p -r1.245 lyxtext.h
--- lyxtext.h   24 Oct 2003 07:59:02 -0000      1.245
+++ lyxtext.h   24 Oct 2003 08:41:03 -0000
@@ -166,14 +166,6 @@ public:
        /// only the top-level LyXText has this non-zero
        BufferView * bv_owner;
 
-private:
-       /// returns a pointer to a specified row.
-       RowList::iterator getRow(Paragraph & par, lyx::pos_type pos) const;
-public:
-       /// returns an iterator pointing to a cursor row
-       RowList::iterator getRow(LyXCursor const & cursor) const;
-       /// convenience
-       RowList::iterator cursorRow() const;
        /// returns an iterator pointing to a cursor paragraph
        ParagraphList::iterator getPar(LyXCursor const & cursor) const;
        ///
@@ -182,6 +174,8 @@ public:
        int parOffset(ParagraphList::iterator pit) const;
        /// convenience
        ParagraphList::iterator cursorPar() const;
+       ///
+       RowList::iterator cursorRow() const;
 
        /** returns a pointer to the row near the specified y-coordinate
          (relative to the whole text). y is set to the real beginning
Index: paragraph.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.C,v
retrieving revision 1.333
diff -u -p -r1.333 paragraph.C
--- paragraph.C 21 Oct 2003 16:15:10 -0000      1.333
+++ paragraph.C 24 Oct 2003 08:41:03 -0000
@@ -1420,3 +1420,15 @@ bool Paragraph::allowEmpty() const
                return pimpl_->inset_owner->owner()->lyxCode() == InsetOld::ERT_CODE;
        return false;
 }
+
+
+RowList::iterator Paragraph::getRow(pos_type pos)
+{
+       RowList::iterator rit = rows.end();
+       RowList::iterator const begin = rows.begin();
+
+       for (--rit; rit != begin && rit->pos() > pos; --rit)
+               ;
+
+       return rit;
+}
Index: paragraph.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.h,v
retrieving revision 1.112
diff -u -p -r1.112 paragraph.h
--- paragraph.h 23 Oct 2003 08:15:55 -0000      1.112
+++ paragraph.h 24 Oct 2003 08:41:03 -0000
@@ -295,6 +295,10 @@ public:
        ParagraphParameters & params();
        ///
        ParagraphParameters const & params() const;
+
+       ///
+       RowList::iterator getRow(lyx::pos_type pos);
+
        ///
        InsetList insetlist;
 
Index: rowpainter.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/rowpainter.C,v
retrieving revision 1.82
diff -u -p -r1.82 rowpainter.C
--- rowpainter.C        24 Oct 2003 07:59:02 -0000      1.82
+++ rowpainter.C        24 Oct 2003 08:41:03 -0000
@@ -390,8 +390,10 @@ 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());
 
        if (text_.bidi.same_direction()) {
                int x;
Index: text.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text.C,v
retrieving revision 1.481
diff -u -p -r1.481 text.C
--- text.C      24 Oct 2003 08:33:52 -0000      1.481
+++ text.C      24 Oct 2003 08:41:03 -0000
@@ -467,7 +467,9 @@ pos_type addressBreakPoint(pos_type i, P
 void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
 {
        // maximum pixel width of a row.
-       int width = workWidth() - rightMargin(*pit, *bv()->buffer(), row);
+       int width = workWidth()
+               - rightMargin(*pit, *bv()->buffer(), row)
+               - leftMargin(pit, row);
 
        // inset->textWidth() returns -1 via workWidth(),
        // but why ?
@@ -509,7 +511,7 @@ void LyXText::rowBreakPoint(ParagraphLis
        LyXFont font = getFont(pit, i);
        lyx::pos_type endPosOfFontSpan = pit->getEndPosOfFontSpan(i);
 
-       for (; i < last; ++i) {
+       for ( ; i < last; ++i) {
                if (pit->isNewline(i)) {
                        point = i;
                        break;
@@ -667,8 +669,7 @@ int LyXText::labelFill(ParagraphList::it
 
        BOOST_ASSERT(last > 0);
 
-       // -1 because a label ends either with a space that is in the label,
-       // or with the beginning of a footnote that is outside the label.
+       // -1 because a label ends with a space that is in the label
        --last;
 
        // a separator at this end does not count
@@ -676,11 +677,8 @@ int LyXText::labelFill(ParagraphList::it
                --last;
 
        int w = 0;
-       pos_type i = row.pos();
-       while (i <= last) {
+       for (pos_type i = row.pos(); i <= last; ++i)
                w += singleWidth(pit, i);
-               ++i;
-       }
 
        int fill = 0;
        string const & labwidstr = pit->params().labelWidthString();
@@ -733,65 +731,28 @@ void LyXText::setHeightOfRow(ParagraphLi
                spacing_val = bv()->buffer()->params().spacing().getValue();
        //lyxerr << "spacing_val = " << spacing_val << endl;
 
+       // these are minimum values
        int maxasc  = int(font_metrics::maxAscent(font) *
                          layout->spacing.getValue() * spacing_val);
        int maxdesc = int(font_metrics::maxDescent(font) *
                          layout->spacing.getValue() * spacing_val);
 
-       pos_type const pos_end = lastPos(*pit, row);
-       int labeladdon = 0;
-       int maxwidth = 0;
-
-       if (!pit->empty()) {
-               // We re-use the font resolution for the entire font span when possible
-               LyXFont font = getFont(pit, row.pos());
-               lyx::pos_type endPosOfFontSpan = pit->getEndPosOfFontSpan(row.pos());
-
-               // Optimisation
-               Paragraph const & par = *pit;
-
-               // Check if any insets are larger
-               for (pos_type pos = row.pos(); pos <= pos_end; ++pos) {
-                       // Manual inlined optimised version of common case of
-                       // "maxwidth += singleWidth(pit, pos);"
-                       char const c = par.getChar(pos);
-
-                       if (IsPrintable(c)) {
-                               if (pos > endPosOfFontSpan) {
-                                       // We need to get the next font
-                                       font = getFont(pit, pos);
-                                       endPosOfFontSpan = 
par.getEndPosOfFontSpan(pos);
-                               }
-                               if (! font.language()->RightToLeft()) {
-                                       maxwidth += font_metrics::width(c, font);
-                               } else {
-                                       // Fall-back to normal case
-                                       maxwidth += singleWidth(pit, pos, c, font);
-                                       // And flush font cache
-                                       endPosOfFontSpan = 0;
-                               }
-                       } else {
-                               // Special handling of insets - are any larger?
-                               if (par.isInset(pos)) {
-                                       InsetOld const * tmpinset = par.getInset(pos);
-                                       if (tmpinset) {
-                                               maxwidth += tmpinset->width();
-                                               maxasc = max(maxasc, 
tmpinset->ascent());
-                                               maxdesc = max(maxdesc, 
tmpinset->descent());
-                                       }
-                               } else {
-                                       // Fall-back to normal case
-                                       maxwidth += singleWidth(pit, pos, c, font);
-                                       // And flush font cache
-                                       endPosOfFontSpan = 0;
-                               }
-                       }
+       // insets may be taller
+       InsetList::iterator ii = pit->insetlist.begin();
+       InsetList::iterator iend = pit->insetlist.end();
+       for ( ; ii != iend; ++ii) {
+               if (ii->pos >= row.pos() && ii->pos < row.endpos()) {
+                       maxasc = max(maxasc, ii->inset->ascent());
+                       maxdesc = max(maxdesc, ii->inset->descent());
                }
        }
 
        // Check if any custom fonts are larger (Asger)
        // This is not completely correct, but we can live with the small,
        // cosmetic error for now.
+       int labeladdon = 0;
+       pos_type const pos_end = lastPos(*pit, row);
+
        LyXFont::FONT_SIZE maxsize =
                pit->highestFontInRange(row.pos(), pos_end, size);
        if (maxsize > font.size()) {
@@ -984,28 +945,24 @@ void LyXText::setHeightOfRow(ParagraphLi
        row.height(maxasc + maxdesc + labeladdon);
        row.baseline(maxasc + labeladdon);
        row.top_of_text(row.baseline() - font_metrics::maxAscent(font));
-
-       row.width(maxwidth);
-
-       if (inset_owner)
-               width = max(workWidth(), int(maxParagraphWidth(ownerParagraphs())));
 }
 
 
 void LyXText::breakParagraph(ParagraphList & paragraphs, char keep_layout)
 {
        // allow only if at start or end, or all previous is new text
-       if (cursor.pos() && cursor.pos() != cursorPar()->size()
-           && cursorPar()->isChangeEdited(0, cursor.pos()))
+       ParagraphList::iterator cpit = cursorPar();
+       if (cursor.pos() && cursor.pos() != cpit->size()
+           && cpit->isChangeEdited(0, cursor.pos()))
                return;
 
        LyXTextClass const & tclass =
                bv()->buffer()->params().getLyXTextClass();
-       LyXLayout_ptr const & layout = cursorPar()->layout();
+       LyXLayout_ptr const & layout = cpit->layout();
 
        // this is only allowed, if the current paragraph is not empty or caption
        // and if it has not the keepempty flag active
-       if (cursorPar()->empty() && !cursorPar()->allowEmpty()
+       if (cpit->empty() && !cpit->allowEmpty()
           && layout->labeltype != LABEL_SENSITIVE)
                return;
 
@@ -1014,9 +971,8 @@ void LyXText::breakParagraph(ParagraphLi
        // Always break behind a space
        //
        // It is better to erase the space (Dekel)
-       if (cursor.pos() < cursorPar()->size()
-            && cursorPar()->isLineSeparator(cursor.pos()))
-          cursorPar()->erase(cursor.pos());
+       if (cursor.pos() < cpit->size() && cpit->isLineSeparator(cursor.pos()))
+          cpit->erase(cursor.pos());
 
        // break the paragraph
        if (keep_layout)
@@ -1028,21 +984,22 @@ void LyXText::breakParagraph(ParagraphLi
        // breakParagraph call should return a bool if it inserts the
        // paragraph before or behind and we should react on that one
        // but we can fix this in 1.3.0 (Jug 20020509)
-       bool const isempty = (cursorPar()->allowEmpty() && cursorPar()->empty());
-       ::breakParagraph(bv()->buffer()->params(), paragraphs, cursorPar(),
+       bool const isempty = cpit->allowEmpty() && cpit->empty();
+       ::breakParagraph(bv()->buffer()->params(), paragraphs, cpit,
                         cursor.pos(), keep_layout);
 
 #warning Trouble Point! (Lgb)
        // When ::breakParagraph is called from within an inset we must
        // ensure that the correct ParagraphList is used. Today that is not
        // the case and the Buffer::paragraphs is used. Not good. (Lgb)
-       ParagraphList::iterator next_par = boost::next(cursorPar());
+       cpit = cursorPar();
+       ParagraphList::iterator next_par = boost::next(cpit);
 
        // well this is the caption hack since one caption is really enough
        if (layout->labeltype == LABEL_SENSITIVE) {
                if (!cursor.pos())
                        // set to standard-layout
-                       cursorPar()->applyLayout(tclass.defaultLayout());
+                       cpit->applyLayout(tclass.defaultLayout());
                else
                        // set to standard-layout
                        next_par->applyLayout(tclass.defaultLayout());
@@ -1052,8 +1009,9 @@ void LyXText::breakParagraph(ParagraphLi
        // move one row up!
        // This touches only the screen-update. Otherwise we would may have
        // an empty row on the screen
-       if (cursor.pos() && cursorRow()->pos() == cursor.pos()
-           && !cursorPar()->isNewline(cursor.pos() - 1))
+       RowList::iterator crit = cpit->getRow(cursor.pos());
+       if (cursor.pos() && crit->pos() == cursor.pos()
+           && !cpit->isNewline(cursor.pos() - 1))
        {
                cursorLeft(bv());
        }
@@ -1062,7 +1020,7 @@ void LyXText::breakParagraph(ParagraphLi
                next_par->erase(0);
 
        updateCounters();
-       redoParagraph(cursorPar());
+       redoParagraph(cpit);
        redoParagraph(next_par);
 
        // This check is necessary. Otherwise the new empty paragraph will
@@ -1070,7 +1028,7 @@ void LyXText::breakParagraph(ParagraphLi
        if (cursor.pos() || isempty)
                setCursor(next_par, 0);
        else
-               setCursor(cursorPar(), 0);
+               setCursor(cpit, 0);
 }
 
 
@@ -1257,9 +1215,8 @@ void LyXText::prepareToPrint(ParagraphLi
                } else {
                        align = pit->params().align();
                }
-               InsetOld * inset = 0;
                // ERT insets should always be LEFT ALIGNED on screen
-               inset = pit->inInset();
+               InsetOld * inset = pit->inInset();
                if (inset && inset->owner() &&
                        inset->owner()->lyxCode() == InsetOld::ERT_CODE)
                {
@@ -1791,6 +1748,12 @@ ParagraphList::iterator LyXText::cursorP
 }
 
 
+RowList::iterator LyXText::cursorRow() const
+{
+       return cursorPar()->getRow(cursor.pos());
+}
+
+
 ParagraphList::iterator LyXText::getPar(LyXCursor const & cur) const
 {
        return getPar(cur.par());
@@ -1804,31 +1767,6 @@ ParagraphList::iterator LyXText::getPar(
        ParagraphList::iterator pit = ownerParagraphs().begin();
        std::advance(pit, par);
        return pit;
-}
-
-
-
-RowList::iterator LyXText::cursorRow() const
-{
-       return getRow(*cursorPar(), cursor.pos());
-}
-
-
-RowList::iterator LyXText::getRow(LyXCursor const & cur) const
-{
-       return getRow(*getPar(cur), cur.pos());
-}
-
-
-RowList::iterator LyXText::getRow(Paragraph & par, pos_type pos) const
-{
-       RowList::iterator rit = boost::prior(par.rows.end());
-       RowList::iterator const begin = par.rows.begin();
-
-       while (rit != begin && rit->pos() > pos)
-               --rit;
-
-       return rit;
 }
 
 
Index: text2.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text2.C,v
retrieving revision 1.483
diff -u -p -r1.483 text2.C
--- text2.C     23 Oct 2003 13:28:48 -0000      1.483
+++ text2.C     24 Oct 2003 08:41:03 -0000
@@ -560,13 +560,15 @@ void LyXText::clearSelection()
 
 void LyXText::cursorHome()
 {
-       setCursor(cursorPar(), cursorRow()->pos());
+       ParagraphList::iterator cpit = cursorPar();
+       setCursor(cpit, cpit->getRow(cursor.pos())->pos());
 }
 
 
 void LyXText::cursorEnd()
 {
-       setCursor(cursorPar(), cursorRow()->endpos() - 1);
+       ParagraphList::iterator cpit = cursorPar();
+       setCursor(cpit, cpit->getRow(cursor.pos())->endpos() - 1);
 }
 
 
@@ -1297,7 +1299,7 @@ void LyXText::setCursor(LyXCursor & cur,
        // get the cursor y position in text
 
        ParagraphList::iterator pit = getPar(par);
-       Row const & row = *getRow(*pit, pos);
+       Row const & row = *pit->getRow(pos);
        int y = pit->y + row.y_offset();
 
        // y is now the beginning of the cursor row
@@ -1408,7 +1410,7 @@ void LyXText::setCurrentFont()
                        --pos;
                else // potentional bug... BUG (Lgb)
                        if (pit->isSeparator(pos)) {
-                               if (pos > cursorRow()->pos() &&
+                               if (pos > pit->getRow(pos)->pos() &&
                                    bidi.level(pos) % 2 ==
                                    bidi.level(pos - 1) % 2)
                                        --pos;
@@ -1602,9 +1604,11 @@ void LyXText::cursorRight(bool internal)
 
 void LyXText::cursorUp(bool selecting)
 {
+       ParagraphList::iterator cpit = cursorPar();
+       Row const & crow = *cpit->getRow(cursor.pos());
 #if 1
        int x = cursor.x_fix();
-       int y = cursor.y() - cursorRow()->baseline() - 1;
+       int y = cursor.y() - crow.baseline() - 1;
        setCursorFromCoordinates(x, y);
        if (!selecting) {
                int topy = bv_owner->top_y();
@@ -1619,18 +1623,20 @@ void LyXText::cursorUp(bool selecting)
        }
 #else
        lyxerr << "cursorUp: y " << cursor.y() << " bl: " <<
-               cursorRow()->baseline() << endl;
+               crow.baseline() << endl;
        setCursorFromCoordinates(cursor.x_fix(),
-               cursor.y() - cursorRow()->baseline() - 1);
+               cursor.y() - crow.baseline() - 1);
 #endif
 }
 
 
 void LyXText::cursorDown(bool selecting)
 {
+       ParagraphList::iterator cpit = cursorPar();
+       Row const & crow = *cpit->getRow(cursor.pos());
 #if 1
        int x = cursor.x_fix();
-       int y = cursor.y() - cursorRow()->baseline() + cursorRow()->height() + 1;
+       int y = cursor.y() - crow.baseline() + crow.height() + 1;
        setCursorFromCoordinates(x, y);
        if (!selecting) {
                int topy = bv_owner->top_y();
@@ -1645,29 +1651,30 @@ void LyXText::cursorDown(bool selecting)
        }
 #else
        setCursorFromCoordinates(cursor.x_fix(),
-                cursor.y() - cursorRow()->baseline() + cursorRow()->height() + 1);
+                cursor.y() - crow.baseline() + crow.height() + 1);
 #endif
 }
 
 
 void LyXText::cursorUpParagraph()
 {
+       ParagraphList::iterator cpit = cursorPar();
        if (cursor.pos() > 0)
-               setCursor(cursorPar(), 0);
-       else if (cursorPar() != ownerParagraphs().begin())
-               setCursor(boost::prior(cursorPar()), 0);
+               setCursor(cpit, 0);
+       else if (cpit != ownerParagraphs().begin())
+               setCursor(boost::prior(cpit), 0);
 }
 
 
 void LyXText::cursorDownParagraph()
 {
-       ParagraphList::iterator par = cursorPar();
-       ParagraphList::iterator next_par = boost::next(par);
+       ParagraphList::iterator pit = cursorPar();
+       ParagraphList::iterator next_pit = boost::next(pit);
 
-       if (next_par != ownerParagraphs().end())
-               setCursor(next_par, 0);
+       if (next_pit != ownerParagraphs().end())
+               setCursor(next_pit, 0);
        else
-               setCursor(par, par->size());
+               setCursor(pit, pit->size());
 }
 
 
Index: text3.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text3.C,v
retrieving revision 1.160
diff -u -p -r1.160 text3.C
--- text3.C     24 Oct 2003 07:59:04 -0000      1.160
+++ text3.C     24 Oct 2003 08:41:03 -0000
@@ -248,11 +248,12 @@ void LyXText::gotoInset(InsetOld::Code c
 
 void LyXText::cursorPrevious()
 {
-       int y = bv_owner->top_y();
+       int y = bv()->top_y();
 
-       RowList::iterator rit = cursorRow();
+       ParagraphList::iterator cpit = cursorPar();
+       RowList::iterator crit = cpit->getRow(cursor.pos());
 
-       if (rit == firstRow()) {
+       if (isFirstRow(cpit, *crit)) {
                if (y > 0)
                        bv()->updateScrollbar();
                return;
@@ -261,37 +262,26 @@ void LyXText::cursorPrevious()
        setCursorFromCoordinates(cursor.x_fix(), y);
        finishUndo();
 
-       int new_y;
-       if (rit == bv()->text->cursorRow()) {
+       if (crit == bv()->text->cursorRow()) {
                // we have a row which is taller than the workarea. The
                // simplest solution is to move to the previous row instead.
                cursorUp(true);
                return;
-               // This is what we used to do, so we wouldn't skip right past
-               // tall rows, but it's not working right now.
        }
 
+       int new_y = + crit->height() - bv()->workHeight() + 1;
+
        if (inset_owner) {
-               new_y = bv()->text->cursor.y()
-                       + bv()->theLockingInset()->insetInInsetY() + y
-                       + rit->height()
-                       - bv()->workHeight() + 1;
+               new_y += bv()->text->cursor.y()
+                       + bv()->theLockingInset()->insetInInsetY() + y;
        } else {
-               new_y = cursor.y()
-                       - rit->baseline()
-                       + rit->height()
-                       - bv()->workHeight() + 1;
+               new_y += cursor.y() - crit->baseline();
        }
 
+       previousRow(cpit, crit);
        LyXCursor cur;
-       ParagraphList::iterator pit = cursorPar();
-       rit = cursorRow();
-       if (isFirstRow(pit, *rit))
-               return;
-
-       previousRow(pit, rit);
-       setCursor(cur, parOffset(pit), rit->pos(), false);
-       if (cur.y() > bv_owner->top_y())
+       setCursor(cur, parOffset(cpit), crit->pos(), false);
+       if (cur.y() > bv()->top_y())
                cursorUp(true);
        bv()->updateScrollbar();
 }
@@ -299,21 +289,23 @@ void LyXText::cursorPrevious()
 
 void LyXText::cursorNext()
 {
-       int topy = bv_owner->top_y();
+       int topy = bv()->top_y();
 
-       RowList::iterator rit = cursorRow();
-       if (isLastRow(cursorPar(), *cursorRow())) {
-               int y = cursor.y() - rit->baseline() + cursorRow()->height();
+       ParagraphList::iterator cpit = cursorPar();
+       RowList::iterator crit = cpit->getRow(cursor.pos());
+
+       if (isLastRow(cpit, *crit)) {
+               int y = cursor.y() - crit->baseline() + crit->height();
                if (y > topy + bv()->workHeight())
-                       bv_owner->updateScrollbar();
+                       bv()->updateScrollbar();
                return;
        }
 
-       int y = topy + bv_owner->workHeight();
+       int y = topy + bv()->workHeight();
        if (inset_owner && !topy) {
-               y -= (bv_owner->text->cursor.y()
-                         - bv_owner->top_y()
-                         + bv_owner->theLockingInset()->insetInInsetY());
+               y -= (bv()->text->cursor.y()
+                         - bv()->top_y()
+                         + bv()->theLockingInset()->insetInInsetY());
        }
 
        ParagraphList::iterator dummypit;
@@ -325,7 +317,7 @@ void LyXText::cursorNext()
        finishUndo();
 
        int new_y;
-       if (rit == bv_owner->text->cursorRow()) {
+       if (crit == bv()->text->cursorRow()) {
                // we have a row which is taller than the workarea. The
                // simplest solution is to move to the next row instead.
                cursorDown(true);
@@ -335,21 +327,20 @@ void LyXText::cursorNext()
 #if 0
                new_y = bv->top_y() + bv->workHeight();
 #endif
+       }
+
+       if (inset_owner) {
+               new_y = bv()->text->cursor.y()
+                       + bv()->theLockingInset()->insetInInsetY()
+                       + y - crit->baseline();
        } else {
-               if (inset_owner) {
-                       new_y = bv()->text->cursor.y()
-                               + bv()->theLockingInset()->insetInInsetY()
-                               + y - rit->baseline();
-               } else {
-                       new_y = cursor.y() - cursorRow()->baseline();
-               }
+               new_y = cursor.y() - crit->baseline();
        }
 
-       ParagraphList::iterator pit = cursorPar();
-       rit = cursorRow();
-       nextRow(pit, rit);
+
+       nextRow(cpit, crit);
        LyXCursor cur;
-       setCursor(cur, parOffset(pit), rit->pos(), false);
+       setCursor(cur, parOffset(cpit), crit->pos(), false);
        if (cur.y() < bv_owner->top_y() + bv()->workHeight())
                cursorDown(true);
        bv()->updateScrollbar();
Index: frontends/screen.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/screen.C,v
retrieving revision 1.77
diff -u -p -r1.77 screen.C
--- frontends/screen.C  17 Oct 2003 18:01:12 -0000      1.77
+++ frontends/screen.C  24 Oct 2003 08:41:03 -0000
@@ -29,6 +29,7 @@
 #include "lyxrow.h"
 #include "lyxtext.h"
 #include "metricsinfo.h"
+#include "paragraph.h"
 #include "rowpainter.h"
 #include "version.h"
 
@@ -257,22 +258,22 @@ unsigned int LyXScreen::topCursorVisible
        int newtop = top_y;
        unsigned int const vheight = workarea().workHeight();
 
-       RowList::iterator row = text->cursorRow();
+       Row & row = *text->cursorPar()->getRow(cursor.pos());
 
-       if (int(cursor.y() - row->baseline() + row->height() - top_y) >= vheight) {
-               if (row->height() < vheight
-                   && row->height() > vheight / 4) {
+       if (int(cursor.y() - row.baseline() + row.height() - top_y) >= vheight) {
+               if (row.height() < vheight
+                   && row.height() > vheight / 4) {
                        newtop = cursor.y()
-                               + row->height()
-                               - row->baseline() - vheight;
+                               + row.height()
+                               - row.baseline() - vheight;
                } else {
                        // scroll down, the scroll region must be so big!!
                        newtop = cursor.y() - vheight / 2;
                }
 
-       } else if (int(cursor.y() - row->baseline()) < top_y && top_y > 0) {
-               if (row->height() < vheight && row->height() > vheight / 4) {
-                       newtop = cursor.y() - row->baseline();
+       } else if (int(cursor.y() - row.baseline()) < top_y && top_y > 0) {
+               if (row.height() < vheight && row.height() > vheight / 4) {
+                       newtop = cursor.y() - row.baseline();
                } else {
                        // scroll up
                        newtop = cursor.y() - vheight / 2;
Index: insets/insettext.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettext.C,v
retrieving revision 1.513
diff -u -p -r1.513 insettext.C
--- insets/insettext.C  17 Oct 2003 18:01:14 -0000      1.513
+++ insets/insettext.C  24 Oct 2003 08:41:03 -0000
@@ -1493,7 +1492,7 @@ bool InsetText::cboundary() const
 
 RowList::iterator InsetText::crow() const
 {
-       return text_.cursorRow();
+       return cpar()->getRow(cpos());
 }
 
 

Reply via email to