X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayoutFile.cpp;h=771a9c49263e0d637534c37b0ed5ac163d011eaa;hb=63e2ac459745c1f5a650edf1b59fa7f9ff7f680c;hp=e428b5d76f860e932e2d44906862925ddfd8bd03;hpb=f09a9fe2e60e4aeaca23b42b2bf30f5d64cfd9b1;p=lyx.git diff --git a/src/LayoutFile.cpp b/src/LayoutFile.cpp index e428b5d76f..771a9c4926 100644 --- a/src/LayoutFile.cpp +++ b/src/LayoutFile.cpp @@ -27,7 +27,6 @@ #include "support/lassert.h" #include "support/lstrings.h" -#include "support/bind.h" #include "support/regex.h" #include "support/TempFile.h" @@ -268,7 +267,7 @@ LayoutFileIndex LayoutFileList::addEmptyClass(string const & textclass) LayoutFileIndex LayoutFileList::addLocalLayout( - string const & textclass, string const & path) + string const & textclass, string const & path, string const & oldpath) { // FIXME There is a bug here: 4593 // @@ -277,10 +276,22 @@ LayoutFileIndex LayoutFileList::addLocalLayout( // different from textclass string fullName = addName(path, textclass + ".layout"); - FileName const layout_file(fullName); - - if (!layout_file.exists()) - return string(); + FileName layout_file(fullName); + bool moved = false; + + if (!layout_file.exists()) { + if (oldpath.empty()) + return string(); + // The document has been moved to a different directory. + // However, oldpath always points to the right spot, unless + // the user also moved the layout file. + fullName = addName(oldpath, textclass + ".layout"); + layout_file.set(fullName); + layout_file.refresh(); + if (!layout_file.exists()) + return string(); + moved = true; + } LYXERR(Debug::TCLASS, "Adding class " << textclass << " from directory " << path); // Read .layout file and get description, real latex classname etc @@ -289,9 +300,9 @@ LayoutFileIndex LayoutFileList::addLocalLayout( // which uses the following regex // \Declare(LaTeX|DocBook)Class\s*(\[([^,]*)(,.*)*\])*\s*{(.*)} ifstream ifs(layout_file.toFilesystemEncoding().c_str()); - static regex const reg("^#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*" + static regex const reg("^\\s*#\\s*\\\\Declare(LaTeX|DocBook)Class\\s*" "(?:\\[([^,]*)(?:,.*)*\\])*\\s*\\{(.*)\\}\\s*"); - static regex const catreg("^#\\s*\\\\DeclareCategory\\{(.*)\\}"); + static regex const catreg("^\\s*#\\s*\\\\DeclareCategory\\{(.*)\\}\\s*"); string line; string class_name; string class_prereq; @@ -327,15 +338,18 @@ LayoutFileIndex LayoutFileList::addLocalLayout( // This textclass is added on request so it will definitely be // used. Load it now because other load() calls may fail if they // are called in a context without buffer path information. - tmpl->load(path); + tmpl->load(moved ? oldpath : path); // There will be only one textclass with this name, even if different // layout files are loaded from different directories. if (haveClass(textclass)) { - LYXERR0("Existing textclass " << textclass << " is redefined by " << fullName); + // Unconditionally issuing the warning may be confusing when + // saving the document with a different name, as it is exactly + // the same textclass that is being re-established. + LYXERR(Debug::TCLASS, "Existing textclass " << textclass << " is redefined by " << fullName); delete classmap_[textclass]; } classmap_[textclass] = tmpl; - return textclass; + return removeExtension(fullName); }