X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextClassList.cpp;h=e1f3a27f5774d814cf8d0d6a68f38dda24e25683;hb=4056f0ddb150d0e5d60bc5941d51e365eed0ac86;hp=02d065df6608fdc914f6dfc1159fa4c031dc5ba2;hpb=9d0ea8aeff32833a90b3fe64df0c5518a9e241be;p=lyx.git diff --git a/src/TextClassList.cpp b/src/TextClassList.cpp index 02d065df66..e1f3a27f57 100644 --- a/src/TextClassList.cpp +++ b/src/TextClassList.cpp @@ -13,9 +13,10 @@ #include "TextClassList.h" #include "TextClass.h" -#include "support/debug.h" #include "Lexer.h" +#include "support/debug.h" +#include "support/FileName.h" #include "support/filetools.h" #include @@ -23,30 +24,17 @@ #include +using namespace std; +using namespace lyx::support; namespace lyx { -using support::FileName; -using support::addName; -using support::libFileSearch; -using support::makeDisplayPath; - using boost::bind; using boost::regex; using boost::smatch; -using std::endl; -using std::equal_to; -using std::find_if; -using std::make_pair; -using std::sort; -using std::string; -using std::pair; -using std::ifstream; - - // Gets textclass number from name -pair const +pair const TextClassList::numberOfClass(string const & textclass) const { ClassList::const_iterator cit = @@ -56,14 +44,24 @@ TextClassList::numberOfClass(string const & textclass) const textclass)); return cit != classlist_.end() ? - make_pair(true, textclass_type(cit - classlist_.begin())) : - make_pair(false, textclass_type(0)); + make_pair(true, TextClassIndex(cit - classlist_.begin())) : + make_pair(false, TextClassIndex(0)); } // Gets a textclass structure from number TextClass const & -TextClassList::operator[](textclass_type textclass) const +TextClassList::operator[](TextClassIndex textclass) const +{ + if (textclass >= classlist_.size()) + return classlist_[0]; + + //FIXME I don't believe the following line is actually necessary (rgh) + classlist_[textclass].load(); + return classlist_[textclass]; +} + +TextClass & TextClassList::at(TextClassIndex textclass) { if (textclass >= classlist_.size()) return classlist_[0]; @@ -76,7 +74,7 @@ TextClassList::operator[](textclass_type textclass) const // used when sorting the textclass list. class less_textclass_avail_desc - : public std::binary_function + : public binary_function { public: int operator()(TextClass const & tc1, @@ -97,7 +95,7 @@ public: bool TextClassList::read() { Lexer lex(0, 0); - support::FileName const real_file = libFileSearch("", "textclass.lst"); + FileName const real_file = libFileSearch("", "textclass.lst"); LYXERR(Debug::TCLASS, "Reading textclasses from `" << real_file << '\''); if (real_file.empty()) { @@ -176,7 +174,8 @@ bool TextClassList::read() } -void TextClassList::reset(textclass_type const textclass) { +void TextClassList::reset(TextClassIndex const & textclass) +{ if (textclass >= classlist_.size()) return; TextClass const & tc = classlist_[textclass]; @@ -186,8 +185,8 @@ void TextClassList::reset(textclass_type const textclass) { } -std::pair const -TextClassList::addTextClass(std::string const & textclass, std::string const & path) +pair const +TextClassList::addTextClass(string const & textclass, string const & path) { // only check for textclass.layout file, .cls can be anywhere in $TEXINPUTS // NOTE: latex class name is defined in textclass.layout, which can be different from textclass @@ -209,18 +208,25 @@ TextClassList::addTextClass(std::string const & textclass, std::string const & p if (regex_match(line, sub, reg)) { // returns: whole string, classtype (not used here), first option, description BOOST_ASSERT(sub.size()==4); - // now, add the layout to textclass. + // now, create a TextClass with description containing path information TextClass tmpl(textclass, sub.str(2)==""?textclass:sub.str(2), sub.str(3) + " <" + path + ">", true); if (lyxerr.debugging(Debug::TCLASS)) tmpl.load(path); + // Do not add this local TextClass to classlist_ if it has + // already been loaded by, for example, a master buffer. + pair pp = + textclasslist.numberOfClass(textclass); + // only layouts from the same directory are considered to be identical. + if (pp.first && classlist_[pp.second].description() == tmpl.description()) + return pp; classlist_.push_back(tmpl); return make_pair(true, classlist_.size() - 1); } } } // If .layout is not in local directory, or an invalid layout is found, return false - return make_pair(false, textclass_type(0)); + return make_pair(false, TextClassIndex(0)); } @@ -228,7 +234,7 @@ TextClassList::addTextClass(std::string const & textclass, std::string const & p TextClassList textclasslist; -textclass_type defaultTextclass() +TextClassIndex defaultTextclass() { // We want to return the article class. if `first' is // true in the returned pair, then `second' is the textclass