]> git.lyx.org Git - lyx.git/blobdiff - src/buffer.C
Dekel's patch -- I didn't fix the xforms-0.88 keysyms stuff so it still doesn't finis...
[lyx.git] / src / buffer.C
index a7af3e04973b22970c8e7885f6c80faa56ef6095..742aad7b79153234af15ae618b0372647896adb2 100644 (file)
  * ====================================================== 
  */
 
-// Change Log:
-// =========== 
-// 23/03/98   Heinrich Bauer (heinrich.bauer@t-mobil.de)
-// Spots marked "changed Heinrich Bauer, 23/03/98" modified due to the
-// following bug: dvi file export did not work after printing (or previewing)
-// and vice versa as long as the same file was concerned. This happened
-// every time the LyX-file was left unchanged between the two actions mentioned
-// above.
-
 #include <config.h>
 
 #include <fstream>
 #include "insets/insetlatexaccent.h"
 #include "insets/insetbib.h" 
 #include "insets/insetcite.h" 
+#include "insets/insetexternal.h"
 #include "insets/insetindex.h" 
 #include "insets/insetinclude.h"
 #include "insets/insettoc.h"
-#include "insets/insetlof.h"
-#include "insets/insetlot.h"
-#include "insets/insetloa.h"
 #include "insets/insetparent.h"
 #include "insets/insetspecialchar.h"
 #include "insets/figinset.h"
 #include "insets/insetert.h"
 #include "insets/insetgraphics.h"
 #include "insets/insetfoot.h"
+#include "insets/insetmarginal.h"
+#include "insets/insetminipage.h"
+#include "insets/insetfloat.h"
+#include "insets/insetlist.h"
 #include "insets/insettabular.h"
+#include "insets/insettheorem.h"
+#include "insets/insetcaption.h"
 #include "support/filetools.h"
 #include "support/path.h"
 #include "LaTeX.h"
@@ -89,6 +84,9 @@
 #include "lyxtext.h"
 #include "gettext.h"
 #include "language.h"
+#include "lyx_gui_misc.h"      // WarnReadonly()
+#include "frontends/Dialogs.h"
+#include "encoding.h"
 
 using std::ostream;
 using std::ofstream;
@@ -100,6 +98,10 @@ using std::endl;
 using std::pair;
 using std::vector;
 using std::max;
+using std::set;
+#ifdef HAVE_SSTREAM
+using std::istringstream;
+#endif
 
 // all these externs should eventually be removed.
 extern BufferList bufferlist;
@@ -121,10 +123,9 @@ Buffer::Buffer(string const & file, bool ronly)
        paragraph = 0;
        lyx_clean = true;
        bak_clean = true;
-       dvi_clean_orgd = false;  // Heinrich Bauer, 23/03/98
-       dvi_clean_tmpd = false;  // Heinrich Bauer, 23/03/98
        dep_clean = 0;
        read_only = ronly;
+       unnamed = false;
        users = 0;
        lyxvc.buffer(this);
        if (read_only || (lyxrc.use_tempdir)) {
@@ -175,7 +176,7 @@ void Buffer::setReadonly(bool flag)
        if (read_only != flag) {
                read_only = flag; 
                updateTitles();
-               updateAllVisibleBufferRelatedPopups();
+               users->owner()->getDialogs()->updateBufferDependent();
        }
        if (read_only) {
                WarnReadonly(filename);
@@ -232,15 +233,15 @@ void Buffer::fileName(string const & newfile)
 // if par = 0 normal behavior
 // else insert behavior
 // Returns false if "\the_end" is not read for formats >= 2.13. (Asger)
-#define USE_PARSE_FUNCTION 1
-//#define USE_TABULAR_INSETS 1
 bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
 {
        string tmptok;
        int pos = 0;
        char depth = 0; // signed or unsigned?
+#ifndef NEW_INSETS
        LyXParagraph::footnote_flag footnoteflag = LyXParagraph::NO_FOOTNOTE;
        LyXParagraph::footnote_kind footnotekind = LyXParagraph::FOOTNOTE;
+#endif
        bool the_end_read = false;
 
        LyXParagraph * return_par = 0;
@@ -255,7 +256,7 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
        if(!par) {
                par = new LyXParagraph;
        } else {
-               users->text->BreakParagraph();
+               users->text->BreakParagraph(users);
                return_par = users->text->FirstParagraph();
                pos = 0;
                markDirty();
@@ -286,8 +287,12 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                        continue;
                the_end_read = parseSingleLyXformat2Token(lex, par, return_par,
                                                          token, pos, depth,
-                                                         font, footnoteflag,
-                                                         footnotekind);
+                                                         font
+#ifndef NEW_INSETS
+                                                         , footnoteflag,
+                                                         footnotekind
+#endif
+                       );
        }
    
        if (!return_par)
@@ -299,29 +304,33 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
 }
 
 
+// We'll remove this later. (Lgb)
+static string last_inset_read;
+
+
 bool
 Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                                   LyXParagraph *& return_par,
                                   string const & token, int & pos,
-                                  char & depth, LyXFont & font,
-                                  LyXParagraph::footnote_flag & footnoteflag,
-                                  LyXParagraph::footnote_kind & footnotekind)
+                                  char & depth, LyXFont & font
+#ifndef NEW_INSETS
+                                  , LyXParagraph::footnote_flag & footnoteflag,
+                                  LyXParagraph::footnote_kind & footnotekind
+#endif
+       )
 {
        bool the_end_read = false;
-
+       
        if (token[0] != '\\') {
                for (string::const_iterator cit = token.begin();
                     cit != token.end(); ++cit) {
-                       par->InsertChar(pos, (*cit));
-                       par->SetFont(pos, font);
+                       par->InsertChar(pos, (*cit), font);
                        ++pos;
                }
        } else if (token == "\\i") {
                Inset * inset = new InsetLatexAccent;
-               inset->Read(lex);
-               par->InsertChar(pos, LyXParagraph::META_INSET); 
-               par->InsertInset(pos, inset);
-               par->SetFont(pos, font);
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
                ++pos;
        } else if (token == "\\layout") {
                if (!return_par) 
@@ -350,12 +359,15 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                        par->layout = 
                                textclasslist.NumberOfLayout(params.textclass, 
                                                             layout.obsoleted_by()).second;
+#ifndef NEW_INSETS
                par->footnoteflag = footnoteflag;
                par->footnotekind = footnotekind;
+#endif
                par->depth = depth;
                font = LyXFont(LyXFont::ALL_INHERIT, params.language_info);
                if (format < 2.16 && params.language == "hebrew")
                        font.setLanguage(default_language);
+#ifndef NEW_INSETS
        } else if (token == "\\end_float") {
                if (!return_par) 
                        return_par = par;
@@ -381,6 +393,84 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                        footnoteflag = LyXParagraph::CLOSED_FOOTNOTE;
                else 
                        footnoteflag = LyXParagraph::OPEN_FOOTNOTE;
+#else
+       } else if (token == "\\begin_float") {
+               // This is the compability reader, unfinished but tested.
+               // (Lgb)
+               lex.next();
+               string tmptok = lex.GetString();
+               //lyxerr << "old float: " << tmptok << endl;
+               
+               Inset * inset = 0;
+               string old_float;
+               
+               if (tmptok == "footnote") {
+                       inset = new InsetFoot;
+               } else if (tmptok == "margin") {
+                       inset = new InsetMarginal;
+               } else if (tmptok == "fig") {
+                       inset = new InsetFloat("figure");
+                       old_float += "placement htbp\n";
+               } else if (tmptok == "tab") {
+                       inset = new InsetFloat("table");
+                       old_float += "placement htbp\n";
+               } else if (tmptok == "alg") {
+                       inset = new InsetFloat("algorithm");
+                       old_float += "placement htbp\n";
+               } else if (tmptok == "wide-fig") {
+                       InsetFloat * tmp = new InsetFloat("figure");
+                       tmp->wide(true);
+                       inset = tmp;
+                       old_float += "placement htbp\n";
+               } else if (tmptok == "wide-tab") {
+                       InsetFloat * tmp = new InsetFloat("table");
+                       tmp->wide(true);
+                       inset = tmp;
+                       old_float += "placement htbp\n";
+               }
+
+               if (!inset) return false; // no end read yet
+               
+               old_float += "collapsed true\n";
+
+               // Here we need to check for \end_deeper and handle that
+               // before we do the footnote parsing.
+               // This _is_ a hack! (Lgb)
+               while(true) {
+                       lex.next();
+                       string tmp = lex.GetString();
+                       if (tmp == "\\end_deeper") {
+                               lyxerr << "\\end_deeper caught!" << endl;
+                               if (!depth) {
+                                       lex.printError("\\end_deeper: "
+                                                      "depth is already null");
+                               } else
+                                       --depth;
+                               
+                       } else {
+                               old_float += tmp;
+                               old_float += ' ';
+                               break;
+                       }
+               }
+               
+               old_float += lex.getLongString("\\end_float");
+               old_float += "\n\\end_inset\n";
+               //lyxerr << "float body: " << old_float << endl;
+
+#ifdef HAVE_SSTREAM
+               istringstream istr(old_float);
+#else
+               istrstream istr(old_float.c_str());
+#endif
+               
+               LyXLex nylex(0, 0);
+               nylex.setStream(istr);
+               
+               inset->Read(this, nylex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+#endif
        } else if (token == "\\begin_deeper") {
                ++depth;
        } else if (token == "\\end_deeper") {
@@ -399,7 +489,7 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                if (pp.first) {
                        params.textclass = pp.second;
                } else {
-                       lex.printError("Unknown textclass `$$Token'");
+                 lex.printError("Unknown textclass `$$Token'");
                        params.textclass = 0;
                }
                if (!textclasslist.Load(params.textclass)) {
@@ -613,14 +703,6 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
        } else if (token == "\\tocdepth") {
                lex.nextToken();
                params.tocdepth = lex.GetInteger();
-#if 0
-       } else if (token == "\\baselinestretch") { // obsolete
-               lex.nextToken(); // should not be used directly
-               // anymore.
-               // Will probably keep a kind of support just for
-               // compability.
-               params.spacing.set(Spacing::Other, lex.GetFloat());
-#endif
        } else if (token == "\\spacing") {
                lex.next();
                string tmp = strip(lex.GetString());
@@ -665,11 +747,6 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
        } else if (token == "\\float_placement") {
                lex.nextToken();
                params.float_placement = lex.GetString();
-#if 0
-       } else if (token == "\\cursor") { // obsolete
-               // this is obsolete, so we just skip it.
-               lex.nextToken();
-#endif
        } else if (token == "\\family") { 
                lex.next();
                font.setLyXFamily(lex.GetString());
@@ -765,226 +842,15 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                par->labelwidthstring = lex.GetString();
                // do not delete this token, it is still needed!
        } else if (token == "\\end_inset") {
+               lyxerr << "Solitary \\end_inset. Missing \\begin_inset?.\n"
+                      << "Last inset read was: " << last_inset_read
+                      << endl;
                // Simply ignore this. The insets do not have
                // to read this.
                // But insets should read it, it is a part of
                // the inset isn't it? Lgb.
        } else if (token == "\\begin_inset") {
-               // Should be moved out into its own function/method. (Lgb)
-               lex.next();
-               string tmptok = lex.GetString();
-               // test the different insets
-               if (tmptok == "Quotes") {
-                       Inset * inset = new InsetQuotes;
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-#if 0
-               } else if (tmptok == "\\i") {
-                       Inset * inset = new InsetLatexAccent;
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-#endif
-               } else if (tmptok == "FormulaMacro") {
-                       Inset * inset = new InsetFormulaMacro;
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-               } else if (tmptok == "Formula") {
-                       Inset * inset = new InsetFormula;
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-               } else if (tmptok == "Figure") {
-                       Inset * inset = new InsetFig(100, 100, this);
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-               } else if (tmptok == "Info") {
-                       Inset * inset = new InsetInfo;
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-               } else if (tmptok == "Include") {
-                       Inset * inset = new InsetInclude(string(), this);
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-               } else if (tmptok == "ERT") {
-                       Inset * inset = new InsetERT(this);
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-               } else if (tmptok == "Tabular") {
-                       Inset * inset = new InsetTabular(this);
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-               } else if (tmptok == "Text") {
-                       Inset * inset = new InsetText(this);
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-               } else if (tmptok == "Foot") {
-                       Inset * inset = new InsetFoot(this);
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-               } else if (tmptok == "GRAPHICS") {
-                       Inset * inset = new InsetGraphics;
-                               //inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-               } else if (tmptok == "LatexCommand") {
-                       InsetCommand inscmd;
-                       inscmd.Read(lex);
-                       Inset * inset = 0;
-                       if (inscmd.getCmdName() == "cite") {
-                               inset = new InsetCitation(inscmd.getContents(), inscmd.getOptions());
-                       } else if (inscmd.getCmdName() == "bibitem") {
-                               lex.printError("Wrong place for bibitem");
-                               inset = inscmd.Clone();
-                       } else if (inscmd.getCmdName() == "BibTeX") {
-                               inset = new InsetBibtex(inscmd.getContents(), inscmd.getOptions(), this);
-                       } else if (inscmd.getCmdName() == "index") {
-                               inset = new InsetIndex(inscmd.getContents());
-                       } else if (inscmd.getCmdName() == "include") {
-                               inset = new InsetInclude(inscmd.getContents(), this);
-                       } else if (inscmd.getCmdName() == "label") {
-                               inset = new InsetLabel(inscmd.getCommand());
-                       } else if (inscmd.getCmdName() == "url"
-                                  || inscmd.getCmdName() == "htmlurl") {
-                               inset = new InsetUrl(inscmd.getCommand());
-                       } else if (inscmd.getCmdName() == "ref"
-                                  || inscmd.getCmdName() == "pageref"
-                                  || inscmd.getCmdName() == "vref"
-                                  || inscmd.getCmdName() == "vpageref"
-                                  || inscmd.getCmdName() == "prettyref") {
-                               if (!inscmd.getOptions().empty() || !inscmd.getContents().empty()) {
-                                       inset = new InsetRef(inscmd, this);
-                               }
-                               // CHECK if this else clause
-                               //is still needed. (Lgb)
-#if 0
-                               // This condition comes from a
-                               // temporary solution to the latexdel
-                               // ref inset that was transformed to
-                               // an empty ref inset plus the body
-                               // surronded by latexdel insets
-                               else {
-                                       string cont, opt, tmptmptok, cmdname;
-                                       lex.next();
-                                       while(lex.IsOK() && lex.GetString() != "\\end_inset" ) {
-                                               lex.next();
-                                       }
-                                       lex.next();
-                                       while(lex.IsOK()) {
-                                               tmptmptok = lex.GetString();
-                                               if(tmptmptok[0] == '\\') {
-                                                       if( tmptmptok == "\\backslash")
-                                                               opt += '\\';
-                                                       else
-                                                               break;
-                                               }
-                                               else
-                                                       opt += tmptmptok;
-                                               opt += ' ';
-                                               lex.next();
-                                       }
-                                       while(lex.IsOK() && lex.GetString() != "\\end_inset" ) {
-                                               lex.next();
-                                       }
-                                       lex.next();
-                                       while(lex.IsOK()) {
-                                               tmptmptok = lex.GetString();
-                                               if(tmptmptok[0] == '\\') {
-                                                       if( tmptmptok == "\\backslash")
-                                                               cont += '\\';
-                                                       else
-                                                               break;
-                                               }
-                                               else
-                                                       cont += tmptmptok;
-                                               cont += ' ';
-                                               lex.next();
-                                       }
-                                       while(lex.IsOK() && lex.GetString() != "\\end_inset" ) {
-                                               lex.next();
-                                       }
-
-                                       cont = strip(cont);
-                                       opt = strip(opt);
-                                       cmdname =  "\\" + inscmd.getCmdName();
-                                       cmdname += "["  + cont  + "]";
-                                       cmdname += "{"  + opt + "}";
-                                       inset = new InsetRef(cmdname, this);
-                               }
-#endif
-                       } else if (inscmd.getCmdName() == "tableofcontents") {
-                               inset = new InsetTOC(this);
-                       } else if (inscmd.getCmdName() == "listoffigures") {
-                               inset = new InsetLOF(this);
-                       } else if (inscmd.getCmdName() == "listofalgorithms") {
-                               inset = new InsetLOA(this);
-                       } else if (inscmd.getCmdName() == "listoftables") {
-                               inset = new InsetLOT(this);
-                       } else if (inscmd.getCmdName() == "printindex") {
-                               inset = new InsetPrintIndex(this);
-                       } else if (inscmd.getCmdName() == "lyxparent") {
-                               inset = new InsetParent(inscmd.getContents(), this);
-                       }
-                              
-                       if (inset) {
-                               par->InsertChar(pos, LyXParagraph::META_INSET);
-                               par->InsertInset(pos, inset);
-                               par->SetFont(pos, font);
-                               ++pos;
-                       }
-               }
-#if 0
-       } else if (token == "\\InsetQuotes") {
-               lyxerr << "InsetQuotes" << endl;
-               Inset * inset = new InsetQuotes;
-               inset->Read(lex);
-               par->InsertChar(pos, LyXParagraph::META_INSET); 
-               par->InsertInset(pos, inset);
-               par->SetFont(pos, font);
-               ++pos;
-#endif
-#if 0
-       } else if (token == "\\InsetFormula") {
-               lyxerr << "InsetFormula" << endl;
-               Inset * inset = new InsetFormula;
-               inset->Read(lex);
-               par->InsertChar(pos, LyXParagraph::META_INSET); 
-               par->InsertInset(pos, inset);
-               par->SetFont(pos, font);
-               ++pos;
-#endif
+               readInset(lex, par, pos, font);
        } else if (token == "\\SpecialChar") {
                LyXLayout const & layout =
                        textclasslist.Style(params.textclass, 
@@ -993,16 +859,13 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                // Insets don't make sense in a free-spacing context! ---Kayvan
                if (layout.free_spacing) {
                        if (lex.IsOK()) {
-                               string next_token;
                                lex.next();
-                               next_token = lex.GetString();
+                               string next_token = lex.GetString();
                                if (next_token == "\\-") {
-                                       par->InsertChar(pos, '-');
-                                       par->SetFont(pos, font);
+                                       par->InsertChar(pos, '-', font);
                                } else if (next_token == "\\protected_separator"
                                        || next_token == "~") {
-                                       par->InsertChar(pos, ' ');
-                                       par->SetFont(pos, font);
+                                       par->InsertChar(pos, ' ', font);
                                } else {
                                        lex.printError("Token `$$Token' "
                                                       "is in free space "
@@ -1012,40 +875,24 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                        }
                } else {
                        Inset * inset = new InsetSpecialChar;
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET); 
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, font);
                }
                ++pos;
-#if 0
-       } else if (token == "\\Figure") {
-               lyxerr << "Figure" << endl;
-               Inset * inset = new InsetFig(100, 100, this);
-               inset->Read(lex);
-               par->InsertChar(pos, LyXParagraph::META_INSET); 
-               par->InsertInset(pos, inset);
-               par->SetFont(pos, font);
-               ++pos;
-#endif
        } else if (token == "\\newline") {
-               par->InsertChar(pos, LyXParagraph::META_NEWLINE);
-               par->SetFont(pos, font);
+               par->InsertChar(pos, LyXParagraph::META_NEWLINE, font);
                ++pos;
        } else if (token == "\\LyXTable") {
-#ifdef USE_TABULAR_INSETS
+#ifdef NEW_TABULAR
                Inset * inset = new InsetTabular(this);
-               inset->Read(lex);
-               par->InsertChar(pos, LyXParagraph::META_INSET);
-               par->InsertInset(pos, inset);
-               par->SetFont(pos, font);
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
                ++pos;
 #else
                par->table = new LyXTable(lex);
 #endif
        } else if (token == "\\hfill") {
-               par->InsertChar(pos, LyXParagraph::META_HFILL);
-               par->SetFont(pos, font);
+               par->InsertChar(pos, LyXParagraph::META_HFILL, font);
                ++pos;
        } else if (token == "\\protected_separator") { // obsolete
                // This is a backward compability thingie. (Lgb)
@@ -1056,46 +903,197 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                                            par->GetLayout());
 
                if (layout.free_spacing) {
-                       par->InsertChar(pos, ' ');
-                       par->SetFont(pos, font);
+                       par->InsertChar(pos, ' ', font);
                } else {
                        Inset * inset = new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                }
                ++pos;
        } else if (token == "\\bibitem") {  // ale970302
-               if (!par->bibkey)
-                       par->bibkey = new InsetBibKey;
-               par->bibkey->Read(lex);                 
-       }else if (token == "\\backslash") {
-               par->InsertChar(pos, '\\');
-               par->SetFont(pos, font);
+               if (!par->bibkey) {
+                       InsetCommandParams p( "bibitem" );
+                       par->bibkey = new InsetBibKey(p);
+               }
+               par->bibkey->Read(this, lex);                   
+       } else if (token == "\\backslash") {
+               par->InsertChar(pos, '\\', font);
                ++pos;
-       }else if (token == "\\the_end") {
+       } else if (token == "\\the_end") {
                the_end_read = true;
        } else {
                // This should be insurance for the future: (Asger)
                lex.printError("Unknown token `$$Token'. "
                               "Inserting as text.");
-               for(string::const_iterator cit = token.begin();
-                   cit != token.end(); ++cit) {
-                       par->InsertChar(pos, (*cit));
-                       par->SetFont(pos, font);
+               string::const_iterator cit = token.begin();
+               string::const_iterator end = token.end();
+               for(; cit != end; ++cit) {
+                       par->InsertChar(pos, (*cit), font);
                        ++pos;
                }
        }
        return the_end_read;
 }
 
-bool Buffer::readFile(LyXLex & lex, LyXParagraph * par)
+
+void Buffer::readInset(LyXLex & lex, LyXParagraph *& par,
+                      int & pos, LyXFont & font)
 {
-       string token;
+       // consistency check
+       if (lex.GetString() != "\\begin_inset") {
+               lyxerr << "Buffer::readInset: Consistency check failed."
+                      << endl;
+       }
+       
+       lex.next();
+       string tmptok = lex.GetString();
+       last_inset_read = tmptok;
+       // test the different insets
+       if (tmptok == "Quotes") {
+               Inset * inset = new InsetQuotes;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "External") {
+               Inset * inset = new InsetExternal;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "FormulaMacro") {
+               Inset * inset = new InsetFormulaMacro;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Formula") {
+               Inset * inset = new InsetFormula;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Figure") {
+               Inset * inset = new InsetFig(100, 100, this);
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Info") {
+               Inset * inset = new InsetInfo;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Include") {
+               InsetCommandParams p( "Include" );
+               Inset * inset = new InsetInclude(p, this);
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "ERT") {
+               Inset * inset = new InsetERT;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Tabular") {
+               Inset * inset = new InsetTabular(this);
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Text") {
+               Inset * inset = new InsetText;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Foot") {
+               Inset * inset = new InsetFoot;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Marginal") {
+               Inset * inset = new InsetMarginal;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Minipage") {
+               Inset * inset = new InsetMinipage;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Float") {
+               lex.next();
+               string tmptok = lex.GetString();
+               Inset * inset = new InsetFloat(tmptok);
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "List") {
+               Inset * inset = new InsetList;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Theorem") {
+               Inset * inset = new InsetList;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "Caption") {
+               Inset * inset = new InsetCaption;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "GRAPHICS") {
+               Inset * inset = new InsetGraphics;
+               inset->Read(this, lex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+       } else if (tmptok == "LatexCommand") {
+               InsetCommandParams inscmd;
+               inscmd.Read(lex);
+               Inset * inset = 0;
+               if (inscmd.getCmdName() == "cite") {
+                       inset = new InsetCitation(inscmd);
+               } else if (inscmd.getCmdName() == "bibitem") {
+                       lex.printError("Wrong place for bibitem");
+                       inset = new InsetBibKey(inscmd);
+               } else if (inscmd.getCmdName() == "BibTeX") {
+                       inset = new InsetBibtex(inscmd, this);
+               } else if (inscmd.getCmdName() == "index") {
+                       inset = new InsetIndex(inscmd);
+               } else if (inscmd.getCmdName() == "include") {
+                       inset = new InsetInclude(inscmd, this);
+               } else if (inscmd.getCmdName() == "label") {
+                       inset = new InsetLabel(inscmd);
+               } else if (inscmd.getCmdName() == "url"
+                          || inscmd.getCmdName() == "htmlurl") {
+                       inset = new InsetUrl(inscmd);
+               } else if (inscmd.getCmdName() == "ref"
+                          || inscmd.getCmdName() == "pageref"
+                          || inscmd.getCmdName() == "vref"
+                          || inscmd.getCmdName() == "vpageref"
+                          || inscmd.getCmdName() == "prettyref") {
+                       if (!inscmd.getOptions().empty()
+                           || !inscmd.getContents().empty()) {
+                               inset = new InsetRef(inscmd);
+                       }
+               } else if (inscmd.getCmdName() == "tableofcontents"
+                          || inscmd.getCmdName() == "listofalgorithms"
+                          || inscmd.getCmdName() == "listoffigures"
+                          || inscmd.getCmdName() == "listoftables") {
+                       inset = new InsetTOC(inscmd);
+               } else if (inscmd.getCmdName() == "printindex") {
+                       inset = new InsetPrintIndex(inscmd);
+               } else if (inscmd.getCmdName() == "lyxparent") {
+                       inset = new InsetParent(inscmd, this);
+               }
+               
+               if (inset) {
+                       par->InsertInset(pos, inset, font);
+                       ++pos;
+               }
+       }
+}
 
+
+bool Buffer::readFile(LyXLex & lex, LyXParagraph * par)
+{
        if (lex.IsOK()) {
                lex.next();
-               token = lex.GetString();
+               string token(lex.GetString());
                if (token == "\\lyxformat") { // the first token _must_ be...
                        lex.next();
                        format = lex.GetFloat();
@@ -1205,19 +1203,7 @@ bool Buffer::save() const
        
        if (writeFile(fileName(), false)) {
                markLyxClean();
-
-               // now delete the autosavefile
-               string a = OnlyPath(fileName());
-               a += '#';
-               a += OnlyFilename(fileName());
-               a += '#';
-               FileInfo fileinfo(a);
-               if (fileinfo.exist()) {
-                       if (::remove(a.c_str()) != 0) {
-                               WriteFSAlert(_("Could not delete "
-                                              "auto-save file!"), a);
-                       }
-               }
+               removeAutosaveFile(fileName());
        } else {
                // Saving failed, so backup is not backup
                if (lyxrc.make_backup) {
@@ -1288,7 +1274,7 @@ bool Buffer::writeFile(string const & fname, bool flag) const
 
        // this will write out all the paragraphs
        // using recursive descent.
-       paragraph->writeFile(ofs, params, footnoteflag, depth);
+       paragraph->writeFile(this, ofs, params, footnoteflag, depth);
 
        // Write marker that shows file is complete
        ofs << "\n\\the_end" << endl;
@@ -1305,9 +1291,18 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
        char c, footnoteflag = 0, depth = 0;
        string tmp;
        LyXParagraph::size_type i;
-       int j, h, ltype = 0, ltype_depth = 0,
-               * clen = 0, actcell = 0, actpos = 0, cell = 0, cells = 0,
-               currlinelen = 0;
+       int j;
+       int ltype = 0;
+       int ltype_depth = 0;
+       int actcell = 0;
+       int actpos = 0;
+#ifndef NEW_TABULAR
+       int h;
+       int * clen = 0;
+       int cell = 0;
+       int cells = 0;
+#endif
+       int currlinelen = 0;
        long fpos = 0;
        bool ref_printed = false;
 
@@ -1322,10 +1317,17 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
        while (par) {
                int noparbreak = 0;
                int islatex = 0;
-               if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE ||
-                   !par->previous ||
-                   par->previous->footnoteflag == LyXParagraph::NO_FOOTNOTE){
-        
+               if (
+#ifndef NEW_INSETS
+                       par->footnoteflag != LyXParagraph::NO_FOOTNOTE ||
+#endif
+                   !par->previous
+#ifndef NEW_INSETS
+                   || par->previous->footnoteflag == LyXParagraph::NO_FOOTNOTE
+#endif
+                       ){
+
+#ifndef NEW_INSETS
                        /* begins a footnote environment ? */ 
                        if (footnoteflag != par->footnoteflag) {
                                footnoteflag = par->footnoteflag;
@@ -1338,6 +1340,7 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                                        currlinelen += j;
                                }
                        }
+#endif
         
                        /* begins or ends a deeper area ?*/ 
                        if (depth != par->depth) {
@@ -1393,10 +1396,14 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
         
                        /* what about the alignment */ 
                } else {
+#ifndef NEW_INSETS
                        /* dummy layout, that means a footnote ended */ 
                        footnoteflag = LyXParagraph::NO_FOOTNOTE;
                        ofs << ") ";
                        noparbreak = 1;
+#else
+                       lyxerr << "Should this ever happen?" << endl;
+#endif
                }
       
                //LyXLayout const & layout =
@@ -1404,16 +1411,9 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                //                          par->GetLayout()); // unused
                //bool free_spc = layout.free_spacing; //unused
 
+#ifndef NEW_TABULAR
                /* It might be a table */ 
                if (par->table){
-#if 0
-                       if (!lyxrc.ascii_roff_command.empty() &&
-                            lyxrc.ascii_roff_command != "none") {
-                               RoffAsciiTable(ofs, par);
-                               par = par->next;
-                               continue;
-                       }
-#endif
                        cell = 1;
                         actcell = 0;
                        cells = par->table->columns;
@@ -1426,11 +1426,11 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                                        if ((inset = par->GetInset(i))) {
 #ifdef HAVE_SSTREAM
                                                std::ostringstream ost;
-                                               inset->Ascii(ost);
+                                               inset->Ascii(this, ost);
                                                h += ost.str().length();
 #else
                                                ostrstream ost;
-                                               inset->Ascii(ost);
+                                               inset->Ascii(this, ost);
                                                ost << '\0';
                                                char * tmp = ost.str();
                                                string tstr(tmp);
@@ -1449,7 +1449,7 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                        if (clen[j] < h)
                                clen[j] = h;
                }
-      
+#endif
                font1 = LyXFont(LyXFont::ALL_INHERIT, params.language_info);
                 actcell = 0;
                for (i = 0, actpos = 1; i < par->size(); ++i, ++actpos) {
@@ -1481,6 +1481,7 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                                                ofs << "  ";
                                        currlinelen += (ltype_depth-depth)*2;
                                }
+#ifndef NEW_TABULAR
                                if (par->table) {
                                        for(j = 0; j < cells; ++j) {
                                                ofs << '+';
@@ -1500,8 +1501,9 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                                        }
                                        ofs << "| ";
                                }
+#endif
                        }
-                       font2 = par->GetFontSettings(i);
+                       font2 = par->GetFontSettings(params, i);
                        if (font1.latex() != font2.latex()) {
                                if (font2.latex() == LyXFont::OFF)
                                        islatex = 0;
@@ -1517,12 +1519,13 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                        case LyXParagraph::META_INSET:
                                if ((inset = par->GetInset(i))) {
                                        fpos = ofs.tellp();
-                                       inset->Ascii(ofs);
+                                       inset->Ascii(this, ofs);
                                        currlinelen += (ofs.tellp() - fpos);
                                        actpos += (ofs.tellp() - fpos) - 1;
                                }
                                break;
                        case LyXParagraph::META_NEWLINE:
+#ifndef NEW_TABULAR
                                if (par->table) {
                                        if (par->table->NumberOfCellsInRow(actcell) <= cell) {
                                                for(j = actpos; j < clen[cell - 1]; ++j)
@@ -1563,6 +1566,7 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                                         ++actcell;
                                        currlinelen = actpos = 0;
                                } else {
+#endif
                                        ofs << "\n";
                                        for(j = 0; j < depth; ++j)
                                                ofs << "  ";
@@ -1573,7 +1577,9 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                                                        ofs << "  ";
                                                currlinelen += (ltype_depth - depth) * 2;
                                        }
+#ifndef NEW_TABULAR
                                }
+#endif
                                break;
                        case LyXParagraph::META_HFILL: 
                                ofs << "\t";
@@ -1602,6 +1608,7 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                                break;
                        }
                }
+#ifndef NEW_TABULAR
                if (par->table) {
                        for(j = actpos; j < clen[cell - 1]; ++j)
                                ofs << ' ';
@@ -1621,7 +1628,8 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                        }
                        ofs << "+\n";
                        delete [] clen;    
-               }      
+               }
+#endif
                par = par->next;
        }
    
@@ -1698,7 +1706,8 @@ void Buffer::makeLaTeXFile(string const & fname,
                
                string options; // the document class options.
                
-               if (tokenPos(tclass.opt_fontsize(), '|', params.fontsize) >= 0) {
+               if (tokenPos(tclass.opt_fontsize(),
+                            '|', params.fontsize) >= 0) {
                        // only write if existing in list (and not default)
                        options += params.fontsize;
                        options += "pt,";
@@ -1756,7 +1765,7 @@ void Buffer::makeLaTeXFile(string const & fname,
                
                // language should be a parameter to \documentclass
                bool use_babel = false;
-               if (params.language_info->RightToLeft) // This seems necessary
+               if (params.language_info->lang() == "hebrew") // This seems necessary
                        features.UsedLanguages.insert(default_language);
                if (params.language != "default" ||
                    !features.UsedLanguages.empty() ) {
@@ -1764,8 +1773,8 @@ void Buffer::makeLaTeXFile(string const & fname,
                        for (LaTeXFeatures::LanguageList::const_iterator cit =
                                     features.UsedLanguages.begin();
                             cit != features.UsedLanguages.end(); ++cit)
-                               options += (*cit)->lang + ",";
-                       options += params.language_info->lang + ',';
+                               options += (*cit)->lang() + ",";
+                       options += params.language_info->lang() + ',';
                }
 
                // the user-defined options
@@ -1795,12 +1804,32 @@ void Buffer::makeLaTeXFile(string const & fname,
                            << "]{fontenc}\n";
                        texrow.newline();
                }
-               if (params.inputenc != "default") {
+
+               if (params.inputenc == "auto") {
+                       string doc_encoding =
+                               params.language_info->encoding()->LatexName();
+
+                       // Create a list with all the input encodings used 
+                       // in the document
+                       set<string> encodings;
+                       for (LaTeXFeatures::LanguageList::const_iterator it =
+                                    features.UsedLanguages.begin();
+                            it != features.UsedLanguages.end(); ++it)
+                               if ((*it)->encoding()->LatexName() != doc_encoding)
+                                       encodings.insert((*it)->encoding()->LatexName());
+
+                       ofs << "\\usepackage[";
+                       for (set<string>::const_iterator it = encodings.begin();
+                            it != encodings.end(); ++it)
+                               ofs << *it << ",";
+                       ofs << doc_encoding << "]{inputenc}\n";
+                       texrow.newline();
+               } else if (params.inputenc != "default") {
                        ofs << "\\usepackage[" << params.inputenc
                            << "]{inputenc}\n";
                        texrow.newline();
                }
-               
+
                // At the very beginning the text parameters.
                if (params.paperpackage != BufferParams::PACKAGE_NONE) {
                        switch (params.paperpackage) {
@@ -1910,7 +1939,8 @@ void Buffer::makeLaTeXFile(string const & fname,
                        texrow.newline();
                }
 
-               if (tokenPos(tclass.opt_pagestyle(), '|', params.pagestyle) >= 0) {
+               if (tokenPos(tclass.opt_pagestyle(),
+                            '|', params.pagestyle) >= 0) {
                        if (params.pagestyle == "fancy") {
                                ofs << "\\usepackage{fancyhdr}\n";
                                texrow.newline();
@@ -1966,16 +1996,15 @@ void Buffer::makeLaTeXFile(string const & fname,
                }
 
                // Now insert the LyX specific LaTeX commands...
-               string preamble, tmppreamble;
 
                // The optional packages;
-               preamble = features.getPackages();
+               string preamble(features.getPackages());
 
                // this might be useful...
-               preamble += "\n\\makeatletter\n\n";
+               preamble += "\n\\makeatletter\n";
 
                // Some macros LyX will need
-               tmppreamble = features.getMacros();
+               string tmppreamble(features.getMacros());
 
                if (!tmppreamble.empty()) {
                        preamble += "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
@@ -1998,7 +2027,7 @@ void Buffer::makeLaTeXFile(string const & fname,
                                + params.preamble + '\n';
                }
 
-               preamble += "\\makeatother\n\n";
+               preamble += "\\makeatother\n";
 
                // Itemize bullet settings need to be last in case the user
                // defines their own bullets that use a package included
@@ -2042,8 +2071,7 @@ void Buffer::makeLaTeXFile(string const & fname,
                ofs << preamble;
 
                // make the body.
-               ofs << "\\begin{document}\n\n";
-               texrow.newline();
+               ofs << "\\begin{document}\n";
                texrow.newline();
        } // only_body
        lyxerr.debug() << "preamble finished, now the body." << endl;
@@ -2094,11 +2122,12 @@ void Buffer::makeLaTeXFile(string const & fname,
        lyxerr.debug() << "Finished making latex file." << endl;
 }
 
+
 //
 // LaTeX all paragraphs from par to endpar, if endpar == 0 then to the end
 //
-void Buffer::latexParagraphs(ostream & ofs, LyXParagraph *par,
-                            LyXParagraph *endpar, TexRow & texrow)
+void Buffer::latexParagraphs(ostream & ofs, LyXParagraph * par,
+                            LyXParagraph * endpar, TexRow & texrow) const
 {
        bool was_title = false;
        bool already_title = false;
@@ -2120,9 +2149,11 @@ void Buffer::latexParagraphs(ostream & ofs, LyXParagraph *par,
                        tmpholder = 0;
                }
 #endif
+#ifndef NEW_INSETS
                if (par->IsDummy())
                        lyxerr[Debug::LATEX] << "Error in latexParagraphs."
                                             << endl;
+#endif
                LyXLayout const & layout =
                        textclasslist.Style(params.textclass,
                                            par->layout);
@@ -2146,11 +2177,18 @@ void Buffer::latexParagraphs(ostream & ofs, LyXParagraph *par,
                ftcount = -1;
                if (layout.isEnvironment()
                     || par->pextra_type != LyXParagraph::PEXTRA_NONE) {
-                       par = par->TeXEnvironment(ofs, texrow,
-                                                 ftnote, ft_texrow, ftcount);
+                       par = par->TeXEnvironment(this, params, ofs, texrow
+#ifndef NEW_INSETS
+                                                 ,ftnote, ft_texrow, ftcount
+#endif
+                               );
                } else {
-                       par = par->TeXOnePar(ofs, texrow, false,
-                                            ftnote, ft_texrow, ftcount);
+                       par = par->TeXOnePar(this, params, ofs, texrow, false
+#ifndef NEW_INSETS
+                                            ,
+                                            ftnote, ft_texrow, ftcount
+#endif
+                               );
                }
 
                // Write out what we've generated...
@@ -2189,6 +2227,7 @@ void Buffer::latexParagraphs(ostream & ofs, LyXParagraph *par,
        }
 }
 
+
 bool Buffer::isLatex() const
 {
        return textclasslist.TextClass(params.textclass).outputType() == LATEX;
@@ -2234,10 +2273,12 @@ void Buffer::sgmlCloseTag(ostream & os, int depth,
 }
 
 
-void Buffer::makeLinuxDocFile(string const & fname, int column)
+void Buffer::makeLinuxDocFile(string const & fname, bool nice, bool body_only)
 {
        LyXParagraph * par = paragraph;
 
+       niceFile = nice; // this will be used by Insetincludes.
+
        string top_element = textclasslist.LatexnameOfClass(params.textclass);
        string environment_stack[10];
         string item_name;
@@ -2250,40 +2291,49 @@ void Buffer::makeLinuxDocFile(string const & fname, int column)
                WriteAlert(_("LYX_ERROR:"), _("Cannot write file"), fname);
                return;
        }
-   
-       tex_code_break_column = column; 
+
+        LyXTextClass const & tclass =
+               textclasslist.TextClass(params.textclass);
+
+       LaTeXFeatures features(params, tclass.numLayouts());
+       validate(features);
+
+       //if(nice)
+       tex_code_break_column = lyxrc.ascii_linelen;
+       //else
+       //tex_code_break_column = 0;
+
        texrow.reset();
-   
-       if (params.preamble.empty()) {
-               ofs << "<!doctype linuxdoc system>\n\n";
-       }
-       else {
-               ofs << "<!doctype linuxdoc system \n [ "
-                   << params.preamble << " \n]>\n\n";
+
+       if (!body_only) {
+               string sgml_includedfiles=features.getIncludedFiles();
+
+               if (params.preamble.empty() && sgml_includedfiles.empty()) {
+                       ofs << "<!doctype linuxdoc system>\n\n";
+               } else {
+                       ofs << "<!doctype linuxdoc system [ "
+                           << params.preamble << sgml_includedfiles << " \n]>\n\n";
+               }
+
+               if(params.options.empty())
+                       sgmlOpenTag(ofs, 0, top_element);
+               else {
+                       string top = top_element;
+                       top += " ";
+                       top += params.options;
+                       sgmlOpenTag(ofs, 0, top);
+               }
        }
 
        ofs << "<!-- "  << LYX_DOCVERSION 
            << " created this file. For more info see http://www.lyx.org/"
            << " -->\n";
 
-       if(params.options.empty())
-               sgmlOpenTag(ofs, 0, top_element);
-       else {
-               string top = top_element;
-               top += " ";
-               top += params.options;
-               sgmlOpenTag(ofs, 0, top);
-       }
-
        while (par) {
                int desc_on = 0; // description mode
                LyXLayout const & style =
-                       textclasslist.Style(users->buffer()->params.textclass,
+                       textclasslist.Style(params.textclass,
                                            par->layout);
-#ifdef WITH_WARNINGS
-#warning please check if this call is really needed!!!
-#endif
-//             par->AutoDeleteInsets();
 
                // treat <toc> as a special case for compatibility with old code
                if (par->GetChar(0) == LyXParagraph::META_INSET) {
@@ -2294,7 +2344,9 @@ void Buffer::makeLinuxDocFile(string const & fname, int column)
                                sgmlOpenTag(ofs, depth, temp);
 
                                par = par->next;
+#ifndef NEW_INSETS
                                linuxDocHandleFootnote(ofs, par, depth);
+#endif
                                continue;
                        }
                }
@@ -2375,13 +2427,17 @@ void Buffer::makeLinuxDocFile(string const & fname, int column)
                        break;
                }
 
+#ifndef NEW_INSETS
                do {
+#endif
                        SimpleLinuxDocOnePar(ofs, par, desc_on, depth);
 
                        par = par->next;
+#ifndef NEW_INSETS
                        linuxDocHandleFootnote(ofs, par, depth);
                }
                while(par && par->IsDummy());
+#endif
 
                ofs << "\n";
                // write closing SGML tags
@@ -2403,14 +2459,17 @@ void Buffer::makeLinuxDocFile(string const & fname, int column)
        if(!environment_stack[depth].empty())
                sgmlCloseTag(ofs, depth, environment_stack[depth]);
 
-       ofs << "\n\n";
-       sgmlCloseTag(ofs, 0, top_element);
+       if (!body_only) {
+               ofs << "\n\n";
+               sgmlCloseTag(ofs, 0, top_element);
+       }
 
        ofs.close();
        // How to check for successful close
 }
 
 
+#ifndef NEW_INSETS
 void Buffer::linuxDocHandleFootnote(ostream & os, LyXParagraph * & par,
                                    int const depth)
 {
@@ -2423,6 +2482,7 @@ void Buffer::linuxDocHandleFootnote(ostream & os, LyXParagraph * & par,
                par = par->next;
        }
 }
+#endif
 
 
 void Buffer::DocBookHandleCaption(ostream & os, string & inner_tag,
@@ -2430,8 +2490,11 @@ void Buffer::DocBookHandleCaption(ostream & os, string & inner_tag,
                                  LyXParagraph * & par)
 {
        LyXParagraph * tpar = par;
-       while (tpar && (tpar->footnoteflag != LyXParagraph::NO_FOOTNOTE) &&
-              (tpar->layout != textclasslist.NumberOfLayout(params.textclass,
+       while (tpar
+#ifndef NEW_INSETS
+              && (tpar->footnoteflag != LyXParagraph::NO_FOOTNOTE)
+#endif
+              && (tpar->layout != textclasslist.NumberOfLayout(params.textclass,
                                                             "Caption").second))
                tpar = tpar->next;
        if (tpar &&
@@ -2448,6 +2511,7 @@ void Buffer::DocBookHandleCaption(ostream & os, string & inner_tag,
 }
 
 
+#ifndef NEW_INSETS
 void Buffer::DocBookHandleFootnote(ostream & os, LyXParagraph * & par,
                                   int const depth)
 {
@@ -2555,6 +2619,7 @@ void Buffer::DocBookHandleFootnote(ostream & os, LyXParagraph * & par,
        if(!extra_par.empty()) os << extra_par;
        if(!tag.empty()) sgmlCloseTag(os, depth, tag);
 }
+#endif
 
 
 // push a tag in a style stack
@@ -2649,43 +2714,45 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
             i < par->size(); ++i) {
 
                // handle quote tag
-               if (i == main_body && !par->IsDummy()) {
+               if (i == main_body
+#ifndef NEW_INSETS
+                   && !par->IsDummy()
+#endif
+                       ) {
                        if (main_body > 0)
                                font1 = style.font;
                }
 
-               font2 = par->getFont(i);
+               font2 = par->getFont(params, i);
 
                if (font1.family() != font2.family()) {
                        switch(family_type) {
                        case 0:
                                if (font2.family() == LyXFont::TYPEWRITER_FAMILY) {
                                        push_tag(os, "tt", stack_num, stack);
-                                       family_type= 1;
+                                       family_type = 1;
                                }
                                else if (font2.family() == LyXFont::SANS_FAMILY) {
                                        push_tag(os, "sf", stack_num, stack);
-                                       family_type= 2;
+                                       family_type = 2;
                                }
                                break;
                        case 1:
                                pop_tag(os, "tt", stack_num, stack);
                                if (font2.family() == LyXFont::SANS_FAMILY) {
                                        push_tag(os, "sf", stack_num, stack);
-                                       family_type= 2;
-                               }
-                               else {
-                                       family_type= 0;
+                                       family_type = 2;
+                               } else {
+                                       family_type = 0;
                                }
                                break;
                        case 2:
                                pop_tag(os, "sf", stack_num, stack);
                                if (font2.family() == LyXFont::TYPEWRITER_FAMILY) {
                                        push_tag(os, "tt", stack_num, stack);
-                                       family_type= 1;
-                               }
-                               else {
-                                       family_type= 0;
+                                       family_type = 1;
+                               } else {
+                                       family_type = 0;
                                }
                        }
                }
@@ -2695,8 +2762,7 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
                        if (font2.series() == LyXFont::BOLD_SERIES) {
                                push_tag(os, "bf", stack_num, stack);
                                is_bold = true;
-                       }
-                       else if (is_bold) {
+                       } else if (is_bold) {
                                pop_tag(os, "bf", stack_num, stack);
                                is_bold = false;
                        }
@@ -2708,31 +2774,28 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
                        case 0:
                                if (font2.shape() == LyXFont::ITALIC_SHAPE) {
                                        push_tag(os, "it", stack_num, stack);
-                                       shape_type= 1;
-                               }
-                               else if (font2.shape() == LyXFont::SLANTED_SHAPE) {
+                                       shape_type = 1;
+                               } else if (font2.shape() == LyXFont::SLANTED_SHAPE) {
                                        push_tag(os, "sl", stack_num, stack);
-                                       shape_type= 2;
+                                       shape_type = 2;
                                }
                                break;
                        case 1:
                                pop_tag(os, "it", stack_num, stack);
                                if (font2.shape() == LyXFont::SLANTED_SHAPE) {
                                        push_tag(os, "sl", stack_num, stack);
-                                       shape_type= 2;
-                               }
-                               else {
-                                       shape_type= 0;
+                                       shape_type = 2;
+                               } else {
+                                       shape_type = 0;
                                }
                                break;
                        case 2:
                                pop_tag(os, "sl", stack_num, stack);
                                if (font2.shape() == LyXFont::ITALIC_SHAPE) {
                                        push_tag(os, "it", stack_num, stack);
-                                       shape_type= 1;
-                               }
-                               else {
-                                       shape_type= 0;
+                                       shape_type = 1;
+                               } else {
+                                       shape_type = 0;
                                }
                        }
                }
@@ -2748,15 +2811,17 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
                }
 
                c = par->GetChar(i);
-      
+
+               if (c == LyXParagraph::META_INSET) {
+                       inset = par->GetInset(i);
+                       inset->Linuxdoc(this, os);
+               }
+
                if (font2.latex() == LyXFont::ON) {
                        // "TeX"-Mode on == > SGML-Mode on.
                        if (c != '\0')
                                os << c; // see LaTeX-Generation...
                        ++char_line_count;
-               } else if (c == LyXParagraph::META_INSET) {
-                       inset = par->GetInset(i);
-                       inset->Linuxdoc(os);
                } else {
                        string sgml_string;
                        if (par->linuxDocConvertChar(c, sgml_string)
@@ -2769,13 +2834,11 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
                                        linux_doc_line_break(os, char_line_count, 6);
                                        os << "</tag>";
                                        desc_on = 2;
-                               }
-                               else  {
+                               } else  {
                                        linux_doc_line_break(os, char_line_count, 1);
                                        os << c;
                                }
-                       }
-                       else {
+                       } else {
                                os << sgml_string;
                                char_line_count += sgml_string.length();
                        }
@@ -2814,11 +2877,8 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
 void Buffer::LinuxDocError(LyXParagraph * par, int pos,
                           char const * message) 
 {
-       InsetError * new_inset;
-
        // insert an error marker in text
-       new_inset = new InsetError(message);
-       par->InsertChar(pos, LyXParagraph::META_INSET);
+       InsetError * new_inset = new InsetError(message);
        par->InsertInset(pos, new_inset);
 }
 
@@ -2830,10 +2890,12 @@ void Buffer::LinuxDocError(LyXParagraph * par, int pos,
 
 enum { MAX_NEST_LEVEL = 25};
 
-void Buffer::makeDocBookFile(string const & fname, int column)
+void Buffer::makeDocBookFile(string const & fname, bool nice, bool only_body)
 {
        LyXParagraph * par = paragraph;
 
+       niceFile = nice; // this will be used by Insetincludes.
+
        string top_element= textclasslist.LatexnameOfClass(params.textclass);
        // Please use a real stack.
        string environment_stack[MAX_NEST_LEVEL];
@@ -2847,8 +2909,16 @@ void Buffer::makeDocBookFile(string const & fname, int column)
        string c_depth, c_params, tmps;
 
        int depth = 0; // paragraph depth
+        LyXTextClass const & tclass =
+               textclasslist.TextClass(params.textclass);
+
+       LaTeXFeatures features(params, tclass.numLayouts());
+       validate(features);
 
-       tex_code_break_column = column; 
+       //if(nice)
+       tex_code_break_column = lyxrc.ascii_linelen;
+       //else
+       //tex_code_break_column = 0;
 
        ofstream ofs(fname.c_str());
        if (!ofs) {
@@ -2858,35 +2928,36 @@ void Buffer::makeDocBookFile(string const & fname, int column)
    
        texrow.reset();
 
-       ofs << "<!doctype " << top_element
-           << " public \"-//OASIS//DTD DocBook V3.1//EN\"";
+       if(!only_body) {
+               string sgml_includedfiles=features.getIncludedFiles();
 
-       if (params.preamble.empty())
-               ofs << ">\n\n";
-       else
-               ofs << "\n [ " << params.preamble << " \n]>\n\n";
+               ofs << "<!doctype " << top_element
+                   << " public \"-//OASIS//DTD DocBook V3.1//EN\"";
 
-       ofs << "<!-- DocBook file was created by " << LYX_DOCVERSION 
-           << "\n  See http://www.lyx.org/ for more information -->\n";
+               if (params.preamble.empty() && sgml_includedfiles.empty())
+                       ofs << ">\n\n";
+               else
+                       ofs << "\n [ " << params.preamble 
+                           << sgml_includedfiles << " \n]>\n\n";
 
-       if(params.options.empty())
-               sgmlOpenTag(ofs, 0, top_element);
-       else {
-               string top = top_element;
-               top += " ";
-               top += params.options;
-               sgmlOpenTag(ofs, 0, top);
+               if(params.options.empty())
+                       sgmlOpenTag(ofs, 0, top_element);
+               else {
+                       string top = top_element;
+                       top += " ";
+                       top += params.options;
+                       sgmlOpenTag(ofs, 0, top);
+               }
        }
 
+       ofs << "<!-- DocBook file was created by " << LYX_DOCVERSION 
+           << "\n  See http://www.lyx.org/ for more information -->\n";
+
        while (par) {
                int desc_on = 0; // description mode
                LyXLayout const & style =
-                       textclasslist.Style(users->buffer()->params.textclass,
+                       textclasslist.Style(params.textclass,
                                            par->layout);
-#ifdef WITH_WARNINGS
-#warning please check if this call is really needed!!!
-#endif
-//             par->AutoDeleteInsets();
 
                // environment tag closing
                for( ; depth > par->depth; --depth) {
@@ -2952,19 +3023,16 @@ void Buffer::makeDocBookFile(string const & fname, int column)
                                                if(!command_stack[j].empty())
                                                        sgmlCloseTag(ofs, j, command_stack[j]);
                                        command_depth= command_base= cmd_depth;
-                               }
-                               else if(cmd_depth <= command_depth) {
+                               } else if(cmd_depth <= command_depth) {
                                        for(int j = command_depth;
                                            j >= cmd_depth; --j)
 
                                                if(!command_stack[j].empty())
                                                        sgmlCloseTag(ofs, j, command_stack[j]);
                                        command_depth= cmd_depth;
-                               }
-                               else
+                               } else
                                        command_depth= cmd_depth;
-                       }
-                       else {
+                       } else {
                                command_depth = command_base = cmd_depth;
                                command_flag = true;
                        }
@@ -3034,8 +3102,7 @@ void Buffer::makeDocBookFile(string const & fname, int column)
                                item_name= "term";
                                sgmlOpenTag(ofs, depth + 1 + command_depth,
                                            item_name);
-                       }
-                       else {
+                       } else {
                                item_name= "para";
                                sgmlOpenTag(ofs, depth + 1 + command_depth,
                                            item_name);
@@ -3047,16 +3114,19 @@ void Buffer::makeDocBookFile(string const & fname, int column)
                        break;
                }
 
+#ifndef NEW_INSETS
                do {
+#endif
                        string extra_par;
                        SimpleDocBookOnePar(ofs, extra_par, par, desc_on,
                                            depth + 1 + command_depth);
                        par = par->next;
+#ifndef NEW_INSETS
                        DocBookHandleFootnote(ofs, par,
                                              depth + 1 + command_depth);
                }
                while(par && par->IsDummy());
-
+#endif
                string end_tag;
                // write closing SGML tags
                switch(style.latextype) {
@@ -3107,8 +3177,10 @@ void Buffer::makeDocBookFile(string const & fname, int column)
                if(!command_stack[j].empty())
                        sgmlCloseTag(ofs, j, command_stack[j]);
 
-       ofs << "\n\n";
-       sgmlCloseTag(ofs, 0, top_element);
+       if (!only_body) {
+               ofs << "\n\n";
+               sgmlCloseTag(ofs, 0, top_element);
+       }
 
        ofs.close();
        // How to check for successful close
@@ -3119,10 +3191,13 @@ void Buffer::SimpleDocBookOnePar(ostream & os, string & extra,
                                 LyXParagraph * par, int & desc_on,
                                 int const depth) 
 {
+#ifndef NEW_TABULAR
        if (par->table) {
-               par->SimpleDocBookOneTablePar(os, extra, desc_on, depth);
+               par->SimpleDocBookOneTablePar(this,
+                                             os, extra, desc_on, depth);
                return;
        }
+#endif
 
        bool emph_flag = false;
 
@@ -3146,7 +3221,7 @@ void Buffer::SimpleDocBookOnePar(ostream & os, string & extra,
        // parsing main loop
        for (LyXParagraph::size_type i = 0;
             i < par->size(); ++i) {
-               LyXFont font2 = par->getFont(i);
+               LyXFont font2 = par->getFont(params, i);
 
                // handle <emphasis> tag
                if (font1.emph() != font2.emph() && i) {
@@ -3165,11 +3240,11 @@ void Buffer::SimpleDocBookOnePar(ostream & os, string & extra,
                        Inset * inset = par->GetInset(i);
 #ifdef HAVE_SSTREAM
                        std::ostringstream ost;
-                       inset->DocBook(ost);
+                       inset->DocBook(this, ost);
                        string tmp_out = ost.str().c_str();
 #else
                        ostrstream ost;
-                       inset->DocBook(ost);
+                       inset->DocBook(this, ost);
                        ost << '\0';
                        char * ctmp = ost.str();
                        string tmp_out(ctmp);
@@ -3264,7 +3339,6 @@ int Buffer::runLaTeX()
 
        // Always generate the LaTeX file
        makeLaTeXFile(name, org_path, false);
-       markDviDirty();
 
        // do the LaTex run(s)
        TeXErrors terr;
@@ -3289,7 +3363,6 @@ int Buffer::runLaTeX()
        } else {
                //no errors or any other things to think about so:
                users->owner()->getMiniBuffer()->Set(_("Done"));
-               markDviClean();
        }
 
        // if we removed error insets before we ran LaTeX or if we inserted
@@ -3328,13 +3401,10 @@ int Buffer::runLiterate()
        users->owner()->getMiniBuffer()->Set(_("Running Literate..."));   
 
        // Remove all error insets
-       bool a = users->removeAutoInsets();
+       bool removedErrorInsets = users->removeAutoInsets();
 
        // generate the Literate file if necessary
-       if (!isDviClean() || a) {
-               makeLaTeXFile(lit_name, org_path, false);
-               markDviDirty();
-       }
+       makeLaTeXFile(lit_name, org_path, false);
 
        string latex_command = lyxrc.pdf_mode ?
                lyxrc.pdflatex_command : lyxrc.latex_command;
@@ -3360,12 +3430,11 @@ int Buffer::runLiterate()
        } else {
                //no errors or any other things to think about so:
                users->owner()->getMiniBuffer()->Set(_("Done"));
-               markDviClean();
        }
 
        // if we removed error insets before we ran LaTeX or if we inserted
        // error insets after we ran LaTeX this must be run:
-        if (a || (res & Literate::ERRORS)){
+        if (removedErrorInsets || (res & Literate::ERRORS)){
                 users->redraw();
                 users->fitCursor();
                 //users->updateScrollbar();
@@ -3399,10 +3468,10 @@ int Buffer::buildProgram()
         users->owner()->getMiniBuffer()->Set(_("Building Program..."));   
  
         // Remove all error insets
-        bool a = users->removeAutoInsets();
+        bool removedErrorInsets = users->removeAutoInsets();
  
         // generate the LaTeX file if necessary
-        if (!isNwClean() || a) {
+        if (!isNwClean() || removedErrorInsets) {
                 makeLaTeXFile(lit_name, org_path, false);
                 markNwDirty();
         }
@@ -3436,7 +3505,7 @@ int Buffer::buildProgram()
         // if we removed error insets before we ran Literate/Build or
        // if we inserted error insets after we ran Literate/Build this
        // must be run:
-       if (a || (res & Literate::ERRORS)){
+       if (removedErrorInsets || (res & Literate::ERRORS)){
                users->redraw();
                users->fitCursor();
                //users->updateScrollbar();
@@ -3469,13 +3538,10 @@ int Buffer::runChktex()
        users->owner()->getMiniBuffer()->Set(_("Running chktex..."));
 
        // Remove all error insets
-       bool a = users->removeAutoInsets();
+       bool removedErrorInsets = users->removeAutoInsets();
 
        // Generate the LaTeX file if neccessary
-       if (!isDviClean() || a) {
-               makeLaTeXFile(name, org_path, false);
-               markDviDirty();
-       }
+       makeLaTeXFile(name, org_path, false);
 
        TeXErrors terr;
        Chktex chktex(lyxrc.chktex_command, name, filepath);
@@ -3491,7 +3557,7 @@ int Buffer::runChktex()
 
        // if we removed error insets before we ran chktex or if we inserted
        // error insets after we ran chktex, this must be run:
-       if (a || res){
+       if (removedErrorInsets || res){
                users->redraw();
                users->fitCursor();
                //users->updateScrollbar();
@@ -3502,160 +3568,6 @@ int Buffer::runChktex()
 }
 
 
-#if 0
-void Buffer::RoffAsciiTable(ostream & os, LyXParagraph * par)
-{
-       LyXFont font1(LyXFont::ALL_INHERIT,params.language_info);
-       LyXFont font2;
-       Inset * inset;
-       LyXParagraph::size_type i;
-       int j, cell = 0;
-       char c;
-       
-       string fname1 = TmpFileName(string(), "RAT1");
-       string fname2 = TmpFileName(string(), "RAT2");
-
-       ofstream ofs(fname1.c_str());
-       if (!ofs) {
-               WriteAlert(_("LYX_ERROR:"),
-                          _("Cannot open temporary file:"), fname1);
-               return;
-       }
-       par->table->RoffEndOfCell(ofs, -1);
-       for (i = 0; i < par->size(); ++i) {
-               c = par->GetChar(i);
-               if (par->table->IsContRow(cell)) {
-                       if (c == LyXParagraph::META_NEWLINE)
-                               ++cell;
-                       continue;
-               }
-               font2 = par->GetFontSettings(i);
-               if (font1.latex() != font2.latex()) {
-                       if (font2.latex() != LyXFont::OFF)
-                               continue;
-               }
-               switch (c) {
-               case LyXParagraph::META_INSET:
-                       if ((inset = par->GetInset(i))) {
-#ifdef HAVE_SSTREAM
-                               stringstresm ss(ios::in | ios::out);
-                               inset->Ascii(ss);
-                               ss.seekp(0);
-                               ss.get(c);
-                               while (!ss) {
-                                       if (c == '\\')
-                                               ofs << "\\\\";
-                                       else
-                                               ofs << c;
-                                       ss.get(c);
-                               }
-#else
-                               strstream ss;
-                               inset->Ascii(ss);
-                               ss.seekp(0);
-                               ss.get(c);
-                               while (!ss) {
-                                       if (c == '\\')
-                                               ofs << "\\\\";
-                                       else
-                                               ofs << c;
-                                       ss.get(c);
-                               }
-                               delete [] ss.str();
-#endif
-                       }
-                       break;
-               case LyXParagraph::META_NEWLINE:
-                       if (par->table->CellHasContRow(cell)>= 0)
-                               par->RoffContTableRows(ofs, i+1, cell);
-                       par->table->RoffEndOfCell(ofs, cell);
-                       ++cell;
-                       break;
-               case LyXParagraph::META_HFILL: 
-                       break;
-               case '\\': 
-                       ofs << "\\\\";
-                       break;
-               default:
-                       if (c != '\0')
-                               ofs << c;
-                       else if (c == '\0')
-                               lyxerr.debug()
-                                       << "RoffAsciiTable:"
-                                       " NULL char in structure." << endl;
-                       break;
-               }
-       }
-       par->table->RoffEndOfCell(ofs, cell);
-       ofs.close();
-       string cmd = lyxrc.ascii_roff_command + " >" + fname2;
-       cmd = subst(cmd, "$$FName", fname1);
-       Systemcalls one(Systemcalls::System, cmd);
-       if (!(lyxerr.debugging(Debug::ROFF))) {
-               remove(fname1.c_str());
-       }
-       ifstream ifs(fname2.c_str());
-       if (!ifs) {
-               WriteFSAlert(_("Error! Can't open temporary file:"), fname2);
-               return;
-       }
-       // now output the produced file
-       os << "\n\n";
-       ifs.get(c);
-       if (!ifs)
-               WriteAlert(_("Error!"),
-                          _("Error executing *roff command on table"));
-       // overread leading blank lines
-       while(!ifs && (c == '\n'))
-               ifs.get(c);
-       while(!ifs) {
-               for(j = 0; j < par->depth; ++j)
-                       os << "  ";
-               while(!ifs && (c != '\n')) {
-                       os << c;
-                       ifs.get(c);
-               }
-               os << '\n';
-               // overread trailing blank lines
-               while(!ifs && (c == '\n'))
-                       ifs.get(c);
-       }
-       ifs.close();
-       remove(fname2.c_str());
-}
-#endif
-
-       
-/// changed Heinrich Bauer, 23/03/98
-bool Buffer::isDviClean() const
-{
-  if (lyxrc.use_tempdir)
-    return dvi_clean_tmpd;
-  else
-    return dvi_clean_orgd;
-}
-
-/// changed Heinrich Bauer, 23/03/98
-void Buffer::markDviClean()
-{
-  if (lyxrc.use_tempdir)
-    dvi_clean_tmpd = true;
-  else
-    dvi_clean_orgd = true;
-}
-
-
-/// changed Heinrich Bauer, 23/03/98
-void Buffer::markDviDirty()
-{
-  if (lyxrc.use_tempdir)
-    dvi_clean_tmpd = false;
-  else
-    dvi_clean_orgd = false;
-}
-
-
 void Buffer::validate(LaTeXFeatures & features) const
 {
        LyXParagraph * par = paragraph;
@@ -3787,6 +3699,7 @@ vector<vector<Buffer::TocItem> > Buffer::getTocList()
        vector<vector<TocItem> > l(4);
        LyXParagraph * par = paragraph;
        while (par) {
+#ifndef NEW_INSETS
                if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
                        if (textclasslist.Style(params.textclass, 
                                                par->GetLayout()).labeltype
@@ -3794,7 +3707,7 @@ vector<vector<Buffer::TocItem> > Buffer::getTocList()
                                TocItem tmp;
                                tmp.par = par;
                                tmp.depth = 0;
-                               tmp.str =  par->String(false);
+                               tmp.str =  par->String(this, false);
                                switch (par->footnotekind) {
                                case LyXParagraph::FIG:
                                case LyXParagraph::WIDE_FIG:
@@ -3813,6 +3726,7 @@ vector<vector<Buffer::TocItem> > Buffer::getTocList()
                                }
                        }
                } else if (!par->IsDummy()) {
+#endif
                        char labeltype = textclasslist.Style(params.textclass, 
                                                             par->GetLayout()).labeltype;
       
@@ -3824,10 +3738,12 @@ vector<vector<Buffer::TocItem> > Buffer::getTocList()
                                tmp.depth = max(0,
                                                labeltype - 
                                                textclasslist.TextClass(params.textclass).maxcounter());
-                               tmp.str =  par->String(true);
+                               tmp.str =  par->String(this, true);
                                l[TOC_TOC].push_back(tmp);
                        }
+#ifndef NEW_INSETS
                }
+#endif
                par = par->next;
        }
        return l;
@@ -3844,12 +3760,12 @@ vector<pair<string,string> > Buffer::getBibkeyList()
                        return tmp->getBibkeyList();
        }
 
-       vector<pair<string,string> > keys;
+       vector<pair<string, string> > keys;
        LyXParagraph * par = paragraph;
        while (par) {
                if (par->bibkey)
-                       keys.push_back(pair<string,string>(par->bibkey->getContents(),
-                                                          par->String(false)));
+                       keys.push_back(pair<string, string>(par->bibkey->getContents(),
+                                                          par->String(this, false)));
                par = par->next;
        }
 
@@ -3932,12 +3848,29 @@ bool Buffer::Dispatch(int action, string const & argument)
 }
 
 
+void Buffer::resize()
+{
+       /// resize the BufferViews!
+       if (users)
+               users->resize();
+}
+
+
+void Buffer::resizeInsets(BufferView * bv)
+{
+       /// then remove all LyXText in text-insets
+       LyXParagraph * par = paragraph;
+       for(;par;par = par->next) {
+           par->resizeInsetsLyXText(bv);
+       }
+}
+
 void Buffer::ChangeLanguage(Language const * from, Language const * to)
 {
 
        LyXParagraph * par = paragraph;
        while (par) {
-               par->ChangeLanguage(from, to);
+               par->ChangeLanguage(params, from, to);
                par = par->next;
        }
 }
@@ -3948,7 +3881,7 @@ bool Buffer::isMultiLingual()
 
        LyXParagraph * par = paragraph;
        while (par) {
-               if (par->isMultiLingual())
+               if (par->isMultiLingual(params))
                        return true;
                par = par->next;
        }