* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
- * \author Richard Heck
+ * \author Richard Kimberly Heck
*
* Full author contact details are available in file CREDITS.
*/
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:
///
{ 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<std::string> 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<std::string> 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<std::string> 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<std::string> lml_;
};
-}
+} // namespace lyx
#endif