Fix problem with static error list.

It's amazing we haven't seen problems with this before. The basic problem is that buf.errorList("whatever") would always return the same global, static error list, if it did not already exist. So, to a significant extent, there was only one global error list!

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@38978 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2011-06-07 23:45:33 +00:00
parent bbe40d71d6
commit cd2e50a275
8 changed files with 42 additions and 12 deletions

View File

@ -3154,9 +3154,9 @@ void Buffer::getSourceCode(odocstream & os, string const format,
}
ErrorList & Buffer::errorList(string const & type) const
ErrorList const & Buffer::errorList(string const & type) const
{
static ErrorList emptyErrorList;
static const ErrorList emptyErrorList;
map<string, ErrorList>::iterator it = d->errorLists.find(type);
if (it == d->errorLists.end())
return emptyErrorList;
@ -3165,6 +3165,12 @@ ErrorList & Buffer::errorList(string const & type) const
}
ErrorList & Buffer::errorList(string const & type)
{
return d->errorLists[type];
}
void Buffer::updateTocItem(std::string const & type,
DocIterator const & dit) const
{

View File

@ -562,7 +562,8 @@ public:
/// errors (like parsing or LateX compilation). This method is const
/// because modifying the returned ErrorList does not touch the document
/// contents.
ErrorList & errorList(std::string const & type) const;
ErrorList & errorList(std::string const & type);
ErrorList const & errorList(std::string const & type) const;
/// The Toc backend.
/// This is useful only for screen visualisation of the Buffer. This

View File

@ -647,13 +647,25 @@ void switchBetweenClasses(DocumentClass const * const oldone,
DocumentClass const & newtc = *newone;
// layouts
ParIterator it = par_iterator_begin(in);
ParIterator end = par_iterator_end(in);
for (ParIterator it = par_iterator_begin(in); it != end; ++it) {
// for remembering which layouts we've had to add
set<docstring> newlayouts;
for (; it != end; ++it) {
docstring const name = it->layout().name();
// the pasted text will keep their own layout name. If this layout does
// not exist in the new document, it will behave like a standard layout.
newtc.addLayoutIfNeeded(name);
bool const added_one = newtc.addLayoutIfNeeded(name);
if (added_one)
newlayouts.insert(name);
if (added_one || newlayouts.find(name) != newlayouts.end()) {
// Warn the user.
docstring const s = bformat(_("Layout `%1$s' was not found."), name);
errorlist.push_back(
ErrorItem(_("Layout Not Found"), s, it->id(), 0, it->size()));
}
if (in.usePlainLayout())
it->setLayout(newtc.plainLayout());

View File

@ -357,6 +357,13 @@ void Text::readParToken(Paragraph & par, Lexer & lex,
// all unknown layouts such as frame will be added to document class article so that
// these layouts can keep their original names.
tclass.addLayoutIfNeeded(layoutname);
bool const added_one = tclass.addLayoutIfNeeded(layoutname);
if (added_one) {
// Warn the user.
docstring const s = bformat(_("Layout `%1$s' was not found."), layoutname);
errorList.push_back(
ErrorItem(_("Layout Not Found"), s, par.id(), 0, par.size()));
}
par.setLayout(bp.documentClass()[layoutname]);

View File

@ -1221,10 +1221,13 @@ bool TextClass::load(string const & path) const
}
void DocumentClass::addLayoutIfNeeded(docstring const & n) const
bool DocumentClass::addLayoutIfNeeded(docstring const & n) const
{
if (!hasLayout(n))
layoutlist_.push_back(createBasicLayout(n, true));
if (hasLayout(n))
return false;
layoutlist_.push_back(createBasicLayout(n, true));
return true;
}

View File

@ -377,7 +377,8 @@ public:
/// a plain inset layout for use as a default
static InsetLayout const & plainInsetLayout() { return plain_insetlayout_; }
/// add a new layout \c name if it does not exist in layoutlist_
void addLayoutIfNeeded(docstring const & name) const;
/// \return whether we had to add one.
bool addLayoutIfNeeded(docstring const & name) const;
///////////////////////////////////////////////////////////////////
// accessors

View File

@ -1451,13 +1451,13 @@ void GuiView::errors(string const & error_type, bool from_master)
#if EXPORT_in_THREAD && (QT_VERSION >= 0x040400)
// We are called with from_master == false by default, so we
// have to figure out whether that is the case or not.
ErrorList & el = bv->buffer().errorList(error_type);
ErrorList & el = const_cast<ErrorList &>(bv->buffer().errorList(error_type));
if (el.empty()) {
el = bv->buffer().masterBuffer()->errorList(error_type);
from_master = true;
}
#else
ErrorList & el = from_master ?
ErrorList const & el = from_master ?
bv->buffer().masterBuffer()->errorList(error_type) :
bv->buffer().errorList(error_type);
#endif

View File

@ -627,7 +627,7 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const
"was not exported correctly.\nWarning: "
"LaTeX export is probably incomplete."),
included_file.displayName());
ErrorList & el = tmp->errorList("Export");
ErrorList const & el = tmp->errorList("Export");
if (!el.empty())
msg = bformat(from_ascii("%1$s\n\n%2$s\n\n%3$s"),
msg, el.begin()->error,