Author: rgheck
Date: Wed Jun  8 01:45:33 2011
New Revision: 38978
URL: http://www.lyx.org/trac/changeset/38978

Log:
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!

Modified:
   lyx-devel/trunk/src/Buffer.cpp
   lyx-devel/trunk/src/Buffer.h
   lyx-devel/trunk/src/CutAndPaste.cpp
   lyx-devel/trunk/src/Text.cpp
   lyx-devel/trunk/src/TextClass.cpp
   lyx-devel/trunk/src/TextClass.h
   lyx-devel/trunk/src/frontends/qt4/GuiView.cpp
   lyx-devel/trunk/src/insets/InsetInclude.cpp

Modified: lyx-devel/trunk/src/Buffer.cpp
==============================================================================
--- lyx-devel/trunk/src/Buffer.cpp      Tue Jun  7 19:14:38 2011        (r38977)
+++ lyx-devel/trunk/src/Buffer.cpp      Wed Jun  8 01:45:33 2011        (r38978)
@@ -3154,9 +3154,9 @@
 }
 
 
-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)
+{
+       return d->errorLists[type];
+}
+
+
 void Buffer::updateTocItem(std::string const & type,
        DocIterator const & dit) const
 {

Modified: lyx-devel/trunk/src/Buffer.h
==============================================================================
--- lyx-devel/trunk/src/Buffer.h        Tue Jun  7 19:14:38 2011        (r38977)
+++ lyx-devel/trunk/src/Buffer.h        Wed Jun  8 01:45:33 2011        (r38978)
@@ -562,7 +562,8 @@
        /// 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

Modified: lyx-devel/trunk/src/CutAndPaste.cpp
==============================================================================
--- lyx-devel/trunk/src/CutAndPaste.cpp Tue Jun  7 19:14:38 2011        (r38977)
+++ lyx-devel/trunk/src/CutAndPaste.cpp Wed Jun  8 01:45:33 2011        (r38978)
@@ -647,13 +647,25 @@
        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());

Modified: lyx-devel/trunk/src/Text.cpp
==============================================================================
--- lyx-devel/trunk/src/Text.cpp        Tue Jun  7 19:14:38 2011        (r38977)
+++ lyx-devel/trunk/src/Text.cpp        Wed Jun  8 01:45:33 2011        (r38978)
@@ -357,6 +357,13 @@
                // 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]);
 

Modified: lyx-devel/trunk/src/TextClass.cpp
==============================================================================
--- lyx-devel/trunk/src/TextClass.cpp   Tue Jun  7 19:14:38 2011        (r38977)
+++ lyx-devel/trunk/src/TextClass.cpp   Wed Jun  8 01:45:33 2011        (r38978)
@@ -1221,10 +1221,13 @@
 }
 
 
-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;
 }
 
 

Modified: lyx-devel/trunk/src/TextClass.h
==============================================================================
--- lyx-devel/trunk/src/TextClass.h     Tue Jun  7 19:14:38 2011        (r38977)
+++ lyx-devel/trunk/src/TextClass.h     Wed Jun  8 01:45:33 2011        (r38978)
@@ -377,7 +377,8 @@
        /// 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

Modified: lyx-devel/trunk/src/frontends/qt4/GuiView.cpp
==============================================================================
--- lyx-devel/trunk/src/frontends/qt4/GuiView.cpp       Tue Jun  7 19:14:38 
2011        (r38977)
+++ lyx-devel/trunk/src/frontends/qt4/GuiView.cpp       Wed Jun  8 01:45:33 
2011        (r38978)
@@ -1451,13 +1451,13 @@
 #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

Modified: lyx-devel/trunk/src/insets/InsetInclude.cpp
==============================================================================
--- lyx-devel/trunk/src/insets/InsetInclude.cpp Tue Jun  7 19:14:38 2011        
(r38977)
+++ lyx-devel/trunk/src/insets/InsetInclude.cpp Wed Jun  8 01:45:33 2011        
(r38978)
@@ -627,7 +627,7 @@
                                        "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,

Reply via email to