]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.cpp
Tooltips for collapsables and branches
[lyx.git] / src / TextClass.cpp
index 51084095a53d53d6d8af9d1c458ade229d8f6045..7a51403dd365596c1e34872fa3d7d6bcbea834df 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "frontends/alert.h"
 
+#include "support/ExceptionMessage.h"
 #include "support/lstrings.h"
 #include "support/FileName.h"
 #include "support/filetools.h"
@@ -86,6 +87,21 @@ bool layout2layout(FileName const & filename, FileName const & tempfile)
        return true;
 }
 
+
+std::string translateRT(TextClass::ReadType rt) 
+{
+       switch (rt) {
+       case TextClass::BASECLASS:
+               return "textclass";
+       case TextClass::MERGE:
+               return "input file";
+       case TextClass::MODULE:
+               return "module file";
+       }
+       // shutup warning
+       return string();
+}
+
 } // namespace anon
 
 
@@ -199,20 +215,8 @@ bool TextClass::read(FileName const & filename, ReadType rt)
                { "tocdepth",        TC_TOCDEPTH }
        };
 
-       switch (rt) {
-       case BASECLASS:
-               LYXERR(Debug::TCLASS, "Reading textclass ");
-               break;
-       case MERGE:
-               LYXERR(Debug::TCLASS, "Reading input file ");
-               break;
-       case MODULE:
-               LYXERR(Debug::TCLASS, "Reading module file ");
-               break;
-       default:
-               BOOST_ASSERT(false);
-       }
-       LYXERR(Debug::TCLASS, to_utf8(makeDisplayPath(filename.absFilename())));
+       LYXERR(Debug::TCLASS, "Reading " + translateRT(rt) + ": " +
+               to_utf8(makeDisplayPath(filename.absFilename())));
 
        Lexer lexrc(textClassTags,
                sizeof(textClassTags) / sizeof(textClassTags[0]));
@@ -258,8 +262,7 @@ bool TextClass::read(FileName const & filename, ReadType rt)
                                                            "layout");
 
                                if (tmp.empty()) {
-                                       lexrc.printError("Could not find input"
-                                                        "file: " + inc);
+                                       lexrc.printError("Could not find input file: " + inc);
                                        error = true;
                                } else if (read(tmp, MERGE)) {
                                        lexrc.printError("Error reading input"
@@ -395,13 +398,9 @@ bool TextClass::read(FileName const & filename, ReadType rt)
 
                case TC_REQUIRES: {
                        lexrc.eatLine();
-                       string const packages = lexrc.getString();
-                       vector<string> req = getVectorFromString(packages);
-                       for (vector<string>::const_iterator it = req.begin();
-                            it != req.end(); ++it) {
-                               if (find(requires_.begin(), requires_.end(), *it) == requires_.end())
-                                       requires_.push_back(*it);
-                       }
+                       vector<string> const req 
+                               = getVectorFromString(lexrc.getString());
+                       requires_.insert(req.begin(), req.end());
                        break;
                }
 
@@ -455,41 +454,61 @@ bool TextClass::read(FileName const & filename, ReadType rt)
                return error;
        }
 
-       if (rt == MODULE) 
-               LYXERR(Debug::TCLASS, "Finished reading module file "
-                               << to_utf8(makeDisplayPath(filename.absFilename())));
-       else if (rt == MERGE)
-               LYXERR(Debug::TCLASS, "Finished reading input file "
-                               << to_utf8(makeDisplayPath(filename.absFilename())));
-       else { // we are at top level here.
-               LYXERR(Debug::TCLASS, "Finished reading textclass "
-                                     << to_utf8(makeDisplayPath(filename.absFilename())));
-               if (defaultlayout_.empty()) {
-                       lyxerr << "Error: Textclass '" << name_
-                              << "' is missing a defaultstyle." << endl;
+       LYXERR(Debug::TCLASS, "Finished reading " + translateRT(rt) + ": " +
+                       to_utf8(makeDisplayPath(filename.absFilename())));
+
+       if (rt != BASECLASS) 
+               return error;
+
+       if (defaultlayout_.empty()) {
+               lyxerr << "Error: Textclass '" << name_
+                                               << "' is missing a defaultstyle." << endl;
+               error = true;
+       }
+               
+       //Try to erase "stdinsets" from the provides_ set. 
+       //The
+       //  Provides stdinsets 1
+       //declaration simply tells us that the standard insets have been
+       //defined. (It's found in stdinsets.inc but could also be used in
+       //user-defined files.) There isn't really any such package. So we
+       //might as well go ahead and erase it.
+       //If we do not succeed, then it was not there, which means that
+       //the textclass did not provide the definitions of the standard
+       //insets. So we need to try to load them.
+       int erased = provides_.erase("stdinsets");
+       if (!erased) {
+               FileName tmp = libFileSearch("layouts", "stdinsets.inc");
+
+               if (tmp.empty()) {
+                       throw ExceptionMessage(WarningException, _("Missing File"),
+                               _("Could not find stdinsets.inc! This may lead to data loss!"));
+                       error = true;
+               } else if (read(tmp, MERGE)) {
+                       throw ExceptionMessage(WarningException, _("Corrupt File"),
+                                       _("Could not read stdinsets.inc! This may lead to data loss!"));
                        error = true;
                }
+       }
 
-               min_toclevel_ = Layout::NOT_IN_TOC;
-               max_toclevel_ = Layout::NOT_IN_TOC;
-               const_iterator cit = begin();
-               const_iterator the_end = end();
-               for ( ; cit != the_end ; ++cit) {
-                       int const toclevel = (*cit)->toclevel;
-                       if (toclevel != Layout::NOT_IN_TOC) {
-                               if (min_toclevel_ == Layout::NOT_IN_TOC)
-                                       min_toclevel_ = toclevel;
-                               else
-                                       min_toclevel_ = min(min_toclevel_,
-                                                        toclevel);
-                               max_toclevel_ = max(max_toclevel_,
-                                                        toclevel);
-                       }
+       min_toclevel_ = Layout::NOT_IN_TOC;
+       max_toclevel_ = Layout::NOT_IN_TOC;
+       const_iterator cit = begin();
+       const_iterator the_end = end();
+       for ( ; cit != the_end ; ++cit) {
+               int const toclevel = (*cit)->toclevel;
+               if (toclevel != Layout::NOT_IN_TOC) {
+                       if (min_toclevel_ == Layout::NOT_IN_TOC)
+                               min_toclevel_ = toclevel;
+                       else
+                               min_toclevel_ = min(min_toclevel_,
+                                                       toclevel);
+                       max_toclevel_ = max(max_toclevel_,
+                                                       toclevel);
                }
-               LYXERR(Debug::TCLASS, "Minimum TocLevel is " << min_toclevel_
-                       << ", maximum is " << max_toclevel_);
-
        }
+       LYXERR(Debug::TCLASS, "Minimum TocLevel is " << min_toclevel_
+               << ", maximum is " << max_toclevel_);
 
        return error;
 }
@@ -663,7 +682,7 @@ void TextClass::readInsetLayout(Lexer & lexrc, docstring const & name)
        FontInfo labelfont = inherit_font;
        ColorCode bgcolor(Color_background);
        string preamble;
-       vector<string> requires;
+       set<string> requires;
        bool multipar = false;
        bool passthru = false;
        bool needprotect = false;
@@ -748,8 +767,9 @@ void TextClass::readInsetLayout(Lexer & lexrc, docstring const & name)
                        break;
                case IL_REQUIRES: {
                        lexrc.eatLine();
-                       string const packages = lexrc.getString();
-                       requires = getVectorFromString(packages);
+                       vector<string> const req 
+                               = getVectorFromString(lexrc.getString());
+                       requires.insert(req.begin(), req.end());
                        break;
                }
                case IL_END: