]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insettext.C
some cascading name changes
[lyx.git] / src / insets / insettext.C
index 967d41d6bdb660d2e2d35f37a671c3e6e235c6fa..9d414218ba572794709d44d5f915690177084739 100644 (file)
@@ -120,13 +120,23 @@ InsetText::~InsetText()
        delete (*cit).second;
        (*cit).second = 0;
     }
-    LyXParagraph * p = par->next;
+#ifndef NEW_INSETS
+    LyXParagraph * p = par->next_;
+    delete par;
+    while(p) {
+       par = p;
+       p = p->next_;
+       delete par;
+    }
+#else
+    LyXParagraph * p = par->next();
     delete par;
     while(p) {
        par = p;
-       p = p->next;
+       p = p->next();
        delete par;
     }
+#endif
 }
 
 
@@ -138,13 +148,23 @@ void InsetText::clear()
        delete (*cit).second;
        (*cit).second = 0;
     }
-    LyXParagraph * p = par->next;
+#ifndef NEW_INSETS
+    LyXParagraph * p = par->next_;
+    delete par;
+    while(p) {
+       par = p;
+       p = p->next_;
+       delete par;
+    }
+#else
+    LyXParagraph * p = par->next();
     delete par;
     while(p) {
        par = p;
-       p = p->next;
+       p = p->next();
        delete par;
     }
+#endif
     par = new LyXParagraph();
 }
 
@@ -188,13 +208,23 @@ void InsetText::Read(Buffer const * buf, LyXLex & lex)
        (*cit).second = 0;
     }
 
-    LyXParagraph * p = par->next;
+#ifndef NEW_INSETS
+    LyXParagraph * p = par->next_;
+    delete par;
+    while(p) {
+       par = p;
+       p = p->next_;
+       delete par;
+    }
+#else
+    LyXParagraph * p = par->next();
     delete par;
     while(p) {
        par = p;
-       p = p->next;
+       p = p->next();
        delete par;
     }
+#endif
     par = new LyXParagraph;
     while (lex.IsOK()) {
         lex.nextToken();
@@ -221,7 +251,11 @@ void InsetText::Read(Buffer const * buf, LyXLex & lex)
     par = return_par;
     while(return_par) {
        return_par->SetInsetOwner(this);
-       return_par = return_par->next;
+#ifndef NEW_INSETS
+       return_par = return_par->next_;
+#else
+       return_par = return_par->next();
+#endif
     }
     
     if (token != "\\end_inset") {
@@ -273,7 +307,7 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
 
     // no draw is necessary !!!
     if ((drawFrame == LOCKED) && !locked && !par->size()) {
-       if (!cleared && (need_update == CLEAR_FRAME)) {
+       if (!cleared && (need_update & CLEAR_FRAME)) {
            pain.rectangle(top_x + 1, baseline - insetAscent + 1,
                           width(bv, f) - 1,
                           insetAscent + insetDescent - 1,
@@ -291,7 +325,7 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
 
     // if top_x differs we have a rule down and we don't have to clear anything
     if (!cleared && (top_x == int(x)) &&
-       ((need_update==FULL) || (top_baseline!=baseline)))
+       ((need_update==INIT)||(need_update==FULL)||(top_baseline!=baseline)))
     {
        int w =  insetWidth;
        int h = insetAscent + insetDescent;
@@ -313,7 +347,6 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
        return;
 
     if (top_x != int(x)) {
-//     printf("InsetText::draw1 -> INIT(%d)\n",insetWidth);
        need_update = INIT;
        top_x = int(x);
        bv->text->status = LyXText::CHANGED_IN_DRAW;
@@ -350,7 +383,7 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
        if (y_offset < 0)
            y_offset = y;
        TEXT(bv)->first = first;
-       if (cleared || !locked || (need_update==FULL) || (need_update==INIT)) {
+       if (cleared) { // (need_update&FULL) || (need_update&INIT)
            int yf = y_offset;
            y = 0;
            while ((row != 0) && (yf < ph)) {
@@ -360,13 +393,20 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
                yf += row->height();
                row = row->next();
            }
-       } else if (need_update == SELECTION) {
-           bv->screen()->ToggleToggle(TEXT(bv), bv, y_offset, int(x));
+       } else if (!locked) {
+           if (need_update & CURSOR) {
+               bv->screen()->ToggleSelection(TEXT(bv), bv, true, y_offset,int(x));
+               TEXT(bv)->ClearSelection(bv);
+               TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
+           }
+           bv->screen()->Update(TEXT(bv), bv, y_offset, int(x));
        } else {
            locked = false;
-           if (need_update == CURSOR) {
+           if (need_update & SELECTION)
+               bv->screen()->ToggleToggle(TEXT(bv), bv, y_offset, int(x));
+           else if (need_update & CURSOR) {
                bv->screen()->ToggleSelection(TEXT(bv), bv, true, y_offset,int(x));
-               TEXT(bv)->ClearSelection();
+               TEXT(bv)->ClearSelection(bv);
                TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
            }
            bv->screen()->Update(TEXT(bv), bv, y_offset, int(x));
@@ -381,18 +421,15 @@ void InsetText::draw(BufferView * bv, LyXFont const & f,
            pain.rectangle(top_x + 1, baseline - insetAscent + 1,
                           width(bv, f) - 1, insetAscent + insetDescent - 1,
                           frame_color);
-    } else if (need_update == CLEAR_FRAME) {
+    } else if (need_update & CLEAR_FRAME) {
            pain.rectangle(top_x + 1, baseline - insetAscent + 1,
                           width(bv, f) - 1, insetAscent + insetDescent - 1,
                           LColor::background);
     }
     x += width(bv, f) - TEXT_TO_INSET_OFFSET;
-    if (bv->text->status==LyXText::CHANGED_IN_DRAW)
-    {
+    if (bv->text->status==LyXText::CHANGED_IN_DRAW) {
        need_update = INIT;
-//     printf("InsetText::draw2 -> INIT(%d)\n",insetWidth);
-    }
-    else if (need_update != INIT)
+    } else if (need_update != INIT)
        need_update = NONE;
 }
 
@@ -450,25 +487,23 @@ void InsetText::update(BufferView * bv, LyXFont const & font, bool reinit)
        TEXT_TO_INSET_OFFSET;
 }
 
-void InsetText::SetUpdateStatus(BufferView * bv, UpdateCodes what)
+void InsetText::SetUpdateStatus(BufferView * bv, int what)
 {
+    need_update |= what;
     if (TEXT(bv)->status == LyXText::NEED_MORE_REFRESH)
-       need_update = FULL;
-    if (what > need_update)
-       need_update = what;
+       need_update |= FULL;
+    else if (TEXT(bv)->status == LyXText::NEED_VERY_LITTLE_REFRESH)
+       need_update |= CURSOR_PAR;
+
+    // this to not draw a selection when we redraw all of it!
+    if ((need_update & (INIT|FULL)) && (need_update & CURSOR))
+       TEXT(bv)->ClearSelection(bv);
 }
 
-void InsetText::UpdateLocal(BufferView * bv, UpdateCodes what, bool mark_dirty)
+void InsetText::UpdateLocal(BufferView * bv, int what, bool mark_dirty)
 {
-//    if (what == INIT)
-//     printf("InsetText::UpdateLocal -> INIT(%d)\n",insetWidth);
     TEXT(bv)->FullRebreak(bv);
-    if (need_update != INIT) {
-       if (TEXT(bv)->status == LyXText::NEED_MORE_REFRESH)
-           need_update = FULL;
-       else if (!the_locking_inset || (what != CURSOR))
-           need_update = what;
-    }
+    SetUpdateStatus(bv, what);
     if ((need_update != CURSOR) || (TEXT(bv)->status != LyXText::UNCHANGED) ||
        TEXT(bv)->selection)
            bv->updateInset(this, mark_dirty);
@@ -511,7 +546,11 @@ void InsetText::Edit(BufferView * bv, int x, int y, unsigned int button)
 
     // If the inset is empty set the language of the current font to the
     // language to the surronding text.
-    if (par->Last() == 0 && !par->next) {
+#ifndef NEW_INSETS
+    if (par->Last() == 0 && !par->next_) {
+#else#
+    if (par->Last() == 0 && !par->next()) {
+#endif
        LyXFont font(LyXFont::ALL_IGNORE);
        font.setLanguage(bv->getParentLanguage(this));
        SetFont(bv, font, false);
@@ -528,8 +567,7 @@ void InsetText::InsetUnlock(BufferView * bv)
     HideInsetCursor(bv);
     no_selection = false;
     locked = false;
-    TEXT(bv)->selection = 0;
-    UpdateLocal(bv, CLEAR_FRAME, false);
+    UpdateLocal(bv, CLEAR_FRAME|CURSOR, false);
     if (owner())
            bv->owner()->setLayout(owner()->getLyXText(bv)
                                    ->cursor.par()->GetLayout());
@@ -551,7 +589,13 @@ bool InsetText::LockInsetInInset(BufferView * bv, UpdatableInset * inset)
        inset_pos = cpos(bv);
        inset_par = cpar(bv);
        inset_boundary = cboundary(bv);
+#if 0
+       TEXT(bv)->ClearSelection(bv);
+       TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
        TEXT(bv)->UpdateInset(bv, the_locking_inset);
+#else
+       UpdateLocal(bv, CURSOR, false);
+#endif
        return true;
     } else if (the_locking_inset && (the_locking_inset == inset)) {
        if (cpar(bv) == inset_par && cpos(bv) == inset_pos) {
@@ -595,7 +639,7 @@ bool InsetText::UpdateInsetInInset(BufferView * bv, Inset * inset)
         return false;
     if (the_locking_inset != inset) {
        TEXT(bv)->UpdateInset(bv, the_locking_inset);
-       need_update = CURSOR_PAR;
+       SetUpdateStatus(bv, CURSOR_PAR);
         return the_locking_inset->UpdateInsetInInset(bv, inset);
     }
 //    UpdateLocal(bv, FULL, false);
@@ -611,7 +655,7 @@ bool InsetText::UpdateInsetInInset(BufferView * bv, Inset * inset)
 
 void InsetText::InsetButtonPress(BufferView * bv, int x, int y, int button)
 {
-    no_selection = false;
+    no_selection = true;
 
     int tmp_x = x - drawTextXOffset;
     int tmp_y = y + insetAscent - TEXT(bv)->first;
@@ -621,6 +665,7 @@ void InsetText::InsetButtonPress(BufferView * bv, int x, int y, int button)
     if (the_locking_inset) {
        if (the_locking_inset == inset) {
            the_locking_inset->InsetButtonPress(bv,x-inset_x,y-inset_y,button);
+           no_selection = false;
            return;
        } else if (inset) {
            // otherwise unlock the_locking_inset and lock the new inset
@@ -630,9 +675,9 @@ void InsetText::InsetButtonPress(BufferView * bv, int x, int y, int button)
            the_locking_inset = static_cast<UpdatableInset*>(inset);
            inset->InsetButtonPress(bv, x - inset_x, y - inset_y, button);
            inset->Edit(bv, x - inset_x, y - inset_y, button);
-           if (the_locking_inset) {
-               UpdateLocal(bv, CURSOR_PAR, false);
-           }
+           if (the_locking_inset)
+               UpdateLocal(bv, CURSOR, false);
+           no_selection = false;
            return;
        }
        // otherwise only unlock the_locking_inset
@@ -650,10 +695,9 @@ void InsetText::InsetButtonPress(BufferView * bv, int x, int y, int button)
            the_locking_inset = uinset;
            uinset->InsetButtonPress(bv, x - inset_x, y - inset_y, button);
            uinset->Edit(bv, x - inset_x, y - inset_y, 0);
-//         TEXT(bv)->ClearSelection();
-           if (the_locking_inset) {
-               UpdateLocal(bv, CURSOR_PAR, false);
-           }
+           if (the_locking_inset)
+               UpdateLocal(bv, CURSOR, false);
+           no_selection = false;
            return;
        }
     }
@@ -680,6 +724,7 @@ void InsetText::InsetButtonPress(BufferView * bv, int x, int y, int button)
        }
     }
     ShowInsetCursor(bv);
+    no_selection = false;
 }
 
 
@@ -711,22 +756,21 @@ void InsetText::InsetButtonRelease(BufferView * bv, int x, int y, int button)
 
 void InsetText::InsetMotionNotify(BufferView * bv, int x, int y, int state)
 {
+    if (no_selection)
+       return;
     if (the_locking_inset) {
         the_locking_inset->InsetMotionNotify(bv, x - inset_x,
                                             y - inset_y,state);
         return;
     }
-    if (!no_selection) {
-       HideInsetCursor(bv);
-       TEXT(bv)->SetCursorFromCoordinates(bv, x-drawTextXOffset,
-                                          y+insetAscent);
-       TEXT(bv)->SetSelection(bv);
-       if (TEXT(bv)->toggle_cursor.par()!=TEXT(bv)->toggle_end_cursor.par() ||
-           TEXT(bv)->toggle_cursor.pos()!=TEXT(bv)->toggle_end_cursor.pos())
-           UpdateLocal(bv, SELECTION, false);
-       ShowInsetCursor(bv);
-    }
-    no_selection = false;
+    HideInsetCursor(bv);
+    TEXT(bv)->SetCursorFromCoordinates(bv, x-drawTextXOffset,
+                                      y+insetAscent);
+    TEXT(bv)->SetSelection(bv);
+    if (TEXT(bv)->toggle_cursor.par()!=TEXT(bv)->toggle_end_cursor.par() ||
+       TEXT(bv)->toggle_cursor.pos()!=TEXT(bv)->toggle_end_cursor.pos())
+       UpdateLocal(bv, SELECTION, false);
+    ShowInsetCursor(bv);
 }
 
 
@@ -741,7 +785,7 @@ void InsetText::InsetKeyPress(XKeyEvent * xke)
 
 UpdatableInset::RESULT
 InsetText::LocalDispatch(BufferView * bv,
-                        int action, string const & arg)
+                        kb_action action, string const & arg)
 {
     no_selection = false;
     UpdatableInset::RESULT
@@ -779,6 +823,8 @@ InsetText::LocalDispatch(BufferView * bv,
                    moveRightIntern(bv, false, false);
                dispatched = true;
                break;
+           default:
+               break;
            }
            the_locking_inset = 0;
            if (dispatched)
@@ -802,11 +848,11 @@ InsetText::LocalDispatch(BufferView * bv,
 
            bv->text->SetUndo(bv->buffer(), Undo::INSERT,
 #ifndef NEW_INSETS
-                             bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous,
-                             bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next
+                             bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_,
+                             bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_
 #else
-                             bv->text->cursor.par()->previous,
-                             bv->text->cursor.par()->next
+                             bv->text->cursor.par()->previous(),
+                             bv->text->cursor.par()->next()
 #endif
                    );
            bv->setState();
@@ -815,7 +861,7 @@ InsetText::LocalDispatch(BufferView * bv,
                    TEXT(bv)->CutSelection(bv, false);
                }
            }
-           TEXT(bv)->ClearSelection();
+           TEXT(bv)->ClearSelection(bv);
            for (string::size_type i = 0; i < arg.length(); ++i) {
                if (greek_kb_flag) {
                    if (!math_insert_greek(bv, arg[i])) {
@@ -828,6 +874,7 @@ InsetText::LocalDispatch(BufferView * bv,
                }
            }
        }
+       TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
        UpdateLocal(bv, CURSOR_PAR, true);
        result=DISPATCHED_NOUPDATE;
        break;
@@ -841,7 +888,6 @@ InsetText::LocalDispatch(BufferView * bv,
     case LFUN_RIGHT:
        result = moveRight(bv);
        bv->text->FinishUndo();
-       TEXT(bv)->ClearSelection();
        UpdateLocal(bv, CURSOR, false);
        break;
     case LFUN_LEFTSEL:
@@ -853,7 +899,6 @@ InsetText::LocalDispatch(BufferView * bv,
     case LFUN_LEFT:
        bv->text->FinishUndo();
        result = moveLeft(bv);
-       TEXT(bv)->ClearSelection();
        UpdateLocal(bv, CURSOR, false);
        break;
     case LFUN_DOWNSEL:
@@ -865,8 +910,6 @@ InsetText::LocalDispatch(BufferView * bv,
     case LFUN_DOWN:
        bv->text->FinishUndo();
        result = moveDown(bv);
-       TEXT(bv)->ClearSelection();
-       TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
        UpdateLocal(bv, CURSOR, false);
        break;
     case LFUN_UPSEL:
@@ -878,31 +921,25 @@ InsetText::LocalDispatch(BufferView * bv,
     case LFUN_UP:
        bv->text->FinishUndo();
        result = moveUp(bv);
-       TEXT(bv)->ClearSelection();
-       TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
        UpdateLocal(bv, CURSOR, false);
        break;
     case LFUN_HOME:
        bv->text->FinishUndo();
        TEXT(bv)->CursorHome(bv);
-       TEXT(bv)->ClearSelection();
-       TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
        UpdateLocal(bv, CURSOR, false);
        break;
     case LFUN_END:
        TEXT(bv)->CursorEnd(bv);
-       TEXT(bv)->ClearSelection();
-       TEXT(bv)->sel_cursor = TEXT(bv)->cursor;
        UpdateLocal(bv, CURSOR, false);
        break;
     case LFUN_BACKSPACE:
        bv->text->SetUndo(bv->buffer(), Undo::DELETE,
 #ifndef NEW_INSETS
-         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous,
-         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next
+         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_,
+                         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_
 #else
-         bv->text->cursor.par()->previous,
-         bv->text->cursor.par()->next
+         bv->text->cursor.par()->previous(),
+         bv->text->cursor.par()->next()
 #endif
                );
        if (TEXT(bv)->selection)
@@ -914,11 +951,11 @@ InsetText::LocalDispatch(BufferView * bv,
     case LFUN_DELETE:
        bv->text->SetUndo(bv->buffer(), Undo::DELETE,
 #ifndef NEW_INSETS
-         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous,
-         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next
+         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_,
+                         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_
 #else
-         bv->text->cursor.par()->previous,
-         bv->text->cursor.par()->next
+         bv->text->cursor.par()->previous(),
+         bv->text->cursor.par()->next()
 #endif
                );
        if (TEXT(bv)->selection)
@@ -930,11 +967,11 @@ InsetText::LocalDispatch(BufferView * bv,
     case LFUN_CUT:
        bv->text->SetUndo(bv->buffer(), Undo::DELETE,
 #ifndef NEW_INSETS
-         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous,
-         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next
+         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_,
+                         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_
 #else
-         bv->text->cursor.par()->previous,
-         bv->text->cursor.par()->next
+         bv->text->cursor.par()->previous(),
+         bv->text->cursor.par()->next()
 #endif
                );
        TEXT(bv)->CutSelection(bv);
@@ -972,11 +1009,11 @@ InsetText::LocalDispatch(BufferView * bv,
        }
        bv->text->SetUndo(bv->buffer(), Undo::INSERT,
 #ifndef NEW_INSETS
-         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous,
-         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next
+         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_,
+         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_
 #else
-         bv->text->cursor.par()->previous,
-         bv->text->cursor.par()->next
+         bv->text->cursor.par()->previous(),
+         bv->text->cursor.par()->next()
 #endif
                );
        TEXT(bv)->PasteSelection(bv);
@@ -999,11 +1036,11 @@ InsetText::LocalDispatch(BufferView * bv,
            return DISPATCHED;
        bv->text->SetUndo(bv->buffer(), Undo::INSERT,
 #ifndef NEW_INSETS
-           bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous,
-           bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next
+           bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_,
+           bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_
 #else
-           bv->text->cursor.par()->previous,
-           bv->text->cursor.par()->next
+           bv->text->cursor.par()->previous(),
+           bv->text->cursor.par()->next()
 #endif
                );
        TEXT(bv)->InsertChar(bv, LyXParagraph::META_NEWLINE);
@@ -1054,10 +1091,10 @@ InsetText::LocalDispatch(BufferView * bv,
            // inherit bufferparams/paragraphparams in a strange way. (Lgb)
     {
            LyXParagraph * par = TEXT(bv)->cursor.par();
-           Spacing::Space cur_spacing = par->spacing.getSpace();
+           Spacing::Space cur_spacing = par->params.spacing().getSpace();
            float cur_value = 1.0;
            if (cur_spacing == Spacing::Other) {
-                   cur_value = par->spacing.getValue();
+                   cur_value = par->params.spacing().getValue();
            }
                        
            std::istringstream istr(arg.c_str());
@@ -1088,7 +1125,7 @@ InsetText::LocalDispatch(BufferView * bv,
                           << arg << endl;
            }
            if (cur_spacing != new_spacing || cur_value != new_value) {
-                   par->spacing.set(new_spacing, new_value);
+                   par->params.spacing(Spacing(new_spacing, new_value));
                    //TEXT(bv)->RedoParagraph(owner->view());
                    UpdateLocal(bv, CURSOR_PAR, true);
                    //bv->update(BufferView::SELECT|BufferView::FITCUR|BufferView::CHANGE);
@@ -1097,13 +1134,18 @@ InsetText::LocalDispatch(BufferView * bv,
     break;
        
     default:
-       result = UNDISPATCHED;
+       if (!bv->Dispatch(action, arg))
+           result = UNDISPATCHED;
        break;
     }
 
     /// If the action has deleted all text in the inset, we need to change the
     // language to the language to the surronding text.
-    if (par->Last() == 0 && !par->next) {
+#ifndef NEW_INSETS
+    if (par->Last() == 0 && !par->next_) {
+#else
+    if (par->Last() == 0 && !par->next()) {
+#endif
        LyXFont font(LyXFont::ALL_IGNORE);
        font.setLanguage(bv->getParentLanguage(this));
        SetFont(bv, font, false);
@@ -1135,7 +1177,11 @@ int InsetText::Ascii(Buffer const * buf, ostream & os, int linelen) const
        tmp = buf->asciiParagraph(p, linelen);
        lines += countChar(tmp, '\n');
        os << tmp;
-       p = p->next;
+#ifndef NEW_INSETS
+       p = p->next();
+#else
+       p = p->next();
+#endif
     }
     return lines;
 }
@@ -1150,7 +1196,11 @@ int InsetText::DocBook(Buffer const * buf, ostream & os) const
     string tmp;
     while (p) {
        buf->SimpleDocBookOnePar(os,tmp,p,desc,0);
-       p = p->next;
+#ifndef NEW_INSETS
+       p = p->next_;
+#else
+       p = p->next();
+#endif
     }
     
     return lines;
@@ -1162,7 +1212,11 @@ void InsetText::Validate(LaTeXFeatures & features) const
     LyXParagraph * p = par;
     while(p) {
        p->validate(features);
-       p = p->next;
+#ifndef NEW_INSETS
+       p = p->next_;
+#else
+       p = p->next();
+#endif
     }
 }
 
@@ -1268,7 +1322,11 @@ UpdatableInset::RESULT
 InsetText::moveRightIntern(BufferView * bv, bool behind, 
                           bool activate_inset, bool selecting)
 {
-    if (!cpar(bv)->next && (cpos(bv) >= cpar(bv)->Last()))
+#ifndef NEW_INSETS
+    if (!cpar(bv)->next_ && (cpos(bv) >= cpar(bv)->Last()))
+#else
+    if (!cpar(bv)->next() && (cpos(bv) >= cpar(bv)->Last()))
+#endif
        return FINISHED;
     if (activate_inset && checkAndActivateInset(bv, behind))
        return DISPATCHED;
@@ -1283,7 +1341,11 @@ UpdatableInset::RESULT
 InsetText::moveLeftIntern(BufferView * bv, bool behind,
                          bool activate_inset, bool selecting)
 {
-    if (!cpar(bv)->previous && (cpos(bv) <= 0))
+#ifndef NEW_INSETS
+    if (!cpar(bv)->previous_ && (cpos(bv) <= 0))
+#else
+    if (!cpar(bv)->previous() && (cpos(bv) <= 0))
+#endif
        return FINISHED;
     TEXT(bv)->CursorLeft(bv);
     if (!selecting)
@@ -1323,11 +1385,11 @@ bool InsetText::InsertInset(BufferView * bv, Inset * inset)
     }
     bv->text->SetUndo(bv->buffer(), Undo::INSERT,
 #ifndef NEW_INSETS
-             bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous,
-             bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next
+             bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_,
+             bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_
 #else
-             bv->text->cursor.par()->previous,
-             bv->text->cursor.par()->next
+             bv->text->cursor.par()->previous(),
+             bv->text->cursor.par()->next()
 #endif
            );
     inset->setOwner(this);
@@ -1338,9 +1400,8 @@ bool InsetText::InsertInset(BufferView * bv, Inset * inset)
        (cpar(bv)->GetInset(cpos(bv)) != inset))
        TEXT(bv)->CursorLeft(bv);
 #endif
-    TEXT(bv)->selection = 0;
     bv->fitCursor(TEXT(bv));
-    UpdateLocal(bv, CURSOR_PAR, true);
+    UpdateLocal(bv, CURSOR_PAR|CURSOR, true);
     ShowInsetCursor(bv);
     return true;
 }
@@ -1364,15 +1425,17 @@ UpdatableInset * InsetText::GetFirstLockingInsetOfType(Inset::Code c)
 
 void InsetText::SetFont(BufferView * bv, LyXFont const & font, bool toggleall)
 {
-    bv->text->SetUndo(bv->buffer(), Undo::EDIT,
+    if (TEXT(bv)->selection) {
+       bv->text->SetUndo(bv->buffer(), Undo::EDIT,
 #ifndef NEW_INSETS
-             bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous,
-             bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next
+                         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->previous_,
+                         bv->text->cursor.par()->ParFromPos(bv->text->cursor.pos())->next_
 #else
-             bv->text->cursor.par()->previous,
-             bv->text->cursor.par()->next
+                         bv->text->cursor.par()->previous(),
+                         bv->text->cursor.par()->next()
 #endif
            );
+    }
     TEXT(bv)->SetFont(bv, font, toggleall);
     bv->fitCursor(TEXT(bv));
     UpdateLocal(bv, CURSOR_PAR, true);
@@ -1449,7 +1512,7 @@ int InsetText::getMaxWidth(Painter & pain, UpdatableInset const * inset) const
 }
 
 
-void InsetText::SetParagraphData(LyXParagraph *p)
+void InsetText::SetParagraphData(LyXParagraph * p)
 {
     // delete all instances of LyXText before deleting the paragraps used
     // by it.
@@ -1458,26 +1521,49 @@ void InsetText::SetParagraphData(LyXParagraph *p)
        (*cit).second = 0;
     }
 
+#ifndef NEW_INSETS
     LyXParagraph * np;
     if (par) {
-       np = par->next;
+       np = par->next_;
+       delete par;
+       while (np) {
+           par = np;
+           np = np->next_;
+           delete par;
+       }
+    }
+    par = p->Clone();
+    par->SetInsetOwner(this);
+    np = par;
+    while (p->next_) {
+       p = p->next_;
+       np->next(p->Clone());
+       np->next_->previous(np);
+       np = np->next_;
+       np->SetInsetOwner(this);
+    }
+#else
+    LyXParagraph * np;
+    if (par) {
+       np = par->next();
        delete par;
        while(np) {
            par = np;
-           np = np->next;
+           np = np->next();
            delete par;
        }
     }
     par = p->Clone();
     par->SetInsetOwner(this);
     np = par;
-    while(p->next) {
-       p = p->next;
-       np->next = p->Clone();
-       np->next->previous = np;
-       np = np->next;
+    while(p->next()) {
+       p = p->next();
+       np->next(p->Clone());
+       np->next()->previous(np);
+       np = np->next();
        np->SetInsetOwner(this);
     }
+#endif
     need_update = INIT;
 }
 
@@ -1573,18 +1659,23 @@ Row * InsetText::crow(BufferView * bv) const
 }
 
 
-LyXText * InsetText::getLyXText(BufferView const * lbv) const
+LyXText * InsetText::getLyXText(BufferView const * lbv, bool const recursive) const
 {
     // Super UGLY! (Lgb)
     BufferView * bv = const_cast<BufferView *>(lbv);
        
-    if ((cache.find(bv) != cache.end()) && cache[bv])
+    if ((cache.find(bv) != cache.end()) && cache[bv]) {
+       if (recursive && the_locking_inset)
+           return the_locking_inset->getLyXText(bv);
        return cache[bv];
+    }
     LyXText * lt = new LyXText(const_cast<InsetText *>(this));
     lt->init(bv);
     cache[bv] = lt;
     if (the_locking_inset) {
        lt->SetCursor(bv, inset_par, inset_pos, true, inset_boundary);
+       if (recursive)
+          return the_locking_inset->getLyXText(bv);
     }
     return lt;
 }
@@ -1599,16 +1690,26 @@ void InsetText::deleteLyXText(BufferView * bv, bool recursive) const
     if (recursive) {
        /// then remove all LyXText in text-insets
        LyXParagraph * p = par;
-       for (;p;p = p->next) {
+#ifndef NEW_INSETS
+       for (; p; p = p->next_) {
+           p->deleteInsetsLyXText(bv);
+       }
+#else
+       for (; p; p = p->next()) {
            p->deleteInsetsLyXText(bv);
        }
+#endif
     }
 }
 
 
 void InsetText::resizeLyXText(BufferView * bv) const
 {
-    if (!par->next && !par->size()) // resize not neccessary!
+#ifndef NEW_INSETS
+    if (!par->next_ && !par->size()) // resize not neccessary!
+#else
+    if (!par->next() && !par->size()) // resize not neccessary!
+#endif
        return;
     if ((cache.find(bv) == cache.end()) || !cache[bv])
        return;
@@ -1669,9 +1770,15 @@ void InsetText::resizeLyXText(BufferView * bv) const
        /// then resize all LyXText in text-insets
        inset_x = cx(bv) - top_x + drawTextXOffset;
        inset_y = cy(bv) + drawTextYOffset;
-       for (LyXParagraph * p = par; p; p = p->next) {
+#ifndef NEW_INSETS
+       for (LyXParagraph * p = par; p; p = p->next_) {
            p->resizeInsetsLyXText(bv);
        }
+#else
+       for (LyXParagraph * p = par; p; p = p->next()) {
+           p->resizeInsetsLyXText(bv);
+       }
+#endif
     }
     need_update = FULL;
 }
@@ -1679,7 +1786,11 @@ void InsetText::resizeLyXText(BufferView * bv) const
 
 void InsetText::removeNewlines()
 {
-    for (LyXParagraph * p = par; p; p = p->next) {
+#ifndef NEW_INSETS
+    for (LyXParagraph * p = par; p; p = p->next_) {
+#else
+    for (LyXParagraph * p = par; p; p = p->next()) {
+#endif
        for (int i = 0; i < p->Last(); ++i) {
            if (p->GetChar(i) == LyXParagraph::META_NEWLINE)
                p->Erase(i);