From 7b4a9b95e3de7251268203bf20d6ee43211114b3 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Wed, 8 Jun 2011 00:53:19 +0000 Subject: [PATCH] Fix bug #7517. This restores some code removed when we started adding basic layouts we didn't recognize. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_2_0_X@38983 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/CutAndPaste.cpp | 16 ++++++++++++++-- src/Text.cpp | 7 +++++++ src/TextClass.cpp | 9 ++++++--- src/TextClass.h | 3 ++- status.20x | 2 ++ 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/CutAndPaste.cpp b/src/CutAndPaste.cpp index 39b732fea6..2bac66f8a6 100644 --- a/src/CutAndPaste.cpp +++ b/src/CutAndPaste.cpp @@ -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 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()); diff --git a/src/Text.cpp b/src/Text.cpp index 1da59db4c8..7da48185c8 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -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]); diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 00558d5862..c9cbcae5e0 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -1199,10 +1199,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; } diff --git a/src/TextClass.h b/src/TextClass.h index f3d2197278..6e20650cc2 100644 --- a/src/TextClass.h +++ b/src/TextClass.h @@ -373,7 +373,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 diff --git a/status.20x b/status.20x index 3ce244841a..e03757eb4f 100644 --- a/status.20x +++ b/status.20x @@ -70,6 +70,8 @@ What's new - Fix output of decimally aligned columns in unviewed (on screen) tables. +- Inform user of unknown layouts caused by class change (bug 7571). + - Avoid LaTeX errors if font changing commands are used in the wrong mode by assuring to switch to the right mode on export.