#include <map>
#include <set>
#include <vector>
+#include <list>
namespace lyx {
// that was based upon the same DocumentClass. (Of course, if you
// really, REALLY want to make LayoutList a vector<Layout *>, then
// you can implement custom assignment and copy constructors.)
- typedef std::vector<Layout> LayoutList;
+ //
+ // NOTE: Layout pointers are directly assigned to paragraphs so a
+ // container that does not invalidate these pointers after insertion
+ // is needed.
+ typedef std::list<Layout> LayoutList;
/// The inset layouts available to this class
typedef std::map<docstring, InsetLayout> InsetLayouts;
///
///
bool isDefaultLayout(Layout const &) const;
///
- bool isEmptyLayout(Layout const &) const;
+ bool isPlainLayout(Layout const &) const;
/// returns a special layout for use when we don't really want one,
/// e.g., in table cells
Layout const & emptyLayout() const
// loading
///////////////////////////////////////////////////////////////////
/// Sees to it the textclass structure has been loaded
+ /// This function will search for $classname.layout in default directories
+ /// and an optional path, but if path points to a file, it will be loaded
+ /// directly.
bool load(std::string const & path = std::string()) const;
/// Has this layout file been loaded yet?
/// Overridden by DocumentClass
TextClass();
///
Layout & operator[](docstring const & vname);
-
+ /// Create an empty layout for this textclass.
+ /** \param unknown Set to true if this layout is a default layout used to
+ * represent an unknown layout
+ */
+ Layout createEmptyLayout(docstring const & name, bool unknown = false) const;
+
///////////////////////////////////////////////////////////////////
// non-const iterators
///////////////////////////////////////////////////////////////////
// members
///////////////////////////////////////////////////////////////////
/// Paragraph styles used in this layout
- LayoutList layoutlist_;
+ /// This variable is mutable because unknown layouts can be added
+ /// to const textclass.
+ mutable LayoutList layoutlist_;
/// Layout file name
std::string name_;
/// document class name
///
bool convertLayoutFormat(support::FileName const &, ReadType);
/// \return true for success.
- bool readStyle(Lexer &, Layout &);
+ bool readStyle(Lexer &, Layout &) const;
///
void readOutputType(Lexer &);
///
InsetLayout const & insetLayout(docstring const & name) const;
/// an empty inset layout for use as a default
static InsetLayout const & emptyInsetLayout() { return empty_insetlayout_; }
+ /// add an empty layout \c name if it does not exist in layoutlist_
+ void addLayoutIfNeeded(docstring const & name) const;
///////////////////////////////////////////////////////////////////
// accessors