]> git.lyx.org Git - lyx.git/blobdiff - src/buffer.C
more changes, read the Changelog
[lyx.git] / src / buffer.C
index 156629f5775a0189cfbdda6466b2d82a91d6b6c2..55785a6b3c94e9ceadd4116e746167723ab4d025 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>
@@ -31,6 +22,8 @@
 #include <sys/types.h>
 #include <utime.h>
 
+#include <algorithm>
+
 #ifdef __GNUG__
 #pragma implementation "buffer.h"
 #endif
@@ -58,6 +51,8 @@
 #include "insets/insetquotes.h"
 #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/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 "support/filetools.h"
 #include "support/path.h"
 #include "LaTeX.h"
@@ -86,6 +86,8 @@
 #include "lyxtext.h"
 #include "gettext.h"
 #include "language.h"
+#include "lyx_gui_misc.h"      // WarnReadonly()
+#include "frontends/Dialogs.h"
 
 using std::ostream;
 using std::ofstream;
@@ -95,7 +97,8 @@ using std::ios;
 using std::setw;
 using std::endl;
 using std::pair;
-
+using std::vector;
+using std::max;
 
 // all these externs should eventually be removed.
 extern BufferList bufferlist;
@@ -117,8 +120,6 @@ 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;
        users = 0;
@@ -171,7 +172,7 @@ void Buffer::setReadonly(bool flag)
        if (read_only != flag) {
                read_only = flag; 
                updateTitles();
-               updateAllVisibleBufferRelatedPopups();
+               users->owner()->getDialogs()->updateBufferDependent();
        }
        if (read_only) {
                WarnReadonly(filename);
@@ -229,7 +230,7 @@ void Buffer::fileName(string const & newfile)
 // 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
+//#define USE_TABULAR_INSETS 1
 bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
 {
        string tmptok;
@@ -251,7 +252,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();
@@ -308,16 +309,13 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
        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) 
@@ -352,6 +350,7 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                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;
@@ -377,6 +376,47 @@ 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;
+               
+               if (tmptok == "footnote") {
+                       inset = new InsetFoot;
+               } else if (tmptok == "margin") {
+                       inset = new InsetMarginal;
+               } else if (tmptok == "fig") {
+                       //inset = new InsetFigure;
+               } else if (tmptok == "tab") {
+                       //inset = new InsetTable;
+               } else if (tmptok == "alg") {
+                       //inset = new InsetAlgorithm;
+               } else if (tmptok == "wide-fig") {
+                       //inset = new InsetFigure(true);
+               } else if (tmptok == "wide-tab") {
+                       //inset = new InsetTable(true);
+               }
+
+               if (!inset) return false; // no end read yet
+               
+               string old_float = "\ncollapsed true\n";
+               old_float += lex.getLongString("\\end_float");
+               old_float += "\n\\end_inset\n";
+               lyxerr << "float body: " << old_float << endl;
+               
+               istrstream istr(old_float.c_str());
+               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") {
@@ -609,14 +649,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());
@@ -661,11 +693,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());
@@ -772,92 +799,91 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                // 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);
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, 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);
+               } else if (tmptok == "External") {
+                       Inset * inset = new InsetExternal;
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, 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);
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, 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);
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, 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);
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, 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);
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, 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);
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, 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);
+                       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(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 (tmptok == "Text") {
-                       Inset * inset = new InsetText(this);
-                       inset->Read(lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       Inset * inset = new InsetText;
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, 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);
+                       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") {
+                       Inset * inset = new InsetFloat;
+                       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 == "GRAPHICS") {
                        Inset * inset = new InsetGraphics;
-                               //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);
                } else if (tmptok == "LatexCommand") {
                        InsetCommand inscmd;
-                       inscmd.Read(lex);
+                       inscmd.Read(this, lex);
                        Inset * inset = 0;
                        if (inscmd.getCmdName() == "cite") {
                                inset = new InsetCitation(inscmd.getContents(), inscmd.getOptions());
@@ -876,67 +902,13 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                                   || inscmd.getCmdName() == "htmlurl") {
                                inset = new InsetUrl(inscmd.getCommand());
                        } else if (inscmd.getCmdName() == "ref"
-                                  || inscmd.getCmdName() == "pageref") {
+                                  || 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") {
@@ -952,32 +924,10 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                        }
                               
                        if (inset) {
-                               par->InsertChar(pos, LyXParagraph::META_INSET);
-                               par->InsertInset(pos, inset);
-                               par->SetFont(pos, font);
+                               par->InsertInset(pos, inset, 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
        } else if (token == "\\SpecialChar") {
                LyXLayout const & layout =
                        textclasslist.Style(params.textclass, 
@@ -990,12 +940,10 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                                lex.next();
                                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 "
@@ -1005,40 +953,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
                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)
@@ -1049,22 +981,18 @@ 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);                 
+               par->bibkey->Read(this, lex);                   
        }else if (token == "\\backslash") {
-               par->InsertChar(pos, '\\');
-               par->SetFont(pos, font);
+               par->InsertChar(pos, '\\', font);
                ++pos;
        }else if (token == "\\the_end") {
                the_end_read = true;
@@ -1074,8 +1002,7 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                               "Inserting as text.");
                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;
                }
        }
@@ -1281,7 +1208,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;
@@ -1397,16 +1324,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;
@@ -1419,11 +1339,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);
@@ -1442,7 +1362,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) {
@@ -1474,6 +1394,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 << '+';
@@ -1493,8 +1414,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;
@@ -1510,12 +1432,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)
@@ -1556,6 +1479,7 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                                         ++actcell;
                                        currlinelen = actpos = 0;
                                } else {
+#endif
                                        ofs << "\n";
                                        for(j = 0; j < depth; ++j)
                                                ofs << "  ";
@@ -1566,7 +1490,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";
@@ -1595,6 +1521,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 << ' ';
@@ -1614,7 +1541,8 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
                        }
                        ofs << "+\n";
                        delete [] clen;    
-               }      
+               }
+#endif
                par = par->next;
        }
    
@@ -1691,7 +1619,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,";
@@ -1749,7 +1678,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->RightToLeft()) // This seems necessary
                        features.UsedLanguages.insert(default_language);
                if (params.language != "default" ||
                    !features.UsedLanguages.empty() ) {
@@ -1757,8 +1686,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
@@ -1903,7 +1832,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();
@@ -1959,16 +1889,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%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
@@ -1991,7 +1920,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
@@ -2035,8 +1964,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;
@@ -2087,11 +2015,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;
@@ -2139,10 +2068,10 @@ void Buffer::latexParagraphs(ostream & ofs, LyXParagraph *par,
                ftcount = -1;
                if (layout.isEnvironment()
                     || par->pextra_type != LyXParagraph::PEXTRA_NONE) {
-                       par = par->TeXEnvironment(ofs, texrow,
+                       par = par->TeXEnvironment(this, params, ofs, texrow,
                                                  ftnote, ft_texrow, ftcount);
                } else {
-                       par = par->TeXOnePar(ofs, texrow, false,
+                       par = par->TeXOnePar(this, params, ofs, texrow, false,
                                             ftnote, ft_texrow, ftcount);
                }
 
@@ -2182,6 +2111,7 @@ void Buffer::latexParagraphs(ostream & ofs, LyXParagraph *par,
        }
 }
 
+
 bool Buffer::isLatex() const
 {
        return textclasslist.TextClass(params.textclass).outputType() == LATEX;
@@ -2227,10 +2157,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;
@@ -2243,40 +2175,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) {
@@ -2396,8 +2337,10 @@ 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
@@ -2647,38 +2590,36 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
                                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;
                                }
                        }
                }
@@ -2688,8 +2629,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;
                        }
@@ -2701,31 +2641,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;
                                }
                        }
                }
@@ -2741,15 +2678,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)
@@ -2762,13 +2701,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();
                        }
@@ -2807,11 +2744,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);
 }
 
@@ -2823,10 +2757,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];
@@ -2840,8 +2776,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);
 
-       tex_code_break_column = column; 
+       LaTeXFeatures features(params, tclass.numLayouts());
+       validate(features);
+
+       //if(nice)
+       tex_code_break_column = lyxrc.ascii_linelen;
+       //else
+       //tex_code_break_column = 0;
 
        ofstream ofs(fname.c_str());
        if (!ofs) {
@@ -2851,35 +2795,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) {
@@ -2945,19 +2890,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;
                        }
@@ -3027,8 +2969,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);
@@ -3100,8 +3041,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
@@ -3112,10 +3055,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;
 
@@ -3139,7 +3085,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) {
@@ -3158,11 +3104,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);
@@ -3257,7 +3203,6 @@ int Buffer::runLaTeX()
 
        // Always generate the LaTeX file
        makeLaTeXFile(name, org_path, false);
-       markDviDirty();
 
        // do the LaTex run(s)
        TeXErrors terr;
@@ -3282,7 +3227,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
@@ -3324,10 +3268,7 @@ int Buffer::runLiterate()
        bool a = 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;
@@ -3353,7 +3294,6 @@ 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
@@ -3462,13 +3402,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);
@@ -3484,7 +3421,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();
@@ -3495,160 +3432,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;
@@ -3736,33 +3519,25 @@ void Buffer::setPaperStuff()
 string Buffer::getIncludeonlyList(char delim)
 {
        string lst;
-       LyXParagraph * par = paragraph;
-       LyXParagraph::size_type pos;
-       Inset * inset;
-       while (par){
-               pos = -1;
-               while ((inset = par->ReturnNextInsetPointer(pos))){
-                       if (inset->LyxCode() == Inset::INCLUDE_CODE) {
-                               InsetInclude * insetinc = 
-                                       static_cast<InsetInclude*>(inset);
-                               if (insetinc->isInclude() 
-                                   && insetinc->isNoLoad()) {
-                                       if (!lst.empty())
-                                               lst += delim;
-                                       lst += OnlyFilename(ChangeExtension(insetinc->getContents(), string()));
-                               }
+       for (inset_iterator it = inset_iterator_begin();
+           it != inset_iterator_end(); ++it) {
+               if ((*it)->LyxCode() == Inset::INCLUDE_CODE) {
+                       InsetInclude * insetinc = 
+                               static_cast<InsetInclude *>(*it);
+                       if (insetinc->isInclude() 
+                           && insetinc->isNoLoad()) {
+                               if (!lst.empty())
+                                       lst += delim;
+                               lst += OnlyFilename(ChangeExtension(insetinc->getContents(), string()));
                        }
-                       ++pos;
-               } 
-               par = par->next;
+               }
        }
        lyxerr.debug() << "Includeonly(" << lst << ')' << endl;
        return lst;
 }
 
 
-// This is also a buffer property (ale)
-string Buffer::getReferenceList(char delim)
+vector<string> Buffer::getLabelList()
 {
        /// if this is a child document and the parent is already loaded
        /// Use the parent's list instead  [ale990407]
@@ -3770,81 +3545,108 @@ string Buffer::getReferenceList(char delim)
            && bufferlist.exists(params.parentname)) {
                Buffer * tmp = bufferlist.getBuffer(params.parentname);
                if (tmp)
-                       return tmp->getReferenceList(delim);
+                       return tmp->getLabelList();
+       }
+
+       vector<string> label_list;
+       for (inset_iterator it = inset_iterator_begin();
+            it != inset_iterator_end(); ++it) {
+               vector<string> l = (*it)->getLabelList();
+               label_list.insert(label_list.end(), l.begin(), l.end());
        }
+       return label_list;
+}
 
+
+vector<vector<Buffer::TocItem> > Buffer::getTocList()
+{
+       vector<vector<TocItem> > l(4);
        LyXParagraph * par = paragraph;
-       LyXParagraph::size_type pos;
-       Inset * inset;
-        string lst;
        while (par) {
-               pos = -1;
-               while ((inset = par->ReturnNextInsetPointer(pos))){     
-                       for (int i = 0; i < inset->GetNumberOfLabels(); ++i) {
-                               if (!lst.empty())
-                                       lst += delim;
-                               lst += inset->getLabel(i);
+               if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
+                       if (textclasslist.Style(params.textclass, 
+                                               par->GetLayout()).labeltype
+                           == LABEL_SENSITIVE) {
+                               TocItem tmp;
+                               tmp.par = par;
+                               tmp.depth = 0;
+                               tmp.str =  par->String(this, false);
+                               switch (par->footnotekind) {
+                               case LyXParagraph::FIG:
+                               case LyXParagraph::WIDE_FIG:
+                                       l[TOC_LOF].push_back(tmp);
+                                       break;
+                               case LyXParagraph::TAB:
+                               case LyXParagraph::WIDE_TAB:
+                                       l[TOC_LOT].push_back(tmp);
+                                       break;
+                               case LyXParagraph::ALGORITHM:
+                                       l[TOC_LOA].push_back(tmp);
+                                       break;
+                               case LyXParagraph::FOOTNOTE:
+                               case LyXParagraph::MARGIN:
+                                       break;
+                               }
+                       }
+               } else if (!par->IsDummy()) {
+                       char labeltype = textclasslist.Style(params.textclass, 
+                                                            par->GetLayout()).labeltype;
+      
+                       if (labeltype >= LABEL_COUNTER_CHAPTER
+                           && labeltype <= LABEL_COUNTER_CHAPTER + params.tocdepth) {
+                               // insert this into the table of contents
+                               TocItem tmp;
+                               tmp.par = par;
+                               tmp.depth = max(0,
+                                               labeltype - 
+                                               textclasslist.TextClass(params.textclass).maxcounter());
+                               tmp.str =  par->String(this, true);
+                               l[TOC_TOC].push_back(tmp);
                        }
-                       ++pos;
                }
                par = par->next;
        }
-       lyxerr.debug() << "References(" <<  lst << ")" << endl;
-       return lst;
+       return l;
 }
 
-
 // This is also a buffer property (ale)
-string Buffer::getBibkeyList(char delim)
+vector<pair<string,string> > Buffer::getBibkeyList()
 {
        /// if this is a child document and the parent is already loaded
        /// Use the parent's list instead  [ale990412]
         if (!params.parentname.empty() && bufferlist.exists(params.parentname)) {
                Buffer * tmp = bufferlist.getBuffer(params.parentname);
                if (tmp)
-                       return tmp->getBibkeyList(delim);
+                       return tmp->getBibkeyList();
        }
 
-       string bibkeys;
+       vector<pair<string, string> > keys;
        LyXParagraph * par = paragraph;
        while (par) {
-               if (par->bibkey) {
-                       if (!bibkeys.empty())
-                               bibkeys += delim;
-                       bibkeys += par->bibkey->getContents();
-               }
+               if (par->bibkey)
+                       keys.push_back(pair<string,string>(par->bibkey->getContents(),
+                                                          par->String(this, false)));
                par = par->next;
        }
 
        // Might be either using bibtex or a child has bibliography
-       if (bibkeys.empty()) {
-               par = paragraph;
-               while (par) {
-                       Inset * inset;
-                       LyXParagraph::size_type pos = -1;
-
+       if (keys.empty()) {
+               for (inset_iterator it = inset_iterator_begin();
+                       it != inset_iterator_end(); ++it) {
                        // Search for Bibtex or Include inset
-                       while ((inset = par->ReturnNextInsetPointer(pos))) {
-                               if (inset->LyxCode() == Inset::BIBTEX_CODE) {
-                                       if (!bibkeys.empty())
-                                               bibkeys += delim;
-                                       bibkeys += static_cast<InsetBibtex*>(inset)->getKeys(delim);
-                               } else if (inset->LyxCode() == Inset::INCLUDE_CODE) {
-                                       string bk = static_cast<InsetInclude*>(inset)->getKeys(delim);
-                                       if (!bk.empty()) {
-                                               if (!bibkeys.empty())
-                                                       bibkeys += delim;
-                                               bibkeys += bk;
-                                       }
-                               }
-                               ++pos;
+                       if ((*it)->LyxCode() == Inset::BIBTEX_CODE) {
+                               vector<pair<string,string> > tmp =
+                                       static_cast<InsetBibtex*>(*it)->getKeys();
+                               keys.insert(keys.end(), tmp.begin(), tmp.end());
+                       } else if ((*it)->LyxCode() == Inset::INCLUDE_CODE) {
+                               vector<pair<string,string> > tmp =
+                                       static_cast<InsetInclude*>(*it)->getKeys();
+                               keys.insert(keys.end(), tmp.begin(), tmp.end());
                        }
-                       par = par->next;
                }
        }
  
-       lyxerr.debug() << "Bibkeys(" << bibkeys << ")" << endl;
-       return bibkeys;
+       return keys;
 }
 
 
@@ -3875,7 +3677,7 @@ void Buffer::markDepClean(string const & name)
                        item = new DEPCLEAN;
                        item->clean = true;
                        item->master = name;
-                       item->next = 0;;
+                       item->next = 0;
                }
        }
 }
@@ -3906,12 +3708,26 @@ bool Buffer::Dispatch(int action, string const & argument)
 }
 
 
+void Buffer::resize()
+{
+       /// first resize the BufferViews!
+       if (users) {
+               users->resize();
+       }
+       /// then remove all LyXText in text-insets
+       LyXParagraph * par = paragraph;
+       for(;par;par = par->next) {
+               par->deleteInsetsLyXText(users);
+       }
+}
+
+
 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;
        }
 }
@@ -3922,9 +3738,32 @@ bool Buffer::isMultiLingual()
 
        LyXParagraph * par = paragraph;
        while (par) {
-               if (par->isMultiLingual())
+               if (par->isMultiLingual(params))
                        return true;
                par = par->next;
        }
        return false;
 }
+
+
+Buffer::inset_iterator::inset_iterator(LyXParagraph * paragraph,
+                                      LyXParagraph::size_type pos)
+       : par(paragraph) {
+       it = par->InsetIterator(pos);
+       if (it == par->inset_iterator_end()) {
+               par = par->next;
+               SetParagraph();
+       }
+}
+
+
+void Buffer::inset_iterator::SetParagraph() {
+       while (par) {
+               it = par->inset_iterator_begin();
+               if (it != par->inset_iterator_end())
+                       return;
+               par = par->next;
+       }
+       //it = 0;
+       // We maintain an invariant that whenever par = 0 then it = 0
+}