]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.cpp
comment
[lyx.git] / src / TextClass.cpp
index a1928c5163c2279cb95d4fbdafdea07fa550abc3..2e5087f31389aefaa168b586115868d09589c3ff 100644 (file)
@@ -141,7 +141,7 @@ TextClass::TextClass()
 }
 
 
-bool TextClass::readStyle(Lexer & lexrc, Layout & lay)
+bool TextClass::readStyle(Lexer & lexrc, Layout & lay) const
 {
        LYXERR(Debug::TCLASS, "Reading style " << to_utf8(lay.name()));
        if (!lay.read(lexrc, *this)) {
@@ -244,26 +244,8 @@ bool TextClass::read(FileName const & filename, ReadType rt)
        // Define the `empty' layout used in table cells, ert, etc. Note that 
        // we do this before loading any layout file, so that classes can 
        // override features of this layout if they should choose to do so.
-       if (rt == BASECLASS && !hasLayout(emptylayout_)) {
-               static char const * s = "Margin Static\n"
-                       "LatexType Paragraph\n"
-                       "LatexName dummy\n"
-                       "Align Block\n"
-                       "AlignPossible Left, Right, Center\n"
-                       "LabelType No_Label\n"
-                       "End";
-               istringstream ss(s);
-               Lexer lex(textClassTags);
-               lex.setStream(ss);
-               Layout lay;
-               lay.setName(emptylayout_);
-               if (!readStyle(lex, lay)) {
-                       // The only way this happens is because the hardcoded layout above
-                       // is wrong.
-                       LASSERT(false, /**/);
-               };
-               layoutlist_.push_back(lay);
-       }
+       if (rt == BASECLASS && !hasLayout(emptylayout_))
+               layoutlist_.push_back(createEmptyLayout(emptylayout_));
 
        Lexer lexrc(textClassTags);
        lexrc.setFile(filename);
@@ -921,7 +903,6 @@ bool TextClass::hasLayout(docstring const & n) const
 }
 
 
-
 Layout const & TextClass::operator[](docstring const & name) const
 {
        LASSERT(!name.empty(), /**/);
@@ -987,8 +968,9 @@ bool TextClass::load(string const & path) const
                return true;
 
        // Read style-file, provided path is searched before the system ones
-       FileName layout_file;
-       if (!path.empty())
+       // If path is a file, it is loaded directly.
+       FileName layout_file(path);
+       if (!path.empty() && !layout_file.isReadableFile())
                layout_file = FileName(addName(path, name_ + ".layout"));
        if (layout_file.empty() || !layout_file.exists())
                layout_file = libFileSearch("layouts", name_, "layout");
@@ -1006,8 +988,17 @@ bool TextClass::load(string const & path) const
 }
 
 
+void DocumentClass::addLayoutIfNeeded(docstring const & n) const
+{
+       if (!hasLayout(n))
+               layoutlist_.push_back(createEmptyLayout(n, true));
+}
+
+
 InsetLayout const & DocumentClass::insetLayout(docstring const & name) const 
 {
+       // FIXME The fix for the InsetLayout part of 4812 would be here:
+       // Add the InsetLayout to the document class if it is not found.
        docstring n = name;
        InsetLayouts::const_iterator cen = insetlayoutlist_.end();
        while (!n.empty()) {
@@ -1048,6 +1039,37 @@ bool TextClass::isPlainLayout(Layout const & layout) const
 }
 
 
+Layout TextClass::createEmptyLayout(docstring const & name, bool unknown) const
+{
+       static Layout * defaultLayout = NULL;
+
+       if (defaultLayout) {
+               defaultLayout->setUnknown(unknown);
+               defaultLayout->setName(name);
+               return *defaultLayout;
+       }
+
+       static char const * s = "Margin Static\n"
+                       "LatexType Paragraph\n"
+                       "LatexName dummy\n"
+                       "Align Block\n"
+                       "AlignPossible Left, Right, Center\n"
+                       "LabelType No_Label\n"
+                       "End";
+       istringstream ss(s);
+       Lexer lex(textClassTags);
+       lex.setStream(ss);
+       defaultLayout = new Layout;
+       defaultLayout->setUnknown(unknown);
+       defaultLayout->setName(name);
+       if (!readStyle(lex, *defaultLayout)) {
+               // The only way this happens is because the hardcoded layout above
+               // is wrong.
+               LASSERT(false, /**/);
+       };
+       return *defaultLayout;
+}
+
 /////////////////////////////////////////////////////////////////////////
 //
 // DocumentClassBundle