]> git.lyx.org Git - lyx.git/blobdiff - src/LayoutFile.cpp
Merge branch 'master' of git.lyx.org:lyx
[lyx.git] / src / LayoutFile.cpp
index e428b5d76f860e932e2d44906862925ddfd8bd03..8cca663c4b6ace8e872ace70304b801e2074afee 100644 (file)
@@ -268,7 +268,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 +277,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 +301,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 +339,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);
 }