From 163d827729b90f1d4c4155109bd71b8bd86b9055 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Sun, 27 Jul 2008 17:46:27 +0000 Subject: [PATCH] Support for removing "default" modules. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@25917 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/Buffer.cpp | 3 +- src/BufferParams.cpp | 124 ++++++++++++++++++++---------- src/BufferParams.h | 23 +++++- src/frontends/qt4/GuiDocument.cpp | 21 +++++ 4 files changed, 125 insertions(+), 46 deletions(-) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 44e7b62a4c..6946237044 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -115,7 +115,7 @@ namespace os = support::os; namespace { -int const LYX_FORMAT = 338; //Uwe: support for polytonic Greek +int const LYX_FORMAT = 339; //rgh: removed modules typedef map DepClean; typedef map > RefCache; @@ -471,6 +471,7 @@ int Buffer::readHeader(Lexer & lex) params().fontsCJK.erase(); params().listings_params.clear(); params().clearLayoutModules(); + params().clearRemovedModules(); params().pdfoptions().clear(); for (int i = 0; i < 4; ++i) { diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index 2117e8059c..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 @@ -1445,33 +1458,44 @@ bool BufferParams::setBaseClass(string const & classname) 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); + // 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; } @@ -1541,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(); @@ -1560,12 +1577,6 @@ bool BufferParams::addLayoutModule(string const & modName) } -void BufferParams::clearLayoutModules() -{ - layoutModules_.clear(); -} - - Font const BufferParams::getFont() const { FontInfo f = documentClass().defaultfont(); @@ -1693,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; diff --git a/src/BufferParams.h b/src/BufferParams.h index fe85a3dab8..fbc5a7b925 100644 --- a/src/BufferParams.h +++ b/src/BufferParams.h @@ -23,6 +23,7 @@ #include "support/copied_ptr.h" +#include #include namespace lyx { @@ -51,6 +52,8 @@ class VSpace; */ class BufferParams { public: + /// + typedef std::vector LayoutModuleList; /// enum ParagraphSeparation { /// @@ -124,7 +127,11 @@ public: /// but it seems to be needed by CutAndPaste::putClipboard(). void setDocumentClass(DocumentClass const * const); /// List of modules in use - std::vector const & getModules() const; + LayoutModuleList const & getModules() const { return layoutModules_; } + /// List of default modules the user has removed + std::set const & getRemovedModules() const + { return removedModules_; } + /// /// Add a module to the list of modules in use. /// Returns true if module was successfully added. /// The makeClass variable signals whether to call makeDocumentClass. This @@ -132,8 +139,13 @@ public: /// the BufferParams do not represent the parameters for an actual buffer /// (as in GuiDocument). bool addLayoutModule(std::string const & modName); + /// + void addRemovedModule(std::string const & modName) + { removedModules_.insert(modName); } /// Clear the list - void clearLayoutModules(); + void clearLayoutModules() { layoutModules_.clear(); } + /// Clear the removed module list + void clearRemovedModules() { removedModules_.clear(); } /// returns the main font for the buffer (document) Font const getFont() const; @@ -327,15 +339,18 @@ private: void readBulletsLaTeX(Lexer &); /// void readModules(Lexer &); + /// + void readRemovedModules(Lexer &); /// for use with natbib CiteEngine cite_engine_; /// DocumentClass * doc_class_; - /// - typedef std::vector LayoutModuleList; /// LayoutModuleList layoutModules_; + /// this is for modules that are required by the document class but that + /// the user has chosen not to use + std::set removedModules_; /** Use the Pimpl idiom to hide those member variables that would otherwise * drag in other header files. diff --git a/src/frontends/qt4/GuiDocument.cpp b/src/frontends/qt4/GuiDocument.cpp index c5be6ef4e5..2a55c7f46b 100644 --- a/src/frontends/qt4/GuiDocument.cpp +++ b/src/frontends/qt4/GuiDocument.cpp @@ -1565,6 +1565,27 @@ void GuiDocument::apply(BufferParams & params) vector selModList; for (int i = 0; i < srows; ++i) params.addLayoutModule(modules_sel_model_.getIDString(i)); + // update the list of removed modules + params.clearRemovedModules(); + set const & reqmods = params.baseClass()->defaultModules(); + set::const_iterator rit = reqmods.begin(); + set::const_iterator ren = reqmods.end(); + // check each of the required modules + for (; rit != ren; rit++) { + vector::const_iterator mit = params.getModules().begin(); + vector::const_iterator men = params.getModules().end(); + bool found = false; + for (; mit != men; mit++) { + if (*rit == *mit) { + found = true; + break; + } + } + if (!found) { + // the module isn't present so must have been removed by the user + params.addRemovedModule(*rit); + } + } if (mathsModule->amsautoCB->isChecked()) { params.use_amsmath = BufferParams::package_auto; -- 2.39.2