]> git.lyx.org Git - lyx.git/blobdiff - src/text2.C
bug 1376 partial fix and simplification.
[lyx.git] / src / text2.C
index 9adca2d484e6a8ef00a590f30ad676c0258d8aaa..97fc51aa5b048f91b88c6b82dfdd8765816c54b7 100644 (file)
@@ -1,12 +1,21 @@
-/* This file is part of
- * ======================================================
+/**
+ * \file text2.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- *           LyX, The Document Processor
+ * \author Asger Alstrup
+ * \author Lars Gullik Bjønnes
+ * \author Alfredo Braunstein
+ * \author Jean-Marc Lasgouttes
+ * \author Angus Leeming
+ * \author John Levon
+ * \author André Pönitz
+ * \author Allan Rae
+ * \author Dekel Tsur
+ * \author Jürgen Vigna
  *
- *           Copyright 1995 Matthias Ettrich
- *           Copyright 1995-2001 The LyX Team.
- *
- * ====================================================== */
+ * Full author contact details are available in file CREDITS.
+ */
 
 #include <config.h>
 
@@ -59,19 +68,12 @@ using std::pair;
 using lyx::pos_type;
 
 
-LyXText::LyXText(BufferView * bv)
-       : height(0), width(0), anchor_row_offset_(0),
-         inset_owner(0), the_locking_inset(0), bv_owner(bv)
+LyXText::LyXText(BufferView * bv, InsetText * inset, bool ininset,
+         ParagraphList & paragraphs)
+       : height(0), width(0), anchor_y_(0),
+         inset_owner(inset), the_locking_inset(0), bv_owner(bv),
+         in_inset_(ininset), paragraphs_(paragraphs)
 {
-       anchor_row_ = rows().end();
-}
-
-
-LyXText::LyXText(BufferView * bv, InsetText * inset)
-       : height(0), width(0), anchor_row_offset_(0),
-         inset_owner(inset), the_locking_inset(0), bv_owner(bv)
-{
-       anchor_row_ = rows().end();
 }
 
 
@@ -79,17 +81,20 @@ void LyXText::init(BufferView * bview)
 {
        bv_owner = bview;
 
-       rowlist_.clear();
+       ParagraphList::iterator const beg = ownerParagraphs().begin();
+       ParagraphList::iterator const end = ownerParagraphs().end();
+       for (ParagraphList::iterator pit = beg; pit != end; ++pit)
+               pit->rows.clear();
+
        width = 0;
        height = 0;
 
-       anchor_row_ = rows().end();
-       anchor_row_offset_ = 0;
+       anchor_y_ = 0;
 
-       current_font = getFont(ownerParagraphs().begin(), 0);
+       current_font = getFont(beg, 0);
 
-       redoParagraphs(ownerParagraphs().begin(), ownerParagraphs().end());
-       setCursorIntern(ownerParagraphs().begin(), 0);
+       redoParagraphs(beg, end);
+       setCursorIntern(beg, 0);
        selection.cursor = cursor;
 
        updateCounters();
@@ -240,73 +245,6 @@ void LyXText::setCharFont(
 }
 
 
-// removes the row and reset the touched counters
-void LyXText::removeRow(RowList::iterator rit)
-{
-       if (anchor_row_ == rit) {
-               if (rit != rows().begin()) {
-                       anchor_row_ = boost::prior(rit);
-                       anchor_row_offset_ += anchor_row_->height();
-               } else {
-                       anchor_row_ = boost::next(rit);
-                       anchor_row_offset_ -= rit->height();
-               }
-       }
-
-       // the text becomes smaller
-       height -= rit->height();
-
-       rowlist_.erase(rit);
-}
-
-
-// remove all following rows of the paragraph of the specified row.
-void LyXText::removeParagraph(RowList::iterator rit)
-{
-       ParagraphList::iterator pit = getPar(rit);
-       RowList::iterator end = endRow(pit);
-
-       for (++rit; rit != end; ) {
-               RowList::iterator rit2 = boost::next(rit);
-               removeRow(rit);
-               rit = rit2;
-       }
-}
-
-
-void LyXText::insertParagraph(ParagraphList::iterator pit,
-                             RowList::iterator rit)
-{
-       // insert a new row, starting at position 0
-       rit = rowlist_.insert(rit, Row(0));
-
-       // and now append the whole paragraph before the new row
-
-       pos_type const last = pit->size();
-       bool done = false;
-
-       do {
-               pos_type z = rowBreakPoint(pit, *rit);
-
-               RowList::iterator tmprow = rit;
-
-               if (z < last) {
-                       ++z;
-                       rit = rowlist_.insert(boost::next(rit), Row(z));
-               } else {
-                       done = true;
-               }
-
-               // Set the dimensions of the row
-               // fixed fill setting now by calling inset->update() in
-               // singleWidth when needed!
-               tmprow->fill(fill(pit, tmprow, workWidth()));
-               setHeightOfRow(pit, tmprow);
-
-       } while (!done);
-}
-
-
 InsetOld * LyXText::getInset() const
 {
        ParagraphList::iterator pit = cursor.par();
@@ -344,7 +282,7 @@ void LyXText::toggleInset()
        else
                inset->open(bv());
 
-       bv()->updateInset();
+       bv()->updateInset(inset);
 }
 
 
@@ -606,30 +544,69 @@ void LyXText::setFont(LyXFont const & font, bool toggleall)
 }
 
 
-// rebreaks all paragraphs between the specified pars
-// This function is needed after SetLayout and SetFont etc.
-void LyXText::redoParagraphs(ParagraphList::iterator start,
-  ParagraphList::iterator end)
+int LyXText::redoParagraphInternal(ParagraphList::iterator pit)
 {
-       for ( ; start != end; ++start)
-               redoParagraph(start);
+       RowList::iterator rit = pit->rows.begin();
+       RowList::iterator end = pit->rows.end();
+
+       // remove rows of paragraph, keep track of height changes
+       for (int i = 0; rit != end; ++rit, ++i)
+               height -= rit->height();
+       pit->rows.clear();
+
+       // redo insets
+       InsetList::iterator ii = pit->insetlist.begin();
+       InsetList::iterator iend = pit->insetlist.end();
+       for (; ii != iend; ++ii) {
+               Dimension dim;
+               MetricsInfo mi(bv(), getFont(pit, ii->pos), workWidth());
+               ii->inset->metrics(mi, dim);
+       }
+
+       // rebreak the paragraph
+       for (pos_type z = 0; z < pit->size() + 1; ) {
+               Row row(z);
+               z = rowBreakPoint(pit, row) + 1;
+               row.end(z);
+               pit->rows.push_back(row);
+       }
+
+       int par_width = 0;
+       // set height and fill and width of rows
+       int const ww = workWidth();
+       for (rit = pit->rows.begin(); rit != end; ++rit) {
+               int const f = fill(pit, rit, ww);
+               int const w = ww - f;
+               par_width = std::max(par_width, w);
+               rit->fill(f);
+               rit->width(w);
+               prepareToPrint(pit, rit);
+               setHeightOfRow(pit, rit);
+               height += rit->height();
+       }
+
+       //lyxerr << "redoParagraph: " << pit->rows.size() << " rows\n";
+       return par_width;
 }
 
 
-void LyXText::redoParagraph(ParagraphList::iterator pit)
+int LyXText::redoParagraphs(ParagraphList::iterator start,
+  ParagraphList::iterator end)
 {
-       RowList::iterator first = beginRow(pit);
-       RowList::iterator last = endRow(pit);
-
-       // remove paragraph from rowlist
-       while (first != last) {
-               RowList::iterator rit2 = first;
-               ++first;
-               removeRow(rit2);
+       int pars_width = 0;
+       for ( ; start != end; ++start) {
+               int par_width = redoParagraphInternal(start);
+               pars_width = std::max(par_width, pars_width);
        }
+       updateRowPositions();
+       return pars_width;
+}
+
 
-       // reinsert the paragraph
-       insertParagraph(pit, last);
+void LyXText::redoParagraph(ParagraphList::iterator pit)
+{
+       redoParagraphInternal(pit);
+       updateRowPositions();
 }
 
 
@@ -643,36 +620,19 @@ void LyXText::fullRebreak()
 
 void LyXText::metrics(MetricsInfo & mi, Dimension & dim)
 {
-       //lyxerr << "LyXText::metrics: width: " << mi.base.textwidth << endl;
+       //lyxerr << "LyXText::metrics: width: " << mi.base.textwidth
+       //      << " workWidth: " << workWidth() << endl;
        //Assert(mi.base.textwidth);
 
        // rebuild row cache
-       rowlist_.clear();
-       width = 0;
-       height = 0;
-
-       anchor_row_ = rows().end();
-       anchor_row_offset_ = 0;
-
-       ParagraphList::iterator pit = ownerParagraphs().begin();
-       ParagraphList::iterator end = ownerParagraphs().end();
+       width  = 0;
+       ///height = 0;
 
-       for (; pit != end; ++pit) {
-               InsetList::iterator ii = pit->insetlist.begin();
-               InsetList::iterator iend = pit->insetlist.end();
-               for (; ii != iend; ++ii) {
-                       Dimension dim;
-                       MetricsInfo m = mi;
-#warning FIXME: pos != 0
-                       m.base.font = getFont(pit, 0);
-                       ii->inset->metrics(m, dim);
-               }
-
-               redoParagraph(pit);
-       }
+       //anchor_y_ = 0;
+       width = redoParagraphs(ownerParagraphs().begin(), ownerParagraphs().end());
 
        // final dimension
-       dim.asc = rows().begin()->ascent_of_text();
+       dim.asc = firstRow()->ascent_of_text();
        dim.des = height - dim.asc;
        dim.wid = std::max(mi.base.textwidth, int(width));
 }
@@ -715,21 +675,12 @@ void LyXText::cursorEnd()
                return;
 
        RowList::iterator rit = cursorRow();
-       RowList::iterator next_rit = boost::next(rit);
-       RowList::iterator end = boost::next(rit);
        ParagraphList::iterator pit = cursor.par();
-       pos_type last_pos = lastPos(*this, pit, rit);
-
-       if (next_rit == end) {
-               ++last_pos;
-       } else {
-               if (pit->empty() ||
-                   (pit->getChar(last_pos) != ' ' && !pit->isNewline(last_pos))) {
-                       ++last_pos;
-               }
-       }
-
-       setCursor(pit, last_pos);
+       pos_type pos = lastPos(*pit, rit);
+       /* cursor should be before a hard newline only */
+       if (!pit->isNewline(pos))
+               ++pos;
+       setCursor(pit, pos);
 }
 
 
@@ -793,7 +744,7 @@ string LyXText::getStringToIndex()
        else if (selection.start.par() != selection.end.par())
                bv()->owner()->message(_("Cannot index more than one paragraph!"));
        else
-               idxstring = selectionAsString(bv()->buffer(), false);
+               idxstring = selectionAsString(*bv()->buffer(), false);
 
        // Reset cursors to their original position.
        cursor = reset_cursor;
@@ -888,14 +839,14 @@ void LyXText::setParagraph(bool line_top, bool line_bottom,
        setSelection();
        setCursor(tmpcursor.par(), tmpcursor.pos());
        if (inset_owner)
-               bv()->updateInset();
+               bv()->updateInset(inset_owner);
 }
 
 
 // set the counter of a paragraph. This includes the labels
-void LyXText::setCounter(Buffer const * buf, ParagraphList::iterator pit)
+void LyXText::setCounter(Buffer const & buf, ParagraphList::iterator pit)
 {
-       LyXTextClass const & textclass = buf->params.getLyXTextClass();
+       LyXTextClass const & textclass = buf.params.getLyXTextClass();
        LyXLayout_ptr const & layout = pit->layout();
 
        if (pit != ownerParagraphs().begin()) {
@@ -953,7 +904,7 @@ void LyXText::setCounter(Buffer const * buf, ParagraphList::iterator pit)
 
                ostringstream s;
 
-               if (i >= 0 && i <= buf->params.secnumdepth) {
+               if (i >= 0 && i <= buf.params.secnumdepth) {
                        string numbertype;
                        string langtype;
 
@@ -961,9 +912,9 @@ void LyXText::setCounter(Buffer const * buf, ParagraphList::iterator pit)
 
                        // Is there a label? Useful for Chapter layout
                        if (!pit->params().appendix()) {
-                               s << buf->B_(layout->labelstring());
+                               s << buf.B_(layout->labelstring());
                        } else {
-                               s << buf->B_(layout->labelstring_appendix());
+                               s << buf.B_(layout->labelstring_appendix());
                        }
 
                        // Use of an integer is here less than elegant. For now.
@@ -972,7 +923,7 @@ void LyXText::setCounter(Buffer const * buf, ParagraphList::iterator pit)
                                numbertype = "sectioning";
                        } else {
                                numbertype = "appendix";
-                               if (pit->isRightToLeftPar(buf->params))
+                               if (pit->isRightToLeftPar(buf.params))
                                        langtype = "hebrew";
                                else
                                        langtype = "latin";
@@ -1026,7 +977,7 @@ void LyXText::setCounter(Buffer const * buf, ParagraphList::iterator pit)
                }
                // In biblio should't be following counters but...
        } else {
-               string s = buf->B_(layout->labelstring());
+               string s = buf.B_(layout->labelstring());
 
                // the caption hack:
                if (layout->labeltype == LABEL_SENSITIVE) {
@@ -1043,9 +994,10 @@ void LyXText::setCounter(Buffer const * buf, ParagraphList::iterator pit)
                                        isOK = true;
                                        break;
                                } else {
+                                       Paragraph const * owner = &ownerPar(buf, in);
                                        tmppit = ownerParagraphs().begin();
                                        for ( ; tmppit != end; ++tmppit)
-                                               if (&*tmppit == in->parOwner())
+                                               if (&*tmppit == owner)
                                                        break;
                                }
                        }
@@ -1065,7 +1017,7 @@ void LyXText::setCounter(Buffer const * buf, ParagraphList::iterator pit)
                                textclass.counters().step(fl.type());
 
                                // Doesn't work... yet.
-                               s = bformat(_("%1$s #:"), buf->B_(fl.name()));
+                               s = bformat(_("%1$s #:"), buf.B_(fl.name()));
                        } else {
                                // par->SetLayout(0);
                                // s = layout->labelstring;
@@ -1111,7 +1063,7 @@ void LyXText::updateCounters()
                        pit->params().depth(maxdepth);
 
                // setCounter can potentially change the labelString.
-               setCounter(bv()->buffer(), pit);
+               setCounter(*bv()->buffer(), pit);
 
                string const & newLabel = pit->params().labelString();
 
@@ -1132,7 +1084,7 @@ void LyXText::insertInset(InsetOld * inset)
        // The character will not be inserted a second time
        insertChar(Paragraph::META_INSET);
        // If we enter a highly editable inset the cursor should be before
-       // the inset. After an Undo LyX tries to call inset->edit(...) 
+       // the inset. After an Undo LyX tries to call inset->edit(...)
        // and fails if the cursor is behind the inset and getInset
        // does not return the inset!
        if (isHighlyEditableInset(inset))
@@ -1151,7 +1103,7 @@ void LyXText::cutSelection(bool doclear, bool realcut)
        // finished. The solution used currently just works, to make it
        // faster we need to be more clever and probably also have more
        // calls to stuffClipboard. (Lgb)
-       bv()->stuffClipboard(selectionAsString(bv()->buffer(), true));
+       bv()->stuffClipboard(selectionAsString(*bv()->buffer(), true));
 
        // This doesn't make sense, if there is no selection
        if (!selection.set())
@@ -1216,7 +1168,7 @@ void LyXText::cutSelection(bool doclear, bool realcut)
 void LyXText::copySelection()
 {
        // stuff the selection onto the X clipboard, from an explicit copy request
-       bv()->stuffClipboard(selectionAsString(bv()->buffer(), true));
+       bv()->stuffClipboard(selectionAsString(*bv()->buffer(), true));
 
        // this doesnt make sense, if there is no selection
        if (!selection.set())
@@ -1392,41 +1344,30 @@ void LyXText::setCursor(LyXCursor & cur, ParagraphList::iterator pit,
        cur.par(pit);
        cur.pos(pos);
        cur.boundary(boundary);
-       if (rows().empty())
+       if (noRows())
                return;
 
        // get the cursor y position in text
-       int y = 0;
-       RowList::iterator row = getRow(pit, pos, y);
-       RowList::iterator beg = rows().begin();
+
+       RowList::iterator row = getRow(pit, pos);
+       int y = row->y();
 
        RowList::iterator old_row = row;
        // if we are before the first char of this row and are still in the
        // same paragraph and there is a previous row then put the cursor on
        // the end of the previous row
        cur.iy(y + row->baseline());
-       if (row != beg &&
-           pos &&
-           getPar(boost::prior(row)) == getPar(row) &&
-           pos < pit->size() &&
-           pit->getChar(pos) == Paragraph::META_INSET) {
-               InsetOld * ins = pit->getInset(pos);
-               if (ins && (ins->needFullRow() || ins->display())) {
-                       --row;
-                       y -= row->height();
-               }
-       }
 
        // y is now the beginning of the cursor row
        y += row->baseline();
        // y is now the cursor baseline
        cur.y(y);
 
-       pos_type last = lastPrintablePos(*this, pit, old_row);
+       pos_type last = lastPrintablePos(*pit, old_row);
 
        // None of these should happen, but we're scaredy-cats
        if (pos > pit->size()) {
-               lyxerr << "dont like 1 please report" << endl;
+               lyxerr << "dont like 1, pos: " << pos << " size: " << pit->size() << endl;
                pos = 0;
                cur.pos(0);
        } else if (pos > last + 1) {
@@ -1449,33 +1390,18 @@ void LyXText::setCursor(LyXCursor & cur, ParagraphList::iterator pit,
                cur.ix(int(x));
        } else
                cur.ix(cur.x());
-/* We take out this for the time being because 1) the redraw code is not
-   prepared to this yet and 2) because some good policy has yet to be decided
-   while editting: for instance how to act on rows being created/deleted
-   because of DEPM.
-*/
-#if 0
-       //if the cursor is in a visible row, anchor to it
-       int topy = top_y();
-       if (topy < y && y < topy + bv()->workHeight())
-               anchor_row(row);
-#endif
 }
 
 
 float LyXText::getCursorX(ParagraphList::iterator pit, RowList::iterator rit,
                          pos_type pos, pos_type last, bool boundary) const
 {
-       pos_type cursor_vpos = 0;
-       double x;
-       double fill_separator;
-       double fill_hfill;
-       double fill_label_hfill;
-       // This call HAS to be here because of the BidiTables!!!
-       prepareToPrint(pit, rit, x, fill_separator, fill_hfill,
-                      fill_label_hfill);
-
-       pos_type const rit_pos = rit->pos();
+       pos_type cursor_vpos    = 0;
+       double x                = rit->x();
+       double fill_separator   = rit->fill_separator();
+       double fill_hfill       = rit->fill_hfill();
+       double fill_label_hfill = rit->fill_label_hfill();
+       pos_type const rit_pos  = rit->pos();
 
        if (last < rit_pos)
                cursor_vpos = rit_pos;
@@ -1506,7 +1432,7 @@ float LyXText::getCursorX(ParagraphList::iterator pit, RowList::iterator rit,
                                x -= singleWidth(pit, body_pos - 1);
                }
 
-               if (hfillExpansion(*this, pit, rit, pos)) {
+               if (hfillExpansion(*pit, rit, pos)) {
                        x += singleWidth(pit, pos);
                        if (pos >= body_pos)
                                x += fill_hfill;
@@ -1558,7 +1484,7 @@ void LyXText::setCurrentFont()
        real_current_font = getFont(pit, pos);
 
        if (cursor.pos() == pit->size() &&
-           isBoundary(bv()->buffer(), *pit, cursor.pos()) &&
+           isBoundary(*bv()->buffer(), *pit, cursor.pos()) &&
            !cursor.boundary()) {
                Language const * lang =
                        pit->getParLanguage(bv()->buffer()->params);
@@ -1575,15 +1501,13 @@ void LyXText::setCurrentFont()
 pos_type LyXText::getColumnNearX(ParagraphList::iterator pit,
        RowList::iterator rit, int & x, bool & boundary) const
 {
-       double tmpx = 0;
-       double fill_separator;
-       double fill_hfill;
-       double fill_label_hfill;
-
-       prepareToPrint(pit, rit, tmpx, fill_separator, fill_hfill, fill_label_hfill);
+       double tmpx             = rit->x();
+       double fill_separator   = rit->fill_separator();
+       double fill_hfill       = rit->fill_hfill();
+       double fill_label_hfill = rit->fill_label_hfill();
 
        pos_type vc = rit->pos();
-       pos_type last = lastPrintablePos(*this, pit, rit);
+       pos_type last = lastPrintablePos(*pit, rit);
        pos_type c = 0;
        LyXLayout_ptr const & layout = pit->layout();
 
@@ -1613,7 +1537,7 @@ pos_type LyXText::getColumnNearX(ParagraphList::iterator pit,
                                tmpx -= singleWidth(pit, body_pos - 1);
                }
 
-               if (hfillExpansion(*this, pit, rit, c)) {
+               if (hfillExpansion(*pit, rit, c)) {
                        tmpx += singleWidth(pit, c);
                        if (c >= body_pos)
                                tmpx += fill_hfill;
@@ -1641,7 +1565,7 @@ pos_type LyXText::getColumnNearX(ParagraphList::iterator pit,
        // This (rtl_support test) is not needed, but gives
        // some speedup if rtl_support == false
        bool const lastrow = lyxrc.rtl_support
-                       && boost::next(rit) == endRow(pit);
+                       && boost::next(rit) == pit->rows.end();
 
        // If lastrow is false, we don't need to compute
        // the value of rtl.
@@ -1661,7 +1585,7 @@ pos_type LyXText::getColumnNearX(ParagraphList::iterator pit,
                bool const rtl = (bidi_level(c) % 2 == 1);
                if (left_side == rtl) {
                        ++c;
-                       boundary = isBoundary(bv()->buffer(), *pit, c);
+                       boundary = isBoundary(*bv()->buffer(), *pit, c);
                }
        }
 
@@ -1681,67 +1605,30 @@ pos_type LyXText::getColumnNearX(ParagraphList::iterator pit,
 
 void LyXText::setCursorFromCoordinates(int x, int y)
 {
-       //LyXCursor old_cursor = cursor;
+       LyXCursor old_cursor = cursor;
        setCursorFromCoordinates(cursor, x, y);
        setCurrentFont();
-#warning DEPM disabled, otherwise crash when entering new table
-       //deleteEmptyParagraphMechanism(old_cursor);
-}
-
-
-namespace {
-
-       /**
-        * return true if the cursor given is at the end of a row,
-        * and the next row is filled by an inset that spans an entire
-        * row.
-        */
-       bool beforeFullRowInset(LyXText & lt, LyXCursor const & cur)
-       {
-               RowList::iterator row = lt.getRow(cur);
-               if (boost::next(row) == lt.rows().end())
-                       return false;
-
-               RowList::iterator next = boost::next(row);
-
-               if (next->pos() != cur.pos() || lt.getPar(next) != cur.par())
-                       return false;
-
-               if (cur.pos() == cur.par()->size()
-                   || !cur.par()->isInset(cur.pos()))
-                       return false;
-
-               InsetOld const * inset = cur.par()->getInset(cur.pos());
-               if (inset->needFullRow() || inset->display())
-                       return true;
-
-               return false;
-       }
+       deleteEmptyParagraphMechanism(old_cursor);
 }
 
 
 void LyXText::setCursorFromCoordinates(LyXCursor & cur, int x, int y)
 {
        // Get the row first.
+       ParagraphList::iterator pit;
+       RowList::iterator rit = getRowNearY(y, pit);
+       y = rit->y();
 
-       RowList::iterator row = getRowNearY(y);
-       ParagraphList::iterator pit = getPar(row);
        bool bound = false;
-       pos_type const column = getColumnNearX(pit, row, x, bound);
+       pos_type const column = getColumnNearX(pit, rit, x, bound);
        cur.par(pit);
-       cur.pos(row->pos() + column);
+       cur.pos(rit->pos() + column);
        cur.x(x);
-       cur.y(y + row->baseline());
+       cur.y(y + rit->baseline());
+
+       cur.iy(cur.y());
+       cur.ix(cur.x());
 
-       if (beforeFullRowInset(*this, cur)) {
-               pos_type const last = lastPrintablePos(*this, pit, row);
-               RowList::iterator next_row = boost::next(row);
-               cur.ix(int(getCursorX(pit, next_row, cur.pos(), last, bound)));
-               cur.iy(y + row->height() + next_row->baseline());
-       } else {
-               cur.iy(cur.y());
-               cur.ix(cur.x());
-       }
        cur.boundary(bound);
 }
 
@@ -1752,7 +1639,7 @@ void LyXText::cursorLeft(bool internal)
                bool boundary = cursor.boundary();
                setCursor(cursor.par(), cursor.pos() - 1, true, false);
                if (!internal && !boundary &&
-                   isBoundary(bv()->buffer(), *cursor.par(), cursor.pos() + 1))
+                   isBoundary(*bv()->buffer(), *cursor.par(), cursor.pos() + 1))
                        setCursor(cursor.par(), cursor.pos() + 1, true, true);
        } else if (cursor.par() != ownerParagraphs().begin()) {
                // steps into the paragraph above
@@ -1773,7 +1660,7 @@ void LyXText::cursorRight(bool internal)
        else if (!at_end) {
                setCursor(cursor.par(), cursor.pos() + 1, true, false);
                if (!internal &&
-                   isBoundary(bv()->buffer(), *cursor.par(), cursor.pos()))
+                   isBoundary(*bv()->buffer(), *cursor.par(), cursor.pos()))
                        setCursor(cursor.par(), cursor.pos(), true, true);
        } else if (boost::next(cursor.par()) != ownerParagraphs().end())
                setCursor(boost::next(cursor.par()), 0);
@@ -1787,7 +1674,7 @@ void LyXText::cursorUp(bool selecting)
        int y = cursor.y() - cursorRow()->baseline() - 1;
        setCursorFromCoordinates(x, y);
        if (!selecting) {
-               int topy = top_y();
+               int topy = bv_owner->top_y();
                int y1 = cursor.iy() - topy;
                int y2 = y1;
                y -= topy;
@@ -1798,8 +1685,10 @@ void LyXText::cursorUp(bool selecting)
                }
        }
 #else
-       setCursorFromCoordinates(bv(), cursor.x_fix(),
-                                cursor.y() - cursorRow()->baseline() - 1);
+       lyxerr << "cursorUp: y " << cursor.y() << " bl: " <<
+               cursorRow()->baseline() << endl;
+       setCursorFromCoordinates(cursor.x_fix(),
+               cursor.y() - cursorRow()->baseline() - 1);
 #endif
 }
 
@@ -1811,7 +1700,7 @@ void LyXText::cursorDown(bool selecting)
        int y = cursor.y() - cursorRow()->baseline() + cursorRow()->height() + 1;
        setCursorFromCoordinates(x, y);
        if (!selecting && cursorRow() == cursorIRow()) {
-               int topy = top_y();
+               int topy = bv_owner->top_y();
                int y1 = cursor.iy() - topy;
                int y2 = y1;
                y -= topy;
@@ -1822,9 +1711,8 @@ void LyXText::cursorDown(bool selecting)
                }
        }
 #else
-       setCursorFromCoordinates(bv(), cursor.x_fix(),
-                                cursor.y() - cursorRow()->baseline()
-                                + cursorRow()->height() + 1);
+       setCursorFromCoordinates(cursor.x_fix(),
+                cursor.y() - cursorRow()->baseline() + cursorRow()->height() + 1);
 #endif
 }
 
@@ -1891,7 +1779,7 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor)
           There are still some small problems that can lead to
           double spaces stored in the document file or space at
           the beginning of paragraphs. This happens if you have
-          the cursor betwenn to spaces and then save. Or if you
+          the cursor between to spaces and then save. Or if you
           cut and paste and the selection have a space at the
           beginning and then save right after the paste. I am
           sure none of these are very hard to fix, but I will
@@ -1955,7 +1843,7 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor)
        if (old_cursor.par()->empty() ||
            (old_cursor.par()->size() == 1 &&
             old_cursor.par()->isLineSeparator(0))) {
-               // ok, we will delete anything
+               // ok, we will delete something
                LyXCursor tmpcursor;
 
                deleted = true;
@@ -1964,65 +1852,19 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor)
                        selection.cursor.par()  == old_cursor.par()
                        && selection.cursor.pos() == old_cursor.pos());
 
-               if (getRow(old_cursor) != rows().begin()) {
-                       RowList::iterator prevrow = boost::prior(getRow(old_cursor));
-                       tmpcursor = cursor;
-                       cursor = old_cursor; // that undo can restore the right cursor position
-                       #warning FIXME. --end() iterator is usable here
-                       ParagraphList::iterator endpit = boost::next(old_cursor.par());
-                       while (endpit != ownerParagraphs().end() &&
-                              endpit->getDepth()) {
-                               ++endpit;
-                       }
+               tmpcursor = cursor;
+               cursor = old_cursor; // that undo can restore the right cursor position
 
-                       recordUndo(bv(), Undo::DELETE, old_cursor.par(),
-                               boost::prior(endpit));
-                       cursor = tmpcursor;
-
-                       // delete old row
-                       removeRow(getRow(old_cursor));
-                       // delete old par
-                       ownerParagraphs().erase(old_cursor.par());
-
-                       /* Breakagain the next par. Needed because of
-                        * the parindent that can occur or dissappear.
-                        * The next row can change its height, if
-                        * there is another layout before */
-                       RowList::iterator tmprit = boost::next(prevrow);
-                       if (tmprit != rows().end()) {
-                               redoParagraph(getPar(tmprit));
-                               updateCounters();
-                       }
-                       setHeightOfRow(getPar(prevrow), prevrow);
-               } else {
-                       RowList::iterator nextrow = boost::next(getRow(old_cursor));
-
-                       tmpcursor = cursor;
-                       cursor = old_cursor; // that undo can restore the right cursor position
-#warning FIXME. --end() iterator is usable here
-                       ParagraphList::iterator endpit = boost::next(old_cursor.par());
-                       while (endpit != ownerParagraphs().end() &&
-                              endpit->getDepth()) {
-                               ++endpit;
-                       }
+               ParagraphList::iterator endpit = boost::next(old_cursor.par());
+               while (endpit != ownerParagraphs().end() && endpit->getDepth())
+                       ++endpit;
 
-                       recordUndo(bv(), Undo::DELETE, old_cursor.par(), boost::prior(endpit));
-                       cursor = tmpcursor;
-
-                       // delete old row
-                       removeRow(getRow(old_cursor));
-                       // delete old par
-                       ownerParagraphs().erase(old_cursor.par());
-
-                       /* Breakagain the next par. Needed because of
-                          the parindent that can occur or dissappear.
-                          The next row can change its height, if
-                          there is another layout before */
-                       if (nextrow != rows().end()) {
-                               redoParagraph(getPar(nextrow));
-                               updateCounters();
-                       }
-               }
+               recordUndo(bv(), Undo::DELETE, old_cursor.par(), boost::prior(endpit));
+               cursor = tmpcursor;
+
+               // delete old par
+               ownerParagraphs().erase(old_cursor.par());
+               redoParagraph();
 
                // correct cursor y
                setCursorIntern(cursor.par(), cursor.pos());
@@ -2046,17 +1888,14 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor)
 
 ParagraphList & LyXText::ownerParagraphs() const
 {
-       if (inset_owner) {
-               return inset_owner->paragraphs;
-       }
-       return bv_owner->buffer()->paragraphs;
+       return paragraphs_;
 }
 
 
 bool LyXText::isInInset() const
 {
        // Sub-level has non-null bv owner and non-null inset owner.
-       return inset_owner != 0 && bv_owner != 0;
+       return inset_owner != 0;
 }