]> git.lyx.org Git - features.git/blobdiff - src/text2.C
clear()->erase() ; lots of using directives for cxx
[features.git] / src / text2.C
index 6ec9e0f7c7a0892e7cd549cda4b765152447f06e..16ac40d0a53f0100b8de8bcfbe9bcfd09c278c98 100644 (file)
@@ -4,27 +4,27 @@
  *           LyX, The Document Processor
  *      
  *           Copyright 1995 Matthias Ettrich
- *           Copyright 1995-1999 The LyX Team.
+ *           Copyright 1995-2000 The LyX Team.
  *
- * ======================================================*/
+ * ====================================================== */
 
 #include <config.h>
 
-#include <cctype>
 #include FORMS_H_LOCATION
 
+
 #ifdef __GNUG__
 #pragma implementation "lyxtext.h"
-#pragma implementation "undo.h"
 #endif
 
 #include "LString.h"
 #include "lyxparagraph.h"
 #include "insets/inseterror.h"
+#include "insets/insetbib.h"
+#include "insets/insetspecialchar.h"
 #include "layout.h"
 #include "LyXView.h"
 #include "support/textutils.h"
-#include "lyx_cb.h"
 #include "undo.h"
 #include "minibuffer.h"
 #include "buffer.h"
 #include "lyx_gui_misc.h"
 #include "lyxtext.h"
 #include "gettext.h"
+#include "BufferView.h"
+#include "LyXView.h"
+#include "lyxrow.h"
+#include "CutAndPaste.h"
+#include "Painter.h"
+#include "font.h"
+#include "debug.h"
 
-extern MiniBuffer * minibuffer;
+//#define USE_OLD_CUT_AND_PASTE 1
 
-// Constructor
-LyXText::LyXText(int pw, Buffer * p)
+using std::copy;
+using std::endl;
+using std::pair;
+
+LyXText::LyXText(BufferView * bv, int pw, Buffer * p)
 {
+       owner_ = bv;
        firstrow = 0;
        lastrow = 0;
-       currentrow = 0;
-       currentrow_y = 0;
        paperwidth = pw;
-       parameters = &p->params;
-       params = p;
+       buffer = p;
        number_of_rows = 0;
-       refresh_y= 0;
+       refresh_y = 0;
        status = LyXText::UNCHANGED;
        LyXParagraph * par = p->paragraph;
        current_font = GetFont(par, 0);
    
        height = 0;
-   
+
        while (par) {
                InsertParagraph(par, lastrow);
                par = par->Next();
        }
-       /* set cursor at the very top position */
-       selection = true;                      /* these setting is necessary 
-                                               * because of the delete-empty-
-                                               * paragraph mechanism in
-                                               * SetCursor */
+
+       // set cursor at the very top position
+       selection = true;           /* these setting is necessary 
+                                      because of the delete-empty-
+                                      paragraph mechanism in
+                                      SetCursor */
        SetCursor(firstrow->par, 0);
        sel_cursor = cursor;
        selection = false;
        mark_set = false;
    
-       /* no rebreak necessary */ 
+       // no rebreak necessary
        need_break_row = 0;
    
        undo_finished = true;
@@ -75,10 +84,25 @@ LyXText::LyXText(int pw, Buffer * p)
 
        // Default layouttype for copy environment type
        copylayouttype = 0;
+
+#if 0
+       // Dump all rowinformation:
+       Row * tmprow = firstrow;
+       lyxerr << "Baseline Paragraph Pos Height Ascent Fill\n";
+       while (tmprow) {
+               lyxerr << tmprow->baseline << '\t'
+                      << tmprow->par << '\t'
+                      << tmprow->pos << '\t'
+                      << tmprow->height << '\t'
+                      << tmprow->ascent_of_text << '\t'
+                      << tmprow->fill << '\n';
+               tmprow = tmprow->next;
+       }
+       lyxerr.flush();
+#endif
 }
 
 
-// Destructor
 LyXText::~LyXText()
 {
        // Delete all rows, this does not touch the paragraphs!
@@ -91,6 +115,12 @@ LyXText::~LyXText()
 }
 
 
+void LyXText::owner(BufferView * bv)
+{
+       if (owner_ && bv) lyxerr << "LyXText::owner_ already set!" << endl;
+       owner_ = bv;
+}
+
 // Gets the fully instantiated font at a given position in a paragraph
 // Basically the same routine as LyXParagraph::getFont() in paragraph.C.
 // The difference is that this one is used for displaying, and thus we
@@ -98,15 +128,12 @@ LyXText::~LyXText()
 // smaller. (Asger)
 // If position is -1, we get the layout font of the paragraph.
 // If position is -2, we get the font of the manual label of the paragraph.
-#ifdef NEW_TEXT
 LyXFont LyXText::GetFont(LyXParagraph * par,
-                        LyXParagraph::size_type pos)
-#else
-LyXFont LyXText::GetFont(LyXParagraph * par, int pos)
-#endif
+                        LyXParagraph::size_type pos) const
 {
        LyXLayout const & layout = 
-               textclasslist.Style(parameters->textclass, par->GetLayout());
+               textclasslist.Style(buffer->params.textclass,
+                                   par->GetLayout());
 
        char par_depth = par->GetDepth();
        // We specialize the 95% common case:
@@ -160,13 +187,13 @@ LyXFont LyXText::GetFont(LyXParagraph * par, int pos)
                par = par->DepthHook(par_depth - 1);
                if (par) {
                        tmpfont.realize(textclasslist.
-                                       Style(parameters->textclass,
+                                       Style(buffer->params.textclass,
                                              par->GetLayout()).font);
                        par_depth = par->GetDepth();
                }
        }
 
-       tmpfont.realize(textclasslist.TextClass(parameters->textclass).defaultfont());
+       tmpfont.realize(textclasslist.TextClass(buffer->params.textclass).defaultfont());
 
        // Cosmetic improvement: If this is an open footnote, make the font 
        // smaller.
@@ -179,22 +206,20 @@ LyXFont LyXText::GetFont(LyXParagraph * par, int pos)
 }
 
 
-#ifdef NEW_TEXT
 void LyXText::SetCharFont(LyXParagraph * par,
                          LyXParagraph::size_type pos,
-                         LyXFont font)
-#else
-void LyXText::SetCharFont(LyXParagraph * par, int pos, LyXFont font)
-#endif
+                         LyXFont const & fnt)
 {
-       /* let the insets convert their font */ 
-       if (par->GetChar(pos) == LYX_META_INSET) {
+       LyXFont font(fnt);
+       // Let the insets convert their font
+       if (par->GetChar(pos) == LyXParagraph::META_INSET) {
                if (par->GetInset(pos))
                        font = par->GetInset(pos)->ConvertFont(font);
        }
 
-       LyXLayout const & layout = textclasslist.Style(parameters->textclass,
-                                          par->GetLayout());
+       LyXLayout const & layout =
+               textclasslist.Style(buffer->params.textclass,
+                                   par->GetLayout());
 
        // Get concrete layout font to reduce against
        LyXFont layoutfont;
@@ -211,12 +236,12 @@ void LyXText::SetCharFont(LyXParagraph * par, int pos, LyXFont font)
                        tp = tp->DepthHook(tp->GetDepth()-1);
                        if (tp)
                                layoutfont.realize(textclasslist.
-                                               Style(parameters->textclass,
+                                               Style(buffer->params.textclass,
                                                      tp->GetLayout()).font);
                }
        }
 
-       layoutfont.realize(textclasslist.TextClass(parameters->textclass).defaultfont());
+       layoutfont.realize(textclasslist.TextClass(buffer->params.textclass).defaultfont());
 
        if (par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
            && par->footnotekind == LyXParagraph::FOOTNOTE) {
@@ -232,20 +257,15 @@ void LyXText::SetCharFont(LyXParagraph * par, int pos, LyXFont font)
 
 /* inserts a new row behind the specified row, increments
  * the touched counters */
-#ifdef NEW_TEXT
 void LyXText::InsertRow(Row * row, LyXParagraph * par,
-                       LyXParagraph::size_type pos)
-#else
-void LyXText::InsertRow(Row * row, LyXParagraph * par, int pos)
-#endif
+                       LyXParagraph::size_type pos) const
 {
        Row * tmprow = new Row;
        if (!row) {
                tmprow->previous = 0;
                tmprow->next = firstrow;
                firstrow = tmprow;
-       }
-       else {
+       } else {
                tmprow->previous = row;
                tmprow->next = row->next;
                row->next = tmprow;
@@ -260,53 +280,46 @@ void LyXText::InsertRow(Row * row, LyXParagraph * par, int pos)
    
        tmprow->par = par;
        tmprow->pos = pos;
-   
+
        if (row == lastrow)
                lastrow = tmprow;
-       number_of_rows++;                              /* one more row  */
+       ++number_of_rows; // one more row
 }
 
 
-/* removes the row and reset the touched counters */
-void LyXText::RemoveRow(Row * row)
+// removes the row and reset the touched counters
+void LyXText::RemoveRow(Row * row) const
 {
        /* this must not happen before the currentrow for clear reasons.
           so the trick is just to set the current row onto the previous
           row of this row */
        long unused_y;
        GetRow(row->par, row->pos, unused_y);
-       currentrow = currentrow->previous;
-       if (currentrow)
-               currentrow_y -= currentrow->height;
-       else
-               currentrow_y = 0;
    
        if (row->next)
                row->next->previous = row->previous;
        if (!row->previous) {
                firstrow = row->next;
-       }
-       else  {
+       } else  {
                row->previous->next = row->next;
        }
        if (row == lastrow)
                lastrow = row->previous;
    
-       height -= row->height;         /* the text becomes smaller  */
+       height -= row->height;   // the text becomes smaller
    
        delete row;
-       --number_of_rows;                              /* one row less  */
+       --number_of_rows;       // one row less
 }
 
 
-/* remove all following rows of the paragraph of the specified row. */
-void LyXText::RemoveParagraph(Row * row)
+// remove all following rows of the paragraph of the specified row.
+void LyXText::RemoveParagraph(Row * row) const
 {
-       Row * tmprow;
-
        LyXParagraph * tmppar = row->par;
        row = row->next;
     
+       Row * tmprow;
        while (row && row->par == tmppar) {
                tmprow = row->next;
                RemoveRow(row);
@@ -314,21 +327,20 @@ void LyXText::RemoveParagraph(Row * row)
        }
 }
    
-  
-/* insert the specified paragraph behind the specified row */
-void LyXText::InsertParagraph(LyXParagraph * par, Row * row)
+
+// insert the specified paragraph behind the specified row
+void LyXText::InsertParagraph(LyXParagraph * par, Row * row) const
 {
        InsertRow(row, par, 0);        /* insert a new row, starting 
                                        * at postition 0 */
 
-       SetCounter(par);                       /* set the counters  */
+       SetCounter(par);  // set the counters
    
-       /* and now append the whole paragraph behind the new row */
+       // and now append the whole paragraph behind the new row
        if (!row) {
                firstrow->height = 0;
                AppendParagraph(firstrow);
-       }
-       else {
+       } else {
                row->next->height = 0;
                AppendParagraph(row->next);
        }
@@ -338,12 +350,12 @@ void LyXText::InsertParagraph(LyXParagraph * par, Row * row)
 void LyXText::ToggleFootnote()
 {
        LyXParagraph * par = cursor.par->ParFromPos(cursor.pos);
-       if (par->next && par->next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE){
+       if (par->next
+           && par->next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
                OpenFootnote();
-               minibuffer->Set(_("Opened float"));
-       }
-       else {
-               minibuffer->Set(_("Closed float"));
+               owner_->owner()->getMiniBuffer()->Set(_("Opened float"));
+       } else {
+               owner_->owner()->getMiniBuffer()->Set(_("Closed float"));
                CloseFootnote();
        }
 }
@@ -352,17 +364,17 @@ void LyXText::ToggleFootnote()
 void LyXText::OpenStuff()
 {
        if (cursor.pos == 0 && cursor.par->bibkey){
-               cursor.par->bibkey->Edit(0,0);
+               cursor.par->bibkey->Edit(owner_, 0, 0, 0);
        }
        else if (cursor.pos < cursor.par->Last() 
-                && cursor.par->GetChar(cursor.pos) == LYX_META_INSET
+                && cursor.par->GetChar(cursor.pos) == LyXParagraph::META_INSET
                 && cursor.par->GetInset(cursor.pos)->Editable()) {
-               minibuffer->Set(cursor.par->GetInset(cursor.pos)->EditMessage());
-               if (cursor.par->GetInset(cursor.pos)->Editable() != 2)
+               owner_->owner()->getMiniBuffer()
+                       ->Set(cursor.par->GetInset(cursor.pos)->EditMessage());
+               if (cursor.par->GetInset(cursor.pos)->Editable() != Inset::HIGHLY_EDITABLE)
                        SetCursorParUndo();
-               cursor.par->GetInset(cursor.pos)->Edit(0,0);
-       }
-       else {
+               cursor.par->GetInset(cursor.pos)->Edit(owner_, 0, 0, 0);
+       } else {
                ToggleFootnote();
        }
 }
@@ -370,47 +382,44 @@ void LyXText::OpenStuff()
 
 void LyXText::CloseFootnote()
 {
-       LyXParagraph * endpar, * tmppar;
-       Row * row;
-   
+       LyXParagraph * tmppar;
        LyXParagraph * par = cursor.par->ParFromPos(cursor.pos);
    
-       /* if the cursor is not in an open footnote, or 
-        * there is no open footnote in this paragraph, just return. */ 
+       // if the cursor is not in an open footnote, or 
+       // there is no open footnote in this paragraph, just return.
        if (cursor.par->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
       
-               if (!par->next
-                   || par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
-                       minibuffer->Set(_("Nothing to do"));
+               if (!par->next ||
+                   par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
+                       owner_->owner()->getMiniBuffer()
+                               ->Set(_("Nothing to do"));
                        return;
                }
    
-               /* ok, move the cursor right before the footnote */ 
-               /* just a little faster than using CursorRight() */
-               for (cursor.pos=0; cursor.par->ParFromPos(cursor.pos)!=par; cursor.pos++);
-               /* now the cursor is at the beginning of the physical par */
-#ifdef NEW_TEXT
+               // ok, move the cursor right before the footnote
+               // just a little faster than using CursorRight()
+               for (cursor.pos = 0;
+                    cursor.par->ParFromPos(cursor.pos) != par;
+                    cursor.pos++)
+                       {}
+               
+               // now the cursor is at the beginning of the physical par
                SetCursor(cursor.par,
                          cursor.pos +
-                         cursor.par->ParFromPos(cursor.pos)->text.size());
-#else
-               SetCursor(cursor.par, cursor.pos + cursor.par->ParFromPos(cursor.pos)->last);
-#endif
-       }
-       else  {
+                         cursor.par->ParFromPos(cursor.pos)->size());
+       } else  {
                /* we are in a footnote, so let us move at the beginning */ 
                /* this is just faster than using just CursorLeft() */ 
        
                tmppar = cursor.par;
                while (tmppar->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
-                       /* just a little bit faster than movin the cursor */
+                       // just a little bit faster than movin the cursor
                        tmppar = tmppar->Previous();
                }
                SetCursor(tmppar, tmppar->Last());
        }
    
-       /* the cursor must be exactly before the footnote */ 
+       // the cursor must be exactly before the footnote
        par = cursor.par->ParFromPos(cursor.pos);
    
        status = LyXText::NEED_MORE_REFRESH;
@@ -418,8 +427,8 @@ void LyXText::CloseFootnote()
        refresh_y = cursor.y - cursor.row->baseline;
    
        tmppar = cursor.par;
-       endpar = par->NextAfterFootnote()->Next();
-       row = cursor.row;
+       LyXParagraph * endpar = par->NextAfterFootnote()->Next();
+       Row * row = cursor.row;
    
        tmppar->CloseFootnote(cursor.pos);
 
@@ -436,7 +445,7 @@ void LyXText::CloseFootnote()
        SetCursor(cursor.par, cursor.pos);
        sel_cursor = cursor;
    
-       /* just necessary */
+       // just necessary
        if (cursor.row->next)
                SetHeightOfRow(cursor.row->next);
 }
@@ -446,16 +455,14 @@ void LyXText::CloseFootnote()
 // Asger is not sure we want to do this...
 void LyXText::MakeFontEntriesLayoutSpecific(LyXParagraph * par)
 {
-       LyXFont layoutfont, tmpfont;
    
-       LyXLayout const & layout = textclasslist.Style(parameters->textclass, par->GetLayout());
+       LyXLayout const & layout =
+               textclasslist.Style(buffer->params.textclass,
+                                   par->GetLayout());
 
-#ifdef NEW_TEXT
+       LyXFont layoutfont, tmpfont;
        for (LyXParagraph::size_type pos = 0;
             pos < par->Last(); ++pos) {
-#else
-       for (int pos = 0; pos < par->Last(); pos++) {
-#endif
                if (pos < BeginningOfMainBody(par))
                        layoutfont = layout.labelfont;
                else
@@ -467,15 +474,82 @@ void LyXText::MakeFontEntriesLayoutSpecific(LyXParagraph * par)
        }
 }
 
+LyXParagraph * LyXText::SetLayout(LyXCursor & cur, LyXCursor & sstart_cur,
+                                 LyXCursor & send_cur,
+                                 LyXTextClass::size_type layout)
+{
+       LyXParagraph * endpar = send_cur.par->LastPhysicalPar()->Next();
+       LyXParagraph * undoendpar = endpar;
+
+       if (endpar && endpar->GetDepth()) {
+               while (endpar && endpar->GetDepth()) {
+                       endpar = endpar->LastPhysicalPar()->Next();
+                       undoendpar = endpar;
+               }
+       } else if (endpar) {
+               endpar = endpar->Next(); // because of parindents etc.
+       }
+   
+       SetUndo(Undo::EDIT,
+               sstart_cur.par->ParFromPos(sstart_cur.pos)->previous, 
+               undoendpar);
+
+       /* ok we have a selection. This is always between sstart_cur
+        * and sel_end cursor */ 
+       cur = sstart_cur;
+   
+       LyXLayout const & lyxlayout =
+               textclasslist.Style(buffer->params.textclass, layout);
+   
+       while (cur.par != send_cur.par) {
+               if (cur.par->footnoteflag == sstart_cur.par->footnoteflag) {
+                       cur.par->SetLayout(layout);
+                       MakeFontEntriesLayoutSpecific(cur.par);
+                       LyXParagraph* fppar = cur.par->FirstPhysicalPar();
+                       fppar->added_space_top = lyxlayout.fill_top ?
+                               VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
+                       fppar->added_space_bottom = lyxlayout.fill_bottom ? 
+                               VSpace(VSpace::VFILL) : VSpace(VSpace::NONE); 
+                       if (lyxlayout.margintype == MARGIN_MANUAL)
+                               cur.par->SetLabelWidthString(lyxlayout.labelstring());
+                       if (lyxlayout.labeltype != LABEL_BIBLIO
+                           && fppar->bibkey) {
+                               delete fppar->bibkey;
+                               fppar->bibkey = 0;
+                       }
+               }
+               cur.par = cur.par->Next();
+       }
+       if (cur.par->footnoteflag == sstart_cur.par->footnoteflag) {
+               cur.par->SetLayout(layout);
+               MakeFontEntriesLayoutSpecific(cur.par);
+               LyXParagraph* fppar = cur.par->FirstPhysicalPar();
+               fppar->added_space_top = lyxlayout.fill_top ?
+                       VSpace(VSpace::VFILL) : VSpace(VSpace::NONE);
+               fppar->added_space_bottom = lyxlayout.fill_bottom ? 
+                       VSpace(VSpace::VFILL) : VSpace(VSpace::NONE); 
+               if (lyxlayout.margintype == MARGIN_MANUAL)
+                       cur.par->SetLabelWidthString(lyxlayout.labelstring());
+               if (lyxlayout.labeltype != LABEL_BIBLIO
+                   && fppar->bibkey) {
+                       delete fppar->bibkey;
+                       fppar->bibkey = 0;
+               }
+       }
+       return endpar;
+}
 
-/* set layout over selection and make a total rebreak of those paragraphs */
-void  LyXText::SetLayout(char layout)
+// set layout over selection and make a total rebreak of those paragraphs
+void LyXText::SetLayout(LyXTextClass::size_type layout)
 {
-       LyXCursor tmpcursor;
+       LyXCursor
+               tmpcursor = cursor;  /* store the current cursor  */
 
-       /* if there is no selection just set the layout of the current paragraph  */
+#ifdef USE_OLD_SET_LAYOUT
+       // if there is no selection just set the layout
+       // of the current paragraph  */
        if (!selection) {
-               sel_start_cursor = cursor;       /* dummy selection  */
+               sel_start_cursor = cursor;  // dummy selection
                sel_end_cursor = cursor;
        }
 
@@ -489,20 +563,19 @@ void  LyXText::SetLayout(char layout)
                }
        }
        else if (endpar) {
-               endpar = endpar->Next();               /* because of parindents etc.  */
+               endpar = endpar->Next(); // because of parindents etc.
        }
    
        SetUndo(Undo::EDIT, 
                sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous, 
                undoendpar);
 
-       tmpcursor = cursor;                    /* store the current cursor  */
-
        /* ok we have a selection. This is always between sel_start_cursor
         * and sel_end cursor */ 
        cursor = sel_start_cursor;
    
-       LyXLayout const & lyxlayout = textclasslist.Style(parameters->textclass, layout);
+       LyXLayout const & lyxlayout =
+               textclasslist.Style(buffer->params.textclass, layout);
    
        while (cursor.par != sel_end_cursor.par) {
                if (cursor.par->footnoteflag ==
@@ -541,28 +614,37 @@ void  LyXText::SetLayout(char layout)
                        fppar->bibkey = 0;
                }
        }
-   
+#else
+       // if there is no selection just set the layout
+       // of the current paragraph  */
+       if (!selection) {
+               sel_start_cursor = cursor;  // dummy selection
+               sel_end_cursor = cursor;
+       }
+       LyXParagraph *
+       endpar = SetLayout(cursor, sel_start_cursor, sel_end_cursor, layout);
+#endif
        RedoParagraphs(sel_start_cursor, endpar);
    
-       /* we have to reset the selection, because the
-        * geometry could have changed */ 
-       SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
+       // we have to reset the selection, because the
+       // geometry could have changed */ 
+       SetCursor(sel_start_cursor.par, sel_start_cursor.pos, false);
        sel_cursor = cursor;
-       SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
+       SetCursor(sel_end_cursor.par, sel_end_cursor.pos, false);
        UpdateCounters(cursor.row);
        ClearSelection();
        SetSelection();
-       SetCursor(tmpcursor.par, tmpcursor.pos);
+       SetCursor(tmpcursor.par, tmpcursor.pos, true);
 }
 
 
-/* increment depth over selection and
- * make a total rebreak of those paragraphs */
+// increment depth over selection and
+// make a total rebreak of those paragraphs
 void  LyXText::IncDepth()
 {
        // If there is no selection, just use the current paragraph
        if (!selection) {
-               sel_start_cursor = cursor;       /* dummy selection */
+               sel_start_cursor = cursor; // dummy selection
                sel_end_cursor = cursor;
        }
 
@@ -577,17 +659,18 @@ void  LyXText::IncDepth()
                }
        }
        else if (endpar) {
-               endpar = endpar->Next();               /* because of parindents etc.  */
+               endpar = endpar->Next(); // because of parindents etc.
        }
        
        SetUndo(Undo::EDIT, 
-               sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous, 
+               sel_start_cursor
+               .par->ParFromPos(sel_start_cursor.pos)->previous, 
                undoendpar);
 
-       LyXCursor tmpcursor = cursor;        /* store the current cursor  */
+       LyXCursor tmpcursor = cursor; // store the current cursor
 
-       /* ok we have a selection. This is always between sel_start_cursor
-        * and sel_end cursor */ 
+       // ok we have a selection. This is always between sel_start_cursor
+       // and sel_end cursor
        cursor = sel_start_cursor;
    
        bool anything_changed = false;
@@ -596,14 +679,15 @@ void  LyXText::IncDepth()
                // NOTE: you can't change the depth of a bibliography entry
                if (cursor.par->footnoteflag ==
                    sel_start_cursor.par->footnoteflag
-                   && textclasslist.Style(parameters->textclass,
+                   && textclasslist.Style(buffer->params.textclass,
                                      cursor.par->GetLayout()
                                     ).labeltype != LABEL_BIBLIO) {
-                       LyXParagraph * prev = cursor.par->FirstPhysicalPar()->Previous();
+                       LyXParagraph * prev =
+                               cursor.par->FirstPhysicalPar()->Previous();
                        if (prev 
                            && (prev->GetDepth() - cursor.par->GetDepth() > 0
                                || (prev->GetDepth() == cursor.par->GetDepth()
-                                   && textclasslist.Style(parameters->textclass,
+                                   && textclasslist.Style(buffer->params.textclass,
                                                      prev->GetLayout()).isEnvironment()))) {
                                cursor.par->FirstPhysicalPar()->depth++;
                                anything_changed = true;
@@ -614,7 +698,7 @@ void  LyXText::IncDepth()
                cursor.par = cursor.par->Next();
        }
    
-       /* if nothing changed set all depth to 0 */ 
+       // if nothing changed set all depth to 0
        if (!anything_changed) {
                cursor = sel_start_cursor;
                while (cursor.par != sel_end_cursor.par) {
@@ -627,8 +711,8 @@ void  LyXText::IncDepth()
    
        RedoParagraphs(sel_start_cursor, endpar);
    
-       /* we have to reset the selection, because the
-        * geometry could have changed */ 
+       // we have to reset the selection, because the
+       // geometry could have changed
        SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
        sel_cursor = cursor;
        SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
@@ -639,13 +723,14 @@ void  LyXText::IncDepth()
 }
 
 
-/* decrement depth over selection and
- * make a total rebreak of those paragraphs */
+// decrement depth over selection and
+// make a total rebreak of those paragraphs
 void  LyXText::DecDepth()
 {
-       /* if there is no selection just set the layout of the current paragraph  */
+       // if there is no selection just set the layout
+       // of the current paragraph
        if (!selection) {
-               sel_start_cursor = cursor;       /* dummy selection  */
+               sel_start_cursor = cursor; // dummy selection
                sel_end_cursor = cursor;
        }
    
@@ -659,17 +744,18 @@ void  LyXText::DecDepth()
                }
        }
        else if (endpar) {
-               endpar = endpar->Next();               /* because of parindents etc.  */
+               endpar = endpar->Next(); // because of parindents etc.
        }
    
        SetUndo(Undo::EDIT, 
-               sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous, 
+               sel_start_cursor
+               .par->ParFromPos(sel_start_cursor.pos)->previous, 
                undoendpar);
 
-       LyXCursor tmpcursor = cursor;                  /* store the current cursor  */
+       LyXCursor tmpcursor = cursor; // store the current cursor
 
-       /* ok we have a selection. This is always between sel_start_cursor
-        * and sel_end cursor */ 
+       // ok we have a selection. This is always between sel_start_cursor
+       // and sel_end cursor
        cursor = sel_start_cursor;
 
        while (true) {
@@ -685,8 +771,8 @@ void  LyXText::DecDepth()
 
        RedoParagraphs(sel_start_cursor, endpar);
    
-       /* we have to reset the selection, because the
-        * geometry could have changed */ 
+       // we have to reset the selection, because the
+       // geometry could have changed
        SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
        sel_cursor = cursor;
        SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
@@ -697,10 +783,10 @@ void  LyXText::DecDepth()
 }
 
 
-/* set font over selection and make a total rebreak of those paragraphs */
-void  LyXText::SetFont(LyXFont font, bool toggleall)
+// set font over selection and make a total rebreak of those paragraphs
+void LyXText::SetFont(LyXFont const & font, bool toggleall)
 {
-       /* if there is no selection just set the current_font */
+       // if there is no selection just set the current_font
        if (!selection) {
                // Determine basis font
                LyXFont layoutfont;
@@ -709,7 +795,9 @@ void  LyXText::SetFont(LyXFont font, bool toggleall)
                else
                        layoutfont = GetFont(cursor.par, -1);
                // Update current font
-               real_current_font.update(font,toggleall);
+               real_current_font.update(font,
+                                        buffer->params.language_info,
+                                        toggleall);
 
                // Reduce to implicit settings
                current_font = real_current_font;
@@ -719,10 +807,10 @@ void  LyXText::SetFont(LyXFont font, bool toggleall)
                return;
        }
 
-       LyXCursor tmpcursor = cursor;                  /* store the current cursor  */
+       LyXCursor tmpcursor = cursor; // store the current cursor
    
-       /* ok we have a selection. This is always between sel_start_cursor
-        * and sel_end cursor */ 
+       // ok we have a selection. This is always between sel_start_cursor
+       // and sel_end cursor
    
        SetUndo(Undo::EDIT, 
                sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous, 
@@ -734,11 +822,13 @@ void  LyXText::SetFont(LyXFont font, bool toggleall)
        {
                if (cursor.pos < cursor.par->Last()
                    && cursor.par->footnoteflag
-                   == sel_start_cursor.par->footnoteflag) {   /* an open footnote
-                                                               * should behave
-                                                               * like a closed */
-                       LyXFont newfont = GetFont(cursor.par,cursor.pos);
-                       newfont.update(font,toggleall);
+                   == sel_start_cursor.par->footnoteflag) {
+                       // an open footnote should behave
+                       // like a closed one
+                       LyXFont newfont = GetFont(cursor.par, cursor.pos);
+                       newfont.update(font,
+                                      buffer->params.language_info,
+                                      toggleall);
                        SetCharFont(cursor.par, cursor.pos, newfont);
                        cursor.pos++;
                } else {
@@ -749,8 +839,8 @@ void  LyXText::SetFont(LyXFont font, bool toggleall)
    
        RedoParagraphs(sel_start_cursor, sel_end_cursor.par->Next());
    
-       /* we have to reset the selection, because the
-        * geometry could have changed */ 
+       // we have to reset the selection, because the
+       // geometry could have changed
        SetCursor(sel_start_cursor.par, sel_start_cursor.pos);
        sel_cursor = cursor;
        SetCursor(sel_end_cursor.par, sel_end_cursor.pos);
@@ -760,42 +850,43 @@ void  LyXText::SetFont(LyXFont font, bool toggleall)
 }
 
 
-void LyXText::RedoHeightOfParagraph(LyXCursor cursor)
+void LyXText::RedoHeightOfParagraph(LyXCursor const & cur)
 {
-       Row * tmprow = cursor.row;
-       long y = cursor.y - tmprow->baseline;
+       Row * tmprow = cur.row;
+       long y = cur.y - tmprow->baseline;
 
        SetHeightOfRow(tmprow);
        LyXParagraph * first_phys_par = tmprow->par->FirstPhysicalPar();
-       /* find the first row of the paragraph */
+       // find the first row of the paragraph
        if (first_phys_par != tmprow->par)
-               while (tmprow->previous && tmprow->previous->par != first_phys_par)  {
+               while (tmprow->previous
+                      && tmprow->previous->par != first_phys_par) {
                        tmprow = tmprow->previous;
                        y -= tmprow->height;
                        SetHeightOfRow(tmprow);
                }
-       while (tmprow->previous && tmprow->previous->par == first_phys_par)  {
+       while (tmprow->previous && tmprow->previous->par == first_phys_par) {
                tmprow = tmprow->previous;
                y -= tmprow->height;
                SetHeightOfRow(tmprow);
        }
-   
-       /* we can set the refreshing parameters now */
+       
+       // we can set the refreshing parameters now
        status = LyXText::NEED_MORE_REFRESH;
        refresh_y = y;
        refresh_row = tmprow;
-       SetCursor(cursor.par, cursor.pos);
+       SetCursor(cur.par, cur.pos);
 }
 
 
-void LyXText::RedoDrawingOfParagraph(LyXCursor cursor)
+void LyXText::RedoDrawingOfParagraph(LyXCursor const & cur)
 {
-       Row * tmprow = cursor.row;
+       Row * tmprow = cur.row;
    
-       long y = cursor.y - tmprow->baseline;
+       long y = cur.y - tmprow->baseline;
        SetHeightOfRow(tmprow);
        LyXParagraph * first_phys_par = tmprow->par->FirstPhysicalPar();
-       /* find the first row of the paragraph */
+       // find the first row of the paragraph
        if (first_phys_par != tmprow->par)
                while (tmprow->previous && tmprow->previous->par != first_phys_par)  {
                        tmprow = tmprow->previous;
@@ -804,55 +895,56 @@ void LyXText::RedoDrawingOfParagraph(LyXCursor cursor)
        while (tmprow->previous && tmprow->previous->par == first_phys_par)  {
                tmprow = tmprow->previous;
                y -= tmprow->height;
-      
        }
    
-       /* we can set the refreshing parameters now */
+       // we can set the refreshing parameters now
        if (status == LyXText::UNCHANGED || y < refresh_y) {
                refresh_y = y;
                refresh_row = tmprow;
        }
        status = LyXText::NEED_MORE_REFRESH;
-       SetCursor(cursor.par, cursor.pos);
+       SetCursor(cur.par, cur.pos);
 }
 
 
 /* deletes and inserts again all paragaphs between the cursor
 * and the specified par 
 * This function is needed after SetLayout and SetFont etc. */
-void LyXText::RedoParagraphs(LyXCursor cursor, LyXParagraph * endpar)
+void LyXText::RedoParagraphs(LyXCursor const & cur,
+                            LyXParagraph const * endpar) const
 {
        Row * tmprow2;
        LyXParagraph * tmppar, * first_phys_par;
    
-       Row * tmprow = cursor.row;
+       Row * tmprow = cur.row;
    
-       long y = cursor.y - tmprow->baseline;
+       long y = cur.y - tmprow->baseline;
    
        if (!tmprow->previous){
                first_phys_par = FirstParagraph();   // a trick/hack for UNDO
-       }
-       else {
+       } else {
                first_phys_par = tmprow->par->FirstPhysicalPar();
-               /* find the first row of the paragraph */
+               // find the first row of the paragraph
                if (first_phys_par != tmprow->par)
-                       while (tmprow->previous && tmprow->previous->par != first_phys_par)  {
+                       while (tmprow->previous &&
+                              (tmprow->previous->par != first_phys_par)) {
                                tmprow = tmprow->previous;
                                y -= tmprow->height;
                        }
-               while (tmprow->previous && tmprow->previous->par == first_phys_par)  {
+               while (tmprow->previous
+                      && tmprow->previous->par == first_phys_par) {
                        tmprow = tmprow->previous;
                        y -= tmprow->height;
                }
        }
    
-       /* we can set the refreshing parameters now */
+       // we can set the refreshing parameters now
        status = LyXText::NEED_MORE_REFRESH;
        refresh_y = y;
-       refresh_row = tmprow->previous;        /* the real refresh row will
-                                               * be deleted, so I store
-                                               * the previous here */ 
-       /* remove it */
+       refresh_row = tmprow->previous;  /* the real refresh row will
+                                           be deleted, so I store
+                                           the previous here */ 
+       // remove it
        if (tmprow->next)
                tmppar = tmprow->next->par;
        else
@@ -865,9 +957,9 @@ void LyXText::RedoParagraphs(LyXCursor cursor, LyXParagraph * endpar)
                        tmppar = 0;
        }  
    
-       /* remove the first one */
-       tmprow2 = tmprow;                      /* this is because tmprow->previous
-                                               * can be 0 */
+       // remove the first one
+       tmprow2 = tmprow;     /* this is because tmprow->previous
+                                can be 0 */
        tmprow = tmprow->previous;
        RemoveRow(tmprow2);
    
@@ -881,17 +973,14 @@ void LyXText::RedoParagraphs(LyXCursor cursor, LyXParagraph * endpar)
                        while (tmprow->next && tmprow->next->par == tmppar)
                                tmprow = tmprow->next;
                        tmppar = tmppar->Next();
-        
                }
-       }
-       while (tmppar != endpar);
+       } while (tmppar != endpar);
    
-       /* this is because of layout changes */ 
+       // this is because of layout changes
        if (refresh_row) {
                refresh_y -= refresh_row->height;
                SetHeightOfRow(refresh_row);   
-       }
-       else {
+       } else {
                refresh_row = firstrow;
                refresh_y = 0;
                SetHeightOfRow(refresh_row);   
@@ -902,14 +991,14 @@ void LyXText::RedoParagraphs(LyXCursor cursor, LyXParagraph * endpar)
 }
 
 
-int LyXText::FullRebreak()
+bool LyXText::FullRebreak()
 {
        if (need_break_row) {
                BreakAgain(need_break_row);
                need_break_row = 0;
-               return 1;
+               return true;
        }
-       return 0;
+       return false;
 }
 
 
@@ -920,7 +1009,7 @@ int LyXText::FullRebreak()
 * realize, that you left an empty paragraph, they will delete it.
 * They also delet the corresponding row */
    
-/* need the selection cursor: */ 
+// need the selection cursor:
 void LyXText::SetSelection()
 {
        if (!selection) {
@@ -929,9 +1018,9 @@ void LyXText::SetSelection()
                sel_end_cursor = sel_cursor;
        }
    
-       selection = True;
+       selection = true;
    
-       /* first the toggling area */ 
+       // first the toggling area
        if (cursor.y < last_sel_cursor.y ||
            (cursor.y == last_sel_cursor.y && cursor.x < last_sel_cursor.x)) {
                toggle_end_cursor = last_sel_cursor;
@@ -944,9 +1033,17 @@ void LyXText::SetSelection()
    
        last_sel_cursor = cursor;
    
-       /* and now the whole selection */ 
-   
-       if (sel_cursor.y < cursor.y ||
+       // and now the whole selection
+
+       if (sel_cursor.par == cursor.par)
+          if (sel_cursor.pos < cursor.pos) {
+               sel_end_cursor = cursor;
+               sel_start_cursor = sel_cursor;
+       } else {
+               sel_end_cursor = sel_cursor; 
+               sel_start_cursor = cursor;
+       }
+       else if (sel_cursor.y < cursor.y ||
            (sel_cursor.y == cursor.y && sel_cursor.x < cursor.x)) {
                sel_end_cursor = cursor;
                sel_start_cursor = sel_cursor;
@@ -956,27 +1053,27 @@ void LyXText::SetSelection()
                sel_start_cursor = cursor;
        }
    
-       /* a selection with no contents is not a selection */ 
+       // a selection with no contents is not a selection
        if (sel_start_cursor.x == sel_end_cursor.x && 
            sel_start_cursor.y == sel_end_cursor.y)
                selection = false;
 }
 
 
-void LyXText::ClearSelection()
+void LyXText::ClearSelection() const
 {
        selection = false;
        mark_set = false;
 }
 
 
-void  LyXText::CursorHome()
+void LyXText::CursorHome() const
 {
        SetCursor(cursor.par, cursor.row->pos);
 }
 
 
-void  LyXText::CursorEnd()
+void  LyXText::CursorEnd() const
 {
        if (!cursor.row->next || cursor.row->next->par != cursor.row->par)
                SetCursor(cursor.par, RowLast(cursor.row) + 1);
@@ -1007,7 +1104,7 @@ void  LyXText::CursorEnd()
 }
 
 
-void  LyXText::CursorTop()
+void  LyXText::CursorTop() const
 {
        while (cursor.par->Previous())
                cursor.par = cursor.par->Previous();
@@ -1015,7 +1112,7 @@ void  LyXText::CursorTop()
 }
 
 
-void  LyXText::CursorBottom()
+void  LyXText::CursorBottom() const
 {
        while (cursor.par->Next())
                cursor.par = cursor.par->Next();
@@ -1025,57 +1122,42 @@ void  LyXText::CursorBottom()
    
 /* returns a pointer to the row near the specified y-coordinate
 * (relative to the whole text). y is set to the real beginning
-* of this row */ 
-Row * LyXText::GetRowNearY(long & y)
+* of this row */
+Row * LyXText::GetRowNearY(long & y) const
 {
-       Row * tmprow;
-       long tmpy;
-   
-       if (currentrow){
-               tmprow = currentrow;
-               tmpy = currentrow_y;
-       }
-       else {
-               tmprow = firstrow;
-               tmpy = 0;
-       }
-
-       if (tmpy<=y)
-               while (tmprow->next && tmpy + tmprow->height <= y) {
-                       tmpy += tmprow->height;
-                       tmprow = tmprow->next;
-               }
-       else
-               while (tmprow->previous && tmpy > y) {
-                       tmprow = tmprow->previous;
-                       tmpy -= tmprow->height;
-               }
+       Row * tmprow = firstrow;
+       long tmpy = 0;
 
-       currentrow = tmprow;
-       currentrow_y = tmpy;
+       while (tmprow->next && tmpy + tmprow->height <= y) {
+               tmpy += tmprow->height;
+               tmprow = tmprow->next;
+       }
 
-       y = tmpy;                              /* return the real y  */
+       y = tmpy;   // return the real y
        return tmprow;
 }
-   
 
-void LyXText::ToggleFree(LyXFont font, bool toggleall)
+
+void LyXText::ToggleFree(LyXFont const & font, bool toggleall)
 {
        // If the mask is completely neutral, tell user
-       if (font == LyXFont(LyXFont::ALL_IGNORE)){
+       if (font == LyXFont(LyXFont::ALL_IGNORE)) {
                // Could only happen with user style
-               minibuffer->Set(_("No font change defined. Use Character under"
+               owner_->owner()->getMiniBuffer()
+                       ->Set(_("No font change defined. Use Character under"
                                  " the Layout menu to define font change."));
                return;
        }
 
        // Try implicit word selection
+       // If there is a change in the language the implicit word selection 
+       // is disabled.
        LyXCursor resetCursor = cursor;
-       int implicitSelection = SelectWordWhenUnderCursor();
+       bool implicitSelection = (font.language() == ignore_language)
+               ? SelectWordWhenUnderCursor() : false;
 
        // Set font
-       SetFont(font,toggleall);
-       //minibuffer->Set(_("Font style changed"));
+       SetFont(font, toggleall);
 
        /* Implicit selections are cleared afterwards and cursor is set to the
           original position. */
@@ -1088,14 +1170,10 @@ void LyXText::ToggleFree(LyXFont font, bool toggleall)
 }
 
 
-#ifdef NEW_TEXT
-LyXParagraph::size_type
-LyXText::BeginningOfMainBody(LyXParagraph * par)
-#else
-int LyXText::BeginningOfMainBody(LyXParagraph * par)
-#endif
+LyXParagraph::size_type LyXText::BeginningOfMainBody(LyXParagraph * par) const
 {
-       if (textclasslist.Style(parameters->textclass, par->GetLayout()).labeltype != LABEL_MANUAL)
+       if (textclasslist.Style(buffer->params.textclass,
+                               par->GetLayout()).labeltype != LABEL_MANUAL)
                return 0;
        else
                return par->BeginningOfMainBody();
@@ -1130,42 +1208,43 @@ void LyXText::MeltFootnoteEnvironment()
        tmppar = firsttmppar;
        /* tmppar is now the paragraph right before the footnote */
 
-#ifdef NEW_TEXT
-       char first_footnote_par_is_not_empty = tmppar->next->text.size();
-#else
-       char first_footnote_par_is_not_empty = tmppar->next->last;
-#endif
+       bool first_footnote_par_is_not_empty = tmppar->next->size();
    
-       while (tmppar->next && tmppar->next->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
-               tmppar = tmppar->next;         /* I use next instead of Next(),
-                                               * because there cannot be any
-                                               * footnotes in a footnote
-                                               * environment */
+       while (tmppar->next
+              && tmppar->next->footnoteflag == LyXParagraph::OPEN_FOOTNOTE) {
+               tmppar = tmppar->next;   /* I use next instead of Next(),
+                                         * because there cannot be any
+                                         * footnotes in a footnote
+                                         * environment */
                tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE;
       
                /* remember the captions and empty paragraphs */
-               if ((textclasslist.Style(parameters->textclass,
-                                   tmppar->GetLayout()).labeltype == LABEL_SENSITIVE)
+               if ((textclasslist.Style(buffer->params.textclass,
+                                        tmppar->GetLayout())
+                    .labeltype == LABEL_SENSITIVE)
                    || !tmppar->Last())
                        tmppar->SetLayout(0);
        }
    
-       /* now we will paste the ex-footnote, if the layouts allow it */
-       /* first restore the layout of the paragraph right behind the footnote*/ 
+       // now we will paste the ex-footnote, if the layouts allow it
+       // first restore the layout of the paragraph right behind
+       // the footnote
        if (tmppar->next) 
                tmppar->next->MakeSameLayout(cursor.par);
 
-       /* first the end */ 
+       // first the end
        if ((!tmppar->GetLayout() && !tmppar->table)
-           || (tmppar->Next() && (!tmppar->Next()->Last()
-                                  || tmppar->Next()->HasSameLayout(tmppar)))) {
-               if (tmppar->Next()->Last() && tmppar->Next()->IsLineSeparator(0))
+           || (tmppar->Next()
+               && (!tmppar->Next()->Last()
+                   || tmppar->Next()->HasSameLayout(tmppar)))) {
+               if (tmppar->Next()->Last()
+                   && tmppar->Next()->IsLineSeparator(0))
                        tmppar->Next()->Erase(0);
                tmppar->PasteParagraph();
        }
 
-       tmppar = tmppar->Next();               /* make shure tmppar cannot be touched
-                                               * by the pasting of the beginning */
+       tmppar = tmppar->Next();  /* make sure tmppar cannot be touched
+                                  * by the pasting of the beginning */
 
        /* then the beginning */ 
        /* if there is no space between the text and the footnote, so we insert
@@ -1173,13 +1252,8 @@ void LyXText::MeltFootnoteEnvironment()
         * (only if the previous par and the footnotepar are not empty!) */
        if ((!firsttmppar->next->GetLayout() && !firsttmppar->next->table)
            || firsttmppar->HasSameLayout(firsttmppar->next)) {
-#ifdef NEW_TEXT
-               if (firsttmppar->text.size()
-                   && !firsttmppar->IsSeparator(firsttmppar->text.size() - 1)
-#else
-               if (firsttmppar->last
-                   && !firsttmppar->IsSeparator(firsttmppar->last - 1)
-#endif
+               if (firsttmppar->size()
+                   && !firsttmppar->IsSeparator(firsttmppar->size() - 1)
                    && first_footnote_par_is_not_empty) {
                        firsttmppar->next->InsertChar(0, ' ');
                }
@@ -1210,7 +1284,8 @@ void LyXText::MeltFootnoteEnvironment()
 
 void LyXText::SetParagraph(bool line_top, bool line_bottom,
                           bool pagebreak_top, bool pagebreak_bottom,
-                          VSpace space_top, VSpace space_bottom,
+                          VSpace const & space_top,
+                          VSpace const & space_bottom,
                           LyXAlignment align, 
                           string labelwidthstring,
                           bool noindent) 
@@ -1232,16 +1307,17 @@ void LyXText::SetParagraph(bool line_top, bool line_bottom,
                }
        }
        else if (endpar) {
-               endpar = endpar->Next(); /* because of parindents etc.  */
+               endpar = endpar->Next(); // because of parindents etc.
        }
    
        SetUndo(Undo::EDIT, 
-               sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous, 
+               sel_start_cursor
+               .par->ParFromPos(sel_start_cursor.pos)->previous, 
                undoendpar);
 
        
        LyXParagraph * tmppar = sel_end_cursor.par;
-       while (tmppar != sel_start_cursor.par->FirstPhysicalPar()->Previous()){
+       while (tmppar != sel_start_cursor.par->FirstPhysicalPar()->Previous()) {
                SetCursor(tmppar->FirstPhysicalPar(), 0);
                status = LyXText::NEED_MORE_REFRESH;
                refresh_row = cursor.row;
@@ -1254,16 +1330,16 @@ void LyXText::SetParagraph(bool line_top, bool line_bottom,
                        cursor.par->pagebreak_bottom = pagebreak_bottom;
                        cursor.par->added_space_top = space_top;
                        cursor.par->added_space_bottom = space_bottom;
-                               /* does the layout allow the new alignment? */
+                       // does the layout allow the new alignment?
                        if (align == LYX_ALIGN_LAYOUT)
                                align = textclasslist
-                                       .Style(parameters->textclass,
+                                       .Style(buffer->params.textclass,
                                               cursor.par->GetLayout()).align;
                        if (align & textclasslist
-                           .Style(parameters->textclass,
+                           .Style(buffer->params.textclass,
                                   cursor.par->GetLayout()).alignpossible) {
                                if (align == textclasslist
-                                   .Style(parameters->textclass,
+                                   .Style(buffer->params.textclass,
                                           cursor.par->GetLayout()).align)
                                        cursor.par->align = LYX_ALIGN_LAYOUT;
                                else
@@ -1311,11 +1387,12 @@ void LyXText::SetParagraphExtraOpt(int type,
                }
        }
        else if (endpar) {
-               endpar = endpar->Next(); /* because of parindents etc.  */
+               endpar = endpar->Next(); // because of parindents etc.
        }
    
        SetUndo(Undo::EDIT, 
-               sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous, 
+               sel_start_cursor
+               .par->ParFromPos(sel_start_cursor.pos)->previous, 
                undoendpar);
        
        tmppar = sel_end_cursor.par;
@@ -1326,13 +1403,13 @@ void LyXText::SetParagraphExtraOpt(int type,
                 refresh_y = cursor.y - cursor.row->baseline;
                 if (cursor.par->footnoteflag ==
                     sel_start_cursor.par->footnoteflag) {
-                        if (type == PEXTRA_NONE) {
-                                if (cursor.par->pextra_type != PEXTRA_NONE) {
+                        if (type == LyXParagraph::PEXTRA_NONE) {
+                                if (cursor.par->pextra_type != LyXParagraph::PEXTRA_NONE) {
                                         cursor.par->UnsetPExtraType();
-                                        cursor.par->pextra_type=PEXTRA_NONE;
+                                        cursor.par->pextra_type = LyXParagraph::PEXTRA_NONE;
                                 }
                         } else {
-                                cursor.par->SetPExtraType(type,width,widthp);
+                                cursor.par->SetPExtraType(type, width, widthp);
                                 cursor.par->pextra_hfill = hfill;
                                 cursor.par->pextra_start_minipage = start_minipage;
                                 cursor.par->pextra_alignment = alignment;
@@ -1350,32 +1427,61 @@ void LyXText::SetParagraphExtraOpt(int type,
 }
 
 
-static char const * alphaCounter(int n){
-  static char result[2];
-  result[1] = 0;
-  if (n == 0)
-    return "";
-  else {
-    result[0] = 64 + n;
-    if (n > 26)
-      return "??";
-  }
-  return result;
+char loweralphaCounter(int n)
+{
+       if (n < 1 || n > 26)
+               return '?';
+       else
+               return 'a' + n - 1;
+}
+
+char alphaCounter(int n)
+{
+       if (n < 1 || n > 26)
+               return '?';
+       else
+               return 'A' + n - 1;
+}
+
+char hebrewCounter(int n)
+{
+       static const char hebrew[22] = {
+               'à', 'á', 'â', 'ã', 'ä', 'Ã¥', 'æ', 'ç', 'è',
+               'é', 'ë', 'ì', 'î', 'ð', 'ñ', 'ò', 'ô', 'ö', 
+               '÷', 'ø', 'ù', 'ú'
+       };
+       if (n < 1 || n > 22)
+               return '?';
+       else
+               return hebrew[n-1];
 }
 
+static char const * romanCounter(int n)
+{
+       static char const * roman[20] = {
+               "i",   "ii",  "iii", "iv", "v",
+               "vi",  "vii", "viii", "ix", "x",
+               "xi",  "xii", "xiii", "xiv", "xv",
+               "xvi", "xvii", "xviii", "xix", "xx"
+       };
+       if (n < 1 || n > 20)
+               return "??";
+       else
+               return roman[n-1];
+}
 
-/* set the counter of a paragraph. This includes the labels */ 
-void LyXText::SetCounter(LyXParagraph * par)
+// set the counter of a paragraph. This includes the labels
+void LyXText::SetCounter(LyXParagraph * par) const
 {
-       int i;
-   
-       /* this is only relevant for the beginning of paragraph */ 
+       // this is only relevant for the beginning of paragraph
        par = par->FirstPhysicalPar();
 
-       LyXLayout const & layout = textclasslist.Style(parameters->textclass, 
-                                          par->GetLayout());
+       LyXLayout const & layout =
+               textclasslist.Style(buffer->params.textclass, 
+                                   par->GetLayout());
 
-       LyXTextClass const & textclass = textclasslist.TextClass(parameters->textclass);
+       LyXTextClass const & textclass =
+               textclasslist.TextClass(buffer->params.textclass);
 
        /* copy the prev-counters to this one, unless this is the start of a 
           footnote or of a bibliography or the very first paragraph */
@@ -1383,17 +1489,17 @@ void LyXText::SetCounter(LyXParagraph * par)
            && !(par->Previous()->footnoteflag == LyXParagraph::NO_FOOTNOTE 
                    && par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
                    && par->footnotekind == LyXParagraph::FOOTNOTE)
-           && !(textclasslist.Style(parameters->textclass,
+           && !(textclasslist.Style(buffer->params.textclass,
                                par->Previous()->GetLayout()
                                ).labeltype != LABEL_BIBLIO
                 && layout.labeltype == LABEL_BIBLIO)) {
-               for (i=0; i<10; i++) {
+               for (int i = 0; i < 10; ++i) {
                        par->setCounter(i, par->Previous()->GetFirstCounter(i));
                }
                par->appendix = par->Previous()->FirstPhysicalPar()->appendix;
                if (!par->appendix && par->start_of_appendix){
                  par->appendix = true;
-                 for (i=0; i<10; i++) {
+                 for (int i = 0; i < 10; ++i) {
                    par->setCounter(i, 0);
                  }  
                }
@@ -1401,7 +1507,7 @@ void LyXText::SetCounter(LyXParagraph * par)
                par->itemdepth = par->Previous()->FirstPhysicalPar()->itemdepth;
        }
        else {
-               for (i=0; i<10; i++) {
+               for (int i = 0; i < 10; ++i) {
                        par->setCounter(i, 0);
                }  
                par->appendix = par->start_of_appendix;
@@ -1418,7 +1524,7 @@ void LyXText::SetCounter(LyXParagraph * par)
            && par->Previous()
            && par->Previous()->footnoteflag != LyXParagraph::OPEN_FOOTNOTE
            && (par->PreviousBeforeFootnote()
-               && textclasslist.Style(parameters->textclass,
+               && textclasslist.Style(buffer->params.textclass,
                                  par->PreviousBeforeFootnote()->GetLayout()
                                 ).labeltype >= LABEL_COUNTER_ENUMI)) {
                 // Any itemize or enumerate environment in a marginnote
@@ -1440,7 +1546,7 @@ void LyXText::SetCounter(LyXParagraph * par)
         */
        if (par->Previous()
            && par->Previous()->GetDepth() < par->GetDepth()
-           && textclasslist.Style(parameters->textclass,
+           && textclasslist.Style(buffer->params.textclass,
                              par->Previous()->GetLayout()
                             ).labeltype == LABEL_COUNTER_ENUMI
            && par->enumdepth < 3
@@ -1464,234 +1570,283 @@ void LyXText::SetCounter(LyXParagraph * par)
                /* reset the counters.
                 * A depth change is like a breaking layout
                 */
-               for (i=6 + par->enumdepth + 1; i<10;i++)
+               for (int i = 6 + par->enumdepth + 1; i < 10; ++i)
                        par->setCounter(i, 0);
        }
    
        if (!par->labelstring.empty()) {
-               par->labelstring.clear();
+               par->labelstring.erase();
        }
    
        if (layout.margintype == MARGIN_MANUAL) {
                if (par->labelwidthstring.empty()) {
                        par->SetLabelWidthString(layout.labelstring());
                }
-       }
-       else {
+       } else {
                par->SetLabelWidthString(string());
        }
    
        /* is it a layout that has an automatic label ? */ 
        if (layout.labeltype >=  LABEL_FIRST_COUNTER) {
       
-               i = layout.labeltype - LABEL_FIRST_COUNTER;
-               if (i >= 0 && i<=parameters->secnumdepth) {
+               int i = layout.labeltype - LABEL_FIRST_COUNTER;
+               if (i >= 0 && i<= buffer->params.secnumdepth) {
                        par->incCounter(i);     // increment the counter  
         
-                       char * s = new char[50];
-
                        // Is there a label? Useful for Chapter layout
                        if (!par->appendix){
                                if (!layout.labelstring().empty())
                                        par->labelstring = layout.labelstring();
                                else
-                                       par->labelstring.clear();
-                        }
-                       else {
+                                       par->labelstring.erase();
+                        } else {
                                if (!layout.labelstring_appendix().empty())
                                        par->labelstring = layout.labelstring_appendix();
                                else
-                                       par->labelstring.clear();
+                                       par->labelstring.erase();
                        }
-                       if (!par->appendix){
+
+#ifdef HAVE_SSTREAM
+                       std::ostringstream s;
+#else
+                       ostrstream s;
+#endif
+                       if (!par->appendix) {
                                switch (2 * LABEL_FIRST_COUNTER -
                                        textclass.maxcounter() + i) {
                                case LABEL_COUNTER_CHAPTER:
-                                       sprintf(s, "%d",
-                                               par->getCounter(i));
+                                       s << par->getCounter(i);
                                        break;
                                case LABEL_COUNTER_SECTION:
-                                       sprintf(s, "%d.%d",
-                                               par->getCounter(i - 1),
-                                               par->getCounter(i));
+                                       s << par->getCounter(i - 1) << '.'
+                                          << par->getCounter(i);
                                        break;
                                case LABEL_COUNTER_SUBSECTION:
-                                       sprintf(s, "%d.%d.%d",
-                                               par->getCounter(i-2),
-                                               par->getCounter(i-1),
-                                               par->getCounter(i));
+                                       s << par->getCounter(i - 2) << '.'
+                                         << par->getCounter(i - 1) << '.'
+                                         << par->getCounter(i);
                                        break;
                                case LABEL_COUNTER_SUBSUBSECTION:
-                                       sprintf(s, "%d.%d.%d.%d",
-                                               par->getCounter(i-3),
-                                               par->getCounter(i-2),
-                                               par->getCounter(i-1),
-                                               par->getCounter(i));
+                                       s << par->getCounter(i - 3) << '.'
+                                         << par->getCounter(i - 2) << '.'
+                                         << par->getCounter(i - 1) << '.'
+                                         << par->getCounter(i);
+                                       
                                        break;
                                case LABEL_COUNTER_PARAGRAPH:
-                                       sprintf(s, "%d.%d.%d.%d.%d",
-                                               par->getCounter(i-4),
-                                               par->getCounter(i-3),
-                                               par->getCounter(i-2),
-                                               par->getCounter(i-1),
-                                               par->getCounter(i));
+                                       s << par->getCounter(i - 4) << '.'
+                                         << par->getCounter(i - 3) << '.'
+                                         << par->getCounter(i - 2) << '.'
+                                         << par->getCounter(i - 1) << '.'
+                                         << par->getCounter(i);
                                        break;
                                case LABEL_COUNTER_SUBPARAGRAPH:
-                                       sprintf(s, "%d.%d.%d.%d.%d.%d",
-                                               par->getCounter(i-5),
-                                               par->getCounter(i-4),
-                                               par->getCounter(i-3),
-                                               par->getCounter(i-2),
-                                               par->getCounter(i-1),
-                                               par->getCounter(i));
+                                       s << par->getCounter(i - 5) << '.'
+                                         << par->getCounter(i - 4) << '.'
+                                         << par->getCounter(i - 3) << '.'
+                                         << par->getCounter(i - 2) << '.'
+                                         << par->getCounter(i - 1) << '.'
+                                         << par->getCounter(i);
+
                                        break;
                                default:
-                                       sprintf(s, "%d.", par->getCounter(i));
+                                       s << par->getCounter(i) << '.';
                                         break;
                                }
-                       }
-                       else {
+                       } else { // appendix
                                switch (2 * LABEL_FIRST_COUNTER - textclass.maxcounter() + i) {
                                case LABEL_COUNTER_CHAPTER:
-                                       sprintf(s, "%s",
-                                               alphaCounter(par->getCounter(i)));
+                                       if (par->isRightToLeftPar())
+                                               s << hebrewCounter(par->getCounter(i));
+                                       else
+                                               s << alphaCounter(par->getCounter(i));
                                        break;
                                case LABEL_COUNTER_SECTION:
-                                       sprintf(s, "%s.%d",
-                                               alphaCounter(par->getCounter(i - 1)),
-                                               par->getCounter(i));
+                                       if (par->isRightToLeftPar())
+                                               s << hebrewCounter(par->getCounter(i - 1));
+                                       else
+                                               s << alphaCounter(par->getCounter(i - 1));
+
+                                       s << '.'
+                                         << par->getCounter(i);
+
                                        break;
                                case LABEL_COUNTER_SUBSECTION:
-                                       sprintf(s, "%s.%d.%d",
-                                               alphaCounter(par->getCounter(i-2)),
-                                               par->getCounter(i-1),
-                                               par->getCounter(i));
+                                       if (par->isRightToLeftPar())
+                                               s << hebrewCounter(par->getCounter(i - 2));
+                                       else
+                                               s << alphaCounter(par->getCounter(i - 2));
+
+                                       s << '.'
+                                         << par->getCounter(i-1) << '.'
+                                         << par->getCounter(i);
+
                                        break;
                                case LABEL_COUNTER_SUBSUBSECTION:
-                                       sprintf(s, "%s.%d.%d.%d",
-                                               alphaCounter(par->getCounter(i-3)),
-                                               par->getCounter(i-2),
-                                               par->getCounter(i-1),
-                                               par->getCounter(i));
+                                       if (par->isRightToLeftPar())
+                                               s << hebrewCounter(par->getCounter(i-3));
+                                       else
+                                               s << alphaCounter(par->getCounter(i-3));
+
+                                       s << '.'
+                                         << par->getCounter(i-2) << '.'
+                                         << par->getCounter(i-1) << '.'
+                                         << par->getCounter(i);
+
                                        break;
                                case LABEL_COUNTER_PARAGRAPH:
-                                       sprintf(s, "%s.%d.%d.%d.%d",
-                                               alphaCounter(par->getCounter(i-4)),
-                                               par->getCounter(i-3),
-                                               par->getCounter(i-2),
-                                               par->getCounter(i-1),
-                                               par->getCounter(i));
+                                       if (par->isRightToLeftPar())
+                                               s << hebrewCounter(par->getCounter(i-4));
+                                       else
+                                               s << alphaCounter(par->getCounter(i-4));
+
+                                       s << '.'
+                                         << par->getCounter(i-3) << '.'
+                                         << par->getCounter(i-2) << '.'
+                                         << par->getCounter(i-1) << '.'
+                                         << par->getCounter(i);
+
                                        break;
                                case LABEL_COUNTER_SUBPARAGRAPH:
-                                       sprintf(s, "%s.%d.%d.%d.%d.%d",
-                                               alphaCounter(par->getCounter(i-5)),
-                                               par->getCounter(i-4),
-                                               par->getCounter(i-3),
-                                               par->getCounter(i-2),
-                                               par->getCounter(i-1),
-                                               par->getCounter(i));
+                                       if (par->isRightToLeftPar())
+                                               s << hebrewCounter(par->getCounter(i-5));
+                                       else
+                                               s << alphaCounter(par->getCounter(i-5));
+
+                                       s << '.'
+                                         << par->getCounter(i-4) << '.'
+                                         << par->getCounter(i-3) << '.'
+                                         << par->getCounter(i-2) << '.'
+                                         << par->getCounter(i-1) << '.'
+                                         << par->getCounter(i);
+
                                        break;
                                default:
-                                       sprintf(s, "%c.", par->getCounter(i));
+                                       // Can this ever be reached? And in the
+                                       // case it is, how can this be correct?
+                                       // (Lgb)
+                                       s << static_cast<unsigned char>(par->getCounter(i)) << '.';
+                                       
                                        break;
                                }
                        }
-        
-                       par->labelstring += s;
-                       delete[] s;
-        
-                       for (i++; i<10; i++) {
-                               /* reset the following counters  */
+#ifdef HAVE_SSTREAM
+                       par->labelstring += s.str().c_str();
+                       // We really want to remove the c_str as soon as
+                       // possible...
+#else
+                       s << '\0';
+                       char * tmps = s.str();
+                       par->labelstring += tmps;
+                       delete [] tmps;
+#endif
+                       
+                       for (i++; i < 10; ++i) {
+                               // reset the following counters
                                par->setCounter(i, 0);
                        }
                } else if (layout.labeltype < LABEL_COUNTER_ENUMI) {
-                       for (i++; i<10; i++) {
-                               /* reset the following counters  */
+                       for (i++; i < 10; ++i) {
+                               // reset the following counters
                                par->setCounter(i, 0);
                        }
                } else if (layout.labeltype == LABEL_COUNTER_ENUMI) {
                        par->incCounter(i + par->enumdepth);
-                       char * s = new char[25];
                        int number = par->getCounter(i + par->enumdepth);
+
+#ifdef HAVE_SSTREAM
+                       std::ostringstream s;
+#else
+                       ostrstream s;
+#endif
                        switch (par->enumdepth) {
                        case 1:
-                               sprintf(s, "(%c)", (number % 27) + 'a' - 1);
+                               if (par->isRightToLeftPar())
+                                       s << '('
+                                         << hebrewCounter(number)
+                                         << ')';
+                               else
+                                       s << '('
+                                         << loweralphaCounter(number)
+                                         << ')';
                                break;
                        case 2:
-                               switch (number) {
-                               case 1: sprintf(s, "i."); break;
-                               case 2: sprintf(s, "ii."); break;
-                               case 3: sprintf(s, "iii."); break;
-                               case 4: sprintf(s, "iv."); break;
-                               case 5: sprintf(s, "v."); break;
-                               case 6: sprintf(s, "vi."); break;
-                               case 7: sprintf(s, "vii."); break;
-                               case 8: sprintf(s, "viii."); break;
-                               case 9: sprintf(s, "ix."); break;
-                               case 10: sprintf(s, "x."); break;
-                               case 11: sprintf(s, "xi."); break;
-                               case 12: sprintf(s, "xii."); break;
-                               case 13: sprintf(s, "xiii."); break;
-                               default:
-                                       sprintf(s, "\\roman{%d}.", number);
-                                       break;
-                               }
+                               if (par->isRightToLeftPar())
+                                       s << '.' << romanCounter(number);
+                               else
+                                       s << romanCounter(number) << '.';
                                break;
                        case 3:
-                               sprintf(s, "%c.", (number % 27) + 'A' - 1);
+                               if (par->isRightToLeftPar())
+                                       s << '.'
+                                         << alphaCounter(number);
+                               else
+                                       s << alphaCounter(number)
+                                         << '.';
                                break;
                        default:
-                               sprintf(s, "%d.", number);
+                               if (par->isRightToLeftPar())
+                                       s << '.' << number;
+                               else
+                                       s << number << '.';
                                break;
                        }
-                       par->labelstring = s;
-                       delete[] s;
+#ifdef HAVE_SSTREAM
+                       par->labelstring = s.str().c_str();
+                       // we really want to get rid of that c_str()
+#else
+                       s << '\0';
+                       char * tmps = s.str();
+                       par->labelstring = tmps;
+                       delete [] tmps;
+#endif
 
-                       for (i += par->enumdepth + 1;i<10;i++)
+                       for (i += par->enumdepth + 1; i < 10; ++i)
                                par->setCounter(i, 0);  /* reset the following counters  */
         
                } 
        } else if (layout.labeltype == LABEL_BIBLIO) {// ale970302
-           i = LABEL_COUNTER_ENUMI - LABEL_FIRST_COUNTER + par->enumdepth;
-           par->incCounter(i);
-           int number = par->getCounter(i);
-           if (!par->bibkey)
-             par->bibkey = new InsetBibKey();
-           par->bibkey->setCounter(number);
-           par->labelstring = layout.labelstring();
-           
-           // In biblio should't be following counters but...
-       }                                               
-       else  {
+               int i = LABEL_COUNTER_ENUMI - LABEL_FIRST_COUNTER + par->enumdepth;
+               par->incCounter(i);
+               int number = par->getCounter(i);
+               if (!par->bibkey)
+                       par->bibkey = new InsetBibKey();
+               par->bibkey->setCounter(number);
+               par->labelstring = layout.labelstring();
+               
+               // In biblio should't be following counters but...
+       } else {
                string s = layout.labelstring();
-      
-               /* the caption hack: */
+               
+               // the caption hack:
       
                if (layout.labeltype == LABEL_SENSITIVE) {
                        if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
                            && (par->footnotekind == LyXParagraph::FIG
-                           || par->footnotekind == LyXParagraph::WIDE_FIG))
-                               s = "Figure:";
+                               || par->footnotekind == LyXParagraph::WIDE_FIG))
+                               s = (par->getParLanguage()->lang == "hebrew")
+                                       ? ":øåéà" : "Figure:";
                        else if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
                                 && (par->footnotekind == LyXParagraph::TAB
-                                || par->footnotekind == LyXParagraph::WIDE_TAB))
-                               s = "Table:";
+                                    || par->footnotekind == LyXParagraph::WIDE_TAB))
+                               s = (par->getParLanguage()->lang == "hebrew")
+                                       ? ":äìáè" : "Table:";
                        else if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE
                                 && par->footnotekind == LyXParagraph::ALGORITHM)
-                               s = "Algorithm:";
+                               s = (par->getParLanguage()->lang == "hebrew")
+                                       ? ":íúéøåâìà" : "Algorithm:";
                        else {
                                /* par->SetLayout(0); 
                                   s = layout->labelstring;  */
-                               s = "Senseless: "; 
-          
+                               s = (par->getParLanguage()->lang == "hebrew")
+                                       ? " :úåòîùî Ã¸Ã±Ã§" : "Senseless: ";
                        }
                }
                par->labelstring = s;
-      
+               
                /* reset the enumeration counter. They are always resetted
                 * when there is any other layout between */ 
-               for (i=6 + par->enumdepth; i<10;i++)
+               for (int i = 6 + par->enumdepth; i < 10; ++i)
                        par->setCounter(i, 0);
        }
 }
@@ -1699,7 +1854,7 @@ void LyXText::SetCounter(LyXParagraph * par)
 
 /* Updates all counters BEHIND the row. Changed paragraphs
 * with a dynamic left margin will be rebroken. */ 
-void LyXText::UpdateCounters(Row * row)
+void LyXText::UpdateCounters(Row * row) const
 {
        LyXParagraph * par;
        if (!row) {
@@ -1707,7 +1862,8 @@ void LyXText::UpdateCounters(Row * row)
                par = row->par;
        }
        else {
-               if (row->par->next && row->par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
+               if (row->par->next
+                   && row->par->next->footnoteflag != LyXParagraph::OPEN_FOOTNOTE) {
                        par = row->par->LastPhysicalPar()->Next();
                } else {
                        par = row->par->next;
@@ -1717,15 +1873,17 @@ void LyXText::UpdateCounters(Row * row)
        while (par) {
                while (row->par != par)
                        row = row->next;
-      
+               
                SetCounter(par);
-      
+               
                /* now  check for the headline layouts. remember that they
                 * have a dynamic left margin */ 
                if (!par->IsDummy()
-                   && ( textclasslist.Style(parameters->textclass, par->layout).margintype == MARGIN_DYNAMIC
-                        || textclasslist.Style(parameters->textclass, par->layout).labeltype == LABEL_SENSITIVE)
-                       ){
+                   && ( textclasslist.Style(buffer->params.textclass,
+                                            par->layout).margintype == MARGIN_DYNAMIC
+                        || textclasslist.Style(buffer->params.textclass,
+                                               par->layout).labeltype == LABEL_SENSITIVE)
+                       ) {
         
                        /* Rebreak the paragraph */ 
                        RemoveParagraph(row);
@@ -1754,18 +1912,21 @@ void LyXText::UpdateCounters(Row * row)
 /* insets an inset. */ 
 void LyXText::InsertInset(Inset *inset)
 {
+       if (!cursor.par->InsertInsetAllowed(inset))
+               return;
        SetUndo(Undo::INSERT, 
                cursor.par->ParFromPos(cursor.pos)->previous, 
                cursor.par->ParFromPos(cursor.pos)->next);
-       cursor.par->InsertChar(cursor.pos, LYX_META_INSET);
+       cursor.par->InsertChar(cursor.pos, LyXParagraph::META_INSET);
        cursor.par->InsertInset(cursor.pos, inset);
-       InsertChar(LYX_META_INSET);  /* just to rebreak and refresh correctly.
+       InsertChar(LyXParagraph::META_INSET);  /* just to rebreak and refresh correctly.
                                      * The character will not be inserted a
                                      * second time */
 }
 
 
-/* this is for the simple cut and paste mechanism */ 
+#ifdef USE_OLD_CUT_AND_PASTE
+// this is for the simple cut and paste mechanism
 static LyXParagraph * simple_cut_buffer = 0;
 static char simple_cut_buffer_textclass = 0;
 
@@ -1773,7 +1934,7 @@ void DeleteSimpleCutBuffer()
 {
        if (!simple_cut_buffer)
                return;
-       LyXParagraph *tmppar;
+       LyXParagraph * tmppar;
 
        while (simple_cut_buffer) {
                tmppar =  simple_cut_buffer;
@@ -1782,7 +1943,7 @@ void DeleteSimpleCutBuffer()
        }
        simple_cut_buffer = 0;
 }
-
+#endif
 
 void LyXText::copyEnvironmentType()
 {
@@ -1795,40 +1956,43 @@ void LyXText::pasteEnvironmentType()
        SetLayout(copylayouttype);
 }
 
-
+#ifdef USE_OLD_CUT_AND_PASTE
 void LyXText::CutSelection(bool doclear)
 {
-       /* This doesn't make sense, if there is no selection */ 
-       if (!selection) {
+       // This doesn't make sense, if there is no selection
+       if (!selection)
                return;
-       }
    
-       /* OK, we have a selection. This is always between sel_start_cursor
-        * and sel_end cursor */
+       // OK, we have a selection. This is always between sel_start_cursor
+       // and sel_end cursor
        LyXParagraph * tmppar;
    
-       /* Check whether there are half footnotes in the selection */
+       // Check whether there are half footnotes in the selection
        if (sel_start_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
-           || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE){
+           || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
                tmppar = sel_start_cursor.par;
                while (tmppar != sel_end_cursor.par){
-                       if (tmppar->footnoteflag != sel_end_cursor.par->footnoteflag){
-                               WriteAlert(_("Impossible operation"), _("Don't know what to do with half floats."), _("sorry."));
+                       if (tmppar->footnoteflag != sel_end_cursor.par->footnoteflag) {
+                               WriteAlert(_("Impossible operation"),
+                                          _("Don't know what to do with half floats."),
+                                          _("sorry."));
                                return;
                        }
                        tmppar = tmppar->Next();
                }
        }
 
-       /* table stuff -- begin*/
-       if (sel_start_cursor.par->table || sel_end_cursor.par->table){
-               if ( sel_start_cursor.par != sel_end_cursor.par){
-                       WriteAlert(_("Impossible operation"), _("Don't know what to do with half tables."), _("sorry."));
+       /* table stuff -- begin */
+       if (sel_start_cursor.par->table || sel_end_cursor.par->table) {
+               if ( sel_start_cursor.par != sel_end_cursor.par) {
+                       WriteAlert(_("Impossible operation"),
+                                  _("Don't know what to do with half tables."),
+                                  _("sorry."));
                        return;
                }
                sel_start_cursor.par->table->Reinit();
        }
-       /* table stuff -- end*/
+       /* table stuff -- end */
 
        // make sure that the depth behind the selection are restored, too
        LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
@@ -1839,171 +2003,140 @@ void LyXText::CutSelection(bool doclear)
                        endpar = endpar->LastPhysicalPar()->Next();
                        undoendpar = endpar;
                }
-       }
-       else if (endpar) {
-               endpar = endpar->Next();               /* because of parindents etc.  */
+       } else if (endpar) {
+               endpar = endpar->Next(); // because of parindents etc.
        }
    
        SetUndo(Undo::DELETE, 
-               sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->previous, 
+               sel_start_cursor
+               .par->ParFromPos(sel_start_cursor.pos)->previous, 
                undoendpar);
    
-       /* delete the simple_cut_buffer */ 
+       // clear the simple_cut_buffer
        DeleteSimpleCutBuffer();
    
-       /* set the textclass */
-       simple_cut_buffer_textclass = parameters->textclass;
+       // set the textclass
+       simple_cut_buffer_textclass = buffer->params.textclass;
 
 #ifdef WITH_WARNINGS
 #warning Asger: Make cut more intelligent here.
 #endif
-/* 
-White paper for "intelligent" cutting:
-
-Example: "This is our text."
-Using " our " as selection, cutting will give "This istext.".
-Using "our" as selection, cutting will give "This is text.".
-Using " our" as selection, cutting will give "This is text.".
-Using "our " as selection, cutting will give "This is text.".
-
-All those four selections will (however) paste identically:
-Pasting with the cursor right after the "is" will give the
-original text with all four selections.
-
-The rationale is to be intelligent such that words are copied,
-cut and pasted in a functional manner.
-
-This is not implemented yet.
-*/
+       /* 
+          White paper for "intelligent" cutting:
+          
+          Example: "This is our text."
+          Using " our " as selection, cutting will give "This istext.".
+          Using "our" as selection, cutting will give "This is text.".
+          Using " our" as selection, cutting will give "This is text.".
+          Using "our " as selection, cutting will give "This is text.".
+          
+          All those four selections will (however) paste identically:
+          Pasting with the cursor right after the "is" will give the
+          original text with all four selections.
+          
+          The rationale is to be intelligent such that words are copied,
+          cut and pasted in a functional manner.
+          
+          This is not implemented yet. (Asger)
+
+          The changes below sees to do a lot of what you want. However
+          I have not verified that all cases work as they should:
+                    - cut in single row
+                    - cut in multiple row
+                    - cut with insets
+                    - cut across footnotes and paragraph
+          My simplistic tests show that the idea are basically sound but
+          there are some items to fix up...we only need to find them
+          first.
+
+          As do redo Asger's example above (with | beeing the cursor in the
+          result after cutting.):
+          
+          Example: "This is our text."
+          Using " our " as selection, cutting will give "This is|text.".
+          Using "our"   as selection, cutting will give "This is | text.".
+          Using " our"  as selection, cutting will give "This is| text.".
+          Using "our "  as selection, cutting will give "This is |text.".
 
-       bool space_wrapped =
-               sel_end_cursor.par->IsLineSeparator(sel_end_cursor.pos);
-       if (sel_end_cursor.pos > 0
-           && sel_end_cursor.par->IsLineSeparator(sel_end_cursor.pos - 1)) {
-               sel_end_cursor.pos--;  /* please break before a space at
-                                       * the end */
-               space_wrapped = true;
-       }
+          (Lgb)
+       */
 
-       // cut behind a space if there is one
-       while (sel_start_cursor.par->Last() > sel_start_cursor.pos
-              && sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos)
-              && (sel_start_cursor.par != sel_end_cursor.par
-                  || sel_start_cursor.pos < sel_end_cursor.pos))
-               sel_start_cursor.pos++; 
-   
-       /* there are two cases: cut only within one paragraph or
-        * more than one paragraph */
+       // there are two cases: cut only within one paragraph or
+       // more than one paragraph
    
        if (sel_start_cursor.par->ParFromPos(sel_start_cursor.pos) 
            == sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)) {
-               /* only within one paragraph */
+               // only within one paragraph
                simple_cut_buffer = new LyXParagraph;
-#ifdef NEW_TEXT
-               simple_cut_buffer->text.reserve(500);
                LyXParagraph::size_type i =
                        sel_start_cursor.pos;
-#else
-               int i = sel_start_cursor.pos;
-#endif
-               for (; i< sel_end_cursor.pos; i++){
-                       /* table stuff -- begin*/
+               for (; i < sel_end_cursor.pos; ++i) {
+                       /* table stuff -- begin */
                        if (sel_start_cursor.par->table
-                           && sel_start_cursor.par->IsNewline(sel_start_cursor.pos)){
+                           && sel_start_cursor.par->IsNewline(sel_start_cursor.pos)) {
                                sel_start_cursor.par->CopyIntoMinibuffer(sel_start_cursor.pos);
                                sel_start_cursor.pos++;
                        } else {
-                               /* table stuff -- end*/
+                               /* table stuff -- end */
                                sel_start_cursor.par->CopyIntoMinibuffer(sel_start_cursor.pos);
                                sel_start_cursor.par->Erase(sel_start_cursor.pos);
                        }
                        simple_cut_buffer->InsertFromMinibuffer(simple_cut_buffer->Last());
                }
-               /* check for double spaces */
-               if (sel_start_cursor.pos &&
-                   sel_start_cursor.par->Last()>sel_start_cursor.pos &&
-                   sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos - 1) &&
-                   sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos)){
-                       sel_start_cursor.par->Erase(sel_start_cursor.pos);
-               }
-               if (space_wrapped)
-                       simple_cut_buffer->InsertChar(i - sel_start_cursor.pos, ' ');
                endpar = sel_end_cursor.par->Next();
-       }
-       else {
-               /* cut more than one paragraph */ 
-   
-               sel_end_cursor.par->BreakParagraphConservative(sel_end_cursor.pos);
-               /* insert a space at the end if there was one */
-               if (space_wrapped)
-                       sel_end_cursor.par->InsertChar(sel_end_cursor.par->Last(), ' ');
+       } else {
+               // cut more than one paragraph
    
+               sel_end_cursor.par
+                       ->BreakParagraphConservative(sel_end_cursor.pos);
                sel_end_cursor.par = sel_end_cursor.par->Next();
                sel_end_cursor.pos = 0;
    
                cursor = sel_end_cursor;
-   
-               /* please break behind a space, if there is one. The space should
-                * be copied too */ 
-               if (sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos))
-                       sel_start_cursor.pos++;
-   
-               sel_start_cursor.par->BreakParagraphConservative(sel_start_cursor.pos);
-               if (!sel_start_cursor.pos
-                   || sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos - 1)
-                   || sel_start_cursor.par->IsNewline(sel_start_cursor.pos - 1)) {
-                       sel_start_cursor.par->Next()->InsertChar(0, ' ');
-               }
-   
-               /* store the endparagraph for redoing later */
-               endpar = sel_end_cursor.par->Next();   /* needed because
-                                                       * the sel_end_
-                                                       * cursor.par
-                                                       * will be pasted!*/
-   
-               /*store the selection */ 
-               simple_cut_buffer = sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->next;
+
+               sel_start_cursor.par
+                       ->BreakParagraphConservative(sel_start_cursor.pos);
+               // store the endparagraph for redoing later
+               endpar = sel_end_cursor.par->Next(); /* needed because
+                                                       the sel_end_
+                                                       cursor.par
+                                                       will be pasted! */
+   
+               // store the selection
+               simple_cut_buffer = sel_start_cursor.par
+                       ->ParFromPos(sel_start_cursor.pos)->next;
                simple_cut_buffer->previous = 0;
                sel_end_cursor.par->previous->next = 0;
 
-               /* cut the selection */ 
+               // cut the selection
                sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->next 
                        = sel_end_cursor.par;
    
                sel_end_cursor.par->previous 
                        = sel_start_cursor.par->ParFromPos(sel_start_cursor.pos);
 
-               /* care about footnotes */
+               // care about footnotes
                if (simple_cut_buffer->footnoteflag) {
-                       LyXParagraph *tmppar = simple_cut_buffer;
+                       LyXParagraph * tmppar = simple_cut_buffer;
                        while (tmppar){
                                tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE;
                                tmppar = tmppar->next;
                        }
                }
 
-               /* the cut selection should begin with standard layout */
+               // the cut selection should begin with standard layout
                simple_cut_buffer->Clear(); 
    
-               /* paste the paragraphs again, if possible  */
+               // paste the paragraphs again, if possible
                if (doclear)
                        sel_start_cursor.par->Next()->ClearParagraph();
                if (sel_start_cursor.par->FirstPhysicalPar()->HasSameLayout(sel_start_cursor.par->Next())
                    || 
                    !sel_start_cursor.par->Next()->Last())
                        sel_start_cursor.par->ParFromPos(sel_start_cursor.pos)->PasteParagraph();
+       }
 
-   
-               /* maybe a forgotten blank */
-               if (sel_start_cursor.pos 
-                   && sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos)
-                   && sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos - 1)) {
-                       sel_start_cursor.par->Erase(sel_start_cursor.pos);
-               }
-       }   
-
-
-       /* sometimes necessary */
+       // sometimes necessary
        if (doclear)
                sel_start_cursor.par->ClearParagraph();
 
@@ -2016,50 +2149,141 @@ This is not implemented yet.
        UpdateCounters(cursor.row);
 }
 
+#else ///////////////////////////////////////////////////////////////////
+
+void LyXText::CutSelection(bool doclear)
+{
+    // This doesn't make sense, if there is no selection
+    if (!selection)
+       return;
+   
+    // OK, we have a selection. This is always between sel_start_cursor
+    // and sel_end cursor
+    LyXParagraph * tmppar;
+    
+    // Check whether there are half footnotes in the selection
+    if (sel_start_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
+       || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
+       tmppar = sel_start_cursor.par;
+       while (tmppar != sel_end_cursor.par){
+           if (tmppar->footnoteflag != sel_end_cursor.par->footnoteflag) {
+               WriteAlert(_("Impossible operation"),
+                          _("Don't know what to do with half floats."),
+                          _("sorry."));
+               return;
+                       }
+           tmppar = tmppar->Next();
+       }
+    }
+    
+    /* table stuff -- begin */
+    if (sel_start_cursor.par->table || sel_end_cursor.par->table) {
+       if ( sel_start_cursor.par != sel_end_cursor.par) {
+           WriteAlert(_("Impossible operation"),
+                      _("Don't know what to do with half tables."),
+                      _("sorry."));
+           return;
+       }
+       sel_start_cursor.par->table->Reinit();
+    }
+    /* table stuff -- end */
+    
+    // make sure that the depth behind the selection are restored, too
+    LyXParagraph * endpar = sel_end_cursor.par->LastPhysicalPar()->Next();
+    LyXParagraph * undoendpar = endpar;
+    
+    if (endpar && endpar->GetDepth()) {
+       while (endpar && endpar->GetDepth()) {
+           endpar = endpar->LastPhysicalPar()->Next();
+           undoendpar = endpar;
+       }
+    } else if (endpar) {
+       endpar = endpar->Next(); // because of parindents etc.
+    }
+    
+    SetUndo(Undo::DELETE, sel_start_cursor
+           .par->ParFromPos(sel_start_cursor.pos)->previous, undoendpar);
+    
+    CutAndPaste cap;
+
+    // there are two cases: cut only within one paragraph or
+    // more than one paragraph
+    if (sel_start_cursor.par->ParFromPos(sel_start_cursor.pos) 
+       == sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)) {
+       // only within one paragraph
+       endpar = sel_start_cursor.par;
+       cap.cutSelection(sel_start_cursor.par, &endpar,
+                        sel_start_cursor.pos, sel_end_cursor.pos,
+                        buffer->params.textclass, doclear);
+    } else {
+       endpar = sel_end_cursor.par;
+
+       cap.cutSelection(sel_start_cursor.par, &endpar,
+                        sel_start_cursor.pos, sel_end_cursor.pos,
+                        buffer->params.textclass, doclear);
+       cursor.par = sel_end_cursor.par = endpar;
+       cursor.pos = sel_end_cursor.pos;
+    }
+    endpar = sel_end_cursor.par->Next();
+
+    // sometimes necessary
+    if (doclear)
+       sel_start_cursor.par->ClearParagraph();
+
+    RedoParagraphs(sel_start_cursor, endpar);
+   
+    ClearSelection();
+    cursor = sel_start_cursor;
+    SetCursor(cursor.par, cursor.pos);
+    sel_cursor = cursor;
+    UpdateCounters(cursor.row);
+}
+#endif
     
+#ifdef USE_OLD_CUT_AND_PASTE
 void LyXText::CopySelection()
 {
-#ifdef NEW_TEXT
-       LyXParagraph::size_type i = 0;
-#else
-       int i = 0;
-#endif
-       /* this doesnt make sense, if there is no selection */ 
-       if (!selection) {
+       // this doesnt make sense, if there is no selection
+       if (!selection)
                return;
-       }
 
-       /* ok we have a selection. This is always between sel_start_cursor
-        * and sel_end cursor */
+       // ok we have a selection. This is always between sel_start_cursor
+       // and sel_end cursor
        LyXParagraph * tmppar;
    
        /* check wether there are half footnotes in the selection */
        if (sel_start_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
-           || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE){
+           || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
                tmppar = sel_start_cursor.par;
-               while (tmppar != sel_end_cursor.par){
-                       if (tmppar->footnoteflag != sel_end_cursor.par->footnoteflag){
-                               WriteAlert(_("Impossible operation"), _("Don't know what to do with half floats."), _("sorry."));
+               while (tmppar != sel_end_cursor.par) {
+                       if (tmppar->footnoteflag !=
+                           sel_end_cursor.par->footnoteflag) {
+                               WriteAlert(_("Impossible operation"),
+                                          _("Don't know what to do"
+                                            " with half floats."),
+                                          _("sorry."));
                                return;
                        }
                        tmppar = tmppar->Next();
                }
        }
 
-       /* table stuff -- begin*/
+       /* table stuff -- begin */
        if (sel_start_cursor.par->table || sel_end_cursor.par->table){
                if ( sel_start_cursor.par != sel_end_cursor.par){
-                       WriteAlert(_("Impossible operation"), _("Don't know what to do with half tables."), _("sorry."));
+                       WriteAlert(_("Impossible operation"),
+                                  _("Don't know what to do with half tables."),
+                                  _("sorry."));
                        return;
                }
        }
-       /* table stuff -- end*/
+       /* table stuff -- end */
    
-       /* delete the simple_cut_buffer */ 
+       // delete the simple_cut_buffer
        DeleteSimpleCutBuffer();
 
-       /* set the textclass */
-       simple_cut_buffer_textclass = parameters->textclass;
+       // set the textclass
+       simple_cut_buffer_textclass = buffer->params.textclass;
 
        // copy behind a space if there is one
        while (sel_start_cursor.par->Last() > sel_start_cursor.pos
@@ -2068,23 +2292,22 @@ void LyXText::CopySelection()
                   || sel_start_cursor.pos < sel_end_cursor.pos))
                sel_start_cursor.pos++; 
 
-       /* there are two cases: copy only within one paragraph or more than one paragraph */
+       // there are two cases: copy only within one paragraph
+       // or more than one paragraph
        if (sel_start_cursor.par->ParFromPos(sel_start_cursor.pos) 
            == sel_end_cursor.par->ParFromPos(sel_end_cursor.pos)) {
-               /* only within one paragraph */
+               // only within one paragraph
                simple_cut_buffer = new LyXParagraph;
-#if NEW_TEXT
-               simple_cut_buffer->text.reserve(500);
-#endif
+               LyXParagraph::size_type i = 0;
                for (i = sel_start_cursor.pos; i < sel_end_cursor.pos; ++i){
                        sel_start_cursor.par->CopyIntoMinibuffer(i);
                        simple_cut_buffer->InsertFromMinibuffer(i - sel_start_cursor.pos);
                }
-       }
-       else {
-               /* copy more than one paragraph */ 
-               /* clone the paragraphs within the selection*/
-               tmppar = sel_start_cursor.par->ParFromPos(sel_start_cursor.pos);
+       } else {
+               // copy more than one paragraph
+               // clone the paragraphs within the selection
+               tmppar =
+                       sel_start_cursor.par->ParFromPos(sel_start_cursor.pos);
                simple_cut_buffer = tmppar->Clone();
                LyXParagraph *tmppar2 = simple_cut_buffer;
      
@@ -2093,49 +2316,94 @@ void LyXText::CopySelection()
                        tmppar = tmppar->next;
                        tmppar2->next = tmppar->Clone();
                        tmppar2->next->previous = tmppar2;
-                       tmppar2=tmppar2->next;
+                       tmppar2 = tmppar2->next;
                }
                tmppar2->next = 0;
 
-               /* care about footnotes */
+               // care about footnotes
                if (simple_cut_buffer->footnoteflag) {
                        tmppar = simple_cut_buffer;
                        while (tmppar){
-                               tmppar->footnoteflag = LyXParagraph::NO_FOOTNOTE;
+                               tmppar->footnoteflag =
+                                       LyXParagraph::NO_FOOTNOTE;
                                tmppar = tmppar->next;
                        }
                }
-     
-               /* the simple_cut_buffer paragraph is too big */
-#ifdef NEW_TEXT
+               
+               // the simple_cut_buffer paragraph is too big
                LyXParagraph::size_type tmpi2 =
                        sel_start_cursor.par->PositionInParFromPos(sel_start_cursor.pos);
-#else
-               int tmpi2 =
-                       sel_start_cursor.par->PositionInParFromPos(sel_start_cursor.pos);
-#endif
-               for (;tmpi2;tmpi2--)
+               for (; tmpi2; --tmpi2)
                        simple_cut_buffer->Erase(0);
-
-               /* now tmppar 2 is too big, delete all after sel_end_cursor.pos */
+               
+               // now tmppar 2 is too big, delete all after sel_end_cursor.pos
      
                tmpi2 = sel_end_cursor.par->PositionInParFromPos(sel_end_cursor.pos);
-#ifdef NEW_TEXT
                while (tmppar2->size() > tmpi2) {
-                       tmppar2->Erase(tmppar2->text.size() - 1);
+                       tmppar2->Erase(tmppar2->size() - 1);
                }
-#else
-               while (tmppar2->last > tmpi2) {
-                       tmppar2->Erase(tmppar2->last-1);
+       }
+}
+
+#else //////////////////////////////////////////////////////////////////////
+
+void LyXText::CopySelection()
+{
+       // this doesnt make sense, if there is no selection
+       if (!selection)
+               return;
+
+       // ok we have a selection. This is always between sel_start_cursor
+       // and sel_end cursor
+       LyXParagraph * tmppar;
+   
+       /* check wether there are half footnotes in the selection */
+       if (sel_start_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE
+           || sel_end_cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
+               tmppar = sel_start_cursor.par;
+               while (tmppar != sel_end_cursor.par) {
+                       if (tmppar->footnoteflag !=
+                           sel_end_cursor.par->footnoteflag) {
+                               WriteAlert(_("Impossible operation"),
+                                          _("Don't know what to do"
+                                            " with half floats."),
+                                          _("sorry."));
+                               return;
+                       }
+                       tmppar = tmppar->Next();
                }
-#endif
        }
+
+       /* table stuff -- begin */
+       if (sel_start_cursor.par->table || sel_end_cursor.par->table){
+               if ( sel_start_cursor.par != sel_end_cursor.par){
+                       WriteAlert(_("Impossible operation"),
+                                  _("Don't know what to do with half tables."),
+                                  _("sorry."));
+                       return;
+               }
+       }
+       /* table stuff -- end */
+   
+       // copy behind a space if there is one
+       while (sel_start_cursor.par->Last() > sel_start_cursor.pos
+              && sel_start_cursor.par->IsLineSeparator(sel_start_cursor.pos)
+              && (sel_start_cursor.par != sel_end_cursor.par
+                  || sel_start_cursor.pos < sel_end_cursor.pos))
+               sel_start_cursor.pos++; 
+
+       CutAndPaste cap;
+
+       cap.copySelection(sel_start_cursor.par, sel_end_cursor.par,
+                         sel_start_cursor.pos, sel_end_cursor.pos,
+                         buffer->params.textclass);
 }
-          
+#endif          
 
+#ifdef USE_OLD_CUT_AND_PASTE
 void LyXText::PasteSelection()
 {
-       /* this does not make sense, if there is nothing to paste */ 
+       // this does not make sense, if there is nothing to paste
        if (!simple_cut_buffer)
                return;
 
@@ -2144,31 +2412,33 @@ void LyXText::PasteSelection()
 
        LyXCursor tmpcursor;
 
-       /* be carefull with footnotes in footnotes */ 
+       // be carefull with footnotes in footnotes
        if (cursor.par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
       
-               /* check whether the cut_buffer includes a footnote */
+               // check whether the cut_buffer includes a footnote
                tmppar = simple_cut_buffer;
-               while (tmppar && tmppar->footnoteflag == LyXParagraph::NO_FOOTNOTE)
+               while (tmppar
+                      && tmppar->footnoteflag == LyXParagraph::NO_FOOTNOTE)
                        tmppar = tmppar->next;
       
                if (tmppar) {
                        WriteAlert(_("Impossible operation"),
-                                  _("Can't paste float into float!"), _("Sorry."));
+                                  _("Can't paste float into float!"),
+                                  _("Sorry."));
                        return;
                }
        }
 
-       /* table stuff -- begin*/
-       if (cursor.par->table){
-               if (simple_cut_buffer->next){
+       /* table stuff -- begin */
+       if (cursor.par->table) {
+               if (simple_cut_buffer->next) {
                        WriteAlert(_("Impossible operation"),
                                   _("Table cell cannot include more than one paragraph!"),
                                   _("Sorry."));
                        return;
                }
        }
-       /* table stuff -- end*/
+       /* table stuff -- end */
    
        SetUndo(Undo::INSERT, 
                cursor.par->ParFromPos(cursor.pos)->previous, 
@@ -2176,25 +2446,16 @@ void LyXText::PasteSelection()
 
        tmpcursor = cursor;
 
-       /* There are two cases: cutbuffer only one paragraph or many */
+       // There are two cases: cutbuffer only one paragraph or many
        if (!simple_cut_buffer->next) {
-               /* only within a paragraph */
-     
-               /* please break behind a space, if there is one */
-               while (tmpcursor.par->Last() > tmpcursor.pos
-                      && tmpcursor.par->IsLineSeparator(tmpcursor.pos))
-                       tmpcursor.pos++; 
+               // only within a paragraph
 
                tmppar = simple_cut_buffer->Clone();
-               /* table stuff -- begin*/
+               /* table stuff -- begin */
                bool table_too_small = false;
                if (tmpcursor.par->table) {
-#ifdef NEW_TEXT
-                       while (simple_cut_buffer->text.size()
+                       while (simple_cut_buffer->size()
                               && !table_too_small) {
-#else
-                       while (simple_cut_buffer->last && !table_too_small){
-#endif
                                if (simple_cut_buffer->IsNewline(0)){
                                        while(tmpcursor.pos < tmpcursor.par->Last() && !tmpcursor.par->IsNewline(tmpcursor.pos))
                                                tmpcursor.pos++;
@@ -2203,6 +2464,36 @@ void LyXText::PasteSelection()
                                                tmpcursor.pos++;
                                        else
                                                table_too_small = true;
+                               } else {
+                                       // This is an attempt to fix the
+                                       // "never insert a space at the
+                                       // beginning of a paragraph" problem.
+                                       if (tmpcursor.pos == 0
+                                           && simple_cut_buffer->IsLineSeparator(0)) {
+                                               simple_cut_buffer->Erase(0);
+                                       } else {
+                                               simple_cut_buffer->CutIntoMinibuffer(0);
+                                               simple_cut_buffer->Erase(0);
+                                               tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
+                                               tmpcursor.pos++;
+                                       }
+                               }
+                       }
+               } else {
+                       /* table stuff -- end */
+                       // Some provisions should be done here for checking
+                       // if we are inserting at the beginning of a
+                       // paragraph. If there are a space at the beginning
+                       // of the text to insert and we are inserting at
+                       // the beginning of the paragraph the space should
+                       // be removed.
+                       while (simple_cut_buffer->size()) {
+                               // This is an attempt to fix the
+                               // "never insert a space at the
+                               // beginning of a paragraph" problem.
+                               if (tmpcursor.pos == 0
+                                   && simple_cut_buffer->IsLineSeparator(0)) {
+                                       simple_cut_buffer->Erase(0);
                                } else {
                                        simple_cut_buffer->CutIntoMinibuffer(0);
                                        simple_cut_buffer->Erase(0);
@@ -2210,27 +2501,15 @@ void LyXText::PasteSelection()
                                        tmpcursor.pos++;
                                }
                        }
-               } else {
-                       /* table stuff -- end*/
-#ifdef NEW_TEXT
-                       while (simple_cut_buffer->text.size()){
-#else
-                       while (simple_cut_buffer->last){
-#endif
-                               simple_cut_buffer->CutIntoMinibuffer(0);
-                               simple_cut_buffer->Erase(0);
-                               tmpcursor.par->InsertFromMinibuffer(tmpcursor.pos);
-                               tmpcursor.pos++;
-                       }
                }
-
                delete simple_cut_buffer;
                simple_cut_buffer = tmppar;
                endpar = tmpcursor.par->Next();
        } else {
-               /* many paragraphs */
+               // many paragraphs
+               CutAndPaste cap;
 
-               /* make a copy of the simple cut_buffer */
+               // make a copy of the simple cut_buffer
                tmppar = simple_cut_buffer;
                LyXParagraph * simple_cut_clone = tmppar->Clone();
                LyXParagraph * tmppar2 = simple_cut_clone;
@@ -2242,124 +2521,76 @@ void LyXText::PasteSelection()
                        tmppar = tmppar->next;
                        tmppar2->next = tmppar->Clone();
                        tmppar2->next->previous = tmppar2;
-                       tmppar2=tmppar2->next;
+                       tmppar2 = tmppar2->next;
                        if (cursor.par->footnoteflag){
                                tmppar->footnoteflag = cursor.par->footnoteflag;
                                tmppar->footnotekind = cursor.par->footnotekind;
                        }
                }
      
-               /* make sure there is no class difference */ 
-               SwitchLayoutsBetweenClasses(simple_cut_buffer_textclass,
-                                           parameters->textclass,
-                                           simple_cut_buffer);
+               // make sure there is no class difference
+               cap.SwitchLayoutsBetweenClasses(simple_cut_buffer_textclass,
+                                               buffer->params.textclass,
+                                               simple_cut_buffer);
      
-               /* make the simple_cut_buffer exactly the same layout than
-                  the cursor paragraph */
+               // make the simple_cut_buffer exactly the same layout than
+               // the cursor paragraph
                simple_cut_buffer->MakeSameLayout(cursor.par);
      
-               /* find the end of the buffer */ 
-               LyXParagraph *lastbuffer = simple_cut_buffer;
-               while (lastbuffer->Next())
-                       lastbuffer=lastbuffer->Next();
-     
-               /* find the physical end of the buffer */ 
-               lastbuffer = simple_cut_buffer;
+               // find the end of the buffer
+               LyXParagraph * lastbuffer = simple_cut_buffer;
                while (lastbuffer->Next())
-                       lastbuffer=lastbuffer->Next();
-     
-               /* please break behind a space, if there is one. The space 
-                * should be copied too */
-               if (cursor.par->Last() > cursor.pos && cursor.par->IsLineSeparator(cursor.pos))
-                       cursor.pos++; 
+                       lastbuffer = lastbuffer->Next();
      
                bool paste_the_end = false;
 
-               /* open the paragraph for inserting the simple_cut_buffer
-                  if necessary */
+               // open the paragraph for inserting the simple_cut_buffer
+               // if necessary
                if (cursor.par->Last() > cursor.pos || !cursor.par->Next()){
                        cursor.par->BreakParagraphConservative(cursor.pos);
                        paste_the_end = true;
                }
-     
-               /* be careful with double spaces */ 
-               if ((!cursor.par->Last()
-                    || cursor.par->IsLineSeparator(cursor.pos - 1)
-                    || cursor.par->IsNewline(cursor.pos - 1))
-#ifdef NEW_TEXT
-                   && simple_cut_buffer->text.size()
-#else
-                   && simple_cut_buffer->last
-#endif
-                   && simple_cut_buffer->IsLineSeparator(0))
-                       simple_cut_buffer->Erase(0);
-     
-               /* set the end for redoing later */ 
+
+               // set the end for redoing later
                endpar = cursor.par->ParFromPos(cursor.pos)->next->Next();
      
-               /* paste it! */ 
-               lastbuffer->ParFromPos(lastbuffer->Last())->next = cursor.par->ParFromPos(cursor.pos)->next;
-               cursor.par->ParFromPos(cursor.pos)->next->previous = lastbuffer->ParFromPos(lastbuffer->Last());
+               // paste it!
+               lastbuffer->ParFromPos(lastbuffer->Last())->next =
+                       cursor.par->ParFromPos(cursor.pos)->next;
+               cursor.par->ParFromPos(cursor.pos)->next->previous =
+                       lastbuffer->ParFromPos(lastbuffer->Last());
      
                cursor.par->ParFromPos(cursor.pos)->next = simple_cut_buffer;
-               simple_cut_buffer->previous = cursor.par->ParFromPos(cursor.pos);
+               simple_cut_buffer->previous =
+                       cursor.par->ParFromPos(cursor.pos);
    
                if (cursor.par->ParFromPos(cursor.pos)->Next() == lastbuffer)
                        lastbuffer = cursor.par;
      
                cursor.par->ParFromPos(cursor.pos)->PasteParagraph();
      
-               /* store the new cursor position  */
+               // store the new cursor position
                tmpcursor.par = lastbuffer;
                tmpcursor.pos = lastbuffer->Last();
      
-               /* maybe some pasting */ 
+               // maybe some pasting
                if (lastbuffer->Next() && paste_the_end) {
                        if (lastbuffer->Next()->HasSameLayout(lastbuffer)) {
-        
-                               /* be careful witth double spaces */ 
-                               if ((!lastbuffer->Last()
-                                    || lastbuffer->IsLineSeparator(lastbuffer->Last() - 1)
-                                    || lastbuffer->IsNewline(lastbuffer->Last() - 1))
-                                   && lastbuffer->Next()->Last()
-                                   && lastbuffer->Next()->IsLineSeparator(0))
-                                       lastbuffer->Next()->Erase(0);
-        
                                lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
         
-                       }
-                       else if (!lastbuffer->Next()->Last()) {
+                       } else if (!lastbuffer->Next()->Last()) {
                                lastbuffer->Next()->MakeSameLayout(lastbuffer);
-        
-                               /* be careful witth double spaces */ 
-                               if ((!lastbuffer->Last()
-                                    || lastbuffer->IsLineSeparator(lastbuffer->Last() - 1)
-                                    || lastbuffer->IsNewline(lastbuffer->Last() - 1))
-                                   && lastbuffer->Next()->Last()
-                                   && lastbuffer->Next()->IsLineSeparator(0))
-                                       lastbuffer->Next()->Erase(0);
-        
                                lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
         
-                       }
-                       else if (!lastbuffer->Last()) {
+                       } else if (!lastbuffer->Last()) {
                                lastbuffer->MakeSameLayout(lastbuffer->next);
-        
-                               /* be careful witth double spaces */ 
-                               if ((!lastbuffer->Last()
-                                    || lastbuffer->IsLineSeparator(lastbuffer->Last() - 1)
-                                    || lastbuffer->IsNewline(lastbuffer->Last() - 1))
-                                   && lastbuffer->Next()->Last()
-                                   && lastbuffer->Next()->IsLineSeparator(0))
-                                       lastbuffer->Next()->Erase(0);
-        
                                lastbuffer->ParFromPos(lastbuffer->Last())->PasteParagraph();
         
-                       }
-                       else lastbuffer->Next()->ClearParagraph();
+                       } else
+                               lastbuffer->Next()->ClearParagraph();
                }
 
-               /* restore the simple cut buffer */
+               // restore the simple cut buffer
                simple_cut_buffer = simple_cut_clone;
        }
 
@@ -2373,23 +2604,50 @@ void LyXText::PasteSelection()
        SetSelection();
        UpdateCounters(cursor.row);
 }
+
+#else ////////////////////////////////////////////////////////////////////
+
+void LyXText::PasteSelection()
+{
+    CutAndPaste cap;
+
+    // this does not make sense, if there is nothing to paste
+    if (!cap.checkPastePossible(cursor.par, cursor.pos))
+       return;
+
+    SetUndo(Undo::INSERT, 
+           cursor.par->ParFromPos(cursor.pos)->previous, 
+           cursor.par->ParFromPos(cursor.pos)->next); 
+
+    LyXParagraph *endpar;
+    LyXParagraph *actpar = cursor.par;
+    int endpos = cursor.pos;
+
+    cap.pasteSelection(&actpar, &endpar, endpos, buffer->params.textclass);
+
+    RedoParagraphs(cursor, endpar);
+    
+    SetCursor(cursor.par, cursor.pos);
+    ClearSelection();
    
+    sel_cursor = cursor;
+    SetCursor(actpar, endpos);
+    SetSelection();
+    UpdateCounters(cursor.row);
+}
+#endif   
 
-/* returns a pointer to the very first LyXParagraph */ 
-LyXParagraph * LyXText::FirstParagraph()
+// returns a pointer to the very first LyXParagraph
+LyXParagraph * LyXText::FirstParagraph() const
 {
-       return params->paragraph;
+       return buffer->paragraph;
 }
 
 
-/* returns true if the specified string is at the specified position */
-#ifdef NEW_TEXT
+// returns true if the specified string is at the specified position
 bool LyXText::IsStringInText(LyXParagraph * par,
                             LyXParagraph::size_type pos,
-                            char const * str)
-#else 
-bool LyXText::IsStringInText(LyXParagraph * par, int pos, char const * str)
-#endif
+                            char const * str) const
 {
        if (par) {
                int i = 0;
@@ -2404,7 +2662,7 @@ bool LyXText::IsStringInText(LyXParagraph * par, int pos, char const * str)
 }
 
 
-/* sets the selection over the number of characters of string, no check!! */
+// sets the selection over the number of characters of string, no check!!
 void LyXText::SetSelectionOverString(char const * string)
 {
        sel_cursor = cursor;
@@ -2414,23 +2672,19 @@ void LyXText::SetSelectionOverString(char const * string)
 }
 
 
-/* simple replacing. The font of the first selected character is used */
+// simple replacing. The font of the first selected character is used
 void LyXText::ReplaceSelectionWithString(char const * str)
 {
        SetCursorParUndo();
        FreezeUndo();
 
-       if (!selection) { /* create a dummy selection */
+       if (!selection) { // create a dummy selection
                sel_end_cursor = cursor;
                sel_start_cursor = cursor;
        }
 
        // Get font setting before we cut
-#ifdef NEW_TEXT
        LyXParagraph::size_type pos = sel_end_cursor.pos;
-#else
-       int pos = sel_end_cursor.pos;
-#endif
        LyXFont font = sel_start_cursor.par->GetFontSettings(sel_start_cursor.pos);
 
        // Insert the new string
@@ -2447,16 +2701,12 @@ void LyXText::ReplaceSelectionWithString(char const * str)
 }
 
 
-/* if the string can be found: return true and set the cursor to
- * the new position */
-bool LyXText::SearchForward(char const * str)
+// if the string can be found: return true and set the cursor to
+// the new position
+bool LyXText::SearchForward(char const * str) const
 {
        LyXParagraph * par = cursor.par;
-#ifdef NEW_TEXT
        LyXParagraph::size_type pos = cursor.pos;
-#else
-       int pos = cursor.pos;
-#endif
        while (par && !IsStringInText(par, pos, str)) {
                if (pos < par->Last() - 1)
                        ++pos;
@@ -2466,7 +2716,7 @@ bool LyXText::SearchForward(char const * str)
                }
        }
        if (par) {
-               SetCursor(par,pos);
+               SetCursor(par, pos);
                return true;
        }
        else
@@ -2474,185 +2724,150 @@ bool LyXText::SearchForward(char const * str)
 }
 
 
-bool LyXText::SearchBackward(char const * string)
+bool LyXText::SearchBackward(char const * string) const
 {
        LyXParagraph * par = cursor.par;
        int pos = cursor.pos;
 
        do {
-               if (pos>0)
-                       pos--;
+               if (pos > 0)
+                       --pos;
                else {
                        // We skip empty paragraphs (Asger)
                        do {
                                par = par->Previous();
                                if (par)
-                                       pos = par->Last()-1;
-                       } while (par && pos<0);
+                                       pos = par->Last() - 1;
+                       } while (par && pos < 0);
                }
-       } while (par && !IsStringInText(par,pos,string));
+       } while (par && !IsStringInText(par, pos, string));
   
        if (par) {
-               SetCursor(par,pos);
+               SetCursor(par, pos);
                return true;
-       }
-       else
+       } else
                return false;
 }
 
 
-#ifdef NEW_TEXT
-void LyXText::InsertStringA(LyXParagraph::TextContainer const & text)
-{
-       char * str = new char[text.size() + 1];
-       // shoudl use std::copy or something
-       for (LyXParagraph::size_type i = 0; i < static_cast<int>(text.size());
-            ++i) {
-               str[i] = text[i];
-       }
-       str[text.size()] = '\0';
-       InsertStringA(str);
-       delete [] str;
-}
-#endif
-
-/* needed to insert the selection */
-void LyXText::InsertStringA(char const * str)
+// needed to insert the selection
+void LyXText::InsertStringA(string const & str)
 {
        LyXParagraph * par = cursor.par;
-#ifdef NEW_TEXT
        LyXParagraph::size_type pos = cursor.pos;
        LyXParagraph::size_type a = 0;
-#else
-       int pos = cursor.pos;
-       int a = 0;
-#endif
         int cell = 0;
        LyXParagraph * endpar = cursor.par->Next();
-
+       
        SetCursorParUndo();
-
-       char flag = textclasslist.Style(parameters->textclass, 
-                                  cursor.par->GetLayout()).isEnvironment();
-       /* only to be sure, should not be neccessary */ 
+       
+       bool flag =
+               textclasslist.Style(buffer->params.textclass, 
+                                   cursor.par->GetLayout()).isEnvironment();
+       // only to be sure, should not be neccessary
        ClearSelection();
-   
-       /* insert the string, don't insert doublespace */ 
-       int i = 0;
-#ifndef NEW_TEXT
-       int i2 = 0;
-       for (i2 = i; str[i2] && str[i2] != '\n'; ++i2);
-       par->Enlarge(pos, i2 - i);
-#endif
-       while (str[i]) {
-               if (str[i]!='\n') {
-                       if (str[i]==' ' && (str[i+1]!=' ')
-                           && pos && par->GetChar(pos-1)!=' ') {
+       
+       // insert the string, don't insert doublespace
+       string::size_type i = 0;
+       while (i < str.length()) {
+               if (str[i] != '\n') {
+                       if (str[i] == ' ' 
+                           && i + 1 < str.length() && str[i + 1] != ' '
+                           && pos && par->GetChar(pos - 1)!= ' ') {
                                par->InsertChar(pos,' ');
-                               pos++;
-                       }
-                        else if (par->table) {
-                            if (str[i] == '\t') {
-#ifdef NEW_TEXT
-                                while((pos < par->size()) &&
-                                      (par->GetChar(pos) != LYX_META_NEWLINE))
-                                        ++pos;
-                                if (pos < par->size())
-                                        ++pos;
-#else
-                                while((pos < par->last) &&
-                                      (par->GetChar(pos) != LYX_META_NEWLINE))
-                                        ++pos;
-                                if (pos < par->last)
-                                        ++pos;
-#endif
-                                else // no more fields to fill skip the rest
-                                        break;
-                            } else if ((str[i] != 13) &&
-                                ((str[i] & 127) >= ' ')) {
-                                par->InsertChar(pos,str[i]);
-                                pos++;
-                            }
-                        }
-                       else if (str[i]==' ') {
-                               par->InsertChar(pos,LYX_META_PROTECTED_SEPARATOR);
-                               pos++;
-                       }
-                       else if (str[i]=='\t') {
-                               for (a = pos; a < (pos/8 + 1) * 8 ; ++a) {
-                                       par->InsertChar(a, LYX_META_PROTECTED_SEPARATOR);
+                               par->SetFont(pos, current_font);
+                               ++pos;
+                       } else if (par->table) {
+                               if (str[i] == '\t') {
+                                       while((pos < par->size()) &&
+                                             (par->GetChar(pos) != LyXParagraph::META_NEWLINE))
+                                               ++pos;
+                                       if (pos < par->size())
+                                               ++pos;
+                                       else // no more fields to fill skip the rest
+                                               break;
+                               } else if ((str[i] != 13) &&
+                                          ((str[i] & 127) >= ' ')) {
+                                       par->InsertChar(pos, str[i]);
+                                       par->SetFont(pos, current_font);
+                                       ++pos;
+                               }
+                        } else if (str[i] == ' ') {
+                               InsetSpecialChar * new_inset =
+                                       new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
+                               if (par->InsertInsetAllowed(new_inset)) {
+                                       par->InsertChar(pos, LyXParagraph::META_INSET);
+                                       par->SetFont(pos, current_font);
+                                       par->InsertInset(pos, new_inset);
+                               } else {
+                                       delete new_inset;
+                               }
+                               ++pos;
+                       } else if (str[i] == '\t') {
+                               for (a = pos; a < (pos / 8 + 1) * 8 ; ++a) {
+                               InsetSpecialChar * new_inset =
+                                       new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
+                               if (par->InsertInsetAllowed(new_inset)) {
+                                       par->InsertChar(pos, LyXParagraph::META_INSET);
+                                       par->SetFont(pos, current_font);
+                                       par->InsertInset(pos, new_inset);
+                               } else {
+                                       delete new_inset;
+                               }
                                }
                                pos = a;
-                       }
-                       else if (str[i]!=13 && 
-                                // Ignore unprintables
-                                (str[i] & 127) >= ' ') {
-                               par->InsertChar(pos,str[i]);
-                               pos++;
+                       } else if (str[i] != 13 && 
+                                  // Ignore unprintables
+                                  (str[i] & 127) >= ' ') {
+                               par->InsertChar(pos, str[i]);
+                               par->SetFont(pos, current_font);
+                               ++pos;
                        }
                } else {
                         if (par->table) {
-                                if (!str[i+1]) {
-                                        pos++;
+                                if (i + 1 >= str.length()) {
+                                        ++pos;
                                         break;
                                 }
-#ifdef NEW_TEXT
                                 while((pos < par->size()) &&
-#else
-                                while((pos < par->last) &&
-#endif
-                                      (par->GetChar(pos) != LYX_META_NEWLINE))
-                                        pos++;
-                                pos++;
-                                cell=NumberOfCell(par,pos);
-#ifdef NEW_TEXT
+                                      (par->GetChar(pos) != LyXParagraph::META_NEWLINE))
+                                        ++pos;
+                                ++pos;
+                                cell = NumberOfCell(par, pos);
                                 while((pos < par->size()) &&
                                       !(par->table->IsFirstCell(cell))) {
+
                                         while((pos < par->size()) &&
-                                              (par->GetChar(pos) != LYX_META_NEWLINE))
+                                              (par->GetChar(pos) != LyXParagraph::META_NEWLINE))
                                                 ++pos;
                                         ++pos;
-                                        cell=NumberOfCell(par,pos);
+                                        cell = NumberOfCell(par, pos);
                                 }
                                 if (pos >= par->size())
                                         // no more fields to fill skip the rest
                                         break;
-#else
-                                while((pos < par->last) &&
-                                      !(par->table->IsFirstCell(cell))) {
-                                        while((pos < par->last) &&
-                                              (par->GetChar(pos) != LYX_META_NEWLINE))
-                                                pos++;
-                                        pos++;
-                                        cell=NumberOfCell(par,pos);
-                                }
-                                if (pos >= par->last)
-                                        // no more fields to fill skip the rest
-                                        break;
-#endif
                         } else {
-#ifdef NEW_TEXT
-                                if (!par->text.size()) {
-#else
-                                if (!par->last) {
-#endif
-                                        par->InsertChar(pos,LYX_META_PROTECTED_SEPARATOR);
-                                        pos++;
+                                if (!par->size()) { // par is empty
+                                       InsetSpecialChar * new_inset =
+                                               new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
+                                       if (par->InsertInsetAllowed(new_inset)) {
+                                               par->InsertChar(pos, LyXParagraph::META_INSET);
+                                               par->SetFont(pos, current_font);
+                                               par->InsertInset(pos, new_inset);
+                                       } else {
+                                               delete new_inset;
+                                       }
+                                        ++pos;
                                 }
                                 par->BreakParagraph(pos, flag);
                                 par = par->Next();
                                 pos = 0;
                         }
-#ifndef NEW_TEXT
-                       for (i2 = i; str[i2] && str[i2] != '\n'; i2++);
-                       par->Enlarge(pos, i2 - i);
-#endif
                }
-      
-               i++;
+               ++i;
        }
-   
-       RedoParagraphs(cursor,endpar);
+       
+       RedoParagraphs(cursor, endpar);
        SetCursor(cursor.par, cursor.pos);
        sel_cursor = cursor;
        SetCursor(par, pos);
@@ -2660,154 +2875,94 @@ void LyXText::InsertStringA(char const * str)
 }
 
 
-#ifdef NEW_TEXT
-void LyXText::InsertStringB(LyXParagraph::TextContainer const & text)
-{
-       char * str = new char[text.size() + 1];
-       // should use std::copy or something
-       for(LyXParagraph::size_type i = 0; i < static_cast<int>(text.size());
-           ++i) {
-               str[i] = text[i];
-       }
-       str[text.size()] = '\0';
-       InsertStringB(str);
-       delete [] str;
-}
-#endif
 /* turns double-CR to single CR, others where converted into one blank and 13s 
  * that are ignored .Double spaces are also converted into one. Spaces at
  * the beginning of a paragraph are forbidden. tabs are converted into one
  * space. then InsertStringA is called */ 
-void LyXText::InsertStringB(char const * s)
+void LyXText::InsertStringB(string const & s)
 {
        string str(s);
        LyXParagraph * par = cursor.par;
-       int i = 1;
-       while (str[i]) {
+       string::size_type i = 1;
+       while (i < str.length()) {
                if (str[i] == '\t' && !par->table)
                        str[i] = ' ';
-               if (str[i] == ' ' && str[i + 1] == ' ')
+               if (str[i] == ' ' && i + 1 < str.length() && str[i + 1] == ' ')
                        str[i] = 13;
-               if (str[i] == '\n' && str[i + 1] && !par->table){
+               if (str[i] == '\n' && i + 1 < str.length() && !par->table){
                        if (str[i + 1] != '\n') {
                                if (str[i - 1] != ' ')
                                        str[i] = ' ';
                                else
                                        str[i] = 13;
                        }
-                       while (str[i + 1] && (str[i + 1] == ' '
-                                              || str[i + 1] == '\t'
-                                              || str[i + 1] == '\n'
-                                              || str[i + 1] == 13)) {
+                       while (i + 1 < str.length() 
+                              && (str[i + 1] == ' ' 
+                                  || str[i + 1] == '\t'
+                                  || str[i + 1] == '\n' 
+                                  || str[i + 1] == 13)) {
                                str[i + 1] = 13;
                                ++i;
                        }
                }
                ++i;
        }
-       InsertStringA(str.c_str());
+       InsertStringA(str);
 }
 
 
-bool LyXText::GotoNextError()
+bool LyXText::GotoNextError() const
 {
-       LyXCursor res=cursor;
+       LyXCursor res = cursor;
        do {
                if (res.pos < res.par->Last() - 1) {
                        res.pos++;
                }
                else  {
-                       res.par=res.par->Next();
+                       res.par = res.par->Next();
                        res.pos = 0;
                }
       
        } while (res.par && 
-                !(res.par->GetChar(res.pos)==LYX_META_INSET
+                !(res.par->GetChar(res.pos) == LyXParagraph::META_INSET
                   && res.par->GetInset(res.pos)->AutoDelete()));
    
        if (res.par) {
                SetCursor(res.par, res.pos);
                return true;
        }
-   
        return false;
 }
 
 
-bool LyXText::GotoNextNote()
+bool LyXText::GotoNextNote() const
 {
-       LyXCursor res=cursor;
+       LyXCursor res = cursor;
        do {
-               if (res.pos < res.par->Last()-1) {
+               if (res.pos < res.par->Last() - 1) {
                        res.pos++;
-               }
-               else  {
-                       res.par=res.par->Next();
+               } else  {
+                       res.par = res.par->Next();
                        res.pos = 0;
                }
       
        } while (res.par && 
-                !(res.par->GetChar(res.pos)==LYX_META_INSET
-                  && res.par->GetInset(res.pos)->LyxCode()==Inset::IGNORE_CODE));
+                !(res.par->GetChar(res.pos) == LyXParagraph::META_INSET
+                  && res.par->GetInset(res.pos)->LyxCode() == Inset::IGNORE_CODE));
    
        if (res.par) {
                SetCursor(res.par, res.pos);
                return true;
        }
-   
        return false;
 }
 
 
-int LyXText::SwitchLayoutsBetweenClasses(char class1, char class2,
-                                        LyXParagraph * par)
-{
-       InsetError * new_inset = 0;
-       int ret = 0;
-       if (!par || class1 == class2)
-               return ret;
-       par = par->FirstPhysicalPar();
-       while (par) {
-               string name = textclasslist.NameOfLayout(class1, par->layout);
-               int lay = 0;
-               pair<bool, LyXTextClass::LayoutList::size_type> pp =
-                       textclasslist.NumberOfLayout(class2, name);
-               if (pp.first) {
-                       lay = pp.second;
-               } else { // layout not found
-                       // use default layout "Standard" (0)
-                       lay = 0;
-               }
-               par->layout = lay;
-      
-               if (name != textclasslist.NameOfLayout(class2, par->layout)) {
-                       ret++;
-                       string s = "Layout had to be changed from\n"
-                               + name + " to " + textclasslist.NameOfLayout(class2, par->layout)
-                               + "\nbecause of class conversion from\n"
-                               + textclasslist.NameOfClass(class1) + " to "
-                               + textclasslist.NameOfClass(class2);
-                       new_inset = new InsetError(s);
-                       par->InsertChar(0, LYX_META_INSET);
-                       par->InsertInset(0, new_inset);
-               }
-      
-               par = par->next;
-       }
-       return ret;
-}
-
-
-#ifdef NEW_TEXT
 void LyXText::CheckParagraph(LyXParagraph * par,
                             LyXParagraph::size_type pos)
-#else
-void LyXText::CheckParagraph(LyXParagraph * par, int pos)
-#endif
 {
-  
-       LyXCursor tmpcursor;
+       LyXCursor tmpcursor;                    
+
 
        /* table stuff -- begin*/
    
@@ -2818,18 +2973,14 @@ void LyXText::CheckParagraph(LyXParagraph * par, int pos)
                /* table stuff -- end*/
      
                long y = 0;
-#ifdef NEW_TEXT
                LyXParagraph::size_type z;
-#else
-               int z;
-#endif
                Row * row = GetRow(par, pos, y);
      
-               /* is there a break one row above */ 
+               // is there a break one row above
                if (row->previous && row->previous->par == row->par) {
                        z = NextBreakPoint(row->previous, paperwidth);
                        if ( z >= row->pos) {
-                               /* set the dimensions of the row above  */ 
+                               // set the dimensions of the row above
                                y -= row->previous->height;
                                refresh_y = y;
                                refresh_row = row->previous;
@@ -2837,7 +2988,8 @@ void LyXText::CheckParagraph(LyXParagraph * par, int pos)
        
                                BreakAgain(row->previous);
 
-                               /* set the cursor again. Otherwise dungling pointers are possible */
+                               // set the cursor again. Otherwise
+                               // dangling pointers are possible
                                SetCursor(cursor.par, cursor.pos);
                                sel_cursor = cursor;
                                return;
@@ -2845,11 +2997,7 @@ void LyXText::CheckParagraph(LyXParagraph * par, int pos)
                }
 
                int tmpheight = row->height;
-#ifdef NEW_TEXT
                LyXParagraph::size_type tmplast = RowLast(row);
-#else
-               int tmplast = RowLast(row);
-#endif
                refresh_y = y;
                refresh_row = row;
 
@@ -2859,8 +3007,10 @@ void LyXText::CheckParagraph(LyXParagraph * par, int pos)
                else
                        status = LyXText::NEED_MORE_REFRESH; 
    
-               /* check the special right address boxes */
-               if (textclasslist.Style(parameters->textclass, par->GetLayout()).margintype == MARGIN_RIGHT_ADDRESS_BOX) {
+               // check the special right address boxes
+               if (textclasslist.Style(buffer->params.textclass,
+                                       par->GetLayout()).margintype
+                   == MARGIN_RIGHT_ADDRESS_BOX) {
                        tmpcursor.par = par;
                        tmpcursor.row = row;
                        tmpcursor.y = y;
@@ -2872,10 +3022,10 @@ void LyXText::CheckParagraph(LyXParagraph * par, int pos)
    
        }
 
-       /* set the cursor again. Otherwise dangling pointers are possible */
+       // set the cursor again. Otherwise dangling pointers are possible
        // also set the selection
    
-       if (selection){
+       if (selection) {
                tmpcursor = cursor;
                SetCursorIntern(sel_cursor.par, sel_cursor.pos);
                sel_cursor = cursor; 
@@ -2891,21 +3041,21 @@ void LyXText::CheckParagraph(LyXParagraph * par, int pos)
 }
 
 
-/* returns 0 if inset wasn't found */
+// returns 0 if inset wasn't found
 int LyXText::UpdateInset(Inset * inset)
 {
-       /* first check the current paragraph */
+       // first check the current paragraph
        int pos = cursor.par->GetPositionOfInset(inset);
        if (pos != -1){
                CheckParagraph(cursor.par, pos);
                return 1;
        }
   
-       /* check every paragraph */
+       // check every paragraph
   
        LyXParagraph * par = FirstParagraph();
        do {
-               /* make sure the paragraph is open */
+               // make sure the paragraph is open
                if (par->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE){
                        pos = par->GetPositionOfInset(inset);
                        if (pos != -1){
@@ -2920,33 +3070,148 @@ int LyXText::UpdateInset(Inset * inset)
 }
 
 
-#ifdef NEW_TEXT
 void LyXText::SetCursor(LyXParagraph * par,
-                       LyXParagraph::size_type pos)
-#else
-void LyXText::SetCursor(LyXParagraph * par, int pos)
-#endif
+                       LyXParagraph::size_type pos, bool setfont) const
 {
        LyXCursor old_cursor = cursor;
-       SetCursorIntern(par, pos);
+       SetCursorIntern(par, pos, setfont);
        DeleteEmptyParagraphMechanism(old_cursor);
 }
 
 
-#ifdef NEW_TEXT
-void LyXText::SetCursorIntern(LyXParagraph * par, LyXParagraph::size_type pos)
-#else
-void LyXText::SetCursorIntern(LyXParagraph * par, int pos)
-#endif
+void LyXText::SetCursor(LyXCursor & cur, LyXParagraph * par,
+                       LyXParagraph::size_type pos) const
 {
-       long y;
-       Row * row;
-       int left_margin;
-       LyXParagraph * tmppar;
+       // correct the cursor position if impossible
+       if (pos > par->Last()){
+               LyXParagraph * tmppar = par->ParFromPos(pos);
+               pos = par->PositionInParFromPos(pos);
+               par = tmppar;
+       }
+       if (par->IsDummy() && par->previous &&
+           par->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
+               while (par->previous &&
+                      ((par->previous->IsDummy() &&
+                        (par->previous->previous->footnoteflag ==
+                         LyXParagraph::CLOSED_FOOTNOTE)) ||
+                       (par->previous->footnoteflag ==
+                        LyXParagraph::CLOSED_FOOTNOTE))) {
+                       par = par->previous ;
+                       if (par->IsDummy() &&
+                           (par->previous->footnoteflag ==
+                            LyXParagraph::CLOSED_FOOTNOTE))
+                               pos += par->size() + 1;
+               }
+               if (par->previous) {
+                       par = par->previous;
+               }
+               pos += par->size() + 1;
+       }
+
+       cur.par = par;
+       cur.pos = pos;
+
+       /* get the cursor y position in text  */
+       long y = 0;
+       Row * row = GetRow(par, pos, y);
+       /* y is now the beginning of the cursor row */ 
+       y += row->baseline;
+       /* y is now the cursor baseline */ 
+       cur.y = y;
+   
+       /* now get the cursors x position */
+       float x;
+       float fill_separator, fill_hfill, fill_label_hfill;
+       PrepareToPrint(row, x, fill_separator, fill_hfill, fill_label_hfill);
+       LyXParagraph::size_type cursor_vpos;
+       LyXParagraph::size_type last = RowLastPrintable(row);
+
+       if (pos > last + 1)   // This shouldn't happen.
+               pos = last+1;
+
+       if (last < row->pos)
+                cursor_vpos = 0;
+       else if ((pos > last) ||
+                ((pos - 1 >= row->pos) &&
+                 (row->par->IsSeparator(pos) ||
+                  (row->par->table && row->par->IsNewline(pos)))))
+               /// Place cursor after char at (logical) position pos-1
+               cursor_vpos = !(bidi_level(pos-1) % 2)
+                       ? log2vis(pos-1) + 1 : log2vis(pos-1);
+       else
+               /// Place cursor before char at (logical) position pos
+               cursor_vpos = !(bidi_level(pos) % 2)
+                       ? log2vis(pos) : log2vis(pos) + 1;
+
+       /* table stuff -- begin*/
+       if (row->par->table) {
+               int cell = NumberOfCell(row->par, row->pos);
+               float x_old = x;
+               x += row->par->table->GetBeginningOfTextInCell(cell);
+               for (LyXParagraph::size_type vpos = row->pos;
+                    vpos < cursor_vpos; ++vpos) {
+                       pos = vis2log(vpos);
+                       if (row->par->IsNewline(pos)) {
+                               x = x_old + row->par->table->WidthOfColumn(cell);
+                               x_old = x;
+                               ++cell;
+                               x += row->par->table->GetBeginningOfTextInCell(cell);
+                       } else {
+                               x += SingleWidth(row->par, pos);
+                       }
+               }
+       } else {
+               /* table stuff -- end*/
+               LyXParagraph::size_type main_body =
+                       BeginningOfMainBody(row->par);
+               if ((main_body > 0) &&
+                   ((main_body-1 > last) || 
+                    !row->par->IsLineSeparator(main_body-1)))
+                       main_body = 0;
+
+               for (LyXParagraph::size_type vpos = row->pos;
+                    vpos < cursor_vpos; ++vpos) {
+                       pos = vis2log(vpos);
+                       if (main_body > 0 && pos == main_body-1) {
+                               x += fill_label_hfill +
+                                       lyxfont::width(textclasslist.Style(
+                                               buffer->params.textclass,
+                                               row->par->GetLayout())
+                                                      .labelsep,
+                                                      GetFont(row->par, -2));
+                               if (row->par->IsLineSeparator(main_body-1))
+                                       x -= SingleWidth(row->par,main_body-1);
+                       }
+                       if (HfillExpansion(row, pos)) {
+                               x += SingleWidth(row->par, pos);
+                               if (pos >= main_body)
+                                       x += fill_hfill;
+                               else 
+                                       x += fill_label_hfill;
+                       } else if (row->par->IsSeparator(pos)) {
+                               x += SingleWidth(row->par, pos);
+                               if (pos >= main_body)
+                                       x += fill_separator;
+                       } else
+                               x += SingleWidth(row->par, pos);
+               }
+       }
    
-       /* correct the cursor position if impossible */
+       cur.x = int(x);
+       cur.x_fix = cur.x;
+       cur.row = row;
+}
+
+
+void LyXText::SetCursorIntern(LyXParagraph * par,
+                             LyXParagraph::size_type pos, bool setfont) const
+{
+       SetCursor(cursor, par, pos);
+#warning Remove this when verified working (Jug 20000413)
+#if 0
+       // correct the cursor position if impossible
        if (pos > par->Last()){
-               tmppar = par->ParFromPos(pos);
+               LyXParagraph * tmppar = par->ParFromPos(pos);
                pos = par->PositionInParFromPos(pos);
                par = tmppar;
        }
@@ -2958,113 +3223,124 @@ void LyXText::SetCursorIntern(LyXParagraph * par, int pos)
                        par = par->previous ;
                        if (par->IsDummy() &&
                            par->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE)
-#ifdef NEW_TEXT
-                               pos += par->text.size() + 1;
-#else
-                               pos += par->last + 1;
-#endif
+                               pos += par->size() + 1;
                }
                if (par->previous) {
                        par = par->previous;
                }
-#ifdef NEW_TEXT
-               pos += par->text.size() + 1;
-#else
-               pos += par->last + 1;
-#endif
+               pos += par->size() + 1;
        }
 
        cursor.par = par;
        cursor.pos = pos;
 
        /* get the cursor y position in text  */
-       row = GetRow(par, pos, y);
+       long y = 0;
+       Row * row = GetRow(par, pos, y);
        /* y is now the beginning of the cursor row */ 
        y += row->baseline;
        /* y is now the cursor baseline */ 
        cursor.y = y;
    
        /* now get the cursors x position */
-   
        float x;
        float fill_separator, fill_hfill, fill_label_hfill;
-       left_margin = LabelEnd(row);
        PrepareToPrint(row, x, fill_separator, fill_hfill, fill_label_hfill);
-#ifdef NEW_TEXT
-       LyXParagraph::size_type main_body =
-               BeginningOfMainBody(row->par);
-#else
-       int main_body = BeginningOfMainBody(row->par);
-#endif 
+       LyXParagraph::size_type cursor_vpos;
+       LyXParagraph::size_type last = RowLastPrintable(row);
+
+       if (pos > last + 1)   // This shouldn't happen.
+               pos = last+1;
+
+       if (last < row->pos)
+                cursor_vpos = 0;
+       else if (pos > last ||
+           (pos - 1 >= row->pos &&
+            (row->par->IsSeparator(pos) ||
+             (row->par->table && row->par->IsNewline(pos))
+             )))
+               /// Place cursor after char at (logical) position pos-1
+               cursor_vpos = (bidi_level(pos-1) % 2 == 0)
+                       ? log2vis(pos-1) + 1 : log2vis(pos-1);
+       else
+               /// Place cursor before char at (logical) position pos
+               cursor_vpos = (bidi_level(pos) % 2 == 0)
+                       ? log2vis(pos) : log2vis(pos) + 1;
+
        /* table stuff -- begin*/
        if (row->par->table) {
                int cell = NumberOfCell(row->par, row->pos);
                float x_old = x;
                x += row->par->table->GetBeginningOfTextInCell(cell);
-               for (pos = row->pos; pos < cursor.pos; pos++)  {
+               for (LyXParagraph::size_type vpos = row->pos; vpos < cursor_vpos; ++vpos)  {
+                       pos = vis2log(vpos);
                        if (row->par->IsNewline(pos)) {
                                x = x_old + row->par->table->WidthOfColumn(cell);
                                x_old = x;
-                               cell++;
+                               ++cell;
                                x += row->par->table->GetBeginningOfTextInCell(cell);
                        } else {
                                x += SingleWidth(row->par, pos);
                        }
                }
-       } else
+       } else {
                /* table stuff -- end*/
-
-               for (pos = row->pos; pos < cursor.pos; pos++)  {
-                       if (pos && pos == main_body
-                           && !row->par->IsLineSeparator(pos - 1)) {
-                               x += GetFont(row->par, -2).stringWidth(
-                                                   textclasslist.Style(parameters->textclass, row->par->GetLayout()).labelsep);
-                               if (x < left_margin)
-                                       x = left_margin;
+               LyXParagraph::size_type main_body =
+                       BeginningOfMainBody(row->par);
+               if (main_body > 0 &&
+                   (main_body-1 > last || 
+                    !row->par->IsLineSeparator(main_body-1)))
+                       main_body = 0;
+
+               for (LyXParagraph::size_type vpos = row->pos; vpos < cursor_vpos; ++vpos)  {
+                       pos = vis2log(vpos);
+                       if (main_body > 0 && pos == main_body-1) {
+                               x += fill_label_hfill +
+                                       lyxfont::width(textclasslist
+                                                      .Style(buffer->params.textclass,
+                                                             row->par->GetLayout())
+                                                      .labelsep,
+                                                      GetFont(row->par, -2));
+                               if (row->par->IsLineSeparator(main_body-1))
+                                       x -= SingleWidth(row->par, main_body-1);
                        }
-      
-                       x += SingleWidth(row->par, pos);
                        if (HfillExpansion(row, pos)) {
+                               x += SingleWidth(row->par, pos);
                                if (pos >= main_body)
                                        x += fill_hfill;
                                else 
                                        x += fill_label_hfill;
                        }
-                       else if (pos >= main_body && row->par->IsSeparator(pos)) {
-                               x+= fill_separator;
-                       }
-      
-                       if (pos + 1 == main_body
-                           && row->par->IsLineSeparator(pos)) {
-                               x += GetFont(row->par, -2).stringWidth(
-                                                   textclasslist.Style(parameters->textclass, row->par->GetLayout()).labelsep);
-                               if (row->par->IsLineSeparator(pos))
-                                       x-= SingleWidth(row->par, pos);
-                               if (x < left_margin)
-                                       x = left_margin;
-                       }
+                       else if (row->par->IsSeparator(pos)) {
+                               x += SingleWidth(row->par, pos);
+                               if (pos >= main_body)
+                                       x += fill_separator;
+                       } else
+                               x += SingleWidth(row->par, pos);
                }
+       }
    
        cursor.x = int(x);
    
        cursor.x_fix = cursor.x;
        cursor.row = row;
-   
-       if (cursor.pos && 
-           (cursor.pos == cursor.par->Last() || cursor.par->IsSeparator(cursor.pos)
-            || (cursor.pos && cursor.pos == BeginningOfMainBody(cursor.par)
-                && !cursor.par->IsSeparator(cursor.pos))
-                   )) {
-               current_font = cursor.par->GetFontSettings(cursor.pos - 1);
-               real_current_font = GetFont(cursor.par, cursor.pos - 1);
-       } else {
-               current_font = cursor.par->GetFontSettings(cursor.pos);
-               real_current_font = GetFont(cursor.par, cursor.pos);
+#endif
+       if (setfont) {
+               if (cursor.pos && 
+                   (cursor.pos == cursor.par->Last() || cursor.par->IsSeparator(cursor.pos)
+                    || (cursor.par->table && cursor.par->IsNewline(cursor.pos))
+                    )) {
+                       current_font = cursor.par->GetFontSettings(cursor.pos - 1);
+                       real_current_font = GetFont(cursor.par, cursor.pos - 1);
+               } else {
+                       current_font = cursor.par->GetFontSettings(cursor.pos);
+                       real_current_font = GetFont(cursor.par, cursor.pos);
+               }
        }
 }
 
 
-void LyXText::SetCursorFromCoordinates(int x, long y)
+void LyXText::SetCursorFromCoordinates(int x, long y) const
 {
        LyXCursor old_cursor = cursor;
    
@@ -3086,6 +3362,7 @@ void LyXText::SetCursorFromCoordinates(int x, long y)
             || cursor.par->IsSeparator(cursor.pos)
             || (cursor.pos && cursor.pos == BeginningOfMainBody(cursor.par)
                 && !cursor.par->IsSeparator(cursor.pos))
+            || (cursor.par->table && cursor.par->IsNewline(cursor.pos))
                    )) {
                current_font = cursor.par->GetFontSettings(cursor.pos - 1);
                real_current_font = GetFont(cursor.par, cursor.pos - 1);
@@ -3096,32 +3373,46 @@ void LyXText::SetCursorFromCoordinates(int x, long y)
        DeleteEmptyParagraphMechanism(old_cursor);
 }
 
+void LyXText::SetCursorFromCoordinates(LyXCursor & cur, int x, long y) const
+{
+       /* get the row first */ 
+   
+       Row * row = GetRowNearY(y);
+       int column = GetColumnNearX(row, x);
+   
+       cur.par = row->par;
+       cur.pos = row->pos + column;
+       cur.x = x;
+       cur.y = y + row->baseline;
+       cur.row = row;
+}
+
 
-void LyXText::CursorLeft()
+void LyXText::CursorLeft() const
 {
        CursorLeftIntern();
         if (cursor.par->table) {
                 int cell = NumberOfCell(cursor.par, cursor.pos);
                 if (cursor.par->table->IsContRow(cell) &&
-                    cursor.par->table->CellHasContRow(cursor.par->table->GetCellAbove(cell))<0) {
+                    cursor.par->table->CellHasContRow(cursor.par->table->GetCellAbove(cell)) < 0) {
                         CursorUp();
                 }
         }
 }
 
 
-void LyXText::CursorLeftIntern()
+void LyXText::CursorLeftIntern() const
 {
        if (cursor.pos > 0) {
                SetCursor(cursor.par, cursor.pos - 1);
        }
-       else if (cursor.par->Previous()) {
+       else if (cursor.par->Previous()) { // steps into the above paragraph.
                SetCursor(cursor.par->Previous(), cursor.par->Previous()->Last());
        }
 }
 
 
-void LyXText::CursorRight()
+void LyXText::CursorRight() const
 {
        CursorRightIntern();
         if (cursor.par->table) {
@@ -3134,7 +3425,7 @@ void LyXText::CursorRight()
 }
 
 
-void LyXText::CursorRightIntern()
+void LyXText::CursorRightIntern() const
 {
        if (cursor.pos < cursor.par->Last()) {
                SetCursor(cursor.par, cursor.pos + 1);
@@ -3145,7 +3436,7 @@ void LyXText::CursorRightIntern()
 }
 
 
-void LyXText::CursorUp()
+void LyXText::CursorUp() const
 {
        SetCursorFromCoordinates(cursor.x_fix, 
                                 cursor.y - cursor.row->baseline - 1);
@@ -3159,7 +3450,7 @@ void LyXText::CursorUp()
 }
 
 
-void LyXText::CursorDown()
+void LyXText::CursorDown() const
 {
         if (cursor.par->table &&
             cursor.par->table->ShouldBeVeryLastRow(NumberOfCell(cursor.par, cursor.pos)) &&
@@ -3186,7 +3477,7 @@ void LyXText::CursorDown()
 }
 
 
-void LyXText::CursorUpParagraph()
+void LyXText::CursorUpParagraph() const
 {
        if (cursor.pos > 0) {
                SetCursor(cursor.par, 0);
@@ -3197,220 +3488,261 @@ void LyXText::CursorUpParagraph()
 }
 
 
-void LyXText::CursorDownParagraph()
+void LyXText::CursorDownParagraph() const
 {
        if (cursor.par->Next()) {
                SetCursor(cursor.par->Next(), 0);
        } else {
-               SetCursor(cursor.par,cursor.par->Last());
+               SetCursor(cursor.par, cursor.par->Last());
        }
 }
 
 
 
-void LyXText::DeleteEmptyParagraphMechanism(LyXCursor old_cursor)
+void LyXText::DeleteEmptyParagraphMechanism(LyXCursor const & old_cursor) const
 {
-    bool deleted = false;
+       // Would be wrong to delete anything if we have a selection.
+       if (selection) return;
+
+       // We allow all kinds of "mumbo-jumbo" when freespacing.
+       if (textclasslist.Style(buffer->params.textclass,
+                               old_cursor.par->GetLayout()).free_spacing)
+               return;
+
+       bool deleted = false;
        
-    /* this is the delete-empty-paragraph-mechanism. */ 
-    if (selection)
-        return;
-
-    // Paragraph should not be deleted if empty
-    if ((textclasslist.Style(parameters->textclass,
-                        old_cursor.par->GetLayout())).keepempty)
-        return;
-
-    LyXCursor tmpcursor;
-
-    if (old_cursor.par != cursor.par) {
-        if ( (old_cursor.par->Last() == 0
-              || (old_cursor.par->Last() == 1
-                  && (old_cursor.par->IsLineSeparator(0))))
-             && old_cursor.par->FirstPhysicalPar()
-             == old_cursor.par->LastPhysicalPar()) {
-                       
-            /* ok, we will delete anything */ 
+       /* Ok I'll put some comments here about what is missing.
+          I have fixed BackSpace (and thus Delete) to not delete
+          double-spaces automagically. I have also changed Cut,
+          Copy and Paste to hopefully do some sensible things.
+          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
+          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
+          put out 1.1.4pre2 with FIX_DOUBLE_SPACE defined so
+          that I can get some feedback. (Lgb)
+       */
+
+       // If old_cursor.pos == 0 and old_cursor.pos(1) == LineSeparator
+       // delete the LineSeparator.
+       // MISSING
+
+       // If old_cursor.pos == 1 and old_cursor.pos(0) == LineSeparator
+       // delete the LineSeparator.
+       // MISSING
+
+       // If the pos around the old_cursor were spaces, delete one of them.
+       if (old_cursor.par != cursor.par || old_cursor.pos != cursor.pos) { // Only if the cursor has really moved
+               
+               if (old_cursor.pos > 0
+                   && old_cursor.pos < old_cursor.par->Last()
+                   && old_cursor.par->IsLineSeparator(old_cursor.pos)
+                   && old_cursor.par->IsLineSeparator(old_cursor.pos - 1)) {
+                       old_cursor.par->Erase(old_cursor.pos - 1);
+                       RedoParagraphs(old_cursor, old_cursor.par->Next());
+                       // correct cursor
+                       if (old_cursor.par == cursor.par &&
+                           cursor.pos > old_cursor.pos) {
+                               SetCursorIntern(cursor.par, cursor.pos - 1);
+                       } else
+                               SetCursorIntern(cursor.par, cursor.pos);
+                       return;
+               }
+       }
+
+       // Do not delete empty paragraphs with keepempty set.
+       if ((textclasslist.Style(buffer->params.textclass,
+                                old_cursor.par->GetLayout())).keepempty)
+               return;
+
+       LyXCursor tmpcursor;
+
+       if (old_cursor.par != cursor.par) {
+               if ( (old_cursor.par->Last() == 0
+                     || (old_cursor.par->Last() == 1
+                         && old_cursor.par->IsLineSeparator(0)))
+                    && old_cursor.par->FirstPhysicalPar()
+                    == old_cursor.par->LastPhysicalPar()) {
+                       // ok, we will delete anything
                        
-            // make sure that you do not delete any environments
-            if ((old_cursor.par->footnoteflag != LyXParagraph::OPEN_FOOTNOTE &&
-                 !(old_cursor.row->previous 
-                   && old_cursor.row->previous->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
-                 && !(old_cursor.row->next 
-                      && old_cursor.row->next->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
-                || 
-                (old_cursor.par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE &&
-                 ((old_cursor.row->previous 
-                   && old_cursor.row->previous->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
-                  || 
-                  (old_cursor.row->next
-                   && old_cursor.row->next->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
-                 )){
-                status = LyXText::NEED_MORE_REFRESH;
-                deleted = true;
+                       // make sure that you do not delete any environments
+                       if ((old_cursor.par->footnoteflag != LyXParagraph::OPEN_FOOTNOTE &&
+                            !(old_cursor.row->previous 
+                              && old_cursor.row->previous->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
+                            && !(old_cursor.row->next 
+                                 && old_cursor.row->next->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
+                           || (old_cursor.par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE
+                               && ((old_cursor.row->previous 
+                                    && old_cursor.row->previous->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE)
+                                   || (old_cursor.row->next
+                                       && old_cursor.row->next->par->footnoteflag == LyXParagraph::OPEN_FOOTNOTE))
+                                   )) {
+                               status = LyXText::NEED_MORE_REFRESH;
+                               deleted = true;
                                
-                if (old_cursor.row->previous) {
-                    refresh_row = old_cursor.row->previous;
-                    refresh_y = old_cursor.y - old_cursor.row->baseline - refresh_row->height;
-                    tmpcursor = cursor;
-                    cursor = old_cursor; // that undo can restore the right cursor position
-                    LyXParagraph *endpar = old_cursor.par->next;
-                    if (endpar && endpar->GetDepth()) {
-                        while (endpar && endpar->GetDepth()) {
-                            endpar = endpar->LastPhysicalPar()->Next();
-                        }
-                    }
-                    SetUndo(Undo::DELETE,
-                            old_cursor.par->previous,
-                            endpar);
-                    cursor = tmpcursor;
-
-                    /* delete old row */ 
-                    RemoveRow(old_cursor.row);
-                    if (params->paragraph == old_cursor.par) {
-                        params->paragraph = params->paragraph->next;
-                    }
-                    /* delete old par */ 
-                    delete old_cursor.par;
+                               if (old_cursor.row->previous) {
+                                       refresh_row = old_cursor.row->previous;
+                                       refresh_y = old_cursor.y - old_cursor.row->baseline - refresh_row->height;
+                                       tmpcursor = cursor;
+                                       cursor = old_cursor; // that undo can restore the right cursor position
+                                       LyXParagraph * endpar = old_cursor.par->next;
+                                       if (endpar && endpar->GetDepth()) {
+                                               while (endpar && endpar->GetDepth()) {
+                                                       endpar = endpar->LastPhysicalPar()->Next();
+                                               }
+                                       }
+                                       SetUndo(Undo::DELETE,
+                                               old_cursor.par->previous,
+                                               endpar);
+                                       cursor = tmpcursor;
+
+                                       // delete old row
+                                       RemoveRow(old_cursor.row);
+                                       if (buffer->paragraph == old_cursor.par) {
+                                               buffer->paragraph = buffer->paragraph->next;
+                                       }
+                                       // delete old par
+                                       delete 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 (refresh_row->next) {
-                        BreakAgain(refresh_row->next);
-                        UpdateCounters(refresh_row);
-                    }
-                    SetHeightOfRow(refresh_row);
-                }
-                else {
-                    refresh_row = old_cursor.row->next;
-                    refresh_y = old_cursor.y - old_cursor.row->baseline;
+                                       /* 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 (refresh_row->next) {
+                                               BreakAgain(refresh_row->next);
+                                               UpdateCounters(refresh_row);
+                                       }
+                                       SetHeightOfRow(refresh_row);
+                               } else {
+                                       refresh_row = old_cursor.row->next;
+                                       refresh_y = old_cursor.y - old_cursor.row->baseline;
                                        
-                    tmpcursor = cursor;
-                    cursor = old_cursor; // that undo can restore the right cursor position
-                    LyXParagraph *endpar = old_cursor.par->next;
-                    if (endpar && endpar->GetDepth()) {
-                        while (endpar && endpar->GetDepth()) {
-                            endpar = endpar->LastPhysicalPar()->Next();
-                        }
-                    }
-                    SetUndo(Undo::DELETE,
-                            old_cursor.par->previous,
-                            endpar);
-                    cursor = tmpcursor;
-
-                    /* delete old row */ 
-                    RemoveRow(old_cursor.row);
-                    /* delete old par */ 
-                    if (params->paragraph == old_cursor.par) {
-                        params->paragraph = params->paragraph->next;
-                    }
-                    delete old_cursor.par;
+                                       tmpcursor = cursor;
+                                       cursor = old_cursor; // that undo can restore the right cursor position
+                                       LyXParagraph *endpar = old_cursor.par->next;
+                                       if (endpar && endpar->GetDepth()) {
+                                               while (endpar && endpar->GetDepth()) {
+                                                       endpar = endpar->LastPhysicalPar()->Next();
+                                               }
+                                       }
+                                       SetUndo(Undo::DELETE,
+                                               old_cursor.par->previous,
+                                               endpar);
+                                       cursor = tmpcursor;
+
+                                       // delete old row
+                                       RemoveRow(old_cursor.row);
+                                       // delete old par
+                                       if (buffer->paragraph == old_cursor.par) {
+                                               buffer->paragraph = buffer->paragraph->next;
+                                       }
+                                       delete 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 (refresh_row) {
-                        BreakAgain(refresh_row);
-                        UpdateCounters(refresh_row->previous);
-                    }
-                }
+                                       /* 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 (refresh_row) {
+                                               BreakAgain(refresh_row);
+                                               UpdateCounters(refresh_row->previous);
+                                       }
+                               }
                                
-                               /* correct cursor y */
-                SetCursor(cursor.par, cursor.pos);
-                    
-                               /* if (cursor.y > old_cursor.y)
-                                  cursor.y -= old_cursor.row->height; */ 
-        
-                if (sel_cursor.par  == old_cursor.par
-                    && sel_cursor.pos == sel_cursor.pos) {
-                    /* correct selection*/ 
-                    sel_cursor = cursor;
-                }
-            }
-       
-        }
-        if (!deleted){
-            if (old_cursor.par->ClearParagraph()){
-                RedoParagraphs(old_cursor, old_cursor.par->Next());
-                               /* correct cursor y */
-                SetCursor(cursor.par, cursor.pos);
-                sel_cursor = cursor;
-            }
-        }
-    } else if (cursor.par->table && (cursor.row != old_cursor.row)) {
-        int cell = NumberOfCell(old_cursor.par, old_cursor.pos);
-        if (old_cursor.par->table->IsContRow(cell) &&
-            IsEmptyTableRow(&old_cursor)) {
-            RemoveTableRow(&old_cursor);
-            RedoParagraph();
-        }
-    }
+                               // correct cursor y
+
+                               SetCursorIntern(cursor.par, cursor.pos);
+
+                               if (sel_cursor.par  == old_cursor.par
+                                   && sel_cursor.pos == sel_cursor.pos) {
+                                       // correct selection
+                                       sel_cursor = cursor;
+                               }
+                       }
+               }
+               if (!deleted) {
+                       if (old_cursor.par->ClearParagraph()) {
+                               RedoParagraphs(old_cursor, old_cursor.par->Next());
+                               // correct cursor y
+                               SetCursorIntern(cursor.par, cursor.pos);
+                               sel_cursor = cursor;
+                       }
+               }
+       }
 }
 
 
 LyXParagraph * LyXText::GetParFromID(int id)
 {
        LyXParagraph * result = FirstParagraph();
-       while (result && result->GetID() != id)
+       while (result && result->id() != id)
                result = result->next;
        return result;
 }
 
 
 // undo functions
-bool  LyXText::TextUndo()
-{ // returns false if no undo possible
-       Undo * undo = params->undostack.Pop();
-       if (undo){
+bool LyXText::TextUndo()
+{
+       // returns false if no undo possible
+       Undo * undo = buffer->undostack.pop();
+       if (undo) {
                FinishUndo();
                if (!undo_frozen)
-                       params->redostack.Push(CreateUndo(undo->kind, 
-                                                         GetParFromID(undo->number_of_before_par),
-                                                         GetParFromID(undo->number_of_behind_par)));
+                       buffer->redostack
+                               .push(CreateUndo(undo->kind, 
+                                                GetParFromID(undo->number_of_before_par),
+                                                GetParFromID(undo->number_of_behind_par)));
        }
        return TextHandleUndo(undo);
 }
 
 
 bool LyXText::TextRedo()
-{ // returns false if no redo possible
-       Undo * undo = params->redostack.Pop();
-       if (undo){
+{
+       // returns false if no redo possible
+       Undo * undo = buffer->redostack.pop();
+       if (undo) {
                FinishUndo();
                if (!undo_frozen)
-                       params->undostack.Push(CreateUndo(undo->kind, 
-                                                         GetParFromID(undo->number_of_before_par),
-                                                         GetParFromID(undo->number_of_behind_par)));
+                       buffer->undostack
+                               .push(CreateUndo(undo->kind, 
+                                                GetParFromID(undo->number_of_before_par),
+                                                GetParFromID(undo->number_of_behind_par)));
        }
        return TextHandleUndo(undo);
 }
 
 
-bool LyXText::TextHandleUndo(Undo * undo){ // returns false if no undo possible
+bool LyXText::TextHandleUndo(Undo * undo)
+{
+       // returns false if no undo possible
        bool result = false;
-       if (undo){
-               LyXParagraph * before = GetParFromID(undo->number_of_before_par); 
-               LyXParagraph * behind = GetParFromID(undo->number_of_behind_par); 
+       if (undo) {
+               LyXParagraph * before =
+                       GetParFromID(undo->number_of_before_par); 
+               LyXParagraph * behind =
+                       GetParFromID(undo->number_of_behind_par); 
                LyXParagraph * tmppar;
                LyXParagraph * tmppar2;
-               LyXParagraph * tmppar3;
-               LyXParagraph * tmppar4;
                LyXParagraph * endpar;
                LyXParagraph * tmppar5;
     
-               // if there's no before take the beginning of the document for redoing
+               // if there's no before take the beginning
+               // of the document for redoing
                if (!before)
                        SetCursorIntern(FirstParagraph(), 0);
 
                // replace the paragraphs with the undo informations
 
-               tmppar3 = undo->par;
+               LyXParagraph * tmppar3 = undo->par;
                undo->par = 0; // otherwise the undo destructor would delete the paragraph
-               tmppar4 = tmppar3;
+               LyXParagraph * tmppar4 = tmppar3;
                if (tmppar4){
                        while (tmppar4->next)
                                tmppar4 = tmppar4->next;
@@ -3421,27 +3753,18 @@ bool LyXText::TextHandleUndo(Undo * undo){ // returns false if no undo possible
                        if (before)
                                tmppar5 = before->next;
                        else
-                               tmppar5 = params->paragraph;
+                               tmppar5 = buffer->paragraph;
                        tmppar2 = tmppar3;
                        while (tmppar5 && tmppar5 != behind){
                                tmppar = tmppar5;
                                tmppar5 = tmppar5->next;
                                // a memory optimization for edit: Only layout information
                                // is stored in the undo. So restore the text informations.
-                               if (undo->kind == Undo::EDIT){
-                                       tmppar2->text = tmppar->text;
-#ifdef NEW_TEXT
-                                       //tmppar->text.clear();
-                                       tmppar->text.erase(tmppar->text.begin(),
-                                                          tmppar->text.end());
-#else
-                                       tmppar->text = 0;
-#endif
+                               if (undo->kind == Undo::EDIT) {
+                                       tmppar2->setContentsFromPar(tmppar);
+                                       tmppar->clearContents();
                                        tmppar2 = tmppar2->next;
                                }
-                               if ( currentrow && currentrow->par == tmppar )
-                                       currentrow = currentrow -> previous;
-                               delete tmppar;
                        }
                }
     
@@ -3450,12 +3773,12 @@ bool LyXText::TextHandleUndo(Undo * undo){ // returns false if no undo possible
                        if (before)
                                before->next = tmppar3;
                        else
-                               params->paragraph = tmppar3;
+                               buffer->paragraph = tmppar3;
                        tmppar3->previous = before;
                }
                else {
                        if (!before)
-                               params->paragraph = behind;
+                               buffer->paragraph = behind;
                }
                if (tmppar4) {
                        tmppar4->next = behind;
@@ -3465,12 +3788,12 @@ bool LyXText::TextHandleUndo(Undo * undo){ // returns false if no undo possible
     
     
                // Set the cursor for redoing
-               if (before){
+               if (before) {
                        SetCursorIntern(before->FirstSelfrowPar(), 0);
                        // check wether before points to a closed float and open it if necessary
                        if (before && before->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE
                            && before->next && before->next->footnoteflag != LyXParagraph::NO_FOOTNOTE){
-                               tmppar4 =before;
+                               tmppar4 = before;
                                while (tmppar4->previous && 
                                       tmppar4->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE)
                                        tmppar4 = tmppar4->previous;
@@ -3516,48 +3839,51 @@ bool LyXText::TextHandleUndo(Undo * undo){ // returns false if no undo possible
 
 
 void LyXText::FinishUndo()
-{ // makes sure the next operation will be stored
+{
+       // makes sure the next operation will be stored
        undo_finished = True;
 }
 
 
 void LyXText::FreezeUndo()
-{ // this is dangerous and for internal use only
+{
+       // this is dangerous and for internal use only
        undo_frozen = True;
 }
 
 
 void LyXText::UnFreezeUndo()
-{ // this is dangerous and for internal use only
+{
+       // this is dangerous and for internal use only
        undo_frozen = false;
 }
 
 
-void LyXText::SetUndo(Undo::undo_kind kind, LyXParagraph * before,
-                     LyXParagraph * behind)
+void LyXText::SetUndo(Undo::undo_kind kind, LyXParagraph const * before,
+                     LyXParagraph const * behind) const
 {
        if (!undo_frozen)
-               params->undostack.Push(CreateUndo(kind, before, behind));
-       params->redostack.Clear();
+               buffer->undostack.push(CreateUndo(kind, before, behind));
+       buffer->redostack.clear();
 }
 
 
-void LyXText::SetRedo(Undo::undo_kind kind, LyXParagraph * before,
-                     LyXParagraph * behind)
+void LyXText::SetRedo(Undo::undo_kind kind, LyXParagraph const * before,
+                     LyXParagraph const * behind)
 {
-       params->redostack.Push(CreateUndo(kind, before, behind));
+       buffer->redostack.push(CreateUndo(kind, before, behind));
 }
 
 
-Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph * before,
-                         LyXParagraph * behind)
+Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph const * before,
+                         LyXParagraph const * behind) const
 {
        int before_number = -1;
        int behind_number = -1;
        if (before)
-               before_number = before->GetID();
+               before_number = before->id();
        if (behind)
-               behind_number = behind->GetID();
+               behind_number = behind->id();
        // Undo::EDIT  and Undo::FINISH are
        // always finished. (no overlapping there)
        // overlapping only with insert and delete inside one paragraph: 
@@ -3568,10 +3894,10 @@ Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph * before,
        if (!undo_finished && kind != Undo::EDIT && 
            kind != Undo::FINISH){
                // check wether storing is needed
-               if (params->undostack.Top() && 
-                   params->undostack.Top()->kind == kind &&
-                   params->undostack.Top()->number_of_before_par ==  before_number &&
-                   params->undostack.Top()->number_of_behind_par ==  behind_number ){
+               if (!buffer->undostack.empty() && 
+                   buffer->undostack.top()->kind == kind &&
+                   buffer->undostack.top()->number_of_before_par ==  before_number &&
+                   buffer->undostack.top()->number_of_behind_par ==  behind_number ){
                        // no undo needed
                        return 0;
                }
@@ -3596,22 +3922,18 @@ Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph * before,
                        end = end->next;
        }
 
-       if (start && end && start != end->next && (before != behind || (!before && !behind))) {
+       if (start && end
+           && start != end->next
+           && (before != behind || (!before && !behind))) {
                tmppar = start;
                tmppar2 = tmppar->Clone();
-               tmppar2->SetID(tmppar->GetID());
+               tmppar2->id(tmppar->id());
 
-               // a memory optimization: Just store the layout information when only edit
+               // a memory optimization: Just store the layout information
+               // when only edit
                if (kind == Undo::EDIT){
-#ifdef NEW_TEXT
                        //tmppar2->text.clear();
-                       tmppar2->text.erase(tmppar2->text.begin(),
-                                           tmppar2->text.end());
-#else
-                       if (tmppar2->text)
-                               delete[] tmppar2->text;
-                       tmppar2->text = 0;
-#endif
+                       tmppar2->clearContents();
                }
 
                undopar = tmppar2;
@@ -3619,33 +3941,27 @@ Undo * LyXText::CreateUndo(Undo::undo_kind kind, LyXParagraph * before,
                while (tmppar != end && tmppar->next) {
                        tmppar = tmppar->next;
                        tmppar2->next = tmppar->Clone();
-                       tmppar2->next->SetID(tmppar->GetID());
-                       // a memory optimization: Just store the layout information when only edit
+                       tmppar2->next->id(tmppar->id());
+                       // a memory optimization: Just store the layout
+                       // information when only edit
                        if (kind == Undo::EDIT){
-#ifdef NEW_TEXT
                                //tmppar2->next->text.clear();
-                               tmppar2->next->text.erase(tmppar2->next->text.begin(), tmppar2->next->text.end());
-#else
-                               if (tmppar2->next->text)
-                                       delete[] tmppar2->next->text;
-                               tmppar2->next->text = 0;
-#endif
+                               tmppar2->clearContents();
                        }
                        tmppar2->next->previous = tmppar2;
-                       tmppar2=tmppar2->next;
+                       tmppar2 = tmppar2->next;
                }
                tmppar2->next = 0;
-       }
-       else
+       } else
                undopar = 0; // nothing to replace (undo of delete maybe)
   
-       int cursor_par = cursor.par->ParFromPos(cursor.pos)->GetID();
+       int cursor_par = cursor.par->ParFromPos(cursor.pos)->id();
        int cursor_pos =  cursor.par->PositionInParFromPos(cursor.pos);
 
        Undo * undo = new Undo(kind, 
-                             before_number, behind_number,  
-                             cursor_par, cursor_pos, 
-                             undopar);
+                              before_number, behind_number,  
+                              cursor_par, cursor_pos, 
+                              undopar);
   
        undo_finished = false;
        return undo;
@@ -3659,119 +3975,82 @@ void LyXText::SetCursorParUndo()
                cursor.par->ParFromPos(cursor.pos)->next); 
 }
 
-void LyXText::RemoveTableRow(LyXCursor * cursor)
-{
-    int
-        cell_act,
-        cell = -1,
-        cell_org = 0,
-        ocell = 0;
-    
-    /* move to the previous row */
-    cell_act = NumberOfCell(cursor->par, cursor->pos);
-    if (cell < 0)
-        cell = cell_act;
-    while (cursor->pos && !cursor->par->IsNewline(cursor->pos-1))
-        cursor->pos--;
-    while (cursor->pos && 
-           !cursor->par->table->IsFirstCell(cell_act)){
-        cursor->pos--;
-        while (cursor->pos && !cursor->par->IsNewline(cursor->pos-1))
-            cursor->pos--;
-            cell--;
-            cell_act--;
-    }
-    /* now we have to pay attention if the actual table is the
-       main row of TableContRows and if yes to delete all of them */
-    if (!cell_org)
-        cell_org = cell;
-    do {
-        ocell = cell;
-        /* delete up to the next row */
-        while (cursor->pos < cursor->par->Last() && 
-               (cell_act == ocell
-                || !cursor->par->table->IsFirstCell(cell_act))){
-            while (cursor->pos < cursor->par->Last() &&
-                   !cursor->par->IsNewline(cursor->pos))
-                cursor->par->Erase(cursor->pos);
-            cell++;
-            cell_act++;
-            if (cursor->pos < cursor->par->Last())
-                cursor->par-> Erase(cursor->pos);
-        }
-        if (cursor->pos && cursor->pos == cursor->par->Last()){
-            cursor->pos--;
-            cursor->par->Erase(cursor->pos); // no newline at the very end!
-        }
-    } while (((cell+1) < cursor->par->table->GetNumberOfCells()) &&
-             !cursor->par->table->IsContRow(cell_org) &&
-             cursor->par->table->IsContRow(cell));
-    cursor->par->table->DeleteRow(cell_org);
-    return;
-}
 
-
-bool LyXText::IsEmptyTableRow(LyXCursor * old_cursor)
+void LyXText::RemoveTableRow(LyXCursor * cur) const
 {
-       if (!old_cursor->par->table)
-               return false;
-#ifdef I_DONT_KNOW_IF_I_SHOULD_DO_THIS
-       int
-               pos = old_cursor->pos,
-               cell = NumberOfCell(old_cursor->par, pos);
-
-       // search first charater of this table row
-       while (pos && !old_cursor->par->table->IsFirstCell(cell)) {
-               pos--;
-               while (pos && !old_cursor->par->IsNewline(pos-1))
-                       pos--;
-               cell--;
-       }
-       if (!old_cursor->par->IsNewline(pos))
-               return false;
-       cell++;
-       pos++;
-       while ((pos < old_cursor->par->Last()) &&
-              !old_cursor->par->table->IsFirstCell(cell)) {
-               if (!old_cursor->par->IsNewline(pos))
-                       return false;
-               pos++;
-               cell++;
-       }
-       return true;
-#endif
-       return false;
+       int cell = -1;
+       int cell_org = 0;
+       int ocell = 0;
+    
+       // move to the previous row
+       int cell_act = NumberOfCell(cur->par, cur->pos);
+       if (cell < 0)
+               cell = cell_act;
+       while (cur->pos && !cur->par->IsNewline(cur->pos - 1))
+               cur->pos--;
+       while (cur->pos && 
+              !cur->par->table->IsFirstCell(cell_act)) {
+               cur->pos--;
+               while (cur->pos && !cur->par->IsNewline(cur->pos - 1))
+                       cur->pos--;
+               --cell;
+               --cell_act;
+       }
+       // now we have to pay attention if the actual table is the
+       //   main row of TableContRows and if yes to delete all of them
+       if (!cell_org)
+               cell_org = cell;
+       do {
+               ocell = cell;
+               // delete up to the next row
+               while (cur->pos < cur->par->Last() && 
+                      (cell_act == ocell
+                       || !cur->par->table->IsFirstCell(cell_act))) {
+                       while (cur->pos < cur->par->Last() &&
+                              !cur->par->IsNewline(cur->pos))
+                               cur->par->Erase(cur->pos);
+                       ++cell;
+                       ++cell_act;
+                       if (cur->pos < cur->par->Last())
+                               cur->par->Erase(cur->pos);
+               }
+               if (cur->pos && cur->pos == cur->par->Last()) {
+                       cur->pos--;
+                       cur->par->Erase(cur->pos); // no newline at very end!
+               }
+       } while (((cell + 1) < cur->par->table->GetNumberOfCells()) &&
+                !cur->par->table->IsContRow(cell_org) &&
+                cur->par->table->IsContRow(cell));
+       cur->par->table->DeleteRow(cell_org);
+       return;
 }
 
 
-bool LyXText::IsEmptyTableCell()
+bool LyXText::IsEmptyTableCell() const
 {
-#ifdef NEW_TEXT
        LyXParagraph::size_type pos = cursor.pos - 1;
-#else
-       int pos = cursor.pos - 1;
-#endif
        while (pos >= 0 && pos < cursor.par->Last()
               && !cursor.par->IsNewline(pos))
                --pos;
        return cursor.par->IsNewline(pos + 1);
 }
 
+
 void LyXText::toggleAppendix(){
-  LyXParagraph * par = cursor.par->FirstPhysicalPar();
-  bool start = !par->start_of_appendix;
-
-  /* ensure that we have only one start_of_appendix in this document */
-  LyXParagraph * tmp = FirstParagraph();
-  for (;tmp;tmp=tmp->next)
-    tmp->start_of_appendix = 0;
-  par->start_of_appendix = start;
-
-  /* we can set the refreshing parameters now */
-  status = LyXText::NEED_MORE_REFRESH;
-  refresh_y = 0;
-  refresh_row = 0; // not needed for full update
-  UpdateCounters(0);
-  SetCursor(cursor.par, cursor.pos);
+       LyXParagraph * par = cursor.par->FirstPhysicalPar();
+       bool start = !par->start_of_appendix;
+
+       // ensure that we have only one start_of_appendix in this document
+       LyXParagraph * tmp = FirstParagraph();
+       for (; tmp; tmp = tmp->next)
+               tmp->start_of_appendix = 0;
+       par->start_of_appendix = start;
+
+       // we can set the refreshing parameters now
+       status = LyXText::NEED_MORE_REFRESH;
+       refresh_y = 0;
+       refresh_row = 0; // not needed for full update
+       UpdateCounters(0);
+       SetCursor(cursor.par, cursor.pos);
 }