X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fbuffer.C;h=e0953cf145bdde710a6fad6f78f0acb7232a5fe5;hb=53b464c5e95ed708e9464db0499826894be450fd;hp=a0225b519956c55404224f9ab87ef3674336c8b3;hpb=28ed26ab13ccbc24e1ad858784893ac018fabe8f;p=features.git diff --git a/src/buffer.C b/src/buffer.C index a0225b5199..e0953cf145 100644 --- a/src/buffer.C +++ b/src/buffer.C @@ -23,6 +23,15 @@ #include +#include +#include +using std::ofstream; +using std::ifstream; +using std::fstream; +using std::ios; +using std::setw; + + #include #include @@ -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" @@ -90,9 +101,10 @@ // 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.readable()) { WriteAlert(_("Error!"), _("Specified file is unreadable: "), - MakeDisplayPath(filename, 50)); + 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)); + 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(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 pp = + pair 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,87 +1164,76 @@ 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, - "#LyX 1.1 Copyright 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; Inset * inset; char c, footnoteflag = 0, depth = 0; @@ -1246,13 +1244,13 @@ void Buffer::writeFileAscii(string const & filename, int linelen) currlinelen = 0; long fpos = 0; bool ref_printed = false; - - - if (!file()) { - WriteFSAlert(_("Error: Cannot write file:"), filename); + + ofstream ofs(fname.c_str()); + if (!ofs) { + WriteFSAlert(_("Error: Cannot write file:"), fname); return; } - + string fname1 = TmpFileName(); LyXParagraph * par = paragraph; while (par) { @@ -1267,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; } } @@ -1332,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; } @@ -1340,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; } @@ -1353,14 +1351,13 @@ void Buffer::writeFileAscii(string const & filename, int linelen) 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) { @@ -1368,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) @@ -1379,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; jlabelstring.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 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); @@ -1440,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 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 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 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 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;jnext; } - 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()); @@ -1587,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. @@ -1612,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"; @@ -1677,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 @@ -1884,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... @@ -1961,9 +1961,7 @@ void Buffer::makeLaTeXFile(string const & filename, 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"; @@ -2034,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; } @@ -2061,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 @@ -2070,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; } @@ -2108,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\n", space[depth], latexname.c_str()); + os << string(depth, ' ') << "\n"; } -void Buffer::makeLinuxDocFile(string const & filename, int column) +void Buffer::makeLinuxDocFile(string const & fname, int column) { LyXParagraph * par = paragraph; @@ -2137,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, "\n\n"); + ofs << "\n\n"; } else { - fprintf(file, "\n\n", - params.preamble.c_str() ); + ofs << "\n\n"; } string userName(getUserName()); - fprintf(file, - "\n", userName.c_str(), (char *)date()); + ofs << "\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 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, "

"); + ofs << "

"; } - sgmlOpenTag(file, depth, style.latexname()); + sgmlOpenTag(ofs, depth, style.latexname()); break; case LATEX_COMMAND: @@ -2216,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, "

"); + sgmlCloseTag(ofs, depth, + environment_stack[depth]); + ofs << "

"; } environment_stack[depth].clear(); - sgmlOpenTag(file, depth, style.latexname()); + sgmlOpenTag(ofs, depth, style.latexname()); break; case LATEX_ENVIRONMENT: @@ -2230,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(); } @@ -2241,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; @@ -2255,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: @@ -2278,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; @@ -2359,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) { @@ -2403,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, "", stack[j]); + for (int j = pos; j >= 0; --j) + os << ""; /* 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, "", stack[j]); + for (int j = pos; (j >= 0) && (strcmp(stack[j], tag)); --j) + os << ""; // closes the tag - fprintf(file, "", tag); + os << ""; // 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; } @@ -2477,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; @@ -2536,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 { @@ -2555,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 { @@ -2569,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; } } @@ -2583,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 { @@ -2602,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 { @@ -2615,10 +2603,10 @@ void Buffer::SimpleLinuxDocOnePar(FILE * file, LyXParagraph * par, /* handle 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; } } @@ -2628,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; @@ -2645,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, ""); + linux_doc_line_break(os, char_line_count, 6); + os << ""; 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(); } } @@ -2668,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, "", stack[j]); + 3 + strlen(stack[j])); + os << ""; } /* resets description flag correctly */ switch(desc_on){ case 1: /* not closed... */ - linux_doc_line_break(file, char_line_count, 6); - fprintf(file, ""); + linux_doc_line_break(os, char_line_count, 6); + os << ""; break; case 2: /* fprintf(file, "

");*/ @@ -2709,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; @@ -2725,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, - "\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, - "\n", userName.c_str(), (char *)date()); + ofs << "\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(); @@ -2786,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(); @@ -2804,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; @@ -2824,17 +2809,17 @@ void Buffer::makeDocBookFile(string const & filename, int column) if(command_flag) { if(cmd_depth= 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 @@ -2849,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(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: @@ -2872,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; } @@ -2903,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; } @@ -2927,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()); @@ -2940,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 } @@ -3064,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 @@ -3122,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; @@ -3136,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); @@ -3156,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); @@ -3174,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); @@ -3193,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 @@ -3219,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); @@ -3239,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) { @@ -3261,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 @@ -3287,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); @@ -3307,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) { @@ -3329,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. @@ -3357,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; @@ -3374,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) { @@ -3391,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 @@ -3407,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(); @@ -3431,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(); @@ -3446,7 +3430,6 @@ void Buffer::insertErrors(TeXErrors & terr) continue; InsetError * new_inset = new InsetError(msgtxt); - text->SetCursorIntern(texrowpar, tmppos); text->InsertInset(new_inset); text->FullRebreak(); @@ -3456,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(); @@ -3475,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)) { @@ -3513,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: @@ -3544,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:" @@ -3556,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; jdepth; 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()); } @@ -3624,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; @@ -3764,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 @@ -3778,7 +3731,7 @@ void Buffer::insertInset(Inset * inset, string const & lout, text->SetCursorParUndo(); text->FreezeUndo(); - BeforeChange(); + beforeChange(); if (!lout.empty()) { update(-2); text->BreakParagraph(); @@ -3791,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) @@ -3818,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(); @@ -3829,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; @@ -3858,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; @@ -3890,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); } @@ -3924,9 +3877,9 @@ string Buffer::getBibkeyList(char delim) if (inset-> LyxCode() == Inset::BIBTEX_CODE) { if (!bibkeys.empty()) bibkeys += delim; - bibkeys += static_cast(inset)->getKeys(); + bibkeys += static_cast(inset)->getKeys(delim); } else if (inset-> LyxCode() == Inset::INCLUDE_CODE) { - string bk = static_cast(inset)->getKeys(); + string bk = static_cast(inset)->getKeys(delim); if (!bk.empty()) { if (!bibkeys.empty()) bibkeys += delim; @@ -3949,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) { @@ -3960,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); @@ -4006,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 +}