]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insettext.C
The markDirty() and fitCursor() changes
[lyx.git] / src / insets / insettext.C
index 48f014694cba8a5d77c0995e577303129d0ad1a6..3cfc909e5593cd0e76d5f1b46979a48d062447a7 100644 (file)
@@ -37,6 +37,7 @@
 #include "paragraph_funcs.h"
 #include "sgml.h"
 #include "rowpainter.h"
+#include "insetnewline.h"
 
 #include "frontends/Alert.h"
 #include "frontends/Dialogs.h"
@@ -99,35 +100,32 @@ void InsetText::saveLyXTextState(LyXText * t) const
                sstate.selendboundary = t->selection.end.boundary();
                sstate.selection = t->selection.set();
                sstate.mark_set = t->selection.mark();
-               sstate.refresh = t->refresh_row != 0;
        } else {
                sstate.lpar = 0;
        }
 }
 
 
-void InsetText::restoreLyXTextState(BufferView * bv, LyXText * t) const
+void InsetText::restoreLyXTextState(LyXText * t) const
 {
-       if (sstate.lpar) {
-               t->selection.set(true);
-               /* at this point just to avoid the Delete-Empty-Paragraph
-                * Mechanism when setting the cursor */
-               t->selection.mark(sstate.mark_set);
-               if (sstate.selection) {
-                       t->setCursor(bv, sstate.selstartpar, sstate.selstartpos,
-                                    true, sstate.selstartboundary);
-                       t->selection.cursor = t->cursor;
-                       t->setCursor(bv, sstate.selendpar, sstate.selendpos,
-                                    true, sstate.selendboundary);
-                       t->setSelection(bv);
-                       t->setCursor(bv, sstate.lpar, sstate.pos);
-               } else {
-                       t->setCursor(bv, sstate.lpar, sstate.pos, true, sstate.boundary);
-                       t->selection.cursor = t->cursor;
-                       t->selection.set(false);
-               }
-               if (sstate.refresh) {
-               }
+       if (!sstate.lpar)
+               return;
+
+       t->selection.set(true);
+       /* at this point just to avoid the DEPM when setting the cursor */
+       t->selection.mark(sstate.mark_set);
+       if (sstate.selection) {
+               t->setCursor(sstate.selstartpar, sstate.selstartpos,
+                            true, sstate.selstartboundary);
+               t->selection.cursor = t->cursor;
+               t->setCursor(sstate.selendpar, sstate.selendpos,
+                            true, sstate.selendboundary);
+               t->setSelection();
+               t->setCursor(sstate.lpar, sstate.pos);
+       } else {
+               t->setCursor(sstate.lpar, sstate.pos, true, sstate.boundary);
+               t->selection.cursor = t->cursor;
+               t->selection.set(false);
        }
 }
 
@@ -196,7 +194,6 @@ void InsetText::init(InsetText const * ins, bool same_id)
        locked = false;
        old_par = 0;
        last_drawn_width = -1;
-       frame_is_visible = false;
        cached_bview = 0;
        sstate.lpar = 0;
        in_insetAllowed = false;
@@ -261,16 +258,17 @@ void InsetText::writeParagraphData(Buffer const * buf, ostream & os) const
 void InsetText::read(Buffer const * buf, LyXLex & lex)
 {
        string token;
-       int pos = 0;
-       Paragraph * return_par = 0;
        Paragraph::depth_type depth = 0;
-       LyXFont font(LyXFont::ALL_INHERIT);
 
        clear(false);
 
        if (buf->params.tracking_changes)
                paragraphs.begin()->trackChanges();
 
+       // delete the initial paragraph
+       paragraphs.clear();
+       ParagraphList::iterator pit = paragraphs.begin();
+
        while (lex.isOK()) {
                lex.nextToken();
                token = lex.getString();
@@ -280,25 +278,20 @@ void InsetText::read(Buffer const * buf, LyXLex & lex)
                        break;
                }
 
-               Paragraph * tmp = &*(paragraphs.begin());
-
-               if (const_cast<Buffer*>(buf)->
-                       parseSingleLyXformat2Token(lex, tmp, return_par,
-                                                  token, pos, depth, font)) {
-                       // the_end read this should NEVER happen
+               if (token == "\\the_end") {
                        lex.printError("\\the_end read in inset! Error in document!");
                        return;
                }
-               paragraphs.set(tmp);
-       }
-       if (!return_par)
-               return_par = &*(paragraphs.begin());
-       paragraphs.set(return_par);
-       while (return_par) {
-               return_par->setInsetOwner(this);
-               return_par = return_par->next();
+
+               // FIXME: ugly.
+               const_cast<Buffer*>(buf)->readParagraph(lex, token, paragraphs, pit, depth);
        }
 
+       pit = paragraphs.begin();
+       ParagraphList::iterator const end = paragraphs.end();
+       for (; pit != end; ++pit)
+               pit->setInsetOwner(this);
+
        if (token != "\\end_inset") {
                lex.printError("Missing \\end_inset at this point. "
                                           "Read: `$$Token'");
@@ -352,7 +345,7 @@ int InsetText::textWidth(BufferView * bv, bool fordraw) const
 
 
 void InsetText::draw(BufferView * bv, LyXFont const & f,
-                    int baseline, float & x, bool cleared) const
+                    int baseline, float & x) const
 {
        if (nodraw())
                return;
@@ -362,7 +355,6 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
        // this is the first thing we have to ask because if the x pos
        // changed we have to do a complete rebreak of the text as we
        // may have few space to draw in. Well we should check on this too
-       int old_x = top_x;
        if (top_x != int(x)) {
                top_x = int(x);
                topx_set = true;
@@ -370,7 +362,7 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
                if (nw > 0 && old_max_width != nw) {
                        need_update = INIT;
                        old_max_width = nw;
-                       bv->text->status(bv, LyXText::CHANGED_IN_DRAW);
+                       bv->text->postChangedInDraw();
                        return;
                }
        }
@@ -382,16 +374,13 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
        descent(bv, f);
 
        // repaint the background if needed
-       if (cleared && backgroundColor() != LColor::background) {
-               clearInset(bv, baseline, cleared);
-       }
+       if (backgroundColor() != LColor::background)
+               clearInset(bv, baseline);
 
        // no draw is necessary !!!
        if ((drawFrame_ == LOCKED) && !locked && paragraphs.begin()->empty()) {
                top_baseline = baseline;
                x += width(bv, f);
-               if (need_update & CLEAR_FRAME)
-                       clearFrame(pain, cleared);
                need_update = NONE;
                return;
        }
@@ -399,31 +388,10 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
        if (!owner())
                x += static_cast<float>(scroll());
 
-       // if top_x differs we did it already
-       if (!cleared && (old_x == int(x))
-           && ((need_update&(INIT|FULL)) || (top_baseline != baseline)
-               ||(last_drawn_width != insetWidth)))
-       {
-               // Condition necessary to eliminate bug 59 attachment 37
-               if (baseline > 0)
-                       clearInset(bv, baseline, cleared);
-       }
-
-       if (cleared)
-               frame_is_visible = false;
-
-       if (!cleared && (need_update == NONE)) {
-               if (locked)
-                       drawFrame(pain, cleared);
-               return;
-       }
-
        top_baseline = baseline;
        top_y = baseline - insetAscent;
 
        if (last_drawn_width != insetWidth) {
-               if (!cleared)
-                       clearInset(bv, baseline, cleared);
                need_update |= FULL;
                last_drawn_width = insetWidth;
        }
@@ -433,13 +401,7 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
                inset_x = cix(bv) - top_x + drawTextXOffset;
                inset_y = ciy(bv) + drawTextYOffset;
        }
-       if (!cleared && (need_update == CURSOR)
-           && !getLyXText(bv)->selection.set()) {
-               drawFrame(pain, cleared);
-               x += insetWidth;
-               need_update = NONE;
-               return;
-       }
+
        bool clear = false;
        if (!lt) {
                lt = getLyXText(bv);
@@ -465,62 +427,38 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
                lt->top_y(first);
                first = 0;
        }
-       if (cleared || (need_update&(INIT|FULL))) {
-               int yf = y_offset + first;
-               y = 0;
-               while ((row != 0) && (yf < ph)) {
-                       Row * prev = row->previous();
-                       RowPainter rp(*bv, *lt, *row);
-                       if (rp.paint(y + y_offset + first, int(x), y + lt->top_y(), cleared))
-                               lt->markChangeInDraw(bv, row, prev);
-                       if (bv->text->status() == LyXText::CHANGED_IN_DRAW) {
-                               lt->need_break_row = row;
-                               lt->fullRebreak(bv);
-                               lt->setCursor(bv, lt->cursor.par(),
-                                             lt->cursor.pos());
-                               if (lt->selection.set()) {
-                                       lt->setCursor(bv, lt->selection.start,
-                                                     lt->selection.start.par(),
-                                                     lt->selection.start.pos());
-                                       lt->setCursor(bv, lt->selection.end,
-                                                     lt->selection.end.par(),
-                                                     lt->selection.end.pos());
-                               }
-                               break;
+
+       int yf = y_offset + first;
+       y = 0;
+       while ((row != 0) && (yf < ph)) {
+               Row * prev = row->previous();
+               RowPainter rp(*bv, *lt, *row);
+               if (rp.paint(y + y_offset + first, int(x), y + lt->top_y()))
+                       lt->markChangeInDraw(row, prev);
+               if (bv->text->status() == LyXText::CHANGED_IN_DRAW) {
+                       lt->need_break_row = row;
+                       lt->fullRebreak();
+                       lt->setCursor(lt->cursor.par(),
+                                     lt->cursor.pos());
+                       if (lt->selection.set()) {
+                               lt->setCursor(lt->selection.start,
+                                             lt->selection.start.par(),
+                                             lt->selection.start.pos());
+                               lt->setCursor(lt->selection.end,
+                                             lt->selection.end.par(),
+                                             lt->selection.end.pos());
                        }
-                       y += row->height();
-                       yf += row->height();
-                       row = row->next();
-               }
-       } else if (!locked) {
-               if (need_update & CURSOR) {
-                       bv->screen().toggleSelection(lt, bv, true, y_offset,int(x));
-                       lt->clearSelection();
-                       lt->selection.cursor = lt->cursor;
-               }
-               bv->screen().update(lt, bv, y_offset, int(x));
-       } else {
-               locked = false;
-               if (need_update & SELECTION) {
-                       bv->screen().toggleToggle(lt, bv, y_offset, int(x));
-               } else if (need_update & CURSOR) {
-                       bv->screen().toggleSelection(lt, bv, true, y_offset,int(x));
-                       lt->clearSelection();
-                       lt->selection.cursor = lt->cursor;
+                       break;
                }
-               bv->screen().update(lt, bv, y_offset, int(x));
-               locked = true;
+               y += row->height();
+               yf += row->height();
+               row = row->next();
        }
 
-       lt->refresh_y = 0;
-       lt->status(bv, LyXText::UNCHANGED);
-       if ((drawFrame_ == ALWAYS) ||
-               ((cleared || (need_update != CURSOR_PAR)) &&
-                (drawFrame_ == LOCKED) && locked))
-       {
-               drawFrame(pain, cleared);
-       } else if (need_update & CLEAR_FRAME) {
-               clearFrame(pain, cleared);
+       lt->clearPaint();
+
+       if ((drawFrame_ == ALWAYS) || (drawFrame_ == LOCKED && locked)) {
+               drawFrame(pain);
        }
 
        x += insetWidth - TEXT_TO_INSET_OFFSET;
@@ -535,30 +473,15 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
 }
 
 
-void InsetText::drawFrame(Painter & pain, bool cleared) const
+void InsetText::drawFrame(Painter & pain) const
 {
        static int const ttoD2 = TEXT_TO_INSET_OFFSET / 2;
-       if (!frame_is_visible || cleared) {
-               frame_x = top_x + ttoD2;
-               frame_y = top_baseline - insetAscent + ttoD2;
-               frame_w = insetWidth - TEXT_TO_INSET_OFFSET;
-               frame_h = insetAscent + insetDescent - TEXT_TO_INSET_OFFSET;
-               pain.rectangle(frame_x, frame_y, frame_w, frame_h,
-                              frame_color);
-               frame_is_visible = true;
-       }
-}
-
-
-void InsetText::clearFrame(Painter & pain, bool cleared) const
-{
-       if (frame_is_visible) {
-               if (!cleared) {
-                       pain.rectangle(frame_x, frame_y, frame_w, frame_h,
-                                      backgroundColor());
-               }
-               frame_is_visible = false;
-       }
+       frame_x = top_x + ttoD2;
+       frame_y = top_baseline - insetAscent + ttoD2;
+       frame_w = insetWidth - TEXT_TO_INSET_OFFSET;
+       frame_h = insetAscent + insetDescent - TEXT_TO_INSET_OFFSET;
+       pain.rectangle(frame_x, frame_y, frame_w, frame_h,
+                      frame_color);
 }
 
 
@@ -599,7 +522,7 @@ void InsetText::update(BufferView * bv, LyXFont const & font, bool reinit)
        if ((need_update & CURSOR_PAR) && (lt->status() == LyXText::UNCHANGED) &&
                the_locking_inset)
        {
-               lt->updateInset(bv, the_locking_inset);
+               lt->updateInset(the_locking_inset);
        }
        if (lt->status() == LyXText::NEED_MORE_REFRESH)
                need_update |= FULL;
@@ -644,7 +567,7 @@ void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty)
                lt = getLyXText(bv);
                clear = true;
        }
-       lt->fullRebreak(bv);
+       lt->fullRebreak();
        setUpdateStatus(bv, what);
        bool flag = mark_dirty ||
                (((need_update != CURSOR) && (need_update != NONE)) ||
@@ -663,7 +586,7 @@ void InsetText::updateLocal(BufferView * bv, int what, bool mark_dirty)
        bv->fitCursor();
 #endif
        if (flag)
-               bv->updateInset(const_cast<InsetText *>(this), mark_dirty);
+               bv->updateInset(const_cast<InsetText *>(this));
 
        if (need_update == CURSOR)
                need_update = NONE;
@@ -708,7 +631,7 @@ void InsetText::edit(BufferView * bv, int x, int y, mouse_button::state button)
        // cycle hopefully (Jug 20020509)
        // FIXME: GUII I've changed this to none: probably WRONG
        if (!checkAndActivateInset(bv, x, tmp_y, mouse_button::none)) {
-               lt->setCursorFromCoordinates(bv, x - drawTextXOffset,
+               lt->setCursorFromCoordinates(x - drawTextXOffset,
                                            y + insetAscent);
                lt->cursor.x_fix(lt->cursor.x());
        }
@@ -733,7 +656,7 @@ void InsetText::edit(BufferView * bv, int x, int y, mouse_button::state button)
        showInsetCursor(bv);
 
        // Tell the paragraph dialog that we've entered an insettext.
-       bv->owner()->getDialogs().updateParagraph();
+       bv->dispatch(FuncRequest(LFUN_PARAGRAPH_UPDATE));
 }
 
 
@@ -757,14 +680,14 @@ void InsetText::edit(BufferView * bv, bool front)
                clear = true;
        }
        if (front)
-               lt->setCursor(bv, &*(paragraphs.begin()), 0);
+               lt->setCursor(&*(paragraphs.begin()), 0);
        else {
                ParagraphList::iterator it = paragraphs.begin();
                ParagraphList::iterator end = paragraphs.end();
                while (boost::next(it) != end)
                        ++it;
 //             int const pos = (p->size() ? p->size()-1 : p->size());
-               lt->setCursor(bv, &*it, it->size());
+               lt->setCursor(&*it, it->size());
        }
        lt->clearSelection();
        finishUndo();
@@ -797,16 +720,8 @@ void InsetText::insetUnlock(BufferView * bv)
        no_selection = true;
        locked = false;
        int code = NONE;
-#if 0
-       if (drawFrame_ == LOCKED)
-               code = CURSOR|CLEAR_FRAME;
-       else
-               code = CURSOR;
-#else
-       if (drawFrame_ == LOCKED)
-               code = CLEAR_FRAME;
-#endif
        bool clear = false;
+
        if (!lt) {
                lt = getLyXText(bv);
                clear = true;
@@ -821,9 +736,9 @@ void InsetText::insetUnlock(BufferView * bv)
                bv->owner()->setLayout(bv->text->cursor.par()->layout()->name());
        // hack for deleteEmptyParMech
        if (!paragraphs.begin()->empty()) {
-               lt->setCursor(bv, &*(paragraphs.begin()), 0);
+               lt->setCursor(&*(paragraphs.begin()), 0);
        } else if (paragraphs.begin()->next()) {
-               lt->setCursor(bv, paragraphs.begin()->next(), 0);
+               lt->setCursor(paragraphs.begin()->next(), 0);
        }
        if (clear)
                lt = 0;
@@ -849,7 +764,7 @@ void InsetText::lockInset(BufferView * bv)
                lt = getLyXText(bv);
                clear = true;
        }
-       lt->setCursor(bv, &*(paragraphs.begin()), 0);
+       lt->setCursor(&*(paragraphs.begin()), 0);
        lt->clearSelection();
        finishUndo();
        // If the inset is empty set the language of the current font to the
@@ -897,12 +812,12 @@ bool InsetText::lockInsetInInset(BufferView * bv, UpdatableInset * inset)
                                p->insetlist.end();
                        for (; it != end; ++it) {
                                if (it.getInset() == inset) {
-                                       getLyXText(bv)->setCursorIntern(bv, p, it.getPos());
+                                       getLyXText(bv)->setCursorIntern(p, it.getPos());
                                        lockInset(bv, inset);
                                        return true;
                                }
                                if (it.getInset()->getInsetFromID(id)) {
-                                       getLyXText(bv)->setCursorIntern(bv, p, it.getPos());
+                                       getLyXText(bv)->setCursorIntern(p, it.getPos());
                                        it.getInset()->edit(bv);
                                        return the_locking_inset->lockInsetInInset(bv, inset);
                                }
@@ -939,7 +854,7 @@ bool InsetText::unlockInsetInInset(BufferView * bv, UpdatableInset * inset,
                return false;
        if (the_locking_inset == inset) {
                the_locking_inset->insetUnlock(bv);
-               getLyXText(bv)->updateInset(bv, inset);
+               getLyXText(bv)->updateInset(inset);
                the_locking_inset = 0;
                if (lr)
                        moveRightIntern(bv, true, false);
@@ -981,14 +896,14 @@ bool InsetText::updateInsetInInset(BufferView * bv, Inset * inset)
                        ustat = FULL;
                }
                if (found)
-                       lt->updateInset(bv, tl_inset);
+                       lt->updateInset(tl_inset);
                if (clear)
                        lt = 0;
                if (found)
                        setUpdateStatus(bv, ustat);
                return found;
        }
-       bool found = lt->updateInset(bv, inset);
+       bool found = lt->updateInset(inset);
        if (clear)
                lt = 0;
        if (found) {
@@ -1021,7 +936,7 @@ void InsetText::lfunMousePress(FuncRequest const & cmd)
 
        int tmp_x = cmd.x - drawTextXOffset;
        int tmp_y = cmd.y + insetAscent - getLyXText(bv)->top_y();
-       Inset * inset = getLyXText(bv)->checkInsetHit(bv, tmp_x, tmp_y);
+       Inset * inset = getLyXText(bv)->checkInsetHit(tmp_x, tmp_y);
 
        hideInsetCursor(bv);
        if (the_locking_inset) {
@@ -1077,7 +992,7 @@ void InsetText::lfunMousePress(FuncRequest const & cmd)
                }
                int old_top_y = lt->top_y();
 
-               lt->setCursorFromCoordinates(bv, cmd.x - drawTextXOffset,
+               lt->setCursorFromCoordinates(cmd.x - drawTextXOffset,
                                             cmd.y + insetAscent);
                // set the selection cursor!
                lt->selection.cursor = lt->cursor;
@@ -1130,7 +1045,7 @@ bool InsetText::lfunMouseRelease(FuncRequest const & cmd)
 
        int tmp_x = cmd.x - drawTextXOffset;
        int tmp_y = cmd.y + insetAscent - getLyXText(bv)->top_y();
-       Inset * inset = getLyXText(bv)->checkInsetHit(bv, tmp_x, tmp_y);
+       Inset * inset = getLyXText(bv)->checkInsetHit(tmp_x, tmp_y);
        bool ret = false;
        if (inset) {
                if (isHighlyEditableInset(inset))
@@ -1174,14 +1089,14 @@ void InsetText::lfunMouseMotion(FuncRequest const & cmd)
        hideInsetCursor(bv);
        LyXCursor cur = lt->cursor;
        lt->setCursorFromCoordinates
-               (bv, cmd.x - drawTextXOffset, cmd.y + insetAscent);
+               (cmd.x - drawTextXOffset, cmd.y + insetAscent);
        lt->cursor.x_fix(lt->cursor.x());
        if (cur == lt->cursor) {
                if (clear)
                        lt = 0;
                return;
        }
-       lt->setSelection(bv);
+       lt->setSelection();
        bool flag = (lt->toggle_cursor.par() != lt->toggle_end_cursor.par() ||
                                 lt->toggle_cursor.pos() != lt->toggle_end_cursor.pos());
        if (clear)
@@ -1283,7 +1198,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
                        bv->switchKeyMap();
                        if (lyxrc.auto_region_delete) {
                                if (lt->selection.set()) {
-                                       lt->cutSelection(bv, false, false);
+                                       lt->cutSelection(false, false);
                                }
                        }
                        lt->clearSelection();
@@ -1301,7 +1216,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
        case LFUN_RIGHTSEL:
                finishUndo();
                moveRight(bv, false, true);
-               lt->setSelection(bv);
+               lt->setSelection();
                updwhat = SELECTION;
                break;
        case LFUN_RIGHT:
@@ -1312,7 +1227,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
        case LFUN_LEFTSEL:
                finishUndo();
                moveLeft(bv, false, true);
-               lt->setSelection(bv);
+               lt->setSelection();
                updwhat = SELECTION;
                break;
        case LFUN_LEFT:
@@ -1323,7 +1238,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
        case LFUN_DOWNSEL:
                finishUndo();
                moveDown(bv);
-               lt->setSelection(bv);
+               lt->setSelection();
                updwhat = SELECTION;
                break;
        case LFUN_DOWN:
@@ -1334,7 +1249,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
        case LFUN_UPSEL:
                finishUndo();
                moveUp(bv);
-               lt->setSelection(bv);
+               lt->setSelection();
                updwhat = SELECTION;
                break;
        case LFUN_UP:
@@ -1344,18 +1259,18 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
                break;
        case LFUN_HOME:
                finishUndo();
-               lt->cursorHome(bv);
+               lt->cursorHome();
                updwhat = CURSOR;
                break;
        case LFUN_END:
-               lt->cursorEnd(bv);
+               lt->cursorEnd();
                updwhat = CURSOR;
                break;
        case LFUN_PRIOR:
                if (!crow(bv)->previous())
                        result = FINISHED_UP;
                else {
-                       lt->cursorPrevious(bv);
+                       lt->cursorPrevious();
                        result = DISPATCHED_NOUPDATE;
                }
                updwhat = CURSOR;
@@ -1364,16 +1279,16 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
                if (!crow(bv)->next())
                        result = FINISHED_DOWN;
                else {
-                       lt->cursorNext(bv);
+                       lt->cursorNext();
                        result = DISPATCHED_NOUPDATE;
                }
                updwhat = CURSOR;
                break;
        case LFUN_BACKSPACE: {
                if (lt->selection.set())
-                       lt->cutSelection(bv, true, false);
+                       lt->cutSelection(true, false);
                else
-                       lt->backspace(bv);
+                       lt->backspace();
                updwhat = CURSOR_PAR;
                updflag = true;
        }
@@ -1381,9 +1296,9 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
 
        case LFUN_DELETE: {
                if (lt->selection.set()) {
-                       lt->cutSelection(bv, true, false);
+                       lt->cutSelection(true, false);
                } else {
-                       lt->Delete(bv);
+                       lt->Delete();
                }
                updwhat = CURSOR_PAR;
                updflag = true;
@@ -1399,7 +1314,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
 
        case LFUN_COPY:
                finishUndo();
-               lt->copySelection(bv);
+               lt->copySelection();
                updwhat = CURSOR_PAR;
                break;
        case LFUN_PASTESELECTION:
@@ -1409,9 +1324,9 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
                if (clip.empty())
                        break;
                if (ev.argument == "paragraph") {
-                       lt->insertStringAsParagraphs(bv, clip);
+                       lt->insertStringAsParagraphs(clip);
                } else {
-                       lt->insertStringAsLines(bv, clip);
+                       lt->insertStringAsLines(clip);
                }
                // bug 393
                lt->clearSelection();
@@ -1435,7 +1350,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
                setUndo(bv, Undo::INSERT,
                        lt->cursor.par(), lt->cursor.par()->next());
 #endif
-               lt->pasteSelection(bv);
+               lt->pasteSelection();
                // bug 393
                lt->clearSelection();
                updwhat = CURSOR_PAR;
@@ -1448,7 +1363,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
                        result = DISPATCHED;
                        break;
                }
-               lt->breakParagraph(bv, paragraphs, 0);
+               lt->breakParagraph(paragraphs, 0);
                updwhat = CURSOR | FULL;
                updflag = true;
                break;
@@ -1457,7 +1372,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
                        result = DISPATCHED;
                        break;
                }
-               lt->breakParagraph(bv, paragraphs, 1);
+               lt->breakParagraph(paragraphs, 1);
                updwhat = CURSOR | FULL;
                updflag = true;
                break;
@@ -1472,7 +1387,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
                setUndo(bv, Undo::INSERT,
                        lt->cursor.par(), lt->cursor.par()->next());
 #endif
-               lt->insertChar(bv, Paragraph::META_NEWLINE);
+               lt->insertInset(new InsetNewline);
                updwhat = CURSOR | CURSOR_PAR;
                updflag = true;
        }
@@ -1507,7 +1422,7 @@ Inset::RESULT InsetText::localDispatch(FuncRequest const & ev)
 
                        if (cur_layout != layout) {
                                cur_layout = layout;
-                               lt->setLayout(bv, layout);
+                               lt->setLayout(layout);
                                bv->owner()->setLayout(cpar(bv)->layout()->name());
                                updwhat = CURSOR_PAR;
                                updflag = true;
@@ -1595,8 +1510,9 @@ int InsetText::latex(Buffer const * buf, ostream & os,
                     bool moving_arg, bool) const
 {
        TexRow texrow;
-       buf->latexParagraphs(os, paragraphs.begin(), paragraphs.end(),
-                            texrow, moving_arg);
+       latexParagraphs(buf, paragraphs,
+                       paragraphs.begin(), paragraphs.end(),
+                       os, texrow, moving_arg);
        return texrow.rows();
 }
 
@@ -1943,7 +1859,7 @@ bool InsetText::insertInset(BufferView * bv, Inset * inset)
        }
        inset->setOwner(this);
        hideInsetCursor(bv);
-       getLyXText(bv)->insertInset(bv, inset);
+       getLyXText(bv)->insertInset(inset);
        bv->fitCursor();
        updateLocal(bv, CURSOR_PAR|CURSOR, true);
        return true;
@@ -2020,7 +1936,7 @@ void InsetText::setFont(BufferView * bv, LyXFont const & font, bool toggleall,
                return;
        }
        if ((!paragraphs.begin()->next() && paragraphs.begin()->empty()) || cpar(bv)->empty()) {
-               getLyXText(bv)->setFont(bv, font, toggleall);
+               getLyXText(bv)->setFont(font, toggleall);
                return;
        }
        bool clear = false;
@@ -2033,7 +1949,7 @@ void InsetText::setFont(BufferView * bv, LyXFont const & font, bool toggleall,
        }
        if (selectall)
                selectAll(bv);
-       lt->toggleFree(bv, font, toggleall);
+       lt->toggleFree(font, toggleall);
        if (selectall)
                lt->clearSelection();
        bv->fitCursor();
@@ -2070,7 +1986,7 @@ bool InsetText::checkAndActivateInset(BufferView * bv, int x, int y,
        x -= drawTextXOffset;
        int dummyx = x;
        int dummyy = y + insetAscent;
-       Inset * inset = getLyXText(bv)->checkInsetHit(bv, dummyx, dummyy);
+       Inset * inset = getLyXText(bv)->checkInsetHit(dummyx, dummyy);
        // we only do the edit() call if the inset was hit by the mouse
        // or if it is a highly editable inset. So we should call this
        // function from our own edit with button < 0.
@@ -2299,7 +2215,7 @@ LyXText * InsetText::getLyXText(BufferView const * lbv,
                        // when we have to reinit the existing LyXText!
                        //
                        it->second.text->init(bv);
-                       restoreLyXTextState(bv, it->second.text.get());
+                       restoreLyXTextState(it->second.text.get());
                        it->second.remove = false;
                }
                cached_text = it->second.text;
@@ -2311,9 +2227,9 @@ LyXText * InsetText::getLyXText(BufferView const * lbv,
        ///
        // we are here only if we don't have a BufferView * in the cache!!!
        ///
-       cached_text.reset(new LyXText(const_cast<InsetText *>(this)));
+       cached_text.reset(new LyXText(bv, const_cast<InsetText *>(this)));
        cached_text->init(bv);
-       restoreLyXTextState(bv, cached_text.get());
+       restoreLyXTextState(cached_text.get());
 
        cache.insert(make_pair(bv, cached_text));
 
@@ -2360,7 +2276,7 @@ void InsetText::resizeLyXText(BufferView * bv, bool force) const
                LyXText * t = getLyXText(bv);
                saveLyXTextState(t);
                t->init(bv, true);
-               restoreLyXTextState(bv, t);
+               restoreLyXTextState(t);
                return;
        }
        // one endless line, resize normally not necessary
@@ -2380,7 +2296,7 @@ void InsetText::resizeLyXText(BufferView * bv, bool force) const
                 boost::bind(&Paragraph::resizeInsetsLyXText, _1, bv));
 
        t->init(bv, true);
-       restoreLyXTextState(bv, t);
+       restoreLyXTextState(t);
        if (the_locking_inset) {
                inset_x = cix(bv) - top_x + drawTextXOffset;
                inset_y = ciy(bv) + drawTextYOffset;
@@ -2420,7 +2336,7 @@ void InsetText::reinitLyXText() const
                         boost::bind(&Paragraph::resizeInsetsLyXText, _1, bv));
 
                t->init(bv, true);
-               restoreLyXTextState(bv, t);
+               restoreLyXTextState(t);
                if (the_locking_inset) {
                        inset_x = cix(bv) - top_x + drawTextXOffset;
                        inset_y = ciy(bv) + drawTextYOffset;
@@ -2445,7 +2361,7 @@ void InsetText::removeNewlines()
        ParagraphList::iterator end = paragraphs.end();
        for (; it != end; ++it) {
                for (int i = 0; i < it->size(); ++i) {
-                       if (it->getChar(i) == Paragraph::META_NEWLINE) {
+                       if (it->isNewline(i)) {
                                changed = true;
                                it->erase(i);
                        }
@@ -2475,18 +2391,12 @@ int InsetText::scroll(bool recursive) const
 }
 
 
-bool InsetText::doClearArea() const
-{
-       return !locked || (need_update & (FULL|INIT));
-}
-
-
 void InsetText::selectAll(BufferView * bv)
 {
-       getLyXText(bv)->cursorTop(bv);
+       getLyXText(bv)->cursorTop();
        getLyXText(bv)->selection.cursor = getLyXText(bv)->cursor;
-       getLyXText(bv)->cursorBottom(bv);
-       getLyXText(bv)->setSelection(bv);
+       getLyXText(bv)->cursorBottom();
+       getLyXText(bv)->setSelection();
 }
 
 
@@ -2496,7 +2406,7 @@ void InsetText::clearSelection(BufferView * bv)
 }
 
 
-void InsetText::clearInset(BufferView * bv, int baseline, bool & cleared) const
+void InsetText::clearInset(BufferView * bv, int baseline) const
 {
        Painter & pain = bv->painter();
        int w = insetWidth;
@@ -2513,9 +2423,7 @@ void InsetText::clearInset(BufferView * bv, int baseline, bool & cleared) const
                w = pain.paperWidth();
 //     w -= TEXT_TO_INSET_OFFSET;
        pain.fillRectangle(top_x + 1, ty + 1, w - 1, h - 1, backgroundColor());
-       cleared = true;
        need_update = FULL;
-       frame_is_visible = false;
 }
 
 
@@ -2611,7 +2519,7 @@ InsetText::selectNextWordToSpellcheck(BufferView * bv,
                // we have to go on checking so move cursor to the next char
                lt->cursor.pos(lt->cursor.pos() + 1);
        }
-       word = lt->selectNextWordToSpellcheck(bv, value);
+       word = lt->selectNextWordToSpellcheck(value);
        if (word.word().empty())
                bv->unlockInset(const_cast<InsetText *>(this));
        else
@@ -2628,7 +2536,7 @@ void InsetText::selectSelectedWord(BufferView * bv)
                the_locking_inset->selectSelectedWord(bv);
                return;
        }
-       getLyXText(bv)->selectSelectedWord(bv);
+       getLyXText(bv)->selectSelectedWord();
        updateLocal(bv, SELECTION, false);
 }
 
@@ -2674,7 +2582,7 @@ bool InsetText::nextChange(BufferView * bv, lyx::pos_type & length)
        if (the_locking_inset) {
                if (the_locking_inset->nextChange(bv, length))
                        return true;
-               lt->cursorRight(bv, true);
+               lt->cursorRight(true);
        }
        lyxfind::SearchResult result =
                lyxfind::findNextChange(bv, lt, length);
@@ -2685,7 +2593,7 @@ bool InsetText::nextChange(BufferView * bv, lyx::pos_type & length)
                if (bv->lockInset(this))
                        locked = true;
                lt->cursor = cur;
-               lt->setSelectionRange(bv, length);
+               lt->setSelectionRange(length);
                updateLocal(bv, SELECTION, false);
        }
        if (clear)
@@ -2705,7 +2613,7 @@ bool InsetText::searchForward(BufferView * bv, string const & str,
        if (the_locking_inset) {
                if (the_locking_inset->searchForward(bv, str, cs, mw))
                        return true;
-               lt->cursorRight(bv, true);
+               lt->cursorRight(true);
        }
        lyxfind::SearchResult result =
                lyxfind::LyXFind(bv, lt, str, true, cs, mw);
@@ -2716,7 +2624,7 @@ bool InsetText::searchForward(BufferView * bv, string const & str,
                if (bv->lockInset(this))
                        locked = true;
                lt->cursor = cur;
-               lt->setSelectionRange(bv, str.length());
+               lt->setSelectionRange(str.length());
                updateLocal(bv, SELECTION, false);
        }
        if (clear)
@@ -2740,7 +2648,7 @@ bool InsetText::searchBackward(BufferView * bv, string const & str,
                Paragraph * p = &*(paragraphs.begin());
                while (p->next())
                        p = p->next();
-               lt->setCursor(bv, p, p->size());
+               lt->setCursor(p, p->size());
        }
        lyxfind::SearchResult result =
                lyxfind::LyXFind(bv, lt, str, false, cs, mw);
@@ -2751,7 +2659,7 @@ bool InsetText::searchBackward(BufferView * bv, string const & str,
                if (bv->lockInset(this))
                        locked = true;
                lt->cursor = cur;
-               lt->setSelectionRange(bv, str.length());
+               lt->setSelectionRange(str.length());
                updateLocal(bv, SELECTION, false);
        }
        if (clear)