#include "gettext.h"
#include "language.h"
#include "exporter.h"
+#include "errorlist.h"
#include "Lsstream.h"
#include "format.h"
#include "BufferView.h"
#include "lyxtextclasslist.h"
#include "sgml.h"
#include "paragraph_funcs.h"
+#include "messages.h"
#include "author.h"
#include "frontends/LyXView.h"
#include "support/filetools.h"
#include "support/path.h"
#include "support/os.h"
+#include "support/tostr.h"
#include "support/lyxlib.h"
#include "support/FileInfo.h"
#include "support/lyxmanip.h"
#include <boost/bind.hpp>
#include <boost/tuple/tuple.hpp>
-#include "BoostFormat.h"
#include <fstream>
#include <iomanip>
users->buffer(0);
if (!tmppath.empty() && destroyDir(tmppath) != 0) {
-#if USE_BOOST_FORMAT
- boost::format fmt = _("Could not remove the temporary directory %1$s");
- fmt % tmppath;
- string msg = fmt.str();
-#else
- string msg = _("Could not remove the temporary directory ") + tmppath;
-#endif
- Alert::warning(_("Could not remove temporary directory"), msg);
+ Alert::warning(_("Could not remove temporary directory"),
+ bformat(_("Could not remove the temporary directory %1$s"), tmppath));
}
paragraphs.clear();
string const Buffer::getLatexName(bool no_path) const
{
string const name = ChangeExtension(MakeLatexName(fileName()), ".tex");
- if (no_path)
- return OnlyFilename(name);
- else
- return name;
+ return no_path ? OnlyFilename(name) : name;
}
void unknownClass(string const & unknown)
{
- string msg =
-#if USE_BOOST_FORMAT
- boost::io::str(boost::format(
- _("Using the default document class, because the "
- " class %1$s is unknown.")) % unknown);
-#else
- _("Using the default document class, because the "
- " class ") + unknown + (" is unknown.");
-#endif
- Alert::warning(_("Unknown document class"), msg);
+ Alert::warning(_("Unknown document class"),
+ bformat(_("Using the default document class, because the "
+ " class %1$s is unknown."), unknown));
}
} // anon
if (!params.getLyXTextClass().load()) {
string theclass = params.getLyXTextClass().name();
- string msg =
-#if USE_BOOST_FORMAT
- boost::io::str(boost::format(
- _("Using the default document class, because the "
- " class %1$s could not be loaded.")) % theclass);
-#else
- _("Using the default document class, because the "
- " class ") + theclass + (" could not be loaded.");
-#endif
- Alert::error(_("Can't load document class"), msg);
+ Alert::error(_("Can't load document class"), bformat(
+ "Using the default document class, because the "
+ " class %1$s could not be loaded.", theclass));
params.textclass = 0;
}
} else {
if (unknown_tokens > 0) {
-#if USE_BOOST_FORMAT
string s;
if (unknown_tokens == 1) {
- boost::format fmt(_("Encountered one unknown token when reading the document %1$s."));
- fmt % fileName();
- s = fmt.str();
- } else {
- boost::format fmt(_("Encountered %1$s unknown tokens when reading the document %2$s."));
- fmt % tostr(unknown_tokens);
- fmt % fileName();
- s = fmt.str();
- }
-#else
- string s = _("Encountered ");
- if (unknown_tokens == 1) {
- s += _("one unknown token");
+ s = bformat(_("Encountered one unknown token when reading "
+ "the document %1$s."), fileName());
} else {
- s += tostr(unknown_tokens);
- s += _(" unknown tokens");
+ s = bformat(_("Encountered %1$s unknown tokens when reading "
+ "the document %2$s."), tostr(unknown_tokens), fileName());
}
Alert::warning(_("Document format failure"), s);
-#endif
}
return the_end_read;
}
-int
-Buffer::readParagraph(LyXLex & lex, string const & token,
+int Buffer::readParagraph(LyXLex & lex, string const & token,
ParagraphList & pars, ParagraphList::iterator & pit,
Paragraph::depth_type & depth)
{
if (token == "\\layout") {
lex.pushToken(token);
- Paragraph * par = new Paragraph();
- par->params().depth(depth);
+ Paragraph par;
+ par.owningBuffer(*this);
+ par.params().depth(depth);
if (params.tracking_changes)
- par->trackChanges();
+ par.trackChanges();
LyXFont f(LyXFont::ALL_INHERIT, params.language);
- par->setFont(0, f);
+ par.setFont(0, f);
// FIXME: goddamn InsetTabular makes us pass a Buffer
// not BufferParams
- unknown += ::readParagraph(*this, *par, lex);
+ unknown += ::readParagraph(*this, par, lex);
// insert after
if (pit != pars.end())
// needed to insert the selection
-void Buffer::insertStringAsLines(Paragraph *& par, pos_type & pos,
+void Buffer::insertStringAsLines(ParagraphList::iterator & par, pos_type & pos,
LyXFont const & fn,string const & str)
{
LyXLayout_ptr const & layout = par->layout();
if (autobreakrows && (!par->empty() || layout->keepempty)) {
breakParagraph(params, paragraphs, par, pos,
layout->isEnvironment());
- par = par->next();
+ ++par;
pos = 0;
space_inserted = true;
} else {
bool Buffer::readFile(LyXLex & lex, string const & filename)
{
- return readFile(lex, filename, paragraphs.begin());
+ bool ret = readFile(lex, filename, paragraphs.begin());
+
+ // After we have read a file, we must ensure that the buffer
+ // language is set and used in the gui.
+ // If you know of a better place to put this, please tell me. (Lgb)
+ updateDocLang(params.language);
+
+ return ret;
}
// FIXME: all the below Alerts should give the filename..
-bool Buffer::readFile(LyXLex & lex, string const & filename, ParagraphList::iterator pit)
+bool Buffer::readFile(LyXLex & lex, string const & filename,
+ ParagraphList::iterator pit)
{
if (!lex.isOK()) {
Alert::error(_("Document could not be read"),
// this will write out all the paragraphs
// using recursive descent.
- ParagraphList::iterator pit = paragraphs.begin();
- ParagraphList::iterator pend = paragraphs.end();
+ ParagraphList::const_iterator pit = paragraphs.begin();
+ ParagraphList::const_iterator pend = paragraphs.end();
for (; pit != pend; ++pit)
pit->write(this, ofs, params, depth);
{
ofstream ofs(fname.c_str());
if (!ofs) {
- string const error = strerror(errno);
string const file = MakeDisplayPath(fname, 50);
-#if USE_BOOST_FORMAT
- boost::format fmt(_("Could not save the document\n%1$s\ndue to the error: %2$s"));
- fmt % file;
- fmt % error;
- string text = fmt.str();
-#else
- string text = _("Could not save the document\n");
- text += file + _(" due to the error: ");
- text += error;
-#endif
+ string text = bformat(_("Could not save the document\n%1$s."), file);
Alert::error(_("Could not save document"), text);
return;
}
void Buffer::makeLaTeXFile(string const & fname,
string const & original_path,
- bool nice, bool only_body, bool only_preamble)
+ LatexRunParams const & runparams,
+ bool only_body, bool only_preamble)
{
lyxerr[Debug::LATEX] << "makeLaTeXFile..." << endl;
ofstream ofs(fname.c_str());
if (!ofs) {
- string const error = strerror(errno);
string const file = MakeDisplayPath(fname, 50);
-#if USE_BOOST_FORMAT
- boost::format fmt(_("Could not open the specified document\n%1$s\ndue to the error: %2$s"));
- fmt % file;
- fmt % error;
- string text = fmt.str();
-#else
- string text = _("Could not open the specified document\n");
- text += file + _(" due to the error: ");
- text += error;
-#endif
+ string text = bformat(_("Could not open the specified document\n%1$s."),
+ file);
Alert::error(_("Could not open file"), text);
return;
}
- makeLaTeXFile(ofs, original_path, nice, only_body, only_preamble);
+ makeLaTeXFile(ofs, original_path,
+ runparams, only_body, only_preamble);
ofs.close();
if (ofs.fail()) {
void Buffer::makeLaTeXFile(ostream & os,
string const & original_path,
- bool nice, bool only_body, bool only_preamble)
+ LatexRunParams const & runparams_in,
+ bool only_body, bool only_preamble)
{
- niceFile = nice; // this will be used by Insetincludes.
+ LatexRunParams runparams = runparams_in;
+ niceFile = runparams.nice; // this will be used by Insetincludes.
// validate the buffer.
lyxerr[Debug::LATEX] << " Validating buffer..." << endl;
texrow.reset();
// The starting paragraph of the coming rows is the
// first paragraph of the document. (Asger)
- texrow.start(&*(paragraphs.begin()), 0);
+ texrow.start(paragraphs.begin()->id(), 0);
- if (!only_body && nice) {
+ if (!only_body && runparams.nice) {
os << "%% " << lyx_docversion << " created this file. "
"For more info, see http://www.lyx.org/.\n"
"%% Do not edit unless you really know what "
// original_path is set. This is done for usual tex-file, but not
// for nice-latex-file. (Matthias 250696)
if (!only_body) {
- if (!nice) {
+ if (!runparams.nice) {
// code for usual, NOT nice-latex-file
os << "\\batchmode\n"; // changed
// from \nonstopmode
}
// Write the preamble
- params.writeLaTeX(os, features, texrow);
+ runparams.use_babel = params.writeLaTeX(os, features, texrow);
if (only_preamble)
return;
texrow.newline();
}
- latexParagraphs(this, paragraphs, paragraphs.begin(), paragraphs.end(), os, texrow);
+ latexParagraphs(this, paragraphs, os, texrow, runparams);
// add this just in case after all the paragraphs
os << endl;
if (!ofs) {
string const file = MakeDisplayPath(fname, 50);
-#if USE_BOOST_FORMAT
- boost::format fmt(_("Could not save the specified document\n%1$s.\n"));
- fmt % file;
- string text = fmt.str();
-#else
- string text = _("Could not save the specified document\n");
- text += file + _(".\n");
-#endif
+ string text = bformat(_("Could not save the specified document\n%1$s.\n"),
+ file);
Alert::error(_("Could not save document"), text);
return;
}
<< " -->\n";
Paragraph::depth_type depth = 0; // paragraph depth
- Paragraph * par = &*(paragraphs.begin());
string item_name;
vector<string> environment_stack(5);
- while (par) {
- LyXLayout_ptr const & style = par->layout();
+ users->resetErrorList();
+
+ ParagraphList::iterator pit = paragraphs.begin();
+ ParagraphList::iterator pend = paragraphs.end();
+ for (; pit != pend; ++pit) {
+ LyXLayout_ptr const & style = pit->layout();
// treat <toc> as a special case for compatibility with old code
- if (par->isInset(0)) {
- Inset * inset = par->getInset(0);
+ if (pit->isInset(0)) {
+ Inset * inset = pit->getInset(0);
Inset::Code lyx_code = inset->lyxCode();
if (lyx_code == Inset::TOC_CODE) {
string const temp = "toc";
sgml::openTag(ofs, depth, false, temp);
-
- par = par->next();
continue;
}
}
// environment tag closing
- for (; depth > par->params().depth(); --depth) {
+ for (; depth > pit->params().depth(); --depth) {
sgml::closeTag(ofs, depth, false, environment_stack[depth]);
environment_stack[depth].erase();
}
// write opening SGML tags
switch (style->latextype) {
case LATEX_PARAGRAPH:
- if (depth == par->params().depth()
+ if (depth == pit->params().depth()
&& !environment_stack[depth].empty()) {
sgml::closeTag(ofs, depth, false, environment_stack[depth]);
environment_stack[depth].erase();
break;
case LATEX_COMMAND:
- if (depth!= 0)
- sgmlError(par, 0,
+ if (depth != 0)
+ sgmlError(pit, 0,
_("Error: Wrong depth for LatexType Command.\n"));
if (!environment_stack[depth].empty()) {
{
string const & latexname = style->latexname();
- if (depth == par->params().depth()
+ if (depth == pit->params().depth()
&& environment_stack[depth] != latexname) {
sgml::closeTag(ofs, depth, false,
environment_stack[depth]);
environment_stack[depth].erase();
}
- if (depth < par->params().depth()) {
- depth = par->params().depth();
+ if (depth < pit->params().depth()) {
+ depth = pit->params().depth();
environment_stack[depth].erase();
}
if (environment_stack[depth] != latexname) {
break;
}
- simpleLinuxDocOnePar(ofs, par, depth);
-
- par = par->next();
+ simpleLinuxDocOnePar(ofs, pit, depth);
ofs << "\n";
// write closing SGML tags
// we want this to be true outside previews (for insetexternal)
niceFile = true;
+
+ users->showErrorList(_("LinuxDoc"));
}
// Handle internal paragraph parsing -- layout already processed.
void Buffer::simpleLinuxDocOnePar(ostream & os,
- Paragraph * par,
- Paragraph::depth_type /*depth*/)
+ ParagraphList::iterator par,
+ Paragraph::depth_type /*depth*/) const
{
LyXLayout_ptr const & style = par->layout();
PAR_TAG tag_close = NONE;
list < PAR_TAG > tag_open;
- LyXFont const font = par->getFont(params, i);
+ LyXFont const font = par->getFont(params, i, outerFont(par, paragraphs));
if (font_old.family() != font.family()) {
switch (family_type) {
// Print an error message.
-void Buffer::sgmlError(Paragraph * /*par*/, int /*pos*/,
- string const & /*message*/) const
-{
-#ifdef WITH_WARNINGS
-#warning This is wrong we cannot insert an inset like this!!!
- // I guess this was Jose' so I explain you more or less why this
- // is wrong. This way you insert something in the paragraph and
- // don't tell it to LyXText (row rebreaking and undo handling!!!)
- // I deactivate this code, have a look at BufferView::insertErrors
- // how you should do this correctly! (Jug 20020315)
-#endif
-#if 0
- // insert an error marker in text
- InsetError * new_inset = new InsetError(message);
- par->insertInset(pos, new_inset, LyXFont(LyXFont::ALL_INHERIT,
- params.language));
-#endif
+void Buffer::sgmlError(ParagraphList::iterator pit, int pos,
+ string const & message) const
+{
+ users->addError(ErrorItem(message, string(), pit->id(), pos, pos));
}
ofstream ofs(fname.c_str());
if (!ofs) {
string const file = MakeDisplayPath(fname, 50);
-#if USE_BOOST_FORMAT
- boost::format fmt(_("Could not save the specified document\n%1$s.\n"));
- fmt % file;
- string text = fmt.str();
-#else
- string text = _("Could not save the specified document\n");
- text += file + _(".\n");
-#endif
+ string text = bformat(_("Could not save the specified document\n%1$s.\n"),
+ file);
Alert::error(_("Could not save document"), text);
return;
- return;
}
- Paragraph * par = &*(paragraphs.begin());
-
niceFile = nice; // this will be used by Insetincludes.
LaTeXFeatures features(params);
string item_name;
string command_name;
- while (par) {
+ users->resetErrorList();
+
+ ParagraphList::iterator par = paragraphs.begin();
+ ParagraphList::iterator pend = paragraphs.end();
+
+ for (; par != pend; ++par) {
string sgmlparam;
string c_depth;
string c_params;
simpleDocBookOnePar(ofs, par, desc_on,
depth + 1 + command_depth);
- par = par->next();
string end_tag;
// write closing SGML tags
// we want this to be true outside previews (for insetexternal)
niceFile = true;
+ users->showErrorList(_("DocBook"));
}
void Buffer::simpleDocBookOnePar(ostream & os,
- Paragraph * par, int & desc_on,
+ ParagraphList::iterator par, int & desc_on,
Paragraph::depth_type depth) const
{
bool emph_flag = false;
// parsing main loop
for (pos_type i = 0; i < par->size(); ++i) {
- LyXFont font = par->getFont(params, i);
+ LyXFont font = par->getFont(params, i, outerFont(par, paragraphs));
// handle <emphasis> tag
if (font_old.emph() != font.emph()) {
Path p(path); // path to LaTeX file
users->owner()->message(_("Running chktex..."));
- // Remove all error insets
- bool const removedErrorInsets = users->removeAutoInsets();
-
// Generate the LaTeX file if neccessary
- makeLaTeXFile(name, org_path, false);
+ LatexRunParams runparams;
+ runparams.flavor = LatexRunParams::LATEX;
+ runparams.nice = false;
+ makeLaTeXFile(name, org_path, runparams);
TeXErrors terr;
Chktex chktex(lyxrc.chktex_command, name, filePath());
_("Could not run chktex successfully."));
} else if (res > 0) {
// Insert all errors as errors boxes
- users->insertErrors(terr);
+ ErrorList el (*this, terr);
+ users->setErrorList(el);
+ users->showErrorList(_("ChkTeX"));
}
- // if we removed error insets before we ran chktex or if we inserted
- // error insets after we ran chktex, this must be run:
- if (removedErrorInsets || res) {
-#warning repaint needed here, or do you mean update() ?
- users->repaint();
- users->fitCursor();
- }
users->owner()->busy(false);
return res;
void Buffer::changeLanguage(Language const * from, Language const * to)
{
+ lyxerr << "Changing Language!" << endl;
+
+ // Take care of l10n/i18n
+ updateDocLang(to);
ParIterator end = par_iterator_end();
for (ParIterator it = par_iterator_begin(); it != end; ++it)
}
+void Buffer::updateDocLang(Language const * nlang)
+{
+ messages_.reset(new Messages(nlang->code()));
+}
+
+
bool Buffer::isMultiLingual()
{
ParIterator end = par_iterator_end();
}
-Paragraph * Buffer::getParFromID(int id) const
+ParIterator Buffer::getParFromID(int id) const
{
- if (id < 0)
- return 0;
+#warning FIXME: const correctness! (Andre)
+ ParIterator it = const_cast<Buffer*>(this)->par_iterator_begin();
+ ParIterator end = const_cast<Buffer*>(this)->par_iterator_end();
+
+#warning FIXME, perhaps this func should return a ParIterator? (Lgb)
+ if (id < 0) {
+ // John says this is called with id == -1 from undo
+ lyxerr << "getParFromID(), id: " << id << endl;
+ return end;
+ }
- // why should we allow < 0 ??
- //lyx::Assert(id >= 0);
+ for (; it != end; ++it)
+ if ((*it)->id() == id)
+ return it;
- ParConstIterator it(par_iterator_begin());
- ParConstIterator end(par_iterator_end());
+ return end;
+}
- for (; it != end; ++it) {
- // go on then, show me how to remove
- // the cast
- if ((*it)->id() == id) {
- return const_cast<Paragraph*>(*it);
- }
+
+bool Buffer::hasParWithID(int id) const
+{
+ ParIterator it(const_cast<Buffer*>(this)->par_iterator_begin());
+ ParIterator end(const_cast<Buffer*>(this)->par_iterator_end());
+
+ if (id < 0) {
+ // John says this is called with id == -1 from undo
+ lyxerr << "hasParWithID(), id: " << id << endl;
+ return 0;
}
- return 0;
+ for (; it != end; ++it)
+ if ((*it)->id() == id)
+ return true;
+
+ return false;
}
ParIterator Buffer::par_iterator_begin()
{
- return ParIterator(&*(paragraphs.begin()));
+ return ParIterator(paragraphs.begin(), paragraphs);
}
ParIterator Buffer::par_iterator_end()
{
- return ParIterator();
+ return ParIterator(paragraphs.end(), paragraphs);
}
ParConstIterator Buffer::par_iterator_begin() const
{
- return ParConstIterator(&*(paragraphs.begin()));
+ return ParConstIterator(const_cast<ParagraphList&>(paragraphs).begin(), paragraphs);
}
ParConstIterator Buffer::par_iterator_end() const
{
- return ParConstIterator();
+ return ParConstIterator(const_cast<ParagraphList&>(paragraphs).end(), paragraphs);
}
}
+string const Buffer::B_(string const & l10n) const
+{
+ if (messages_.get()) {
+ return messages_->get(l10n);
+ }
+
+ return _(l10n);
+}
+
+
bool Buffer::isClean() const
{
return lyx_clean;
Buffer::inset_iterator::inset_iterator()
- : pit(0), pend(0)
+ : pit(), pend()
{}
}
-Paragraph * Buffer::inset_iterator::getPar()
+ParagraphList::iterator Buffer::inset_iterator::getPar() const
{
- return &(*pit);
+ return pit;
}