X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferParams.cpp;h=95744c6669d896f8b034adda6f1797548cda2fd6;hb=d145c2dc9f27666ca0ed9f8589f99f502d7b2a4d;hp=bc818c39ddc42072c9c0e2cd734acc5bb41e1750;hpb=56a35c2c61401f1855e91c11142a5389bfc5572c;p=lyx.git diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index bc818c39dd..95744c6669 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -487,6 +487,8 @@ string BufferParams::readToken(Lexer & lex, string const & token, readLocalLayout(lex); } else if (token == "\\begin_modules") { readModules(lex); + } else if (token == "\\begin_removed_modules") { + readRemovedModules(lex); } else if (token == "\\options") { lex.eatLine(); options = lex.getString(); @@ -692,15 +694,26 @@ void BufferParams::writeFile(ostream & os) const os << "\\master " << master << '\n'; } - //the modules + // removed modules + if (!removedModules_.empty()) { + os << "\\begin_removed_modules" << '\n'; + set::const_iterator it = removedModules_.begin(); + set::const_iterator en = removedModules_.end(); + for (; it != en; it++) + os << *it << '\n'; + os << "\\end_removed_modules" << '\n'; + } + + // the modules if (!layoutModules_.empty()) { os << "\\begin_modules" << '\n'; LayoutModuleList::const_iterator it = layoutModules_.begin(); - for (; it != layoutModules_.end(); it++) + LayoutModuleList::const_iterator en = layoutModules_.end(); + for (; it != en; it++) os << *it << '\n'; os << "\\end_modules" << '\n'; } - + // local layout information if (!local_layout.empty()) { // remove '\n' from the end @@ -1428,16 +1441,63 @@ bool BufferParams::setBaseClass(string const & classname) bcl.addEmptyClass(classname); } - if (bcl[classname].load()) { - pimpl_->baseClass_ = classname; - return true; + bool const success = bcl[classname].load(); + if (!success) { + docstring s = + bformat(_("The document class %1$s could not be loaded."), + from_utf8(classname)); + frontend::Alert::error(_("Could not load class"), s); + return false; } - - docstring s = - bformat(_("The document class %1$s could not be loaded."), - from_utf8(classname)); - frontend::Alert::error(_("Could not load class"), s); - return false; + + pimpl_->baseClass_ = classname; + + // add any required modules not already in use + set const & mods = baseClass()->defaultModules(); + set::const_iterator mit = mods.begin(); + set::const_iterator men = mods.end(); + for (; mit != men; mit++) { + string const & modName = *mit; + // see if we're already in use + if (find(layoutModules_.begin(), layoutModules_.end(), modName) != + layoutModules_.end()) { + LYXERR(Debug::TCLASS, "Default module `" << modName << + "' not added because already used."); + continue; + } + // make sure the user hasn't removed it + if (find(removedModules_.begin(), removedModules_.end(), modName) != + removedModules_.end()) { + LYXERR(Debug::TCLASS, "Default module `" << modName << + "' not added because removed by user."); + continue; + } + // Now we want to check the list of selected modules to see if any of them + // exclude this one. + bool foundit = false; + // so iterate over the selected modules... + LayoutModuleList::const_iterator lit = layoutModules_.begin(); + LayoutModuleList::const_iterator len = layoutModules_.end(); + for (; lit != len; lit++) { + LyXModule * lm = moduleList[*lit]; + if (!lm) + continue; + vector const & exc = lm->getExcludedModules(); + // ...and see if this one excludes us. + if (find(exc.begin(), exc.end(), modName) != exc.end()) { + foundit = true; + LYXERR(Debug::TCLASS, "Default module `" << modName << + "' not added because excluded by loaded module `" << + *lit << "'."); + break; + } + } + if (!foundit) { + LYXERR(Debug::TCLASS, "Default module `" << modName << "' added."); + layoutModules_.push_back(modName); + } + } + return true; } @@ -1463,41 +1523,6 @@ void BufferParams::makeDocumentClass() doc_class_ = &(DocumentClassBundle::get().newClass(*baseClass())); - // add any required modules not already in use - set const & mods = baseClass()->defaultModules(); - set::const_iterator mit = mods.begin(); - set::const_iterator men = mods.end(); - for (; mit != men; mit++) { - string const & modName = *mit; - LayoutModuleList::const_iterator const fit = - find(layoutModules_.begin(), layoutModules_.end(), modName); - if (fit == layoutModules_.end()) { - // We need to make sure there's no module chosen that excludes this one - LayoutModuleList::const_iterator lit = layoutModules_.begin(); - LayoutModuleList::const_iterator len = layoutModules_.end(); - bool foundit = false; - // so iterate over the selected modules... - for (; lit != len; lit++) { - LyXModule * lm = moduleList[*lit]; - if (!lm) - continue; - vector const & exc = lm->getExcludedModules(); - // ...and see if one of them excludes us. - if (find(exc.begin(), exc.end(), modName) != exc.end()) { - foundit = true; - LYXERR(Debug::TCLASS, "Default module `" << modName << - "' not added because excluded by loaded module `" << - *lit << "'."); - break; - } - } - if (!foundit) { - LYXERR(Debug::TCLASS, "Default module `" << modName << "' added."); - layoutModules_.push_back(modName); - } - } - } - // FIXME It might be worth loading the children's modules here, // just as we load their bibliographies and such, instead of just // doing a check in InsetInclude. @@ -1540,13 +1565,6 @@ void BufferParams::makeDocumentClass() } -vector const & BufferParams::getModules() const -{ - return layoutModules_; -} - - - bool BufferParams::addLayoutModule(string const & modName) { LayoutModuleList::const_iterator it = layoutModules_.begin(); @@ -1559,12 +1577,6 @@ bool BufferParams::addLayoutModule(string const & modName) } -void BufferParams::clearLayoutModules() -{ - layoutModules_.clear(); -} - - Font const BufferParams::getFont() const { FontInfo f = documentClass().defaultfont(); @@ -1692,6 +1704,37 @@ void BufferParams::readModules(Lexer & lex) } +void BufferParams::readRemovedModules(Lexer & lex) +{ + if (!lex.eatLine()) { + lyxerr << "Error (BufferParams::readRemovedModules):" + "Unexpected end of input." << endl; + return; + } + while (true) { + string mod = lex.getString(); + if (mod == "\\end_removed_modules") + break; + removedModules_.insert(mod); + lex.eatLine(); + } + // now we want to remove any removed modules that were previously + // added. normally, that will be because default modules were added in + // setBaseClass(), which gets called when \textclass is read at the + // start of the read. + set::const_iterator rit = removedModules_.begin(); + set::const_iterator const ren = removedModules_.end(); + for (; rit != ren; rit++) { + LayoutModuleList::iterator const mit = layoutModules_.begin(); + LayoutModuleList::iterator const men = layoutModules_.end(); + LayoutModuleList::iterator found = find(mit, men, *rit); + if (found == men) + continue; + layoutModules_.erase(found); + } +} + + string BufferParams::paperSizeName(PapersizePurpose purpose) const { char real_papersize = papersize;