]> git.lyx.org Git - features.git/blobdiff - src/paragraph.C
several changes and some new insets, read the Changelog
[features.git] / src / paragraph.C
index 02023d9b0af87f5879e48e6da07f9a8bcb4d812e..6e432b619c8e3eb8bf5bb2b78a54514b1161e825 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 #include <fstream>
+#include <csignal>
 
 #include "lyxparagraph.h"
 #include "support/textutils.h"
 #include "LaTeXFeatures.h"
 #include "insets/insetinclude.h"
 #include "insets/insetbib.h"
+#include "insets/insettext.h"
 #include "support/filetools.h"
 #include "lyx_gui_misc.h"
 #include "texrow.h"
 #include "support/lyxmanip.h"
+#include "BufferView.h"
 
 using std::ostream;
 using std::endl;
@@ -69,9 +72,10 @@ LyXParagraph::LyXParagraph()
        itemdepth = 0;
        next = 0;
        previous = 0;
+#ifndef NEW_INSETS
        footnoteflag = LyXParagraph::NO_FOOTNOTE;
        footnotekind = LyXParagraph::FOOTNOTE; // should not be needed
-       
+#endif
        align = LYX_ALIGN_BLOCK;
 
 #ifndef NEW_TABULAR
@@ -103,9 +107,10 @@ LyXParagraph::LyXParagraph(LyXParagraph * par)
        previous = par;
        previous->next = this;
        // end
+#ifndef NEW_INSETS
        footnoteflag = LyXParagraph::NO_FOOTNOTE;
        footnotekind = LyXParagraph::FOOTNOTE;
-
+#endif
 #ifndef NEW_TABULAR
        /* table stuff -- begin*/ 
        table = 0;
@@ -120,7 +125,8 @@ LyXParagraph::LyXParagraph(LyXParagraph * par)
 }
 
 
-void LyXParagraph::writeFile(ostream & os, BufferParams const & params,
+void LyXParagraph::writeFile(Buffer const * buf, ostream & os,
+                            BufferParams const & params,
                             char footflag, char dth) const
 {
        LyXFont font1, font2;
@@ -130,7 +136,7 @@ void LyXParagraph::writeFile(ostream & os, BufferParams const & params,
 
        if (footnoteflag != LyXParagraph::NO_FOOTNOTE
            || !previous
-           || previous->footnoteflag == LyXParagraph::NO_FOOTNOTE){
+           || previous->footnoteflag == LyXParagraph::NO_FOOTNOTE) {
                
                // The beginning or the end of a footnote environment?
                if (footflag != footnoteflag) {
@@ -245,7 +251,7 @@ void LyXParagraph::writeFile(ostream & os, BufferParams const & params,
 #endif
        // bibitem  ale970302
        if (bibkey)
-               bibkey->Write(os);
+               bibkey->Write(buf, os);
 
        font1 = LyXFont(LyXFont::ALL_INHERIT,params.language_info);
 
@@ -274,10 +280,10 @@ void LyXParagraph::writeFile(ostream & os, BufferParams const & params,
                                        // international char, let it write
                                        // code directly so it's shorter in
                                        // the file
-                                       inset->Write(os);
+                                       inset->Write(buf, os);
                                } else {
                                        os << "\n\\begin_inset ";
-                                       inset->Write(os);
+                                       inset->Write(buf, os);
                                        os << "\n\\end_inset \n\n";
                                        column = 0;
                                }
@@ -322,7 +328,7 @@ void LyXParagraph::writeFile(ostream & os, BufferParams const & params,
 
        // now write the next paragraph
        if (next)
-               next->writeFile(os, params, footflag, dth);
+               next->writeFile(buf, os, params, footflag, dth);
 }
 
 
@@ -369,23 +375,13 @@ void LyXParagraph::validate(LaTeXFeatures & features) const
                                             << (*cit).font.stateText(0)
                                             << endl;
                }
-#if 0
+
                Language const * language = (*cit).font.language();
                if (language != doc_language) {
                        features.UsedLanguages.insert(language);
                        lyxerr[Debug::LATEX] << "Found language "
-                                            << language->lang << endl;
+                                            << language->lang() << endl;
                }
-#endif
-       }
-
-       // This is not efficient. I plan to use the code above, after I
-       // change the fontlist handling.
-       for (size_type i = 0; i < size(); ++i) {
-               Language const * language =
-                       GetFontSettings(params, i).language();
-               if (language != doc_language)
-                       features.UsedLanguages.insert(language);
        }
 
        // then the insets
@@ -468,10 +464,17 @@ bool LyXParagraph::InsertFromMinibuffer(LyXParagraph::size_type pos)
        if ((minibuffer_char == LyXParagraph::META_INSET) &&
            !InsertInsetAllowed(minibuffer_inset))
                return false;
+#ifdef NEW_WAY
+       if (minibuffer_char == LyXParagraph::META_INSET)
+               InsertInset(pos, minibuffer_inset, minibuffer_font);
+       else
+               InsertChar(pos, minibuffer_char, minibuffer_font);
+#else
        InsertChar(pos, minibuffer_char);
        SetFont(pos, minibuffer_font);
        if (minibuffer_char == LyXParagraph::META_INSET)
                InsertInset(pos, minibuffer_inset);
+#endif
        return true;
 }
 
@@ -542,9 +545,11 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos)
        // > because last is the next unused position, and you can 
        // use it if you want
        if (pos > size()) {
+#ifndef NEW_INSETS
                if (next && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) 
                        NextAfterFootnote()->Erase(pos - text.size() - 1);
                else 
+#endif
                        lyxerr.debug() << "ERROR (LyXParagraph::Erase): "
                                "position does not exist." << endl;
                return;
@@ -562,28 +567,31 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos)
                        }
                }
                text.erase(text.begin() + pos);
+
                // Erase entries in the tables.
-               for (FontList::iterator it = fontlist.begin();
-                    it != fontlist.end(); ++it) {
-                       if (pos >= (*it).pos && pos <= (*it).pos_end) {
-                               if ((*it).pos == (*it).pos_end) {
-                                       // If it is a multi-character font
-                                       // entry, we just make it smaller
-                                       // (see update below), otherwise we
-                                       // should delete it.
-                                       fontlist.erase(it);
-                                       break;
-                               }
+               FontList::iterator it = lower_bound(fontlist.begin(),
+                                                   fontlist.end(),
+                                                   pos, matchFT());
+               if (it != fontlist.end() && (*it).pos == pos &&
+                   (pos == 0 || 
+                    (it != fontlist.begin() && (*(it-1)).pos == pos - 1))) {
+                       // If it is a multi-character font
+                       // entry, we just make it smaller
+                       // (see update below), otherwise we
+                       // should delete it.
+                       unsigned int i = it - fontlist.begin();
+                       fontlist.erase(fontlist.begin() + i);
+                       it = fontlist.begin() + i;
+                       if (i > 0 && i < fontlist.size() &&
+                           fontlist[i-1].font == fontlist[i].font) {
+                               fontlist.erase(fontlist.begin() + i-1);
+                               it = fontlist.begin() + i-1;
                        }
                }
+
                // Update all other entries.
-               for (FontList::iterator it = fontlist.begin();
-                    it != fontlist.end(); ++it) {
-                       if ((*it).pos > pos)
-                               (*it).pos--;
-                       if ((*it).pos_end >= pos)
-                               (*it).pos_end--;
-               }
+               for (; it != fontlist.end(); ++it)
+                       --(*it).pos;
 
                // Update the inset table.
                for (InsetList::iterator it = upper_bound(insetlist.begin(),
@@ -600,27 +608,67 @@ void LyXParagraph::Erase(LyXParagraph::size_type pos)
 
 void LyXParagraph::InsertChar(LyXParagraph::size_type pos, char c)
 {
+#ifndef NEW_WAY
        // > because last is the next unused position, and you can 
        // use it if you want
        if (pos > size()) {
+#ifndef NEW_INSETS
                if (next
                    && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) 
                        NextAfterFootnote()->InsertChar(pos - text.size() - 1,
                                                        c);
                else 
+#endif
                        lyxerr.debug() << "ERROR (LyXParagraph::InsertChar): "
                                "position does not exist." << endl;
                return;
        }
        text.insert(text.begin() + pos, c);
        // Update the font table.
-       for (FontList::iterator it = fontlist.begin();
-            it != fontlist.end(); ++it) {
-               if ((*it).pos >= pos)
-                       (*it).pos++;
-               if ((*it).pos_end >= pos)
-                       (*it).pos_end++;
+       for (FontList::iterator it = lower_bound(fontlist.begin(),
+                                                fontlist.end(),
+                                                pos, matchFT());
+            it != fontlist.end(); ++it)
+               ++(*it).pos;
+   
+       // Update the inset table.
+       for (InsetList::iterator it = lower_bound(insetlist.begin(),
+                                                 insetlist.end(),
+                                                 pos, matchIT());
+            it != insetlist.end(); ++it)
+               ++(*it).pos;
+#else
+       LyXFont f(LyXFont::ALL_INHERIT);
+       InsertChar(pos, c, f);
+#endif
+}
+
+
+#ifdef NEW_WAY
+void LyXParagraph::InsertChar(LyXParagraph::size_type pos,
+                             char c, LyXFont const & font)
+{
+       // > because last is the next unused position, and you can 
+       // use it if you want
+       if (pos > size()) {
+#ifndef NEW_INSETS
+               if (next
+                   && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) 
+                       NextAfterFootnote()->InsertChar(pos - text.size() - 1,
+                                                       c);
+               else 
+#endif
+                       lyxerr.debug() << "ERROR (LyXParagraph::InsertChar): "
+                               "position does not exist." << endl;
+               return;
        }
+       text.insert(text.begin() + pos, c);
+       // Update the font table.
+       for (FontList::iterator it = lower_bound(fontlist.begin(),
+                                                fontlist.end(),
+                                                pos, matchFT());
+            it != fontlist.end(); ++it)
+               ++(*it).pos;
    
        // Update the inset table.
        for (InsetList::iterator it = lower_bound(insetlist.begin(),
@@ -628,20 +676,29 @@ void LyXParagraph::InsertChar(LyXParagraph::size_type pos, char c)
                                                  pos, matchIT());
             it != insetlist.end(); ++it)
                ++(*it).pos;
+
+       SetFont(pos, font);
 }
+#endif
 
 
 void LyXParagraph::InsertInset(LyXParagraph::size_type pos,
                               Inset * inset)
 {
+#ifdef NEW_WAY
+       LyXFont f(LyXFont::ALL_INHERIT);
+       InsertInset(pos, inset, f);
+#else
        // > because last is the next unused position, and you can 
        // use it if you want
        if (pos > size()) {
+#ifndef NEW_INSETS
                if (next
                    && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) 
                        NextAfterFootnote()
                                ->InsertInset(pos - text.size() - 1, inset);
-               else 
+               else
+#endif
                        lyxerr << "ERROR (LyXParagraph::InsertInset): " 
                                "position does not exist: " << pos << endl;
                return;
@@ -665,9 +722,50 @@ void LyXParagraph::InsertInset(LyXParagraph::size_type pos,
                if (inset_owner)
                        inset->setOwner(inset_owner);
        }
+#endif
 }
 
 
+#ifdef NEW_WAY
+void LyXParagraph::InsertInset(LyXParagraph::size_type pos,
+                              Inset * inset, LyXFont const & font)
+{
+       Assert(inset);
+       
+       // > because last is the next unused position, and you can 
+       // use it if you want
+       if (pos > size()) {
+#ifndef NEW_INSETS
+               if (next
+                   && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) 
+                       NextAfterFootnote()
+                               ->InsertInset(pos - text.size() - 1,
+                                             inset, font);
+               else
+#endif
+                       lyxerr << "ERROR (LyXParagraph::InsertInset): " 
+                               "position does not exist: " << pos << endl;
+               return;
+       }
+       
+       InsertChar(pos, META_INSET, font);
+       Assert(text[pos] == META_INSET);
+       
+       // Add a new entry in the inset table.
+       InsetList::iterator it = lower_bound(insetlist.begin(),
+                                            insetlist.end(),
+                                            pos, matchIT());
+       if (it != insetlist.end() && (*it).pos == pos)
+               lyxerr << "ERROR (LyXParagraph::InsertInset): "
+                       "there is an inset in position: " << pos << endl;
+       else
+               insetlist.insert(it, InsetTable(pos, inset));
+       if (inset_owner)
+               inset->setOwner(inset_owner);
+}
+#endif
+
+
 bool LyXParagraph::InsertInsetAllowed(Inset * inset)
 {
        if (inset_owner)
@@ -679,15 +777,17 @@ bool LyXParagraph::InsertInsetAllowed(Inset * inset)
 Inset * LyXParagraph::GetInset(LyXParagraph::size_type pos)
 {
        if (pos >= size()) {
+#ifndef NEW_INSETS
                if (next
                    && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) 
                        return NextAfterFootnote()
                                ->GetInset(pos - text.size() - 1);
-               else { 
+               else
+#endif
                        lyxerr << "ERROR (LyXParagraph::GetInset): "
                                "position does not exist: "
                               << pos << endl;
-               }
+               
                return 0;
        }
        // Find the inset.
@@ -699,6 +799,8 @@ Inset * LyXParagraph::GetInset(LyXParagraph::size_type pos)
 
        lyxerr << "ERROR (LyXParagraph::GetInset): "
                "Inset does not exist: " << pos << endl;
+       //::raise(SIGSTOP);
+       
        // text[pos] = ' '; // WHY!!! does this set the pos to ' '????
        // Did this commenting out introduce a bug? So far I have not
        // see any, please enlighten me. (Lgb)
@@ -711,15 +813,17 @@ Inset * LyXParagraph::GetInset(LyXParagraph::size_type pos)
 Inset const * LyXParagraph::GetInset(LyXParagraph::size_type pos) const
 {
        if (pos >= size()) {
+#ifndef NEW_INSETS
                if (next
                    && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) 
                        return NextAfterFootnote()
                                ->GetInset(pos - text.size() - 1);
-               else { 
+               else
+#endif
                        lyxerr << "ERROR (LyXParagraph::GetInset): "
                                "position does not exist: "
                               << pos << endl;
-               }
+
                return 0;
        }
        // Find the inset.
@@ -731,6 +835,7 @@ Inset const * LyXParagraph::GetInset(LyXParagraph::size_type pos) const
 
        lyxerr << "ERROR (LyXParagraph::GetInset): "
                "Inset does not exist: " << pos << endl;
+       //::raise(SIGSTOP);
        //text[pos] = ' '; // WHY!!! does this set the pos to ' '????
        // Did this commenting out introduce a bug? So far I have not
        // see any, please enlighten me. (Lgb)
@@ -746,27 +851,23 @@ LyXFont LyXParagraph::GetFontSettings(BufferParams const & bparams,
                                      LyXParagraph::size_type pos) const
 {
        if (pos < size()) {
-#ifdef SORTED_FONT_LIST
-               for (FontList::const_iterator cit = fontlist.begin();
-                    cit != fontlist.end() && pos <= (*cit).pos_end; ++cit)
-                       if (pos >= (*cit).pos)
-                               return (*cit).font;
-#else
-               for (FontList::const_iterator cit = fontlist.begin();
-                    cit != fontlist.end(); ++cit)
-                       if (pos >= (*cit).pos && pos <= (*cit).pos_end)
-                               return (*cit).font;
-#endif
+               FontList::const_iterator cit = lower_bound(fontlist.begin(),
+                                                   fontlist.end(),
+                                                   pos, matchFT());
+               if (cit != fontlist.end())
+                       return (*cit).font;
        }
        // > because last is the next unused position, and you can 
        // use it if you want
        else if (pos > size()) {
+#ifndef NEW_INSETS
                if (next
                    && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) 
                        return NextAfterFootnote()
                                ->GetFontSettings(bparams,
                                                  pos - text.size() - 1);
-               else {
+               else
+#endif
                        // Why is it an error to ask for the font of a
                        // position that does not exist? Would it be
                        // enough for this to be enabled on debug?
@@ -776,7 +877,6 @@ LyXFont LyXParagraph::GetFontSettings(BufferParams const & bparams,
                                "position does not exist. "
                               << pos << " (" << static_cast<int>(pos)
                               << ")" << endl;
-               }
        } else if (pos > 0) {
                return GetFontSettings(bparams, pos - 1);
        } else // pos = size() = 0
@@ -789,17 +889,14 @@ LyXFont LyXParagraph::GetFontSettings(BufferParams const & bparams,
 LyXFont LyXParagraph::GetFirstFontSettings() const
 {
        if (size() > 0) {
-#ifdef SORTED_FONT_LIST
-               if (!fontlist.empty() && fontlist.front().pos == 0)
-                       return fontlist.front().font;
-#else
-               for (FontList::const_iterator cit = fontlist.begin();
-                    cit != fontlist.end(); ++cit)
-                       if (0 >= (*cit).pos && 0 <= (*cit).pos_end)
-                               return (*cit).font;
-#endif
-       } else if (next && next->footnoteflag != LyXParagraph::NO_FOOTNOTE) 
+               if (!fontlist.empty())
+                       return fontlist[0].font;
+       }
+       
+#ifndef NEW_INSETS
+       else if (next && next->footnoteflag != LyXParagraph::NO_FOOTNOTE) 
                return NextAfterFootnote()->GetFirstFontSettings();
+#endif
        return LyXFont(LyXFont::ALL_INHERIT);
 }
 
@@ -865,13 +962,22 @@ LyXParagraph::HighestFontInRange(LyXParagraph::size_type startpos,
                                 LyXParagraph::size_type endpos) const
 {
        LyXFont::FONT_SIZE maxsize = LyXFont::SIZE_TINY;
-       for (FontList::const_iterator cit = fontlist.begin();
-            cit != fontlist.end(); ++cit) {
-               if (startpos <= (*cit).pos_end && endpos >= (*cit).pos) {
-                       LyXFont::FONT_SIZE size = (*cit).font.size();
-                       if (size > maxsize && size <= LyXFont::SIZE_HUGER)
-                               maxsize = size;
-               }
+       if (fontlist.empty())
+               return maxsize;
+       
+       FontList::const_iterator end_it = lower_bound(fontlist.begin(),
+                                                     fontlist.end(),
+                                                     endpos, matchFT());
+       if (end_it != fontlist.end())
+               ++end_it;
+
+       for (FontList::const_iterator cit = lower_bound(fontlist.begin(),
+                                                       fontlist.end(),
+                                                       startpos, matchFT());
+            cit != end_it; ++cit) {
+               LyXFont::FONT_SIZE size = (*cit).font.size();
+               if (size > maxsize && size <= LyXFont::SIZE_HUGER)
+                       maxsize = size;
        }
        return maxsize;
 }
@@ -887,10 +993,13 @@ char LyXParagraph::GetChar(LyXParagraph::size_type pos)
        // > because last is the next unused position, and you can 
        // use it if you want
        else if (pos > size()) {
+#ifndef NEW_INSETS
                if (next && next->footnoteflag != LyXParagraph::NO_FOOTNOTE) 
                        return NextAfterFootnote()
                                ->GetChar(pos - text.size() - 1);
-               else {
+               else
+#endif
+                       {
                        lyxerr << "ERROR (LyXParagraph::GetChar): "
                                "position does not exist."
                               << pos << " (" << static_cast<int>(pos)
@@ -898,8 +1007,12 @@ char LyXParagraph::GetChar(LyXParagraph::size_type pos)
                        // Assert(false); // This triggers sometimes...
                        // Why?
                }
+               
                return '\0';
-       } else {
+       }
+       
+#ifndef NEW_INSETS
+       else {
                // We should have a footnote environment.
                if (!next || next->footnoteflag == LyXParagraph::NO_FOOTNOTE) {
                        // Notice that LyX does request the
@@ -924,6 +1037,7 @@ char LyXParagraph::GetChar(LyXParagraph::size_type pos)
                }
                return '\0'; // to shut up gcc
        }
+#endif
 }
 
 
@@ -937,10 +1051,13 @@ char LyXParagraph::GetChar(LyXParagraph::size_type pos) const
        // > because last is the next unused position, and you can 
        // use it if you want
        else if (pos > size()) {
+#ifndef NEW_INSETS
                if (next && next->footnoteflag != LyXParagraph::NO_FOOTNOTE) 
                        return NextAfterFootnote()
                                ->GetChar(pos - text.size() - 1);
-               else {
+               else
+#endif
+                       {
                        lyxerr << "ERROR (LyXParagraph::GetChar const): "
                                "position does not exist."
                               << pos << " (" << static_cast<int>(pos)
@@ -948,7 +1065,9 @@ char LyXParagraph::GetChar(LyXParagraph::size_type pos) const
                        Assert(false);
                }
                return '\0';
-       } else {
+       }
+#ifndef NEW_INSETS
+       else {
                // We should have a footnote environment.
                if (!next || next->footnoteflag == LyXParagraph::NO_FOOTNOTE) {
                        // Notice that LyX does request the
@@ -973,6 +1092,7 @@ char LyXParagraph::GetChar(LyXParagraph::size_type pos) const
                }
                return '\0'; // to shut up gcc
        }
+#endif
 }
 
 
@@ -1025,11 +1145,13 @@ string LyXParagraph::GetWord(LyXParagraph::size_type & lastpos) const
  
 LyXParagraph::size_type LyXParagraph::Last() const
 {
+#ifndef NEW_INSETS
        if (next && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE)
                return text.size() + NextAfterFootnote()->Last() + 1;
        // the 1 is the symbol
        // for the footnote
        else
+#endif
                return text.size();
 }
 
@@ -1039,11 +1161,13 @@ LyXParagraph * LyXParagraph::ParFromPos(LyXParagraph::size_type pos)
        // > because last is the next unused position, and you can 
        // use it if you want
        if (pos > size()) {
+#ifndef NEW_INSETS
                if (next
                    && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) 
                        return NextAfterFootnote()
                                ->ParFromPos(pos - text.size() - 1);
-               else 
+               else
+#endif
                        lyxerr << "ERROR (LyXParagraph::ParFromPos): "
                                "position does not exist." << endl;
                return this;
@@ -1057,11 +1181,13 @@ int LyXParagraph::PositionInParFromPos(LyXParagraph::size_type pos) const
        // > because last is the next unused position, and you can 
        // use it if you want
        if (pos > size()) {
+#ifndef NEW_INSETS
                if (next
                    && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) 
                        return NextAfterFootnote()
                                ->PositionInParFromPos(pos - text.size() - 1);
-               else 
+               else
+#endif
                        lyxerr <<
                                "ERROR (LyXParagraph::PositionInParFromPos): "
                                "position does not exist." << endl;
@@ -1078,17 +1204,18 @@ void LyXParagraph::SetFont(LyXParagraph::size_type pos,
        // > because last is the next unused position, and you can 
        // use it if you want
        if (pos > size()) {
+#ifndef NEW_INSETS
                if (next &&
                    next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
                        NextAfterFootnote()->SetFont(pos - text.size() - 1,
                                                     font);
-               } else {
+               } else
+#endif
                        lyxerr << "ERROR (LyXParagraph::SetFont): "
                                "position does not exist." << endl;
-               }
+               
                return;
        }
-       LyXFont patternfont(LyXFont::ALL_INHERIT);
 
        // First, reduce font against layout/label font
        // Update: The SetCharFont() routine in text2.C already
@@ -1096,106 +1223,50 @@ void LyXParagraph::SetFont(LyXParagraph::size_type pos,
        // No need to simplify this because it will disappear
        // in a new kernel. (Asger)
        // Next search font table
-       FontList::iterator tmp = fontlist.begin();
-       for (; tmp != fontlist.end(); ++tmp) {
-               if (pos >= (*tmp).pos && pos <= (*tmp).pos_end) {
-                       break;
-               }
-       }
-       if (tmp == fontlist.end()) { // !found
-               // if we did not find a font entry, but if the font at hand
-               // is the same as default, we just forget it
-               if (font == patternfont) return;
-
-               // ok, we did not find a font entry. But maybe there is exactly
-               // the needed font ientry one position left
-               FontList::iterator tmp2 = fontlist.begin();
-               for (; tmp2 != fontlist.end(); ++tmp2) {
-                       if (pos - 1 >= (*tmp2).pos
-                           && pos - 1 <= (*tmp2).pos_end)
-                               break;
-               }
-               if (tmp2 != fontlist.end()) {
-                       // ok there is one, maybe it is exactly
-                       // the needed font
-                       if ((*tmp2).font == font) {
-                               // put the position under the font
-                               (*tmp2).pos_end++;
-                               return;
-                       }
-               }
-               // Add a new entry in the
-               // fontlist for the position
-               FontTable ft;
-               ft.pos = pos;
-               ft.pos_end = pos;
-               ft.font = font; // or patternfont
-               // It seems that using font instead of patternfont here
-               // fixes all the problems. This also surfaces a "bug" in
-               // the old code.
-               fontlist.insert(fontlist.begin(), ft);
-       } else if ((*tmp).pos != (*tmp).pos_end) { // we found a font entry. maybe we have to split it and create a new one.
-
-// more than one character
-               if (pos == (*tmp).pos) {
-                       // maybe we should enlarge the left fonttable
-                       FontList::iterator tmp2 = fontlist.begin();
-                       for (; tmp2 != fontlist.end(); ++tmp2) {
-                               if (pos - 1 >= (*tmp2).pos
-                                   && pos - 1 <= (*tmp2).pos_end)
-                                       break;
-                       }
-                       // Is there is one, and is it exactly
-                       // the needed font?
-                       if (tmp2 != fontlist.end() &&
-                           (*tmp2).font == font) {
-                               // Put the position under the font
-                               (*tmp2).pos_end++;
-                               (*tmp).pos++;
-                               return;
-                       }
 
-                       // Add a new entry in the
-                       // fontlist for the position
-                       FontTable ft;
-                       ft.pos = pos + 1;
-                       ft.pos_end = (*tmp).pos_end;
-                       ft.font = (*tmp).font;
-                       (*tmp).pos_end = pos;
-                       (*tmp).font = font;
-                       fontlist.insert(fontlist.begin(), ft);
-               } else if (pos == (*tmp).pos_end) {
-                       // Add a new entry in the
-                       // fontlist for the position
-                       FontTable ft;
-                       ft.pos = (*tmp).pos;
-                       ft.pos_end = (*tmp).pos_end - 1;
-                       ft.font = (*tmp).font;
-                       (*tmp).pos = (*tmp).pos_end;
-                       (*tmp).font = font;
-                       fontlist.insert(fontlist.begin(), ft);
-               } else {
-                       // Add a new entry in the
-                       // fontlist for the position
-                       FontTable ft;
-                       ft.pos = (*tmp).pos;
-                       ft.pos_end = pos - 1;
-                       ft.font = (*tmp).font;
-                       
-                       FontTable ft2;
-                       ft2.pos = pos + 1;
-                       ft2.pos_end = (*tmp).pos_end;
-                       ft2.font = (*tmp).font;
-                       
-                       (*tmp).pos = pos;
-                       (*tmp).pos_end = pos;
-                       (*tmp).font = font;
-                       
-                       fontlist.insert(fontlist.begin(), ft);
-                       fontlist.insert(fontlist.begin(), ft2);
-               }
-       } else {
-               (*tmp).font = font;
+       FontList::iterator it = lower_bound(fontlist.begin(),
+                                           fontlist.end(),
+                                           pos, matchFT());
+       unsigned int i = it - fontlist.begin();
+       bool notfound = it == fontlist.end();
+
+       if (!notfound && fontlist[i].font == font)
+               return;
+
+       bool begin = pos == 0 || notfound ||
+               (i > 0 && fontlist[i-1].pos == pos - 1);
+       // Is position pos is a beginning of a font block?
+       bool end = !notfound && fontlist[i].pos == pos;
+       // Is position pos is the end of a font block?
+       if (begin && end) { // A single char block
+               if (i+1 < fontlist.size() &&
+                   fontlist[i+1].font == font) {
+                       // Merge the singleton block with the next block
+                       fontlist.erase(fontlist.begin() + i);
+                       if (i > 0 && fontlist[i-1].font == font)
+                               fontlist.erase(fontlist.begin() + i-1);
+               } else if (i > 0 && fontlist[i-1].font == font) {
+                       // Merge the singleton block with the previous block
+                       fontlist[i-1].pos = pos;
+                       fontlist.erase(fontlist.begin() + i);
+               } else
+                       fontlist[i].font = font;
+       } else if (begin) {
+               if (i > 0 && fontlist[i-1].font == font)
+                       fontlist[i-1].pos = pos;
+               else
+                       fontlist.insert(fontlist.begin() + i,
+                                       FontTable(pos, font));
+       } else if (end) {
+               fontlist[i].pos = pos - 1;
+               if (!(i+1 < fontlist.size() &&
+                     fontlist[i+1].font == font))
+                       fontlist.insert(fontlist.begin() + i+1,
+                                       FontTable(pos, font));
+       } else { // The general case. The block is splitted into 3 blocks
+               fontlist.insert(fontlist.begin() + i, 
+                               FontTable(pos - 1, fontlist[i].font));
+               fontlist.insert(fontlist.begin() + i+1, FontTable(pos, font));
        }
 }
 
@@ -1203,6 +1274,7 @@ void LyXParagraph::SetFont(LyXParagraph::size_type pos,
 // This function is able to hide closed footnotes.
 LyXParagraph * LyXParagraph::Next()
 {
+#ifndef NEW_INSETS
        if (next && next->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
                LyXParagraph * tmp = next;
                while (tmp
@@ -1215,12 +1287,14 @@ LyXParagraph * LyXParagraph::Next()
                else
                        return next;  // This should never happen!
        } else
+#endif
                return next;
 }
 
 
 LyXParagraph * LyXParagraph::NextAfterFootnote()
 {
+#ifndef NEW_INSETS
        if (next && next->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
                LyXParagraph * tmp = next;
                while (tmp && tmp->footnoteflag != LyXParagraph::NO_FOOTNOTE)
@@ -1231,12 +1305,14 @@ LyXParagraph * LyXParagraph::NextAfterFootnote()
                else
                        return next;  // This should never happen!
        } else
+#endif
                return next;
 }
 
 
 LyXParagraph const * LyXParagraph::NextAfterFootnote() const
 {
+#ifndef NEW_INSETS
        if (next && next->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
                LyXParagraph * tmp = next;
                while (tmp && tmp->footnoteflag != LyXParagraph::NO_FOOTNOTE)
@@ -1247,12 +1323,14 @@ LyXParagraph const * LyXParagraph::NextAfterFootnote() const
                else
                        return next;  // This should never happen!
        } else
+#endif
                return next;
 }
 
 
 LyXParagraph * LyXParagraph::PreviousBeforeFootnote()
 {
+#ifndef NEW_INSETS
        LyXParagraph * tmp;
        if (previous && previous->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
                tmp = previous;
@@ -1264,12 +1342,14 @@ LyXParagraph * LyXParagraph::PreviousBeforeFootnote()
                else
                        return previous;  // This should never happen!
        } else
+#endif
                return previous;
 }
 
 
 LyXParagraph * LyXParagraph::LastPhysicalPar()
 {
+#ifndef NEW_INSETS
        if (footnoteflag != LyXParagraph::NO_FOOTNOTE)
                return this;
    
@@ -1279,10 +1359,14 @@ LyXParagraph * LyXParagraph::LastPhysicalPar()
                tmp = tmp->NextAfterFootnote();
    
        return tmp;
+#else
+       return this;
+#endif
 }
 
 LyXParagraph const * LyXParagraph::LastPhysicalPar() const
 {
+#ifndef NEW_INSETS
        if (footnoteflag != LyXParagraph::NO_FOOTNOTE)
                return this;
    
@@ -1291,11 +1375,15 @@ LyXParagraph const * LyXParagraph::LastPhysicalPar() const
               && tmp->next->footnoteflag != LyXParagraph::NO_FOOTNOTE)
                tmp = tmp->NextAfterFootnote();
    
-       return tmp;  
+       return tmp;
+#else
+       return this;
+#endif
 }
 
 LyXParagraph * LyXParagraph::FirstPhysicalPar()
 {
+#ifndef NEW_INSETS
        if (!IsDummy())
                return this;
        LyXParagraph * tmppar = this;
@@ -1309,11 +1397,15 @@ LyXParagraph * LyXParagraph::FirstPhysicalPar()
                return this;
        } else
                return tmppar;
+#else
+       return this;
+#endif
 }
 
 
 LyXParagraph const * LyXParagraph::FirstPhysicalPar() const
 {
+#ifndef NEW_INSETS
        if (!IsDummy())
                return this;
        LyXParagraph const * tmppar = this;
@@ -1327,6 +1419,9 @@ LyXParagraph const * LyXParagraph::FirstPhysicalPar() const
                return this;
        } else
                return tmppar;
+#else
+       return this;
+#endif
 }
 
 
@@ -1336,7 +1431,8 @@ LyXParagraph * LyXParagraph::Previous()
        LyXParagraph * tmp = previous;
        if (!tmp)
                return tmp;
-   
+
+#ifndef NEW_INSETS
        if (tmp->previous
            && tmp->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
                tmp = tmp->previous;
@@ -1349,6 +1445,7 @@ LyXParagraph * LyXParagraph::Previous()
                else
                        return previous; 
        } else
+#endif
                return previous;
 }
 
@@ -1359,7 +1456,7 @@ LyXParagraph const * LyXParagraph::Previous() const
        LyXParagraph * tmp = previous;
        if (!tmp)
                return tmp;
-   
+#ifndef NEW_INSETS
        if (tmp->previous
            && tmp->previous->footnoteflag == LyXParagraph::CLOSED_FOOTNOTE) {
                tmp = tmp->previous;
@@ -1372,6 +1469,7 @@ LyXParagraph const * LyXParagraph::Previous() const
                else
                        return previous; 
        } else
+#endif
                return previous;
 }
 
@@ -1386,10 +1484,11 @@ void LyXParagraph::BreakParagraph(BufferParams const & bparams,
        LyXParagraph * firstpar = FirstPhysicalPar();
    
        LyXParagraph * tmp = new LyXParagraph(par);
-       
+
+#ifndef NEW_INSETS
        tmp->footnoteflag = footnoteflag;
        tmp->footnotekind = footnotekind;
-   
+#endif
        // this is an idea for a more userfriendly layout handling, I will
        // see what the users say
    
@@ -1454,9 +1553,10 @@ void LyXParagraph::BreakParagraph(BufferParams const & bparams,
 void LyXParagraph::MakeSameLayout(LyXParagraph const * par)
 {
        par = par->FirstPhysicalPar();
+#ifndef NEW_INSETS
        footnoteflag = par->footnoteflag;
        footnotekind = par->footnotekind;
-
+#endif
        layout = par->layout;
        align = par-> align;
        SetLabelWidthString(par->labelwidthstring);
@@ -1483,6 +1583,7 @@ void LyXParagraph::MakeSameLayout(LyXParagraph const * par)
 }
 
 
+#ifndef NEW_INSETS
 LyXParagraph * LyXParagraph::FirstSelfrowPar()
 {
        LyXParagraph * tmppar = this;
@@ -1498,6 +1599,8 @@ LyXParagraph * LyXParagraph::FirstSelfrowPar()
        else
                return tmppar;
 }
+#endif
+
 
 int LyXParagraph::StripLeadingSpaces(LyXTextClassList::size_type tclass) 
 {
@@ -1558,9 +1661,10 @@ bool LyXParagraph::HasSameLayout(LyXParagraph const * par) const
        par = par->FirstPhysicalPar();
 
        return (
+#ifndef NEW_INSETS
                par->footnoteflag == footnoteflag &&
                par->footnotekind == footnotekind &&
-
+#endif
                par->layout == layout &&
 
                par->align == align &&
@@ -1650,13 +1754,14 @@ void LyXParagraph::PasteParagraph(BufferParams const & bparams)
        }
    
        // delete the next paragraph
-       LyXParagraph *ppar = the_next->previous;
-       LyXParagraph *npar = the_next->next;
+       LyXParagraph * ppar = the_next->previous;
+       LyXParagraph * npar = the_next->next;
        delete the_next;
        ppar->next = npar;
 }
 
 
+#ifndef NEW_INSETS
 void LyXParagraph::OpenFootnote(LyXParagraph::size_type pos)
 {
        LyXParagraph * par = ParFromPos(pos);
@@ -1677,6 +1782,7 @@ void LyXParagraph::CloseFootnote(LyXParagraph::size_type pos)
                par = par->next;
        }
 }
+#endif
 
 int LyXParagraph::GetEndLabel(BufferParams const & bparams) const
 {
@@ -2007,7 +2113,8 @@ int LyXParagraph::GetPositionOfInset(Inset * inset) const
 }
 
 
-LyXParagraph * LyXParagraph::TeXOnePar(BufferParams const & bparams,
+LyXParagraph * LyXParagraph::TeXOnePar(Buffer const * buf,
+                                      BufferParams const & bparams,
                                       ostream & os, TexRow & texrow,
                                       bool moving_arg, 
                                       ostream & foot,
@@ -2077,7 +2184,7 @@ LyXParagraph * LyXParagraph::TeXOnePar(BufferParams const & bparams,
                break;
        case LATEX_ITEM_ENVIRONMENT:
                if (bibkey) {
-                       bibkey->Latex(os, false, false);
+                       bibkey->Latex(buf, os, false, false);
                } else
                        os << "\\item ";
                break;
@@ -2088,8 +2195,9 @@ LyXParagraph * LyXParagraph::TeXOnePar(BufferParams const & bparams,
                break;
        }
 
-       bool need_par = SimpleTeXOnePar(bparams, os, texrow, moving_arg);
+       bool need_par = SimpleTeXOnePar(buf, bparams, os, texrow, moving_arg);
  
+#ifndef NEW_INSETS
        // Spit out footnotes
        LyXParagraph * par = next;
        if (lyxrc.rtl_support) {
@@ -2106,11 +2214,11 @@ LyXParagraph * LyXParagraph::TeXOnePar(BufferParams const & bparams,
                                is_rtl = getParLanguage(bparams)->RightToLeft();
                        while (par && par->footnoteflag != LyXParagraph::NO_FOOTNOTE
                               && par->footnoteflag != footnoteflag) {
-                               par = par->TeXFootnote(bparams,
+                               par = par->TeXFootnote(buf, bparams,
                                                       os, texrow, foot,
                                                       foot_texrow, foot_count,
                                                       is_rtl);
-                               par->SimpleTeXOnePar(bparams,
+                               par->SimpleTeXOnePar(buf, bparams,
                                                     os, texrow, moving_arg);
                                is_rtl = (par->size() > 0)
                                        ? par->GetFontSettings(bparams,
@@ -2128,14 +2236,15 @@ LyXParagraph * LyXParagraph::TeXOnePar(BufferParams const & bparams,
        } else {
                while (par && par->footnoteflag != LyXParagraph::NO_FOOTNOTE
                       && par->footnoteflag != footnoteflag) {
-                       par = par->TeXFootnote(bparams,
+                       par = par->TeXFootnote(buf, bparams,
                                               os, texrow,
                                               foot, foot_texrow, foot_count,
                                               false);
-                       par->SimpleTeXOnePar(bparams, os, texrow, moving_arg);
+                       par->SimpleTeXOnePar(buf, bparams, os, texrow, moving_arg);
                        par = par->next;
                }
        }
+#endif
 
        // Make sure that \\par is done with the font of the last
        // character if this has another size as the default.
@@ -2244,7 +2353,8 @@ LyXParagraph * LyXParagraph::TeXOnePar(BufferParams const & bparams,
 
 
 // This one spits out the text of the paragraph
-bool LyXParagraph::SimpleTeXOnePar(BufferParams const & bparams,
+bool LyXParagraph::SimpleTeXOnePar(Buffer const * buf,
+                                  BufferParams const & bparams,
                                   ostream & os, TexRow & texrow,
                                   bool moving_arg)
 {
@@ -2252,7 +2362,7 @@ bool LyXParagraph::SimpleTeXOnePar(BufferParams const & bparams,
 
 #ifndef NEW_TABULAR
        if (table)
-               return SimpleTeXOneTablePar(bparams, os, texrow);
+               return SimpleTeXOneTablePar(buf, bparams, os, texrow);
 #endif
 
        bool return_value = false;
@@ -2430,7 +2540,7 @@ bool LyXParagraph::SimpleTeXOnePar(BufferParams const & bparams,
                        texrow.start(this, i + 1);
                        column = 0;
                } else {
-                       SimpleTeXSpecialChars(bparams,
+                       SimpleTeXSpecialChars(buf, bparams,
                                              os, texrow, moving_arg,
                                              font, running_font, basefont,
                                              open_font, style, i, column, c);
@@ -2460,7 +2570,8 @@ bool LyXParagraph::SimpleTeXOnePar(BufferParams const & bparams,
 
 
 // This one spits out the text of a table paragraph
-bool LyXParagraph::SimpleTeXOneTablePar(BufferParams const & bparams,
+bool LyXParagraph::SimpleTeXOneTablePar(Buffer const * buf,
+                                       BufferParams const & bparams,
                                        ostream & os, TexRow & texrow)
 {
        lyxerr[Debug::LATEX] << "SimpleTeXOneTablePar...     " << this << endl;
@@ -2590,7 +2701,7 @@ bool LyXParagraph::SimpleTeXOneTablePar(BufferParams const & bparams,
                        running_font = basefont;
                        ++current_cell_number;
                        if (table->CellHasContRow(current_cell_number) >= 0) {
-                               TeXContTableRows(bparams, os, i + 1,
+                               TeXContTableRows(buf, bparams, os, i + 1,
                                                 current_cell_number,
                                                 column, texrow);
                        }
@@ -2618,7 +2729,7 @@ bool LyXParagraph::SimpleTeXOneTablePar(BufferParams const & bparams,
                        }
                        texrow.start(this, i + 1);
                } else {
-                       SimpleTeXSpecialChars(bparams,
+                       SimpleTeXSpecialChars(buf, bparams,
                                              os, texrow, false,
                                              font, running_font, basefont,
                                              open_font, style, i, column, c);
@@ -2641,7 +2752,8 @@ bool LyXParagraph::SimpleTeXOneTablePar(BufferParams const & bparams,
 
 
 // This one spits out the text off ContRows in tables
-bool LyXParagraph::TeXContTableRows(BufferParams const & bparams,
+bool LyXParagraph::TeXContTableRows(Buffer const * buf,
+                                   BufferParams const & bparams,
                                    ostream & os,
                                    LyXParagraph::size_type i,
                                    int current_cell_number,
@@ -2731,7 +2843,7 @@ bool LyXParagraph::TeXContTableRows(BufferParams const & bparams,
                                        column += 9;
                                }
                        }
-                       SimpleTeXSpecialChars(bparams,
+                       SimpleTeXSpecialChars(buf, bparams,
                                              os, texrow, false, font,
                                              running_font, basefont,
                                              open_font, style, i, column, c);
@@ -2815,10 +2927,11 @@ bool LyXParagraph::linuxDocConvertChar(char c, string & sgml_string)
 }
 
 
-void LyXParagraph::SimpleDocBookOneTablePar(BufferParams const & bparams,
+void LyXParagraph::SimpleDocBookOneTablePar(Buffer const * buffer, 
                                            ostream & os, string & extra,
                                            int & desc_on, int depth) 
 {
+       BufferParams const & bparams = buffer->params;
        if (!table) return;
        lyxerr[Debug::LATEX] << "SimpleDocbookOneTablePar... " << this << endl;
        int column = 0;
@@ -2884,7 +2997,7 @@ void LyXParagraph::SimpleDocBookOneTablePar(BufferParams const & bparams,
                        font1 = font2 = getFont(bparams, -1);
                        ++current_cell_number;
                        if (table->CellHasContRow(current_cell_number) >= 0) {
-                               DocBookContTableRows(bparams,
+                               DocBookContTableRows(buffer,
                                                     os, extra, desc_on, i + 1,
                                                     current_cell_number,
                                                     column);
@@ -2906,11 +3019,11 @@ void LyXParagraph::SimpleDocBookOneTablePar(BufferParams const & bparams,
                        inset = GetInset(i);
 #ifdef HAVE_SSTREAM
                        std::ostringstream ost;
-                       inset->DocBook(ost);
+                       inset->DocBook(buffer, ost);
                        string tmp_out = ost.str().c_str();
 #else
                        ostrstream ost;
-                       inset->DocBook(ost);
+                       inset->DocBook(buffer, ost);
                        ost << '\0';
                        char * ctmp = ost.str();
                        string tmp_out(ctmp);
@@ -2993,7 +3106,7 @@ void LyXParagraph::SimpleDocBookOneTablePar(BufferParams const & bparams,
 }
 
 
-void LyXParagraph::DocBookContTableRows(BufferParams const & bparams,
+void LyXParagraph::DocBookContTableRows(Buffer const * buffer,
                                        ostream & os, string & extra,
                                         int & desc_on,
                                        LyXParagraph::size_type i,
@@ -3001,6 +3114,8 @@ void LyXParagraph::DocBookContTableRows(BufferParams const & bparams,
 
 {
        if (!table) return;
+
+       BufferParams const & bparams = buffer->params;
        
        lyxerr[Debug::LATEX] << "DocBookContTableRows... " << this << endl;
 
@@ -3073,11 +3188,11 @@ void LyXParagraph::DocBookContTableRows(BufferParams const & bparams,
                                inset = GetInset(i);
 #ifdef HAVE_SSTREAM
                                std::ostringstream ost;
-                               inset->DocBook(ost);
+                               inset->DocBook(buffer, ost);
                                string tmp_out = ost.str().c_str();
 #else
                                ostrstream ost;
-                               inset->DocBook(ost);
+                               inset->DocBook(buffer, ost);
                                ost << '\0';
                                char * ctmp = ost.str();
                                string tmp_out(ctmp);
@@ -3183,7 +3298,8 @@ void LyXParagraph::SimpleTeXBlanks(ostream & os, TexRow & texrow,
 }
 
 
-void LyXParagraph::SimpleTeXSpecialChars(BufferParams const & bparams,
+void LyXParagraph::SimpleTeXSpecialChars(Buffer const * buf,
+                                        BufferParams const & bparams,
                                         ostream & os, TexRow & texrow,
                                         bool moving_arg,
                                         LyXFont & font,
@@ -3211,7 +3327,7 @@ void LyXParagraph::SimpleTeXSpecialChars(BufferParams const & bparams,
                                close = true;
                        }
 
-                       int tmp = inset->Latex(os, moving_arg,
+                       int tmp = inset->Latex(buf, os, moving_arg,
                                               style.free_spacing);
 
                        if (close)
@@ -3435,100 +3551,8 @@ void LyXParagraph::SimpleTeXSpecialChars(BufferParams const & bparams,
 }
 
 
-#if 0
-bool LyXParagraph::RoffContTableRows(ostream & os,
-                                    LyXParagraph::size_type i,
-                                    int actcell)
-{
-       if (!table)
-               return false;
-
-       LyXFont font1(LyXFont::ALL_INHERIT);
-       LyXFont font2;
-       Inset * inset;
-       char c;
-
-       string fname2 = TmpFileName(string(), "RAT2");
-       int lastpos = i;
-       int cell = table->CellHasContRow(actcell);
-       ++actcell;
-       while(cell >= 0) {
-               // first find the right position
-               i = lastpos;
-               for (; i < size() && actcell < cell; ++i) {
-                       c = GetChar(i);
-                       if (c == LyXParagraph::META_NEWLINE)
-                               ++actcell;
-               }
-               lastpos = i;
-               c = GetChar(i);
-               if ((c != ' ') && (c != LyXParagraph::META_NEWLINE))
-                       os << " ";
-               for (; i < size()
-                            && (c = GetChar(i)) != LyXParagraph::META_NEWLINE;
-                    ++i) {
-                       font2 = GetFontSettings(i);
-                       if (font1.latex() != font2.latex()) {
-                               if (font2.latex() != LyXFont::OFF)
-                                       continue;
-                       }
-                       c = GetChar(i);
-                       switch (c) {
-                       case LyXParagraph::META_INSET:
-                               if ((inset = GetInset(i))) {
-#ifdef HAVE_SSTREAM
-                                       stringstream ss(ios::in | ios::out);
-                                       inset->Ascii(ss);
-                                       ss.seekp(0);
-                                       ss.get(c);
-                                       while (!ss) {
-                                               if (c == '\\')
-                                                       os << "\\\\";
-                                               else
-                                                       os << c;
-                                               ss.get(c);
-                                       }
-#else
-                                       strstream ss;
-                                       inset->Ascii(ss);
-                                       ss.seekp(0);
-                                       ss.get(c);
-                                       while (!ss) {
-                                               if (c == '\\')
-                                                       os << "\\\\";
-                                               else
-                                                       os << c;
-                                               ss.get(c);
-                                       }
-                                       delete [] ss.str();
-#endif
-                               }
-                               break;
-                       case LyXParagraph::META_NEWLINE:
-                               break;
-                       case LyXParagraph::META_HFILL: 
-                               break;
-                       case '\\': 
-                               os << "\\\\";
-                               break;
-                       default:
-                               if (c != '\0')
-                                       os << c;
-                               else
-                                       lyxerr.debug() << "RoffAsciiTable: "
-                                               "NULL char in structure."
-                                                      << endl;
-                               break;
-                       }
-               }
-               cell = table->CellHasContRow(actcell);
-       }
-       return true;
-}
-#endif
-
-
-LyXParagraph * LyXParagraph::TeXDeeper(BufferParams const & bparams,
+LyXParagraph * LyXParagraph::TeXDeeper(Buffer const * buf,
+                                      BufferParams const & bparams,
                                       ostream & os, TexRow & texrow,
                                       ostream & foot,
                                       TexRow & foot_texrow,
@@ -3545,12 +3569,12 @@ LyXParagraph * LyXParagraph::TeXDeeper(BufferParams const & bparams,
                if (textclasslist.Style(bparams.textclass, 
                                        par->layout).isEnvironment()
                    || par->pextra_type != PEXTRA_NONE) {
-                       par = par->TeXEnvironment(bparams,
+                       par = par->TeXEnvironment(buf, bparams,
                                                  os, texrow,
                                                  foot, foot_texrow,
                                                  foot_count);
                } else {
-                       par = par->TeXOnePar(bparams,
+                       par = par->TeXOnePar(buf, bparams,
                                             os, texrow, false,
                                             foot, foot_texrow,
                                             foot_count);
@@ -3562,7 +3586,8 @@ LyXParagraph * LyXParagraph::TeXDeeper(BufferParams const & bparams,
 }
 
 
-LyXParagraph * LyXParagraph::TeXEnvironment(BufferParams const & bparams,
+LyXParagraph * LyXParagraph::TeXEnvironment(Buffer const * buf,
+                                           BufferParams const & bparams,
                                            ostream & os, TexRow & texrow,
                                            ostream & foot,
                                            TexRow & foot_texrow,
@@ -3703,7 +3728,7 @@ LyXParagraph * LyXParagraph::TeXEnvironment(BufferParams const & bparams,
        }
        LyXParagraph * par = this;
        do {
-               par = par->TeXOnePar(bparams,
+               par = par->TeXOnePar(buf, bparams,
                                     os, texrow, false,
                                     foot, foot_texrow, foot_count);
 
@@ -3739,7 +3764,7 @@ LyXParagraph * LyXParagraph::TeXEnvironment(BufferParams const & bparams,
                                os << '\n';
                                texrow.newline();
                        }
-                       par = par->TeXDeeper(bparams, os, texrow,
+                       par = par->TeXDeeper(buf, bparams, os, texrow,
                                             foot, foot_texrow, foot_count);
                }
                if (par && par->layout == layout && par->depth == depth &&
@@ -3847,7 +3872,9 @@ LyXParagraph * LyXParagraph::TeXEnvironment(BufferParams const & bparams,
 }
 
 
-LyXParagraph * LyXParagraph::TeXFootnote(BufferParams const & bparams,
+#ifndef NEW_INSETS
+LyXParagraph * LyXParagraph::TeXFootnote(Buffer const * buf,
+                                        BufferParams const & bparams,
                                         ostream & os, TexRow & texrow,
                                         ostream & foot, TexRow & foot_texrow,
                                         int & foot_count,
@@ -3997,18 +4024,19 @@ LyXParagraph * LyXParagraph::TeXFootnote(BufferParams const & bparams,
                                // environments. Shouldn't be circular because
                                // we don't support footnotes inside
                                // floats (yet). ARRae
-                               par = par->TeXEnvironment(bparams, os, texrow,
+                               par = par->TeXEnvironment(buf, bparams, os,
+                                                         texrow,
                                                          foot, foot_texrow,
                                                          foot_count);
                        } else {
-                               par = par->TeXOnePar(bparams,
+                               par = par->TeXOnePar(buf, bparams,
                                                     os, texrow, moving_arg,
                                                     foot, foot_texrow,
                                                     foot_count);
                        }
                        
                        if (par && !par->IsDummy() && par->depth > depth) {
-                               par = par->TeXDeeper(bparams, os, texrow,
+                               par = par->TeXDeeper(buf, bparams, os, texrow,
                                                     foot, foot_texrow,
                                                     foot_count);
                        }
@@ -4037,12 +4065,12 @@ LyXParagraph * LyXParagraph::TeXFootnote(BufferParams const & bparams,
                                // environments. Shouldn't be circular because
                                // we don't support footnotes inside
                                // floats (yet). ARRae
-                               par = par->TeXEnvironment(bparams,
+                               par = par->TeXEnvironment(buf, bparams,
                                                          foot, foot_texrow,
                                                          dummy, dummy_texrow,
                                                          dummy_count);
                        } else {
-                               par = par->TeXOnePar(bparams,
+                               par = par->TeXOnePar(buf, bparams,
                                                     foot, foot_texrow,
                                                     moving_arg,
                                                     dummy, dummy_texrow,
@@ -4050,7 +4078,7 @@ LyXParagraph * LyXParagraph::TeXFootnote(BufferParams const & bparams,
                        }
 
                        if (par && !par->IsDummy() && par->depth > depth) {
-                               par = par->TeXDeeper(bparams,
+                               par = par->TeXDeeper(buf, bparams,
                                                     foot, foot_texrow,
                                                     dummy, dummy_texrow,
                                                     dummy_count);
@@ -4125,7 +4153,7 @@ bool LyXParagraph::IsDummy() const
        return (footnoteflag == LyXParagraph::NO_FOOTNOTE && previous
                && previous->footnoteflag != LyXParagraph::NO_FOOTNOTE);
 }
-
+#endif
 
 void LyXParagraph::SetPExtraType(BufferParams const & bparams,
                                 int type, char const * width,
@@ -4339,8 +4367,9 @@ bool LyXParagraph::isMultiLingual(BufferParams const & bparams)
 
 // Convert the paragraph to a string.
 // Used for building the table of contents
-string LyXParagraph::String(BufferParams const & bparams, bool label)
+string LyXParagraph::String(Buffer const * buffer, bool label)
 {
+       BufferParams const & bparams = buffer->params;
        string s;
        if (label && !IsDummy() && !labelstring.empty())
                s += labelstring + ' ';
@@ -4354,21 +4383,24 @@ string LyXParagraph::String(BufferParams const & bparams, bool label)
                         GetInset(i)->LyxCode() == Inset::MATH_CODE) {
 #ifdef HAVE_SSTREAM
                        std::ostringstream ost;
-                       GetInset(i)->Ascii(ost);
+                       GetInset(i)->Ascii(buffer, ost);
 #else
                        ostrstream ost;
-                       GetInset(i)->Ascii(ost);
+                       GetInset(i)->Ascii(buffer, ost);
                        ost << '\0';
 #endif
                        s += subst(ost.str(),'\n',' ');
                }
        }
 
+#ifndef NEW_INSETS
        if (next && next->footnoteflag != LyXParagraph::NO_FOOTNOTE 
            && footnoteflag == LyXParagraph::NO_FOOTNOTE)
-               s += NextAfterFootnote()->String(bparams, false);
+               s += NextAfterFootnote()->String(buffer, false);
 
-       if (!IsDummy()) {
+       if (!IsDummy())
+#endif
+               {
                if (isRightToLeftPar(bparams))
                        reverse(s.begin() + len,s.end());
        }
@@ -4376,7 +4408,8 @@ string LyXParagraph::String(BufferParams const & bparams, bool label)
 }
 
 
-string LyXParagraph::String(LyXParagraph::size_type beg,
+string LyXParagraph::String(Buffer const * buffer, 
+                           LyXParagraph::size_type beg,
                            LyXParagraph::size_type end)
 {
        string s;
@@ -4404,10 +4437,10 @@ string LyXParagraph::String(LyXParagraph::size_type beg,
                else if (c == META_INSET) {
 #ifdef HAVE_SSTREAM
                        std::ostringstream ost;
-                       GetInset(i)->Ascii(ost);
+                       GetInset(i)->Ascii(buffer, ost);
 #else
                        ostrstream ost;
-                       GetInset(i)->Ascii(ost);
+                       GetInset(i)->Ascii(buffer, ost);
                        ost << '\0';
 #endif
                        s += ost.str();
@@ -4428,3 +4461,29 @@ string LyXParagraph::String(LyXParagraph::size_type beg,
 
        return s;
 }
+
+
+void LyXParagraph::SetInsetOwner(Inset *i)
+{
+       inset_owner = i;
+       for (InsetList::const_iterator cit = insetlist.begin();
+            cit != insetlist.end(); ++cit) {
+               if ((*cit).inset)
+                       (*cit).inset->setOwner(i);
+       }
+}
+
+
+void LyXParagraph::deleteInsetsLyXText(BufferView * bv)
+{
+       // then the insets
+       for (InsetList::const_iterator cit = insetlist.begin();
+            cit != insetlist.end(); ++cit) {
+               if ((*cit).inset) {
+                       if ((*cit).inset->IsTextInset()) {
+                               static_cast<InsetText *>((*cit).inset)->
+                                       deleteLyXText(bv);
+                       }
+               }
+       }
+}