]> git.lyx.org Git - features.git/blobdiff - src/buffer.C
some new (not extensive) changes, some fixes, will probably reverto to .la libs later...
[features.git] / src / buffer.C
index f6b56a70e9a436856b9d70a4968be44307d57509..e0953cf145bdde710a6fad6f78f0acb7232a5fe5 100644 (file)
 
 #include <config.h>
 
+#include <fstream>
+#include <iomanip>
+using std::ofstream;
+using std::ifstream;
+using std::fstream;
+using std::ios;
+using std::setw;
+
+
 #include <cstdlib>
 #include <unistd.h>
 
@@ -34,6 +43,7 @@
 #include "bufferlist.h"
 #include "lyx_main.h"
 #include "lyx_gui_misc.h"
+#include "LyXAction.h"
 #include "lyxrc.h"
 #include "lyxlex.h"
 #include "tex-strings.h"
@@ -41,6 +51,7 @@
 #include "lyx_cb.h"
 #include "minibuffer.h"
 #include "lyxfont.h"
+#include "version.h"
 #include "mathed/formulamacro.h"
 #include "insets/lyxinset.h"
 #include "insets/inseterror.h"
 
 // all these externs should eventually be removed.
 extern BufferList bufferlist;
-extern void SmallUpdate(signed char);
-extern unsigned char GetCurrentTextClass();
-extern void BeforeChange();
+
+extern void MenuExport(Buffer *, string const &);
+extern LyXAction lyxaction;
+
 
 static const float LYX_FORMAT = 2.15;
 
@@ -107,15 +119,12 @@ Buffer::Buffer(string const & file, LyXRC * lyxrc, bool ronly)
        filename = file;
        filepath = OnlyPath(file);
        paragraph = 0;
-       text = 0;
-       the_locking_inset = 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;
-       inset_slept = false;
        users = 0;
        lyxvc.buffer(this);
        if (read_only || (lyxrc && lyxrc->use_tempdir)) {
@@ -147,7 +156,6 @@ Buffer::~Buffer()
                par = tmppar;
        }
        paragraph = 0;
-       delete text;
 }
 
 
@@ -183,7 +191,7 @@ void Buffer::resetAutosaveTimers()
 }
 
 
-void Buffer::setFileName(string const & newfile)
+void Buffer::fileName(string const & newfile)
 {
        filename = MakeAbsPath(newfile);
        filepath = OnlyPath(filename);
@@ -191,19 +199,9 @@ void Buffer::setFileName(string const & newfile)
        updateTitles();
 }
 
-void Buffer::InsetUnlock()
-{
-       if (the_locking_inset) {
-               if (!inset_slept) the_locking_inset->InsetUnlock();
-               the_locking_inset = 0;
-               text->FinishUndo();
-               inset_slept = false;
-       }
-}
-
 
 // Inserts a file into current document
-bool Buffer::insertLyXFile(string const & filen)
+bool BufferView::insertLyXFile(string const & filen)
        //
        // (c) CHT Software Service GmbH
        // Uwe C. Schroeder
@@ -214,46 +212,49 @@ bool Buffer::insertLyXFile(string const & filen)
 {
        if (filen.empty()) return false;
 
-       string filename = MakeAbsPath(filen);
+       string fname = MakeAbsPath(filen);
 
        // check if file exist
-       FileInfo fi(filename);
+       FileInfo fi(fname);
 
-       if (!fi.exist() || !fi.readable()) {
+       if (!fi.readable()) {
                WriteAlert(_("Error!"),
-                          _("Cannot open specified file:"),
-                          MakeDisplayPath(filename, 50));
+                          _("Specified file is unreadable: "),
+                          MakeDisplayPath(fname, 50));
                return false;
        }
        
-       BeforeChange();
+       beforeChange();
 
-       FilePtr myfile(filename, FilePtr::read);
-       if (!myfile()) {
+       ifstream ifs(fname.c_str());
+       if (!ifs) {
                WriteAlert(_("Error!"),
-                          _("Cannot open specified file:"),
-                          MakeDisplayPath(filename, 50));
+                          _("Cannot open specified file: "),
+                          MakeDisplayPath(fname, 50));
                return false;
        }
        LyXLex lex(0, 0);
-       lex.setFile(myfile);
-       int c = fgetc(myfile());
-       ungetc(c, myfile);
+       lex.setStream(ifs);
+       char c; ifs.get(c);
+       ifs.putback(c);
 
        bool res = true;
 
        if (c == '#') {
                lyxerr.debug() << "Will insert file with header" << endl;
-               res = readFile(lex, text->cursor.par);
+               res = buffer()->readFile(lex, text->cursor.par);
        } else {
                lyxerr.debug() << "Will insert file without header" << endl;
-               res = readLyXformat2(lex, text->cursor.par);
+               res = buffer()->readLyXformat2(lex, text->cursor.par);
        }
+
        resize();
        return res;
 }
 
 
+// candidate for move to BufferView
+// (at least some parts in the beginning of the func)
 //
 // Uwe C. Schroeder
 // changed to be public and have one parameter
@@ -281,8 +282,8 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
        if(!par) {
                par = new LyXParagraph;
        } else {
-               text->BreakParagraph();
-               return_par = text->FirstParagraph();
+               users->text->BreakParagraph();
+               return_par = users->text->FirstParagraph();
                pos = 0;
                markDirty();
                // We don't want to adopt the parameters from the
@@ -312,10 +313,10 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                        continue;
                else if (token[0] != '\\') {
                        int n = token.length();
-                       for (int i = 0; i < n; i++) {
+                       for (int i = 0; i < n; ++i) {
                                par->InsertChar(pos, token[i]);
                                par->SetFont(pos, font);
-                               pos++;
+                               ++pos;
                        }
                } else if (token == "\\i") {
                        inset = new InsetLatexAccent;
@@ -370,28 +371,28 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                        font = LyXFont(LyXFont::ALL_INHERIT);
                } else if (token == "\\begin_float") {
                        tmpret = lex.FindToken(string_footnotekinds);
-                       if (tmpret == -1) tmpret++;
+                       if (tmpret == -1) ++tmpret;
                        if (tmpret != LYX_LAYOUT_DEFAULT) 
-                               footnotekind = (LyXParagraph::footnote_kind)tmpret; // bad
+                               footnotekind = static_cast<LyXParagraph::footnote_kind>(tmpret); // bad
                        if (footnotekind == LyXParagraph::FOOTNOTE
                            || footnotekind == LyXParagraph::MARGIN)
                                footnoteflag = LyXParagraph::CLOSED_FOOTNOTE;
                        else 
                                footnoteflag = LyXParagraph::OPEN_FOOTNOTE;
                } else if (token == "\\begin_deeper") {
-                       depth++;
+                       ++depth;
                } else if (token == "\\end_deeper") {
                        if (!depth) {
                                lex.printError("\\end_deeper: "
                                               "depth is already null");
                        }
                        else
-                               depth--;
+                               --depth;
                } else if (token == "\\begin_preamble") {
                        params.readPreamble(lex);
                } else if (token == "\\textclass") {
                        lex.EatLine();
-                       pair<bool, LyXTextClassList::ClassList::size_type> pp = 
+                       pair<bool, LyXTextClassList::size_type> pp = 
                                textclasslist.NumberOfClass(lex.GetString());
                        if (pp.first) {
                                params.textclass = pp.second;
@@ -415,7 +416,7 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                        lex.EatLine();
                        params.options = lex.GetString();
                } else if (token == "\\language") {
-                       params.readLanguage(lex);           
+                       params.readLanguage(lex);    
                } else if (token == "\\fontencoding") {
                        lex.EatLine();
                } else if (token == "\\inputencoding") {
@@ -451,11 +452,11 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                } else if (token == "\\defskip") {
                        lex.nextToken();
                        params.defskip = VSpace(lex.GetString());
-               } else if (token == "\\no_isolatin1") {
+               } else if (token == "\\no_isolatin1") { // obsolete
                        lex.nextToken();
-               } else if (token == "\\no_babel") {
+               } else if (token == "\\no_babel") { // obsolete
                        lex.nextToken();
-               } else if (token == "\\no_epsfig") {
+               } else if (token == "\\no_epsfig") { // obsolete
                        lex.nextToken();
                } else if (token == "\\epsfig") { // obsolete
                        // Indeed it is obsolete, but we HAVE to be backwards
@@ -623,7 +624,7 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                } else if (token == "\\tocdepth") {
                        lex.nextToken();
                        params.tocdepth = lex.GetInteger();
-               } else if (token == "\\baselinestretch") { // now obsolete
+               } else if (token == "\\baselinestretch") { // obsolete
                        lex.nextToken(); // should not be used directly
                        // anymore.
                        // Will probably keep a kind of support just for
@@ -648,7 +649,7 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                } else if (token == "\\float_placement") {
                        lex.nextToken();
                        params.float_placement = lex.GetString();
-               } else if (token == "\\cursor") {
+               } else if (token == "\\cursor") { // obsolete
                        // this is obsolete, so we just skip it.
                        lex.nextToken();
                } else if (token == "\\family") { 
@@ -701,13 +702,13 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                } else if (token == "\\align") {
                        tmpret = lex.FindToken(string_align);
                        if (tmpret == -1) tmpret++;
-                       if (tmpret != LYX_LAYOUT_DEFAULT) {
+                       if (tmpret != LYX_LAYOUT_DEFAULT) { // tmpret != 99 ???
                                tmpret2 = 1;
-                               for (; tmpret>0; tmpret--)
+                               for (; tmpret > 0; --tmpret)
                                        tmpret2 = tmpret2 * 2;
                                par->align = LyXAlignment(tmpret2);
                        }
-               } else if (token == "\\added_space_top"){
+               } else if (token == "\\added_space_top") {
                        lex.nextToken();
                        par->added_space_top = lex.GetString();
                } else if (token == "\\added_space_bottom") {
@@ -881,6 +882,7 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                                par->InsertInset(pos, inset);
                                par->SetFont(pos, font);
                                pos++;
+#if 0
                        } else if (tmptok == "Label") {
                                // Kept for compability. Remove in 0.13.
                                if (lex.EatLine()) {
@@ -893,6 +895,7 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                                        par->SetFont(pos, font);
                                        pos++;
                                }
+#endif
                        } else if (tmptok == "Info") {
                                inset = new InsetInfo;
                                inset->Read(lex);
@@ -931,9 +934,11 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                                        if (!inscmd.getOptions().empty() || !inscmd.getContents().empty()) {
                                                inset = new InsetRef(inscmd, this);
                                        }
-                                       /* 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 */
+                                       // 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();
@@ -994,7 +999,10 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                                        inset = new InsetPrintIndex(this);
                                } else if (inscmd.getCmdName() == "lyxparent") {
                                        inset = new InsetParent(inscmd.getContents(), this);
-                               } else 
+                               }
+#if 0
+                               // Do we need this at all now?
+                               else 
                                        // The following three are only for compatibility
                                        if (inscmd.getCmdName() == "-") {
                                                inset = new InsetSpecialChar(InsetSpecialChar::HYPHENATION);
@@ -1004,12 +1012,13 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                                                inset = new InsetSpecialChar(InsetSpecialChar::LDOTS);
                                        } else
                                                inset = inscmd.Clone();
+#endif
                               
                                if (inset) {
                                        par->InsertChar(pos, LyXParagraph::META_INSET);
                                        par->InsertInset(pos, inset);
                                        par->SetFont(pos, font);
-                                       pos++;
+                                       ++pos;
                                }
                        }
                } else if (token == "\\InsetQuotes") {
@@ -1018,7 +1027,7 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                        par->InsertChar(pos, LyXParagraph::META_INSET); 
                        par->InsertInset(pos, inset);
                        par->SetFont(pos, font);
-                       pos++;
+                       ++pos;
 #if 0
                } else if (token == "\\InsetLatex") {
                        inset = new InsetLatex;
@@ -1026,7 +1035,7 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                        par->InsertChar(pos, LyXParagraph::META_INSET); 
                        par->InsertInset(pos, inset);
                        par->SetFont(pos, font);
-                       pos++;
+                       ++pos;
                } else if (token == "\\InsetLatexDel") {
                        lex.printError(_("Warning: Ignoring Old Inset"));
 #endif
@@ -1036,35 +1045,35 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                        par->InsertChar(pos, LyXParagraph::META_INSET); 
                        par->InsertInset(pos, inset);
                        par->SetFont(pos, font);
-                       pos++;
+                       ++pos;
                } else if (token == "\\SpecialChar") {
                        inset = new InsetSpecialChar;
                        inset->Read(lex);
                        par->InsertChar(pos, LyXParagraph::META_INSET); 
                        par->InsertInset(pos, inset);
                        par->SetFont(pos, font);
-                       pos++;
+                       ++pos;
                } else if (token == "\\Figure") {
                        inset = new InsetFig(100, 100, this);
                        inset->Read(lex);
                        par->InsertChar(pos, LyXParagraph::META_INSET); 
                        par->InsertInset(pos, inset);
                        par->SetFont(pos, font);
-                       pos++;
+                       ++pos;
                } else if (token == "\\newline") {
                        par->InsertChar(pos, LyXParagraph::META_NEWLINE);
                        par->SetFont(pos, font);
-                       pos++;
+                       ++pos;
                } else if (token == "\\LyXTable") {
                        par->table = new LyXTable(lex);
                } else if (token == "\\hfill") {
                        par->InsertChar(pos, LyXParagraph::META_HFILL);
                        par->SetFont(pos, font);
-                       pos++;
+                       ++pos;
                } else if (token == "\\protected_separator") {
                        par->InsertChar(pos, LyXParagraph::META_PROTECTED_SEPARATOR);
                        par->SetFont(pos, font);
-                       pos++;
+                       ++pos;
                } else if (token == "\\bibitem") {  // ale970302
                        if (!par->bibkey)
                                par->bibkey = new InsetBibKey;
@@ -1072,7 +1081,7 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                }else if (token == "\\backslash") {
                        par->InsertChar(pos, '\\');
                        par->SetFont(pos, font);
-                       pos++;
+                       ++pos;
                }else if (token == "\\the_end") {
                        the_end_read = true;
                } else {
@@ -1080,10 +1089,10 @@ bool Buffer::readLyXformat2(LyXLex & lex, LyXParagraph * par)
                        lex.printError("Unknown token `$$Token'. "
                                       "Inserting as text.");
                        int n = token.length();
-                       for (int i = 0; i < n; i++) {
+                       for (int i = 0; i < n; ++i) {
                                par->InsertChar(pos, token[i]);
                                par->SetFont(pos, font);
-                               pos++;
+                               ++pos;
                        }
                }
        }
@@ -1155,130 +1164,98 @@ bool Buffer::readFile(LyXLex & lex, LyXParagraph * par)
                    
 
 // Returns false if unsuccesful
-bool Buffer::writeFile(string const & filename, bool flag)
+bool Buffer::writeFile(string const & fname, bool flag)
 {
        // if flag is false writeFile will not create any GUI
        // warnings, only cerr.
        // Needed for autosave in background or panic save (Matthias 120496)
 
-       if (read_only && (filename == this->filename)) {
+       if (read_only && (fname == filename)) {
                // Here we should come with a question if we should
                // perform the write anyway.
                if (flag)
                        lyxerr << _("Error! Document is read-only: ")
-                              << filename << endl;
+                              << fname << endl;
                else
                        WriteAlert(_("Error! Document is read-only: "),
-                                  filename);
+                                  fname);
                return false;
        }
 
-       FileInfo finfo(filename);
+       FileInfo finfo(fname);
        if (finfo.exist() && !finfo.writable()) {
                // Here we should come with a question if we should
                // try to do the save anyway. (i.e. do a chmod first)
                if (flag)
                        lyxerr << _("Error! Cannot write file: ")
-                              << filename << endl;
+                              << fname << endl;
                else
                        WriteFSAlert(_("Error! Cannot write file: "),
-                                    filename);
+                                    fname);
                return false;
        }
 
-       FilePtr file(filename, FilePtr::truncate);
-       if (!file()) {
+       ofstream ofs(fname.c_str());
+       if (!ofs) {
                if (flag)
-                       lyxerr << _("Error! Cannot write file: ")
-                              << filename << endl;
+                       lyxerr << _("Error! Cannot open file: ")
+                              << fname << endl;
                else
-                       WriteFSAlert(_("Error! Cannot write file: "),
-                                    filename);
+                       WriteFSAlert(_("Error! Cannot open file: "),
+                                    fname);
                return false;
        }
        // The top of the file should not be written by params.
-       // collect some very important information
-       string userName(getUserName()) ;
 
        // write out a comment in the top of the file
-       fprintf(file,
-               "#This file was created by <%s> %s",
-               userName.c_str(),(char*)date());
-       fprintf(file,
-               "#LyX 1.0 (C) 1995-1999 Matthias Ettrich"
-               " and the LyX Team\n");
-       
-       // at the very beginning the used lyx format
-       fprintf(file, "\\lyxformat %.2f\n", LYX_FORMAT);
+       ofs << '#' << LYX_DOCVERSION 
+           << " created this file. For more info see http://www.lyx.org/\n";
+       ofs.setf(ios::showpoint|ios::fixed);
+       ofs.precision(2);
+       ofs << "\\lyxformat " << setw(4) <<  LYX_FORMAT << "\n";
 
-       // now write out the buffer parameters.
-       params.writeFile(file);
+       // now write out the buffer paramters.
+       params.writeFile(ofs);
 
        char footnoteflag = 0;
        char depth = 0;
 
        // this will write out all the paragraphs
        // using recursive descent.
-       paragraph->writeFile(file, params, footnoteflag, depth);
+       paragraph->writeFile(ofs, params, footnoteflag, depth);
 
        // Write marker that shows file is complete
-       fprintf(file, "\n\\the_end\n");
-       if (file.close()) {
-               if (flag)
-                       lyxerr << _("Error! Could not close file properly: ")
-                              << filename << endl;
-               else
-                       WriteFSAlert(_("Error! Could not close file properly: "),
-                                    filename);
-               return false;
-       }
+       ofs << "\n\\the_end" << endl;
+       ofs.close();
+       // how to check if close went ok?
        return true;
 }
 
 
-void Buffer::writeFileAscii(string const & filename, int linelen) 
+void Buffer::writeFileAscii(string const & fname, int linelen) 
 {
-       FilePtr file(filename, FilePtr::write);
-       LyXFont
-               font1, font2;
+       LyXFont font1, font2;
        Inset * inset;
-       LyXParagraph * par = paragraph;
-       char
-               c,
-               footnoteflag = 0,
-               depth = 0;
-
-       string
-               fname1,
-               tmp;
-
+       char c, footnoteflag = 0, depth = 0;
+       string tmp;
        LyXParagraph::size_type i;
-       int
-               j, h,
-               ltype = 0,
-               ltype_depth = 0,
-               noparbreak = 0,
-               islatex = 0,
-               * clen = 0,
-               actcell = 0,
-               actpos = 0,
-               cell = 0,
-               cells = 0,
+       int j, h, ltype = 0, ltype_depth = 0,
+               * clen = 0, actcell = 0, actpos = 0, cell = 0, cells = 0,
                currlinelen = 0;
-       long
-               fpos = 0;
-       bool
-               ref_printed = false;
-   
-   
-       if (!file()) {
-               WriteFSAlert(_("Error: Cannot write file:"), filename);
+       long fpos = 0;
+       bool ref_printed = false;
+
+       ofstream ofs(fname.c_str());
+       if (!ofs) {
+               WriteFSAlert(_("Error: Cannot write file:"), fname);
                return;
        }
-       fname1 = TmpFileName();
+
+       string fname1 = TmpFileName();
+       LyXParagraph * par = paragraph;
        while (par) {
-               noparbreak = 0;
-               islatex = 0;
+               int noparbreak = 0;
+               int islatex = 0;
                if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE ||
                    !par->previous ||
                    par->previous->footnoteflag == LyXParagraph::NO_FOOTNOTE){
@@ -1288,10 +1265,10 @@ void Buffer::writeFileAscii(string const & filename, int linelen)
                                footnoteflag = par->footnoteflag;
                                if (footnoteflag) {
                                        j = strlen(string_footnotekinds[par->footnotekind])+4;
-                                       if (currlinelen+j > linelen)
-                                               fprintf(file, "\n");
-                                       fprintf(file, "([%s] ", 
-                                               string_footnotekinds[par->footnotekind]);
+                                       if (currlinelen + j > linelen)
+                                               ofs << "\n";
+                                       ofs << "(["
+                                           << string_footnotekinds[par->footnotekind] << "] ";
                                        currlinelen += j;
                                }
                        }
@@ -1353,7 +1330,7 @@ void Buffer::writeFileAscii(string const & filename, int linelen)
                else {
                        /* dummy layout, that means a footnote ended */ 
                        footnoteflag = LyXParagraph::NO_FOOTNOTE;
-                       fprintf(file, ") ");
+                       ofs << ") ";
                        noparbreak = 1;
                }
       
@@ -1361,7 +1338,7 @@ void Buffer::writeFileAscii(string const & filename, int linelen)
                if (par->table){
                        if (!lyxrc->ascii_roff_command.empty() &&
                             lyxrc->ascii_roff_command != "none") {
-                               RoffAsciiTable(file, par);
+                               RoffAsciiTable(ofs, par);
                                par = par->next;
                                continue;
                        }
@@ -1369,19 +1346,18 @@ void Buffer::writeFileAscii(string const & filename, int linelen)
                         actcell = 0;
                        cells = par->table->columns;
                        clen = new int [cells];
-                       memset(clen, 0, sizeof(int)*cells);
+                       memset(clen, 0, sizeof(int) * cells);
                        for (i = 0, j = 0, h = 1; i < par->size(); ++i, ++h) {
                                c = par->GetChar(i);
                                if (c == LyXParagraph::META_INSET) {
                                        if ((inset = par->GetInset(i))) {
-                                               FilePtr fp(fname1,
-                                                          FilePtr::write);
-                                               if (!fp()) {
+                                               ofstream fs(fname1.c_str());
+                                               if (!fs) {
                                                        WriteFSAlert(_("Error: Cannot open temporary file:"), fname1);
                                                        return;
                                                }
-                                               inset->Latex(fp,-1);
-                                               h += ftell(fp) - 1;
+                                               inset->Latex(fs, -1);
+                                               h += fs.tellp() - 1;
                                                remove(fname1.c_str());
                                        }
                                } else if (c == LyXParagraph::META_NEWLINE) {
@@ -1389,7 +1365,7 @@ void Buffer::writeFileAscii(string const & filename, int linelen)
                                                clen[j] = h;
                                        h = 0;
                                        j = (++j) % par->table->NumberOfCellsInRow(actcell);
-                                        actcell++;
+                                        ++actcell;
                                }
                        }
                        if (clen[j] < h)
@@ -1400,49 +1376,51 @@ void Buffer::writeFileAscii(string const & filename, int linelen)
                 actcell = 0;
                for (i = 0, actpos = 1; i < par->size(); ++i, ++actpos) {
                        if (!i && !footnoteflag && !noparbreak){
-                               fprintf(file, "\n\n");
-                               for(j = 0; j<depth; j++)
-                                       fprintf(file, "  ");
-                               currlinelen = depth*2;
+                               ofs << "\n\n";
+                               for(j = 0; j < depth; ++j)
+                                       ofs << "  ";
+                               currlinelen = depth * 2;
                                switch(ltype) {
                                case 0: /* Standart */
                                case 4: /* (Sub)Paragraph */
                                 case 5: /* Description */
                                        break;
                                case 6: /* Abstract */
-                                       fprintf(file, "Abstract\n\n");
+                                       ofs << "Abstract\n\n";
                                        break;
                                case 7: /* Bibliography */
                                        if (!ref_printed) {
-                                               fprintf(file, "References\n\n");
+                                               ofs << "References\n\n";
                                                ref_printed = true;
                                        }
                                        break;
                                default:
-                                       fprintf(file, "%s ", par->labelstring.c_str());
+                                       ofs << par->labelstring << " ";
                                        break;
                                }
                                if (ltype_depth > depth) {
-                                       for(j = ltype_depth-1; j>depth; j--)
-                                               fprintf(file, "  ");
+                                       for(j = ltype_depth - 1; j > depth; --j)
+                                               ofs << "  ";
                                        currlinelen += (ltype_depth-depth)*2;
                                }
                                if (par->table) {
-                                       for(j = 0;j<cells;j++) {
-                                               fputc('+', file);
-                                               for(h = 0; h<(clen[j]+1); h++)
-                                                       fputc('-', file);
+                                       for(j = 0; j < cells; ++j) {
+                                               ofs << '+';
+                                               for(h = 0; h < (clen[j] + 1);
+                                                   ++h)
+                                                       ofs << '-';
                                        }
-                                       fprintf(file, "+\n");
-                                       for(j = 0; j<depth; j++)
-                                               fprintf(file, "  ");
-                                       currlinelen = depth*2;
+                                       ofs << "+\n";
+                                       for(j = 0; j < depth; ++j)
+                                               ofs << "  ";
+                                       currlinelen = depth * 2;
                                        if (ltype_depth > depth) {
-                                               for(j = ltype_depth; j>depth; j--)
-                                                       fprintf(file, "  ");
+                                               for(j = ltype_depth;
+                                                   j > depth; --j)
+                                                       ofs << "  ";
                                                currlinelen += (ltype_depth-depth)*2;
                                        }
-                                       fprintf(file, "| ");
+                                       ofs << "| ";
                                }
                        }
                        font2 = par->GetFontSettings(i);
@@ -1461,138 +1439,144 @@ void Buffer::writeFileAscii(string const & filename, int linelen)
                        switch (c) {
                        case LyXParagraph::META_INSET:
                                if ((inset = par->GetInset(i))) {
-                                       fpos = ftell(file);
-                                       inset->Latex(file,-1);
-                                       currlinelen += (ftell(file) - fpos);
-                                       actpos += (ftell(file) - fpos) - 1;
+                                       fpos = ofs.tellp();
+                                       inset->Latex(ofs, -1);
+                                       currlinelen += (ofs.tellp() - fpos);
+                                       actpos += (ofs.tellp() - fpos) - 1;
                                }
                                break;
                        case LyXParagraph::META_NEWLINE:
                                if (par->table) {
                                        if (par->table->NumberOfCellsInRow(actcell) <= cell) {
-                                               for(j = actpos;j<clen[cell-1];j++)
-                                                       fputc(' ', file);
-                                               fprintf(file, " |\n");
-                                               for(j = 0; j<depth; j++)
-                                                       fprintf(file, "  ");
+                                               for(j = actpos; j < clen[cell-1];j++)
+                                                       ofs << ' ';
+                                               ofs << " |\n";
+                                               for(j = 0; j < depth; ++j)
+                                                       ofs << "  ";
                                                currlinelen = depth*2;
                                                if (ltype_depth > depth) {
-                                                       for(j = ltype_depth; j>depth; j--)
-                                                               fprintf(file, "  ");
-                                                       currlinelen += (ltype_depth-depth)*2;
+                                                       for(j = ltype_depth; j > depth; --j)
+                                                               ofs << "  ";
+                                                       currlinelen += (ltype_depth-depth) * 2;
                                                }
-                                               for(j = 0;j<cells;j++) {
-                                                       fputc('+', file);
-                                                       for(h = 0; h<(clen[j]+1); h++)
-                                                               fputc('-', file);
+                                               for(j = 0; j < cells; ++j) {
+                                                       ofs << '+';
+                                                       for(h = 0; h < (clen[j] + 1); ++h)
+                                                               ofs << '-';
                                                }
-                                               fprintf(file, "+\n");
-                                               for(j = 0; j<depth; j++)
-                                                       fprintf(file, "  ");
-                                               currlinelen = depth*2;
+                                               ofs << "+\n";
+                                               for(j = 0; j < depth; ++j)
+                                                       ofs << "  ";
+                                               currlinelen = depth * 2;
                                                if (ltype_depth > depth) {
-                                                       for(j = ltype_depth; j>depth; j--)
-                                                               fprintf(file, "  ");
+                                                       for(j = ltype_depth;
+                                                           j > depth; --j)
+                                                               ofs << "  ";
                                                        currlinelen += (ltype_depth-depth)*2;
                                                }
-                                               fprintf(file, "| ");
+                                               ofs << "| ";
                                                cell = 1;
                                        } else {
-                                               for(j = actpos; j<clen[cell-1]; j++)
-                                                       fputc(' ', file);
-                                               fprintf(file, " | ");
-                                               cell++;
+                                               for(j = actpos;
+                                                   j < clen[cell - 1]; ++j)
+                                                       ofs << ' ';
+                                               ofs << " | ";
+                                               ++cell;
                                        }
-                                        actcell++;
+                                        ++actcell;
                                        currlinelen = actpos = 0;
                                } else {
-                                       fprintf(file, "\n");
-                                       for(j = 0; j<depth; j++)
-                                               fprintf(file, "  ");
-                                       currlinelen = depth*2;
+                                       ofs << "\n";
+                                       for(j = 0; j < depth; ++j)
+                                               ofs << "  ";
+                                       currlinelen = depth * 2;
                                        if (ltype_depth > depth) {
-                                               for(j = ltype_depth; j>depth; j--)
-                                                       fprintf(file, "  ");
-                                               currlinelen += (ltype_depth-depth)*2;
+                                               for(j = ltype_depth;
+                                                   j > depth; --j)
+                                                       ofs << "  ";
+                                               currlinelen += (ltype_depth - depth) * 2;
                                        }
                                }
                                break;
                        case LyXParagraph::META_HFILL: 
-                               fprintf(file, "\t");
+                               ofs << "\t";
                                break;
                        case LyXParagraph::META_PROTECTED_SEPARATOR:
-                               fprintf(file, " ");
+                               ofs << " ";
                                break;
-                       case '\\': 
-                               fprintf(file, "\\");
+                       case '\\':
+                               ofs << "\\";
                                break;
                        default:
                                if (currlinelen > linelen - 10
                                     && c == ' ' && i + 2 < par->size()) {
-                                       fprintf(file, "\n");
+                                       ofs << "\n";
                                        for(j = 0; j < depth; ++j)
-                                               fprintf(file, "  ");
+                                               ofs << "  ";
                                        currlinelen = depth * 2;
                                        if (ltype_depth > depth) {
                                                for(j = ltype_depth;
                                                    j > depth; --j)
-                                                       fprintf(file, "  ");
+                                                       ofs << "  ";
                                                currlinelen += (ltype_depth-depth)*2;
                                        }
                                } else if (c != '\0')
-                                       fprintf(file, "%c", c);
+                                       ofs << c;
                                else if (c == '\0')
                                        lyxerr.debug() << "writeAsciiFile: NULL char in structure." << endl;
-                               currlinelen++;
+                               ++currlinelen;
                                break;
                        }
                }
                if (par->table) {
-                       for(j = actpos;j<clen[cell-1];j++)
-                               fputc(' ', file);
-                       fprintf(file, " |\n");
-                       for(j = 0; j<depth; j++)
-                               fprintf(file, "  ");
-                       currlinelen = depth*2;
+                       for(j = actpos; j < clen[cell - 1]; ++j)
+                               ofs << ' ';
+                       ofs << " |\n";
+                       for(j = 0; j < depth; ++j)
+                               ofs << "  ";
+                       currlinelen = depth * 2;
                        if (ltype_depth > depth) {
-                               for(j = ltype_depth; j>depth; j--)
-                                       fprintf(file, "  ");
-                               currlinelen += (ltype_depth-depth)*2;
+                               for(j = ltype_depth; j > depth; --j)
+                                       ofs << "  ";
+                               currlinelen += (ltype_depth - depth) * 2;
                        }
-                       for(j = 0;j<cells;j++) {
-                               fputc('+', file);
-                               for(h = 0; h<(clen[j]+1); h++)
-                                       fputc('-', file);
+                       for(j = 0; j < cells; ++j) {
+                               ofs << '+';
+                               for(h = 0; h < (clen[j] + 1); ++h)
+                                       ofs << '-';
                        }
-                       fprintf(file, "+\n");
+                       ofs << "+\n";
                        delete [] clen;    
                }      
                par = par->next;
        }
    
-       fprintf(file, "\n");
+       ofs << "\n";
 }
 
 
-void Buffer::makeLaTeXFile(string const & filename, 
+void Buffer::makeLaTeXFile(string const & fname, 
                           string const & original_path,
                           bool nice, bool only_body)
 {
        lyxerr[Debug::LATEX] << "makeLaTeXFile..." << endl;
-       params.textclass = GetCurrentTextClass();
+       
+       // How the **** can this be needed?
+       //params.textclass = current_view->buffer()->params.textclass;
+       
        niceFile = nice; // this will be used by Insetincludes.
 
        tex_code_break_column = lyxrc->ascii_linelen;
 
         LyXTextClass const & tclass =
                textclasslist.TextClass(params.textclass);
-  
-       FilePtr file(filename, FilePtr::write);
-       if (!file()) {
-               WriteFSAlert(_("Error: Cannot write file:"), filename);
+
+       ofstream ofs(fname.c_str());
+       if (!ofs) {
+               WriteFSAlert(_("Error: Cannot open file: "), fname);
                return;
        }
-
+       
        // validate the buffer.
        lyxerr[Debug::LATEX] << "  Validating buffer..." << endl;
        LaTeXFeatures features(tclass.numLayouts());
@@ -1608,18 +1592,15 @@ void Buffer::makeLaTeXFile(string const & filename,
        string LFile;
        
        if (!only_body && nice) {
-               LFile += "%% This LaTeX-file was created by <";
-               LFile += userName + "> " + (char*)date();
-               LFile += "%% LyX 1.0 (C) 1995-1999 by Matthias Ettrich and the LyX Team\n";
-               LFile += "\n%% Do not edit this file unless you know what you are doing.\n";
-               texrow.newline();
-               texrow.newline();
+               LFile += "%% " LYX_DOCVERSION " created this file.  "
+                        "For more info, see http://www.lyx.org/.\n";
+               LFile += "%% Do not edit unless you really know what you are doing.\n";
                texrow.newline();
                texrow.newline();
        }
        lyxerr.debug() << "lyx header finished" << endl;
        // There are a few differences between nice LaTeX and usual files:
-       // usual is \batchmode, uses \listfiles and has a 
+       // usual is \batchmode and has a 
        // special input@path to allow the including of figures
        // with either \input or \includegraphics (what figinsets do).
        // batchmode is not set if there is a tex_code_break_column.
@@ -1633,9 +1614,6 @@ void Buffer::makeLaTeXFile(string const & filename,
                        LFile += "\\batchmode\n"; // changed
                        // from \nonstopmode
                        texrow.newline();
-                       // We don't need listfiles anymore
-                       //LFile += "\\listfiles\n";
-                       //texrow.newline();
                }
                if (!original_path.empty()) {
                        LFile += "\\makeatletter\n";
@@ -1698,7 +1676,8 @@ void Buffer::makeLaTeXFile(string const & filename,
                                options += "onecolumn,";
                }
 
-               if (!params.use_geometry && params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
+               if (!params.use_geometry 
+                   && params.orientation == BufferParams::ORIENTATION_LANDSCAPE)
                        options += "landscape,";
                
                // language should be a parameter to \documentclass
@@ -1767,10 +1746,10 @@ void Buffer::makeLaTeXFile(string const & filename,
                        switch (params.papersize2) {
                        case BufferParams::VM_PAPER_CUSTOM:
                                if (!params.paperwidth.empty())
-                                       LFile += ",paperwidth= "
+                                       LFile += ",paperwidth="
                                                 + params.paperwidth;
                                if (!params.paperheight.empty())
-                                       LFile += ",paperheight= "
+                                       LFile += ",paperheight="
                                                 + params.paperheight;
                                break;
                        case BufferParams::VM_PAPER_USLETTER:
@@ -1828,19 +1807,19 @@ void Buffer::makeLaTeXFile(string const & filename,
                                }
                        }
                        if (!params.topmargin.empty())
-                               LFile += ",tmargin= " + params.topmargin;
+                               LFile += ",tmargin=" + params.topmargin;
                        if (!params.bottommargin.empty())
-                               LFile += ",bmargin= " + params.bottommargin;
+                               LFile += ",bmargin=" + params.bottommargin;
                        if (!params.leftmargin.empty())
-                               LFile += ",lmargin= " + params.leftmargin;
+                               LFile += ",lmargin=" + params.leftmargin;
                        if (!params.rightmargin.empty())
-                               LFile += ",rmargin= " + params.rightmargin;
+                               LFile += ",rmargin=" + params.rightmargin;
                        if (!params.headheight.empty())
-                               LFile += ",headheight= " + params.headheight;
+                               LFile += ",headheight=" + params.headheight;
                        if (!params.headsep.empty())
-                               LFile += ",headsep= " + params.headsep;
+                               LFile += ",headsep=" + params.headsep;
                        if (!params.footskip.empty())
-                               LFile += ",footskip= " + params.footskip;
+                               LFile += ",footskip=" + params.footskip;
                        LFile += "}\n";
                        texrow.newline();
                }
@@ -1905,7 +1884,7 @@ void Buffer::makeLaTeXFile(string const & filename,
                }
 
                // Write out what we've generated so far...and reset LFile
-               fwrite(LFile.c_str(), sizeof(char), LFile.length(), file);
+               ofs << LFile;
                LFile.clear(); 
 
                // Now insert the LyX specific LaTeX commands...
@@ -1946,34 +1925,43 @@ void Buffer::makeLaTeXFile(string const & filename,
                // Itemize bullet settings need to be last in case the user
                // defines their own bullets that use a package included
                // in the user-defined preamble -- ARRae
+               // Actually it has to be done much later than that
+               // since some packages like frenchb make modifications
+               // at \begin{document} time -- JMarc 
+               string bullets_def;
                for (int i = 0; i < 4; ++i) {
                        if (params.user_defined_bullets[i] != ITEMIZE_DEFAULTS[i]) {
-                               preamble += "\\renewcommand\\labelitemi";
+                               if (bullets_def.empty())
+                                       bullets_def="\\AtBeginDocument{\n";
+                               bullets_def += "  \\renewcommand{\\labelitemi";
                                switch (i) {
-                                       // `i' is one less than the item to modify
+                               // `i' is one less than the item to modify
                                case 0:
                                        break;
                                case 1:
-                                       preamble += 'i';
+                                       bullets_def += 'i';
                                        break;
                                case 2:
-                                       preamble += "ii";
+                                       bullets_def += "ii";
                                        break;
                                case 3:
-                                       preamble += 'v';
+                                       bullets_def += 'v';
                                        break;
                                }
-                               preamble += "[0]{" + params.user_defined_bullets[i].getText() + "}\n";
+                               bullets_def += "}{" + 
+                                 params.user_defined_bullets[i].getText() 
+                                 + "}\n";
                        }
                }
 
+               if (!bullets_def.empty())
+                 preamble += bullets_def + "}\n\n";
+
                for (int j = countChar(preamble, '\n'); j-- ;) {
                        texrow.newline();
                }
 
-               // A bit faster than printing a char at a time I think.
-               fwrite(preamble.c_str(), sizeof(char),
-                      preamble.length(), file);
+               ofs << preamble;
 
                // make the body.
                LFile += "\\begin{document}\n\n";
@@ -2044,8 +2032,7 @@ void Buffer::makeLaTeXFile(string const & filename,
                        // gains a few extra % of speed; going higher than
                        // 2 will slow things down again.  I'll look at
                        // LFile.length() in a future revision.  ARRae
-                       fwrite(LFile.c_str(), sizeof(char),
-                              LFile.length(), file);
+                       ofs << LFile;
                        LFile.clear();
                        loop_count = 0;
                }
@@ -2071,7 +2058,7 @@ void Buffer::makeLaTeXFile(string const & filename,
        texrow.newline();
 
        // Write out what we've generated...and reset LFile
-       fwrite(LFile.c_str(), sizeof(char), LFile.length(), file);
+       ofs << LFile;
        LFile.clear();
 
        // tex_code_break_column's value is used to decide
@@ -2080,9 +2067,8 @@ void Buffer::makeLaTeXFile(string const & filename,
        // value when we leave otherwise we save incorrect .lyx files.
        tex_code_break_column = lyxrc->ascii_linelen;
 
-       if (file.close()) {
-               WriteFSAlert(_("Error! Could not close file properly:"), filename);
-       }
+       // How to check if the close went ok when using fstreams
+       ofs.close();
        lyxerr.debug() << "Finished making latex file." << endl;
 }
 
@@ -2118,26 +2104,21 @@ bool Buffer::isSGML() const
 }
 
 
-void Buffer::sgmlOpenTag(FILE * file, int depth, string const & latexname) const
+void Buffer::sgmlOpenTag(ostream & os, int depth,
+                        string const & latexname) const
 {
-       static char * space[] = {" ","  ", "   ", "    ", "     ", "      ", "       ",
-                        "        ", "         ", "          ", "          "};
-
-       fprintf(file, "%s<%s>\n", space[depth], latexname.c_str());
+       os << string(depth, ' ') << "<" << latexname << ">\n";
 }
 
 
-void Buffer::sgmlCloseTag(FILE * file, int depth,
+void Buffer::sgmlCloseTag(ostream & os, int depth,
                          string const & latexname) const
 {
-       static char * space[] = {" ", "  ", "   ", "    ", "     ", "      ", "       ",
-                        "        ", "         ", "          ", "          "};
-
-       fprintf(file, "%s</%s>\n", space[depth], latexname.c_str());
+       os << string(depth, ' ') << "</" << latexname << ">\n";
 }
 
 
-void Buffer::makeLinuxDocFile(string const & filename, int column)
+void Buffer::makeLinuxDocFile(string const & fname, int column)
 {
        LyXParagraph * par = paragraph;
 
@@ -2147,78 +2128,77 @@ void Buffer::makeLinuxDocFile(string const & filename, int column)
 
        int depth = 0;              /* paragraph depth */
 
-       FilePtr file(filename, FilePtr::write);
-       tex_code_break_column = column; 
+       ofstream ofs(fname.c_str());
 
-       if (!file()) {
-               WriteAlert(_("LYX_ERROR:"), _("Cannot write file"), filename);
+       if (!ofs) {
+               WriteAlert(_("LYX_ERROR:"), _("Cannot write file"), fname);
                return;
        }
    
+       tex_code_break_column = column; 
        texrow.reset();
    
        if (params.preamble.empty()) {
-               fprintf(file, "<!doctype linuxdoc system>\n\n");
+               ofs << "<!doctype linuxdoc system>\n\n";
        }
        else {
-               fprintf(file, "<!doctype linuxdoc system \n [ %s \n]>\n\n", 
-                       params.preamble.c_str() );
+               ofs << "<!doctype linuxdoc system \n [ "
+                   << params.preamble << " \n]>\n\n";
        }
 
         string userName(getUserName());
-       fprintf(file,
-               "<!-- LinuxDoc file was created by LyX 1.0 (C) 1995-1999 ");
-       fprintf(file, "by <%s> %s -->\n", userName.c_str(), (char *)date());
+       ofs << "<!-- LinuxDoc file was created by LyX 1.0 (C) 1995-1999 "
+           << "by <" << userName << "> " << date() << " -->\n";
 
        if(params.options.empty())
-               sgmlOpenTag(file, 0, top_element);
+               sgmlOpenTag(ofs, 0, top_element);
        else {
                string top = top_element;
                top += " ";
                top += params.options;
-               sgmlOpenTag(file, 0, top);
+               sgmlOpenTag(ofs, 0, top);
        }
 
        while (par) {
                int desc_on = 0;            /* description mode*/
                LyXLayout const & style =
-                       textclasslist.Style(GetCurrentTextClass(),
+                       textclasslist.Style(users->buffer()->params.textclass,
                                            par->layout);
                par->AutoDeleteInsets();
 
                /* treat <toc> as a special case for compatibility with old code */
                if (par->GetChar(0) == LyXParagraph::META_INSET) {
-                       Inset *inset = par->GetInset(0);
+                       Inset * inset = par->GetInset(0);
                        char  lyx_code = inset->LyxCode();
                        if (lyx_code == Inset::TOC_CODE){
                                string temp = "toc";
-                               sgmlOpenTag(file, depth, temp);
+                               sgmlOpenTag(ofs, depth, temp);
 
                                par = par->next;
-                               linuxDocHandleFootnote(file, par, depth);
+                               linuxDocHandleFootnote(ofs, par, depth);
                                continue;
                        }
                }
 
-               /* environment tag closing */
-               for( ;depth > par->depth; depth--) {
-                       sgmlCloseTag(file, depth, environment_stack[depth]);
+               // environment tag closing
+               for( ; depth > par->depth; --depth) {
+                       sgmlCloseTag(ofs, depth, environment_stack[depth]);
                        environment_stack[depth].clear();
                }
 
-               /* write opening SGML tags */
+               // write opening SGML tags
                switch(style.latextype) {
                case LATEX_PARAGRAPH:
                        if(depth == par->depth 
                           && !environment_stack[depth].empty()) {
-                               sgmlCloseTag(file, depth, environment_stack[depth]);
+                               sgmlCloseTag(ofs, depth, environment_stack[depth]);
                                environment_stack[depth].clear();
                                if(depth) 
-                                       depth--;
+                                       --depth;
                                else
-                                       fprintf(file, "</p>");
+                                       ofs << "</p>";
                        }
-                       sgmlOpenTag(file, depth, style.latexname());
+                       sgmlOpenTag(ofs, depth, style.latexname());
                        break;
 
                case LATEX_COMMAND:
@@ -2226,12 +2206,13 @@ void Buffer::makeLinuxDocFile(string const & filename, int column)
                                LinuxDocError(par, 0, _("Error : Wrong depth for LatexType Command.\n"));
 
                        if (!environment_stack[depth].empty()){
-                               sgmlCloseTag(file, depth, environment_stack[depth]);
-                               fprintf(file, "</p>");
+                               sgmlCloseTag(ofs, depth,
+                                            environment_stack[depth]);
+                               ofs << "</p>";
                        }
 
                        environment_stack[depth].clear();
-                       sgmlOpenTag(file, depth, style.latexname());
+                       sgmlOpenTag(ofs, depth, style.latexname());
                        break;
 
                case LATEX_ENVIRONMENT:
@@ -2240,7 +2221,7 @@ void Buffer::makeLinuxDocFile(string const & filename, int column)
                           && environment_stack[depth] != style.latexname()
                           && !environment_stack[depth].empty()) {
 
-                               sgmlCloseTag(file, depth,
+                               sgmlCloseTag(ofs, depth,
                                             environment_stack[depth]);
                                environment_stack[depth].clear();
                        }
@@ -2251,10 +2232,10 @@ void Buffer::makeLinuxDocFile(string const & filename, int column)
                        if (environment_stack[depth] != style.latexname()) {
                                if(depth == 0) {
                                        string temp = "p";
-                                       sgmlOpenTag(file, depth, temp);
+                                       sgmlOpenTag(ofs, depth, temp);
                                }
                                environment_stack[depth] = style.latexname();
-                               sgmlOpenTag(file, depth, environment_stack[depth]);
+                               sgmlOpenTag(ofs, depth, environment_stack[depth]);
                        }
                        if(style.latextype == LATEX_ENVIRONMENT) break;
 
@@ -2265,22 +2246,22 @@ void Buffer::makeLinuxDocFile(string const & filename, int column)
                        else
                                item_name = "item";
 
-                       sgmlOpenTag(file, depth+1, item_name);
+                       sgmlOpenTag(ofs, depth + 1, item_name);
                        break;
                default:
-                       sgmlOpenTag(file, depth, style.latexname());
+                       sgmlOpenTag(ofs, depth, style.latexname());
                        break;
                }
 
                do {
-                       SimpleLinuxDocOnePar(file, par, desc_on, depth);
+                       SimpleLinuxDocOnePar(ofs, par, desc_on, depth);
 
                        par = par->next;
-                       linuxDocHandleFootnote(file, par, depth);
+                       linuxDocHandleFootnote(ofs, par, depth);
                }
                while(par && par->IsDummy());
 
-               fprintf(file, "\n");
+               ofs << "\n";
                /* write closing SGML tags */
                switch(style.latextype) {
                case LATEX_COMMAND:
@@ -2288,65 +2269,67 @@ void Buffer::makeLinuxDocFile(string const & filename, int column)
                case LATEX_ITEM_ENVIRONMENT:
                        break;
                default:
-                       sgmlCloseTag(file, depth, style.latexname());
+                       sgmlCloseTag(ofs, depth, style.latexname());
                        break;
                }
        }
    
        /* Close open tags */
-       for(;depth>0;depth--)
-               sgmlCloseTag(file, depth, environment_stack[depth]);
+       for(; depth > 0; --depth)
+               sgmlCloseTag(ofs, depth, environment_stack[depth]);
 
        if(!environment_stack[depth].empty())
-               sgmlCloseTag(file, depth, environment_stack[depth]);
+               sgmlCloseTag(ofs, depth, environment_stack[depth]);
 
-       fprintf(file, "\n\n");
-       sgmlCloseTag(file, 0, top_element);
+       ofs << "\n\n";
+       sgmlCloseTag(ofs, 0, top_element);
 
-       if (file.close()) {
-               WriteFSAlert(_("Error! Could not close file properly:"),
-                            filename);
-       } 
+       ofs.close();
+       // How to check for successful close
 }
 
 
-void Buffer::linuxDocHandleFootnote(FILE * file, LyXParagraph * & par,
+void Buffer::linuxDocHandleFootnote(ostream & os, LyXParagraph * & par,
                                    int const depth)
 {
        string tag = "footnote";
 
        while (par && par->footnoteflag != LyXParagraph::NO_FOOTNOTE) {
-               sgmlOpenTag(file, depth+1, tag);
-               SimpleLinuxDocOnePar(file, par, 0, depth+1);
-               sgmlCloseTag(file, depth+1, tag);
+               sgmlOpenTag(os, depth + 1, tag);
+               SimpleLinuxDocOnePar(os, par, 0, depth + 1);
+               sgmlCloseTag(os, depth + 1, tag);
                par = par->next;
        }
 }
 
-void Buffer::DocBookHandleCaption(FILE * file, string & inner_tag,
+
+void Buffer::DocBookHandleCaption(ostream & os, string & inner_tag,
                                  int const depth, int desc_on,
                                  LyXParagraph * & par)
 {
        LyXParagraph * tpar = par;
        string tmp_par, extra_par;
        while (tpar && (tpar->footnoteflag != LyXParagraph::NO_FOOTNOTE) &&
-              (tpar->layout != textclasslist.NumberOfLayout(params.textclass, "Caption").second))
+              (tpar->layout != textclasslist.NumberOfLayout(params.textclass,
+                                                            "Caption").second))
                tpar = tpar->next;
        if (tpar &&
            tpar->layout == textclasslist.NumberOfLayout(params.textclass,
                                                         "Caption").second) {
-               sgmlOpenTag(file, depth+1, inner_tag);
-           SimpleDocBookOnePar(tmp_par, extra_par, tpar, desc_on, depth+2);
-               tmp_par = strip(tmp_par);
-               tmp_par = frontStrip(tmp_par);
-               fprintf(file, "%s", tmp_par.c_str());
-               sgmlCloseTag(file, depth+1, inner_tag);
-               if(!extra_par.empty())
-                       fprintf(file, "%s", extra_par.c_str());
-       }
+               sgmlOpenTag(os, depth + 1, inner_tag);
+               SimpleDocBookOnePar(tmp_par, extra_par, tpar,
+                                   desc_on, depth + 2);
+               tmp_par = strip(tmp_par);
+               tmp_par = frontStrip(tmp_par);
+               os << tmp_par;
+               sgmlCloseTag(os, depth+1, inner_tag);
+               if(!extra_par.empty())
+                       os << extra_par;
+       }
 }
 
-void Buffer::DocBookHandleFootnote(FILE * file, LyXParagraph * & par,
+
+void Buffer::DocBookHandleFootnote(ostream & os, LyXParagraph * & par,
                                   int const depth)
 {
        string tag, inner_tag;
@@ -2369,19 +2352,19 @@ void Buffer::DocBookHandleFootnote(FILE * file, LyXParagraph * & par,
                if(last == present) {
                        if(inner_span) {
                                if(!tmp_par.empty()) {
-                                       fprintf(file, "%s", tmp_par.c_str());
+                                       os << tmp_par;
                                        tmp_par.clear();
-                                       sgmlCloseTag(file, depth+1, inner_tag);
-                                       sgmlOpenTag(file, depth+1, inner_tag);
+                                       sgmlCloseTag(os, depth+1, inner_tag);
+                                       sgmlOpenTag(os, depth+1, inner_tag);
                                }
                        }
                        else
-                               fprintf(file, "\n");
+                               os << "\n";
                } else {
-                       fprintf(file, "%s", tmp_par.c_str());
-                       if(!inner_tag.empty()) sgmlCloseTag(file, depth+1, inner_tag);
-                       if(!extra_par.empty()) fprintf(file, "%s", extra_par.c_str());
-                       if(!tag.empty()) sgmlCloseTag(file, depth, tag);
+                       os << tmp_par;
+                       if(!inner_tag.empty()) sgmlCloseTag(os, depth+1, inner_tag);
+                       if(!extra_par.empty()) os << extra_par;
+                       if(!tag.empty()) sgmlCloseTag(os, depth, tag);
                        extra_par.clear();
 
                        switch (par->footnotekind) {
@@ -2413,72 +2396,67 @@ void Buffer::DocBookHandleFootnote(FILE * file, LyXParagraph * & par,
                                inner_span = false;
                                break;
                        }
-                       sgmlOpenTag(file, depth, tag);
+                       sgmlOpenTag(os, depth, tag);
                        if ((present == TAB_LIKE) || (present == FIG_LIKE)) {
-                               DocBookHandleCaption(file, inner_tag, depth,
+                               DocBookHandleCaption(os, inner_tag, depth,
                                                     desc_on, par);
                                inner_tag.clear();
                        } else {
-                               sgmlOpenTag(file, depth+1, inner_tag);
+                               sgmlOpenTag(os, depth + 1, inner_tag);
                        }
                }
                // ignore all caption here, we processed them above!!!
                if (par->layout != textclasslist.NumberOfLayout(params.textclass,
                                                           "Caption").second) {
                        SimpleDocBookOnePar(tmp_par, extra_par, par,
-                                           desc_on, depth+2);
+                                           desc_on, depth + 2);
                }
                tmp_par = frontStrip(strip(tmp_par));
 
                last = present;
                par = par->next;
        }
-       fprintf(file, "%s", tmp_par.c_str());
-       if(!inner_tag.empty()) sgmlCloseTag(file, depth+1, inner_tag);
-       if(!extra_par.empty()) fprintf(file, "%s", extra_par.c_str());
-       if(!tag.empty()) sgmlCloseTag(file, depth, tag);
-
+       os << tmp_par;
+       if(!inner_tag.empty()) sgmlCloseTag(os, depth+1, inner_tag);
+       if(!extra_par.empty()) os << extra_par;
+       if(!tag.empty()) sgmlCloseTag(os, depth, tag);
 }
 
 
 /* push a tag in a style stack */
-void Buffer::push_tag(FILE * file, char const * tag,
+void Buffer::push_tag(ostream & os, char const * tag,
                      int & pos, char stack[5][3])
 {
-       int j;
-
        /* pop all previous tags */
-       for (j = pos; j >= 0; j--)
-               fprintf(file, "</%s>", stack[j]); 
+       for (int j = pos; j >= 0; --j)
+               os << "</" << stack[j] << ">";
 
        /* add new tag */
        sprintf(stack[++pos], "%s", tag);
 
        /* push all tags */
-       for (j= 0; j<= pos; j++)
-               fprintf(file, "<%s>", stack[j]);
+       for (int i = 0; i <= pos; ++i)
+               os << "<" << stack[i] << ">";
 }
 
 
 // pop a tag from a style stack
-void Buffer::pop_tag(FILE * file, char const * tag,
+void Buffer::pop_tag(ostream & os, char const * tag,
                     int & pos, char stack[5][3])
 {
-       int j;
-
        // pop all tags till specified one
-       for (j= pos; (j>= 0) && (strcmp(stack[j], tag)); j--)
-               fprintf(file, "</%s>", stack[j]);
+       for (int j = pos; (j >= 0) && (strcmp(stack[j], tag)); --j)
+               os << "</" << stack[j] << ">";
 
        // closes the tag
-       fprintf(file, "</%s>", tag);
+       os << "</" << tag << ">";
 
        // push all tags, but the specified one
-       for (j= j+1; j<= pos; j++) {
-               fprintf(file, "<%s>", stack[j]);
-               strcpy(stack[j-1], stack[j]);
+       for (int i = 0; i <= pos; ++i) {
+               os << "<" << stack[i] << ">";
+               strcpy(stack[i - 1], stack[i]);
        }
-       pos --;
+       --pos;
 }
 
 
@@ -2487,19 +2465,19 @@ void Buffer::pop_tag(FILE * file, char const * tag,
 // checks, if newcol chars should be put into this line
 // writes newline, if necessary.
 static
-void linux_doc_line_break(FILE * file, unsigned int & colcount,
+void linux_doc_line_break(ostream & os, unsigned int & colcount,
                          const unsigned int newcol)
 {
        colcount += newcol;
        if (colcount > lyxrc->ascii_linelen) {
-               fprintf(file, "\n");
+               os << "\n";
                colcount = newcol; // assume write after this call
        }
 }
 
 
-void Buffer::SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par,
-                                 int desc_on, int const depth)
+void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
+                                 int desc_on, int const /*depth*/)
 {
        LyXFont font1, font2;
        char c;
@@ -2546,18 +2524,18 @@ void Buffer::SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par,
                        switch(family_type) {
                        case 0:
                                if (font2.family() == LyXFont::TYPEWRITER_FAMILY) {
-                                       push_tag(file, "tt", stack_num, stack);
+                                       push_tag(os, "tt", stack_num, stack);
                                        family_type= 1;
                                }
                                else if (font2.family() == LyXFont::SANS_FAMILY) {
-                                       push_tag(file, "sf", stack_num, stack);
+                                       push_tag(os, "sf", stack_num, stack);
                                        family_type= 2;
                                }
                                break;
                        case 1:
-                               pop_tag(file, "tt", stack_num, stack);
+                               pop_tag(os, "tt", stack_num, stack);
                                if (font2.family() == LyXFont::SANS_FAMILY) {
-                                       push_tag(file, "sf", stack_num, stack);
+                                       push_tag(os, "sf", stack_num, stack);
                                        family_type= 2;
                                }
                                else {
@@ -2565,9 +2543,9 @@ void Buffer::SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par,
                                }
                                break;
                        case 2:
-                               pop_tag(file, "sf", stack_num, stack);
+                               pop_tag(os, "sf", stack_num, stack);
                                if (font2.family() == LyXFont::TYPEWRITER_FAMILY) {
-                                       push_tag(file, "tt", stack_num, stack);
+                                       push_tag(os, "tt", stack_num, stack);
                                        family_type= 1;
                                }
                                else {
@@ -2579,11 +2557,11 @@ void Buffer::SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par,
                /* handle bold face */
                if (font1.series() != font2.series()) {
                        if (font2.series() == LyXFont::BOLD_SERIES) {
-                               push_tag(file, "bf", stack_num, stack);
+                               push_tag(os, "bf", stack_num, stack);
                                is_bold = true;
                        }
                        else if (is_bold) {
-                               pop_tag(file, "bf", stack_num, stack);
+                               pop_tag(os, "bf", stack_num, stack);
                                is_bold = false;
                        }
                }
@@ -2593,18 +2571,18 @@ void Buffer::SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par,
                        switch(shape_type) {
                        case 0:
                                if (font2.shape() == LyXFont::ITALIC_SHAPE) {
-                                       push_tag(file, "it", stack_num, stack);
+                                       push_tag(os, "it", stack_num, stack);
                                        shape_type= 1;
                                }
                                else if (font2.shape() == LyXFont::SLANTED_SHAPE) {
-                                       push_tag(file, "sl", stack_num, stack);
+                                       push_tag(os, "sl", stack_num, stack);
                                        shape_type= 2;
                                }
                                break;
                        case 1:
-                               pop_tag(file, "it", stack_num, stack);
+                               pop_tag(os, "it", stack_num, stack);
                                if (font2.shape() == LyXFont::SLANTED_SHAPE) {
-                                       push_tag(file, "sl", stack_num, stack);
+                                       push_tag(os, "sl", stack_num, stack);
                                        shape_type= 2;
                                }
                                else {
@@ -2612,9 +2590,9 @@ void Buffer::SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par,
                                }
                                break;
                        case 2:
-                               pop_tag(file, "sl", stack_num, stack);
+                               pop_tag(os, "sl", stack_num, stack);
                                if (font2.shape() == LyXFont::ITALIC_SHAPE) {
-                                       push_tag(file, "it", stack_num, stack);
+                                       push_tag(os, "it", stack_num, stack);
                                        shape_type= 1;
                                }
                                else {
@@ -2625,10 +2603,10 @@ void Buffer::SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par,
                /* handle <em> tag */
                if (font1.emph() != font2.emph()) {
                        if (font2.emph() == LyXFont::ON) {
-                               push_tag(file, "em", stack_num, stack);
+                               push_tag(os, "em", stack_num, stack);
                                is_em = true;
                        } else if (is_em) {
-                               pop_tag(file, "em", stack_num, stack);
+                               pop_tag(os, "em", stack_num, stack);
                                is_em = false;
                        }
                }
@@ -2638,13 +2616,13 @@ void Buffer::SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par,
                if (font2.latex() == LyXFont::ON) {
                        // "TeX"-Mode on == > SGML-Mode on.
                        if (c!= '\0')
-                               fprintf(file, "%c", c); // see LaTeX-Generation...
+                               os << c; // see LaTeX-Generation...
                        char_line_count++;
                } else if (c == LyXParagraph::META_INSET) {
                        inset = par->GetInset(i);
                        string tmp_out;
                        inset->Linuxdoc(tmp_out);
-                       fprintf(file, "%s", tmp_out.c_str());
+                       os << tmp_out;
                }
                else {
                        string sgml_string;
@@ -2655,17 +2633,17 @@ void Buffer::SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par,
                                // char is ' '
                                if (desc_on == 1) {
                                        char_line_count++;
-                                       linux_doc_line_break(file, char_line_count, 6);
-                                       fprintf(file, "</tag>");
+                                       linux_doc_line_break(os, char_line_count, 6);
+                                       os << "</tag>";
                                        desc_on = 2;
                                }
                                else  {
-                                       linux_doc_line_break(file, char_line_count, 1);
-                                       fprintf(file, "%c", c);
+                                       linux_doc_line_break(os, char_line_count, 1);
+                                       os << c;
                                }
                        }
                        else {
-                               fprintf(file, "%s", sgml_string.c_str());
+                               os << sgml_string;
                                char_line_count += sgml_string.length();
                        }
                }
@@ -2678,19 +2656,19 @@ void Buffer::SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par,
        }
 
        /* pop all defined Styles */
-       for (j = stack_num; j >= 0; j--) {
-               linux_doc_line_break(file
+       for (j = stack_num; j >= 0; --j) {
+               linux_doc_line_break(os
                                     char_line_count, 
-                                    3+strlen(stack[j]));
-               fprintf(file, "</%s>", stack[j]);
+                                    3 + strlen(stack[j]));
+               os << "</" << stack[j] << ">";
        }
 
        /* resets description flag correctly */
        switch(desc_on){
        case 1:
                /* <tag> not closed... */
-               linux_doc_line_break(file, char_line_count, 6);
-               fprintf(file, "</tag>");
+               linux_doc_line_break(os, char_line_count, 6);
+               os << "</tag>";
                break;
        case 2:
                /* fprintf(file, "</p>");*/
@@ -2719,7 +2697,7 @@ void Buffer::LinuxDocError(LyXParagraph * par, int pos,
 
 enum { MAX_NEST_LEVEL = 25};
 
-void Buffer::makeDocBookFile(string const & filename, int column)
+void Buffer::makeDocBookFile(string const & fname, int column)
 {
        LyXParagraph * par = paragraph;
 
@@ -2735,57 +2713,53 @@ void Buffer::makeDocBookFile(string const & filename, int column)
 
        int depth= 0;              /* paragraph depth */
 
-       FilePtr file(filename, FilePtr::write);
        tex_code_break_column = column; 
 
-       if (!file()) {
-               WriteAlert(_("LYX_ERROR:"), _("Cannot write file"), filename);
+       ofstream ofs(fname.c_str());
+       if (!ofs) {
+               WriteAlert(_("LYX_ERROR:"), _("Cannot write file"), fname);
                return;
        }
    
-       //ResetTexRow();
        texrow.reset();
 
-       fprintf(file,
-               "<!doctype %s public \"-//OASIS//DTD DocBook V3.1//EN\"",
-               top_element.c_str());
+       ofs << "<!doctype " << top_element
+           << " public \"-//OASIS//DTD DocBook V3.1//EN\"";
 
        if (params.preamble.empty())
-               fprintf(file, ">\n\n");
+               ofs << ">\n\n";
        else
-               fprintf(file, "\n [ %s \n]>\n\n", params.preamble.c_str() );
+               ofs << "\n [ " << params.preamble << " \n]>\n\n";
 
-        string userName(getUserName());
-       fprintf(file,
-               "<!-- DocBook file was created by LyX 1.0 (C) 1995-1999\n");
-       fprintf(file, "by <%s> %s -->\n", userName.c_str(), (char *)date());
+       ofs << "<!-- DocBook file was created by " << LYX_DOCVERSION 
+           << "\n  See http://www.lyx.org/ for more information -->\n";
 
        if(params.options.empty())
-               sgmlOpenTag(file, 0, top_element);
+               sgmlOpenTag(ofs, 0, top_element);
        else {
                string top = top_element;
                top += " ";
                top += params.options;
-               sgmlOpenTag(file, 0, top);
+               sgmlOpenTag(ofs, 0, top);
        }
 
        while (par) {
                int desc_on= 0;            /* description mode*/
-               LyXLayout const & style = textclasslist.Style(GetCurrentTextClass(),
+               LyXLayout const & style = textclasslist.Style(users->buffer()->params.textclass,
                                                   par->layout);
                par->AutoDeleteInsets();
 
                /* environment tag closing */
-               for( ;depth > par->depth; depth--) {
+               for( ; depth > par->depth; --depth) {
                        if(environment_inner[depth] != "!-- --") {
                                item_name= "listitem";
-                               sgmlCloseTag(file, command_depth+depth,
+                               sgmlCloseTag(ofs, command_depth + depth,
                                             item_name);
                                if( environment_inner[depth] == "varlistentry")
-                                       sgmlCloseTag(file, depth+command_depth,
+                                       sgmlCloseTag(ofs, depth+command_depth,
                                                     environment_inner[depth]);
                        }
-                       sgmlCloseTag(file, depth+command_depth,
+                       sgmlCloseTag(ofs, depth + command_depth,
                                     environment_stack[depth]);
                        environment_stack[depth].clear();
                        environment_inner[depth].clear();
@@ -2796,14 +2770,15 @@ void Buffer::makeDocBookFile(string const & filename, int column)
                   && !environment_stack[depth].empty()) {
                        if(environment_inner[depth] != "!-- --") {
                                item_name= "listitem";
-                               sgmlCloseTag(file, command_depth+depth,
+                               sgmlCloseTag(ofs, command_depth+depth,
                                             item_name);
                                if( environment_inner[depth] == "varlistentry")
-                                       sgmlCloseTag(file, depth+command_depth,
+                                       sgmlCloseTag(ofs,
+                                                    depth + command_depth,
                                                     environment_inner[depth]);
                        }
                        
-                       sgmlCloseTag(file, depth+command_depth,
+                       sgmlCloseTag(ofs, depth + command_depth,
                                     environment_stack[depth]);
                        
                        environment_stack[depth].clear();
@@ -2814,7 +2789,7 @@ void Buffer::makeDocBookFile(string const & filename, int column)
                switch(style.latextype) {
                case LATEX_PARAGRAPH:
                        if(style.latexname() != "dummy")
-                               sgmlOpenTag(file, depth+command_depth,
+                               sgmlOpenTag(ofs, depth+command_depth,
                                            style.latexname());
                        break;
 
@@ -2834,17 +2809,17 @@ void Buffer::makeDocBookFile(string const & filename, int column)
                        if(command_flag) {
                                if(cmd_depth<command_base) {
                                        for(int j = command_depth;
-                                           j >= command_base; j--)
+                                           j >= command_base; --j)
                                                if(!command_stack[j].empty())
-                                                       sgmlCloseTag(file, j, command_stack[j]);
+                                                       sgmlCloseTag(ofs, j, command_stack[j]);
                                        command_depth= command_base= cmd_depth;
                                }
-                               else if(cmd_depth<= command_depth) {
-                                       for(int j= command_depth;
-                                           j >= cmd_depth; j--)
+                               else if(cmd_depth <= command_depth) {
+                                       for(int j = command_depth;
+                                           j >= cmd_depth; --j)
 
                                                if(!command_stack[j].empty())
-                                                       sgmlCloseTag(file, j, command_stack[j]);
+                                                       sgmlCloseTag(ofs, j, command_stack[j]);
                                        command_depth= cmd_depth;
                                }
                                else
@@ -2859,19 +2834,19 @@ void Buffer::makeDocBookFile(string const & filename, int column)
                        // treat label as a special case for
                        // more WYSIWYM handling.
                        if (par->GetChar(0) == LyXParagraph::META_INSET) {
-                               Inset *inset = par->GetInset(0);
+                               Inset * inset = par->GetInset(0);
                                char  lyx_code = inset->LyxCode();
                                if (lyx_code == Inset::LABEL_CODE){
-                                       command_name+= " id= \"";
-                                       command_name+= ((InsetCommand *) inset)->getContents();
-                                       command_name+= "\"";
-                                       desc_on= 3;
+                                       command_name += " id=\"";
+                                       command_name += (static_cast<InsetCommand *>(inset))->getContents();
+                                       command_name += "\"";
+                                       desc_on = 3;
                                }
                        }
 
-                       sgmlOpenTag(file, depth+command_depth, command_name);
-                       item_name= "title";
-                       sgmlOpenTag(file, depth+1+command_depth, item_name);
+                       sgmlOpenTag(ofs, depth+command_depth, command_name);
+                       item_name = "title";
+                       sgmlOpenTag(ofs, depth + 1 + command_depth, item_name);
                        break;
 
                case LATEX_ENVIRONMENT:
@@ -2882,26 +2857,26 @@ void Buffer::makeDocBookFile(string const & filename, int column)
                        }
 
                        if (environment_stack[depth] != style.latexname()) {
-                               environment_stack[depth]= style.latexname();
-                               environment_inner[depth]= "!-- --";
-                               sgmlOpenTag(file, depth + command_depth,
+                               environment_stack[depth] = style.latexname();
+                               environment_inner[depth] = "!-- --";
+                               sgmlOpenTag(ofs, depth + command_depth,
                                            environment_stack[depth]);
                        } else {
                                if(environment_inner[depth] != "!-- --") {
                                        item_name= "listitem";
-                                       sgmlCloseTag(file,
+                                       sgmlCloseTag(ofs,
                                                     command_depth + depth,
                                                     item_name);
                                        if (environment_inner[depth] == "varlistentry")
-                                               sgmlCloseTag(file,
-                                                            depth+command_depth,
+                                               sgmlCloseTag(ofs,
+                                                            depth + command_depth,
                                                             environment_inner[depth]);
                                }
                        }
                        
                        if(style.latextype == LATEX_ENVIRONMENT) {
                                if(!style.latexparam().empty())
-                                       sgmlOpenTag(file, depth+command_depth,
+                                       sgmlOpenTag(ofs, depth + command_depth,
                                                    style.latexparam());
                                break;
                        }
@@ -2913,22 +2888,22 @@ void Buffer::makeDocBookFile(string const & filename, int column)
                        else
                                environment_inner[depth]= "listitem";
 
-                       sgmlOpenTag(file, depth+1+command_depth,
+                       sgmlOpenTag(ofs, depth + 1 + command_depth,
                                    environment_inner[depth]);
 
                        if(desc_on) {
                                item_name= "term";
-                               sgmlOpenTag(file, depth+1+command_depth,
+                               sgmlOpenTag(ofs, depth + 1 + command_depth,
                                            item_name);
                        }
                        else {
                                item_name= "para";
-                               sgmlOpenTag(file, depth+1+command_depth,
+                               sgmlOpenTag(ofs, depth + 1 + command_depth,
                                            item_name);
                        }
                        break;
                default:
-                       sgmlOpenTag(file, depth + command_depth,
+                       sgmlOpenTag(ofs, depth + command_depth,
                                    style.latexname());
                        break;
                }
@@ -2937,11 +2912,12 @@ void Buffer::makeDocBookFile(string const & filename, int column)
                        string tmp_par, extra_par;
 
                        SimpleDocBookOnePar(tmp_par, extra_par, par, desc_on,
-                                           depth+1+command_depth);
-                       fprintf(file, "%s", tmp_par.c_str());
+                                           depth + 1 + command_depth);
+                       ofs << tmp_par;
 
                        par = par->next;
-                       DocBookHandleFootnote(file, par, depth+1+command_depth);
+                       DocBookHandleFootnote(ofs, par,
+                                             depth + 1 + command_depth);
                }
                while(par && par->IsDummy());
 
@@ -2950,58 +2926,56 @@ void Buffer::makeDocBookFile(string const & filename, int column)
                switch(style.latextype) {
                case LATEX_COMMAND:
                        end_tag = "title";
-                       sgmlCloseTag(file, depth + command_depth, end_tag);
+                       sgmlCloseTag(ofs, depth + command_depth, end_tag);
                        break;
                case LATEX_ENVIRONMENT:
                        if(!style.latexparam().empty())
-                               sgmlCloseTag(file, depth + command_depth,
+                               sgmlCloseTag(ofs, depth + command_depth,
                                             style.latexparam());
                        break;
                case LATEX_ITEM_ENVIRONMENT:
                        if(desc_on == 1) break;
                        end_tag= "para";
-                       sgmlCloseTag(file, depth+1+command_depth, end_tag);
+                       sgmlCloseTag(ofs, depth + 1 + command_depth, end_tag);
                        break;
                case LATEX_PARAGRAPH:
                        if(style.latexname() != "dummy")
-                               sgmlCloseTag(file, depth + command_depth,
+                               sgmlCloseTag(ofs, depth + command_depth,
                                             style.latexname());
                        break;
                default:
-                       sgmlCloseTag(file, depth+command_depth,
+                       sgmlCloseTag(ofs, depth + command_depth,
                                     style.latexname());
                        break;
                }
        }
 
        // Close open tags
-       for(;depth>= 0;depth--) {
+       for(; depth >= 0; --depth) {
                if(!environment_stack[depth].empty()) {
                        if(environment_inner[depth] != "!-- --") {
                                item_name= "listitem";
-                               sgmlCloseTag(file, command_depth+depth,
+                               sgmlCloseTag(ofs, command_depth + depth,
                                             item_name);
                                if( environment_inner[depth] == "varlistentry")
-                                      sgmlCloseTag(file, depth+command_depth,
+                                      sgmlCloseTag(ofs, depth + command_depth,
                                                    environment_inner[depth]);
                        }
                        
-                       sgmlCloseTag(file, depth+command_depth,
+                       sgmlCloseTag(ofs, depth + command_depth,
                                     environment_stack[depth]);
                }
        }
        
-       for(int j= command_depth;j>= command_base;j--)
+       for(int j = command_depth; j >= command_base; --j)
                if(!command_stack[j].empty())
-                       sgmlCloseTag(file, j, command_stack[j]);
+                       sgmlCloseTag(ofs, j, command_stack[j]);
 
-       fprintf(file, "\n\n");
-       sgmlCloseTag(file, 0, top_element);
+       ofs << "\n\n";
+       sgmlCloseTag(ofs, 0, top_element);
 
-       if (file.close()) {
-               WriteFSAlert(_("Error! Could not close file properly:"),
-                            filename);
-       }
+       ofs.close();
+       // How to check for successful close
 }
 
 
@@ -3074,7 +3048,7 @@ void Buffer::SimpleDocBookOnePar(string & file, string & extra,
                        //         desc_on == 4
                        //
                        if(desc_on!= 3 || i!= 0) {
-                               if(tmp_out[0] == '@') {
+                               if(!tmp_out.empty() && tmp_out[0] == '@') {
                                        if(desc_on == 4)
                                                extra += frontStrip(tmp_out, '@');
                                        else
@@ -3084,7 +3058,7 @@ void Buffer::SimpleDocBookOnePar(string & file, string & extra,
                                        file += tmp_out;
                        }
                } else if (font2.latex() == LyXFont::ON) {
-                       // "TeX"-Mode on == > SGML-Mode on.
+                       // "TeX"-Mode on ==> SGML-Mode on.
                        if (c!= '\0')
                                file += c;
                        char_line_count++;
@@ -3132,9 +3106,9 @@ void Buffer::SimpleDocBookOnePar(string & file, string & extra,
 }
 
 
-bool Buffer::removeAutoInsets()
+bool BufferView::removeAutoInsets()
 {
-       LyXParagraph *par = paragraph;
+       LyXParagraph * par = buffer()->paragraph;
 
        LyXCursor cursor = text->cursor;
        LyXCursor tmpcursor = cursor;
@@ -3146,16 +3120,17 @@ bool Buffer::removeAutoInsets()
                if (par->AutoDeleteInsets()){
                        a = true;
                        if (par->footnoteflag != LyXParagraph::CLOSED_FOOTNOTE){
-                               /* this is possible now, since SetCursor takes
-                                  care about footnotes */
+                               // this is possible now, since SetCursor takes
+                               // care about footnotes
                                text->SetCursorIntern(par, 0);
-                               text->RedoParagraphs(text->cursor, text->cursor.par->Next());
+                               text->RedoParagraphs(text->cursor,
+                                                    text->cursor.par->Next());
                                text->FullRebreak();
                        }
                }
                par = par->next;
        }
-       /* avoid forbidden cursor positions caused by error removing */ 
+       // avoid forbidden cursor positions caused by error removing
        if (cursor.pos > cursor.par->Last())
                cursor.pos = cursor.par->Last();
        text->SetCursorIntern(cursor.par, cursor.pos);
@@ -3166,12 +3141,12 @@ bool Buffer::removeAutoInsets()
 
 int Buffer::runLaTeX()
 {
-       if (!text) return 0;
+       if (!users->text) return 0;
 
        ProhibitInput();
 
        // get LaTeX-Filename
-       string name = SpaceLess(ChangeExtension (filename, ".tex", true));
+       string name = getLatexName();
 
        string path = OnlyPath(filename);
 
@@ -3184,7 +3159,7 @@ int Buffer::runLaTeX()
        users->owner()->getMiniBuffer()->Set(_("Running LaTeX..."));   
 
        // Remove all error insets
-       bool a = removeAutoInsets();
+       bool a = users->removeAutoInsets();
 
        // Always generate the LaTeX file
        makeLaTeXFile(name, org_path, false);
@@ -3203,7 +3178,7 @@ int Buffer::runLaTeX()
        } else if ((res & LaTeX::ERRORS)) {
                users->owner()->getMiniBuffer()->Set(_("Done"));
                // Insert all errors as errors boxes
-               insertErrors(terr);
+               users->insertErrors(terr);
                
                // Dvi should also be kept dirty if the latex run
                // ends up with errors. However it should be possible
@@ -3229,14 +3204,15 @@ int Buffer::runLaTeX()
 
 int Buffer::runLiterate()
 {
-       if (!text) return 0;
+       if (!users->text) return 0;
 
        ProhibitInput();
 
        // get LaTeX-Filename
-       string name = SpaceLess(ChangeExtension (filename, ".tex", true));
+       string name = getLatexName();
         // get Literate-Filename
-        string lit_name = SpaceLess(ChangeExtension (filename, lyxrc->literate_extension, true));
+        string lit_name = ChangeExtension (getLatexName(), 
+                                          lyxrc->literate_extension, true);
 
        string path = OnlyPath(filename);
 
@@ -3249,7 +3225,7 @@ int Buffer::runLiterate()
        users->owner()->getMiniBuffer()->Set(_("Running Literate..."));   
 
        // Remove all error insets
-       bool a = removeAutoInsets();
+       bool a = users->removeAutoInsets();
 
        // generate the Literate file if necessary
        if (!isDviClean() || a) {
@@ -3271,7 +3247,7 @@ int Buffer::runLiterate()
        } else if ((res & Literate::ERRORS)) {
                users->owner()->getMiniBuffer()->Set(_("Done"));
                // Insert all errors as errors boxes
-               insertErrors(terr);
+               users->insertErrors(terr);
                
                // Dvi should also be kept dirty if the latex run
                // ends up with errors. However it should be possible
@@ -3297,14 +3273,15 @@ int Buffer::runLiterate()
 
 int Buffer::buildProgram()
 {
-        if (!text) return 0;
+        if (!users->text) return 0;
  
         ProhibitInput();
  
         // get LaTeX-Filename
-        string name = SpaceLess(ChangeExtension (filename, ".tex", true));
+        string name = getLatexName();
         // get Literate-Filename
-        string lit_name = SpaceLess(ChangeExtension (filename, lyxrc->literate_extension, true));
+        string lit_name = ChangeExtension(getLatexName(), 
+                                         lyxrc->literate_extension, true);
  
         string path = OnlyPath(filename);
  
@@ -3317,7 +3294,7 @@ int Buffer::buildProgram()
         users->owner()->getMiniBuffer()->Set(_("Building Program..."));   
  
         // Remove all error insets
-        bool a = removeAutoInsets();
+        bool a = users->removeAutoInsets();
  
         // generate the LaTeX file if necessary
         if (!isNwClean() || a) {
@@ -3339,7 +3316,7 @@ int Buffer::buildProgram()
         } else if ((res & Literate::ERRORS)) {
                 users->owner()->getMiniBuffer()->Set(_("Done"));
                 // Insert all errors as errors boxes
-                insertErrors(terr);
+               users->insertErrors(terr);
                 
                 // Literate files should also be kept dirty if the literate 
                 // command run ends up with errors.
@@ -3367,12 +3344,12 @@ int Buffer::buildProgram()
 // Other flags: -wall -v0 -x
 int Buffer::runChktex()
 {
-       if (!text) return 0;
+       if (!users->text) return 0;
 
        ProhibitInput();
 
        // get LaTeX-Filename
-       string name = SpaceLess(ChangeExtension (filename, ".tex", true));
+       string name = getLatexName();
        string path = OnlyPath(filename);
 
        string org_path = path;
@@ -3384,7 +3361,7 @@ int Buffer::runChktex()
        users->owner()->getMiniBuffer()->Set(_("Running chktex..."));
 
        // Remove all error insets
-       bool a = removeAutoInsets();
+       bool a = users->removeAutoInsets();
 
        // Generate the LaTeX file if neccessary
        if (!isDviClean() || a) {
@@ -3401,7 +3378,7 @@ int Buffer::runChktex()
                           _("Could not run with file:"), name);
        } else if (res > 0) {
                // Insert all errors as errors boxes
-               insertErrors(terr);
+               users->insertErrors(terr);
        }
 
        // if we removed error insets before we ran chktex or if we inserted
@@ -3417,17 +3394,14 @@ int Buffer::runChktex()
 }
 
 
-extern void AllFloats(char, char);
-
-
-void Buffer::insertErrors(TeXErrors & terr)
+void BufferView::insertErrors(TeXErrors & terr)
 {
        // Save the cursor position
        LyXCursor cursor = text->cursor;
 
        // This is drastic, but it's the only fix, I could find. (Asger)
-       AllFloats(1, 0);
-       AllFloats(1, 1);
+       allFloats(1, 0);
+       allFloats(1, 1);
 
        for (TeXErrors::Errors::const_iterator cit = terr.begin();
             cit != terr.end();
@@ -3441,9 +3415,9 @@ void Buffer::insertErrors(TeXErrors & terr)
                int tmpid = -1; 
                int tmppos = -1;
 
-               texrow.getIdFromRow(errorrow, tmpid, tmppos);
+               buffer()->texrow.getIdFromRow(errorrow, tmpid, tmppos);
 
-               LyXParagraph* texrowpar;
+               LyXParagraph * texrowpar = 0;
 
                if (tmpid == -1) {
                        texrowpar = text->FirstParagraph();
@@ -3455,8 +3429,7 @@ void Buffer::insertErrors(TeXErrors & terr)
                if (texrowpar == 0)
                        continue;
 
-               InsetError *new_inset = new InsetError(msgtxt);
-
+               InsetError * new_inset = new InsetError(msgtxt);
                text->SetCursorIntern(texrowpar, tmppos);
                text->InsertInset(new_inset);
                text->FullRebreak();
@@ -3466,14 +3439,14 @@ void Buffer::insertErrors(TeXErrors & terr)
 }
 
 
-void Buffer::setCursorFromRow (int row)
+void BufferView::setCursorFromRow(int row)
 {
        int tmpid = -1; 
        int tmppos = -1;
 
-       texrow.getIdFromRow(row, tmpid, tmppos);
+       buffer()->texrow.getIdFromRow(row, tmpid, tmppos);
 
-       LyXParagraph* texrowpar;
+       LyXParagraph * texrowpar;
 
        if (tmpid == -1) {
                texrowpar = text->FirstParagraph();
@@ -3485,29 +3458,25 @@ void Buffer::setCursorFromRow (int row)
 }
 
 
-void Buffer::RoffAsciiTable(FILE * file, LyXParagraph * par)
+void Buffer::RoffAsciiTable(ostream & os, LyXParagraph * par)
 {
-       LyXFont
-               font1 =  LyXFont(LyXFont::ALL_INHERIT),
-               font2;
+       LyXFont font1 =  LyXFont(LyXFont::ALL_INHERIT);
+       LyXFont font2;
        Inset * inset;
        LyXParagraph::size_type i;
-       int
-               j,
-               cell = 0;
-       char
-               c;
-       FILE
-               * fp, * fp2;
+       int j, cell = 0;
+       char c;
        
        string fname1 = TmpFileName(string(), "RAT1");
        string fname2 = TmpFileName(string(), "RAT2");
-       if (!(fp= fopen(fname1.c_str(), "w"))) {
+
+       ofstream ofs(fname1.c_str());
+       if (!ofs) {
                WriteAlert(_("LYX_ERROR:"),
                           _("Cannot open temporary file:"), fname1);
                return;
        }
-       par->table->RoffEndOfCell(fp, -1);
+       par->table->RoffEndOfCell(ofs, -1);
        for (i = 0; i < par->size(); ++i) {
                c = par->GetChar(i);
                if (par->table->IsContRow(cell)) {
@@ -3523,30 +3492,31 @@ void Buffer::RoffAsciiTable(FILE * file, LyXParagraph * par)
                switch (c) {
                case LyXParagraph::META_INSET:
                        if ((inset = par->GetInset(i))) {
-                               if (!(fp2= fopen(fname2.c_str(), "w+"))) {
+                               fstream fs(fname2.c_str(), ios::in|ios::out);
+                               if (!fs) {
                                        WriteAlert(_("LYX_ERROR:"),
                                                   _("Cannot open temporary file:"), fname2);
-                                       fclose(fp);
+                                       ofs.close();
                                        remove(fname1.c_str());
                                        return;
                                }
-                               inset->Latex(fp2,-1);
-                               rewind(fp2);
-                               c = fgetc(fp2);
-                               while(!feof(fp2)) {
+                               inset->Latex(fs, -1);
+                               fs.seekp(0);
+                               fs.get(c);
+                               while(!fs) {
                                        if (c == '\\')
-                                               fprintf(fp, "\\\\");
+                                               ofs << "\\\\";
                                        else
-                                               fputc(c, fp);
-                                       c = fgetc(fp2);
+                                               ofs << c;
+                                       fs >> c;
                                }
-                               fclose(fp2);
+                               fs.close();
                        }
                        break;
                case LyXParagraph::META_NEWLINE:
                        if (par->table->CellHasContRow(cell)>= 0)
-                               par->RoffContTableRows(fp, i+1, cell);
-                       par->table->RoffEndOfCell(fp, cell);
+                               par->RoffContTableRows(ofs, i+1, cell);
+                       par->table->RoffEndOfCell(ofs, cell);
                        cell++;
                        break;
                case LyXParagraph::META_HFILL: 
@@ -3554,11 +3524,11 @@ void Buffer::RoffAsciiTable(FILE * file, LyXParagraph * par)
                case LyXParagraph::META_PROTECTED_SEPARATOR:
                        break;
                case '\\': 
-                       fprintf(fp, "\\\\");
+                       ofs << "\\\\";
                        break;
                default:
                        if (c != '\0')
-                               fprintf(fp, "%c", c);
+                               ofs << c;
                        else if (c == '\0')
                                lyxerr.debug()
                                        << "RoffAsciiTable:"
@@ -3566,40 +3536,41 @@ void Buffer::RoffAsciiTable(FILE * file, LyXParagraph * par)
                        break;
                }
        }
-       par->table->RoffEndOfCell(fp, cell);
-       fclose(fp);
+       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());
        }
-       if (!(fp= fopen(fname2.c_str(), "r"))) {
+       ifstream ifs(fname2.c_str());
+       if (!ifs) {
                WriteFSAlert(_("Error! Can't open temporary file:"), fname2);
                return;
        }
        // now output the produced file
-       fprintf(file, "\n\n");
-       c = fgetc(fp);
-       if (feof(fp))
+       os << "\n\n";
+       ifs.get(c);
+       if (!ifs)
                WriteAlert(_("Error!"),
                           _("Error executing *roff command on table"));
        // overread leading blank lines
-       while(!feof(fp) && (c == '\n'))
-               c = fgetc(fp);
-       while(!feof(fp)) {
-               for(j= 0; j<par->depth; j++)
-                       fprintf(file, "  ");
-               while(!feof(fp) && (c != '\n')) {
-                       fputc(c, file);
-                       c = fgetc(fp);
-               }
-               fputc('\n', file);
+       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(!feof(fp) && (c == '\n'))
-                       c = fgetc(fp);
+               while(!ifs && (c == '\n'))
+                       ifs.get(c);
        }
-       fclose(fp);
+       ifs.close();
        remove(fname2.c_str());
 }
 
@@ -3634,35 +3605,6 @@ void Buffer::markDviDirty()
 }
 
 
-void Buffer::update(signed char f)
-{
-       if (!users) return;
-       
-       users->owner()->updateLayoutChoice();
-
-       if (!text->selection && f > -3)
-               text->sel_cursor = text->cursor;
-       
-       FreeUpdateTimer();
-       text->FullRebreak();
-       users->update();
-
-       if (f != 3 && f != -3) {
-               users->fitCursor();
-               users->updateScrollbar();
-       }
-
-       if (f == 1 || f == -1) {
-               if (isLyxClean()) {
-                       markDirty();
-                       users->owner()->getMiniBuffer()->setTimer(4);
-               } else {
-                       markDirty();
-               }
-       }
-}
-
-
 void Buffer::validate(LaTeXFeatures & features)
 {
        LyXParagraph * par = paragraph;
@@ -3774,7 +3716,8 @@ void Buffer::setOldPaperStuff()
 }
 #endif
 
-void Buffer::insertInset(Inset * inset, string const & lout,
+
+void BufferView::insertInset(Inset * inset, string const & lout,
                         bool no_table)
 {
        // check for table/list in tables
@@ -3788,7 +3731,7 @@ void Buffer::insertInset(Inset * inset, string const & lout,
        text->SetCursorParUndo();
        text->FreezeUndo();
        
-       BeforeChange();
+       beforeChange();
        if (!lout.empty()) {
                update(-2);
                text->BreakParagraph();
@@ -3801,7 +3744,7 @@ void Buffer::insertInset(Inset * inset, string const & lout,
                        update(-1);
                }
 
-               int lay = textclasslist.NumberOfLayout(params.textclass,
+               int lay = textclasslist.NumberOfLayout(buffer()->params.textclass,
                                                       lout).second;
                if (lay == -1) // layout not found
                        // use default layout "Standard" (0)
@@ -3828,9 +3771,9 @@ void Buffer::insertInset(Inset * inset, string const & lout,
 
 
 // Open and lock an updatable inset
-void Buffer::open_new_inset(UpdatableInset * new_inset)
+void BufferView::open_new_inset(UpdatableInset * new_inset)
 {
-       BeforeChange();
+       beforeChange();
        text->FinishUndo();
        insertInset(new_inset);
        text->CursorLeft();
@@ -3839,7 +3782,7 @@ void Buffer::open_new_inset(UpdatableInset * new_inset)
 }
 
 
-/* This function should be in Buffer because it's a buffer's property (ale) */
+// This function should be in Buffer because it's a buffer's property (ale)
 string Buffer::getIncludeonlyList(char delim)
 {
        string lst;
@@ -3868,18 +3811,18 @@ string Buffer::getIncludeonlyList(char delim)
 }
 
 
-/* This is also a buffer property (ale) */ 
+// This is also a buffer property (ale)
 string Buffer::getReferenceList(char delim)
 {
        /// if this is a child document and the parent is already loaded
        /// Use the parent's list instead  [ale990407]
        if (!params.parentname.empty() && bufferlist.exists(params.parentname)) {
-               Buffer *tmp = bufferlist.getBuffer(params.parentname);
+               Buffer * tmp = bufferlist.getBuffer(params.parentname);
                if (tmp)
                  return tmp->getReferenceList(delim);
        }
 
-       LyXParagraph *par = paragraph;
+       LyXParagraph * par = paragraph;
        LyXParagraph::size_type pos;
        Inset * inset;
         string lst;
@@ -3900,13 +3843,13 @@ string Buffer::getReferenceList(char delim)
 }
 
 
-/* This is also a buffer property (ale) */ 
+// This is also a buffer property (ale)
 string Buffer::getBibkeyList(char delim)
 {
        /// 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);
+               Buffer * tmp = bufferlist.getBuffer(params.parentname);
                if (tmp)
                        return tmp->getBibkeyList(delim);
        }
@@ -3934,9 +3877,9 @@ string Buffer::getBibkeyList(char delim)
                                if (inset-> LyxCode() == Inset::BIBTEX_CODE) {
                                        if (!bibkeys.empty())
                                                bibkeys += delim;
-                                       bibkeys += static_cast<InsetBibtex*>(inset)->getKeys();
+                                       bibkeys += static_cast<InsetBibtex*>(inset)->getKeys(delim);
                                } else if (inset-> LyxCode() == Inset::INCLUDE_CODE) {
-                                       string bk = static_cast<InsetInclude*>(inset)->getKeys();
+                                       string bk = static_cast<InsetInclude*>(inset)->getKeys(delim);
                                        if (!bk.empty()) {
                                                if (!bibkeys.empty())
                                                        bibkeys += delim;
@@ -3959,10 +3902,10 @@ string Buffer::getBibkeyList(char delim)
 // think how this will work in a multiwindo/buffer environment, all the
 // cursors in all the views showing this buffer will move. (Lgb)
 // OK, then no cursor action should be allowed in buffer. (ale)
-bool Buffer::gotoLabel(string const & label)
+bool BufferView::gotoLabel(string const & label)
 
 {
-        LyXParagraph * par = paragraph;
+        LyXParagraph * par = buffer()->paragraph;
         LyXParagraph::size_type pos;
         Inset * inset;
         while (par) {
@@ -3970,7 +3913,7 @@ bool Buffer::gotoLabel(string const & label)
                 while ((inset = par->ReturnNextInsetPointer(pos))){     
                         for (int i = 0; i < inset->GetNumberOfLabels(); i++) {
                                if (label == inset->getLabel(i)) {
-                                       BeforeChange();
+                                       beforeChange();
                                        text->SetCursor(par, pos);
                                        text->sel_cursor = text->cursor;
                                        update(0);
@@ -4016,3 +3959,28 @@ void Buffer::markDepClean(string const & name)
                }
        }
 }
+
+
+void Buffer::Dispatch(string const & command)
+{
+       // Split command string into command and argument
+       string cmd, line = frontStrip(command);
+       string arg = strip(frontStrip(split(line, cmd, ' ')));
+
+       Dispatch(lyxaction.LookupFunc(cmd.c_str()), arg.c_str());
+}
+
+
+void Buffer::Dispatch(int action, string const & argument)
+{
+       switch (action) {
+               case LFUN_EXPORT: 
+                       MenuExport(this, argument);
+                       break;
+
+               default:
+                       lyxerr << "A truly unknown func!" << endl;
+               break;
+
+       } // end of switch
+}