X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayoutModuleList.h;h=aa9925109d9c6ab25979d60e1bab419df79fd001;hb=801d7dc9f42baf331642606a6641606779985439;hp=9229f80f6b7fd6d049a9725ad029587c39a3280b;hpb=08d7f7885a007a03bf958d2ba2b402a1a53c5bf2;p=lyx.git diff --git a/src/LayoutModuleList.h b/src/LayoutModuleList.h index 9229f80f6b..aa9925109d 100644 --- a/src/LayoutModuleList.h +++ b/src/LayoutModuleList.h @@ -17,6 +17,14 @@ namespace lyx { +class LayoutFile; + +/** + Represents a list of modules, such as might be associated with + a particular document. Provides methods for adding modules, checking + if a module can be added, and, importantly, adapting the list to a + new DocumentClass. +*/ class LayoutModuleList { public: /// @@ -42,13 +50,59 @@ public: { return lml_.insert(pos, str); } /// void push_back(std::string const & str) { lml_.push_back(str); } - /// + /// size_t size() const { return lml_.size(); } /// This is needed in GuiDocument. It seems better than an /// implicit conversion. std::list const & list() const { return lml_; } + /// Checks to make sure module's requriements are satisfied, that it does + /// not conflict with already-present modules, isn't already loaded, etc. + bool moduleCanBeAdded(std::string const & modName, + LayoutFile const * const lay) const; + /// Like !moduleCanBeAdded(), but does not check requirements + bool moduleConflicts(std::string const & modName, + LayoutFile const * const lay) const; + /// If the user changes the base class for a given document, then the + /// associated module list has to be updated. This just calls + /// (i) removeBadModules() + /// (ii) addDefaultModules() + /// (iii) checkModuleConsistency() + /// in that order, for which see below. + /// \param lay The new base class. + /// \param removedModules Modules the user explicitly removed and so + /// which should not be included. + /// \return true if no changes had to be made, false if some did have + /// to be made. + bool adaptToBaseClass(LayoutFile const * const lay, + std::list const & removedModules); + /// + bool operator==(LayoutModuleList const & other) const { + return lml_ == other.lml_; + } + /// + bool operator!=(LayoutModuleList const & other) const { + return !operator==(other); + } private: + /// Removes modules excluded by, provided by, etc, the base class. + /// \param lay The document class against which to check. + /// \return true, if modules were consistent, false if changes had + /// to be made. + bool removeBadModules(LayoutFile const * const lay); + /// Adds default modules, if they're addable. + /// \param lay The base class from which to get default modules. + /// \param removedModules Modules the user has explicitly removed. + void addDefaultModules(LayoutFile const * const lay, + std::list removedModules); + /// Checks for consistency among modules: makes sure requirements + /// are met, no modules exclude one another, etc, and resolves any + /// such conflicts, leaving us with a consistent collection. + /// \param lay The base class against which to check. + /// \return true if modules were consistent, false if changes had + /// to be made. + bool checkModuleConsistency(LayoutFile const * const lay); + /// std::list lml_; }; -} +} // namespace lyx #endif