X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTocBackend.h;h=a38a972834f9c2155af1dbb6f1f512a3eb5a8efc;hb=88034d3d8987a9601b0779bf0115b5105b16fd6e;hp=2668eb0643335cf04b3ddfa507a7f18f8e003a7b;hpb=d5a5fbb8ee87d4a8ae1c55f9ba72819251bb6fb7;p=lyx.git diff --git a/src/TocBackend.h b/src/TocBackend.h index 2668eb0643..a38a972834 100644 --- a/src/TocBackend.h +++ b/src/TocBackend.h @@ -18,46 +18,34 @@ #include "DocIterator.h" #include "FuncRequest.h" #include "OutputEnums.h" +#include "Toc.h" +#include "TocBuilder.h" -#include "support/shared_ptr.h" #include "support/strfwd.h" - -#include -#include -#include -#include +#include "support/unique_ptr.h" namespace lyx { class Buffer; - -/* FIXME: toc types are currently identified by strings. It cannot be converted - * into an enum because of the user-configurable indexing categories and - * the user-definable float types provided by layout files. +/* Toc types are described by strings. They cannot be converted into an enum + * because of the user-configurable categories for index and the user-definable + * toc types provided in layout files. + * + * Here is a summary of built-in toc types + * + * Non-customizable (used without TocBuilder): "tableofcontents", "change", + * "citation", "label", "senseless". * - * I leave this for documentation purposes for the moment. + * Built-in but customizable (used with TocBuilder): "child", "graphics", + * "equation", "index", "index:", "nomencl", "listings", "math-macro", + * "external", any float type (as defined in the layouts). * -enum TocType { - TABLE_OF_CONTENTS,//"tableofcontents" - CHILD,//"child" - GRAPHICS,//"graphics" - NOTE,//"note" - BRANCH,//"branch" - CHANGE,//"change" - LABEL,//"label" - CITATION,//"citation" - EQUATION,//"equation" - FOOTNOTE,//"footnote" - MARGINAL_NOTE,//"marginalnote" - INDEX,//"index", "index:" (from interface) - NOMENCL,//"nomencl" - LISTING,//"listings" - FLOAT,//"figure", "table", "algorithm", user-defined (from layout?) - SENSELESS,//"senseless" - TOC_TYPE_COUNT -} + * The following are used for XHTML output: "tableofcontents" (InsetText), + * "citation" (InsetCitation), any float type. + * + * Other types are defined in the layouts. */ /// @@ -65,10 +53,6 @@ enum TocType { */ class TocItem { - friend class Toc; - friend class TocBackend; - friend class TocBuilder; - public: /// Default constructor for STL containers. TocItem() : dit_(0), depth_(0), output_(false) {} @@ -77,13 +61,10 @@ public: int depth, docstring const & s, bool output_active, - docstring const & t = docstring(), FuncRequest action = FuncRequest(LFUN_UNKNOWN_ACTION) ); /// - ~TocItem() {} - /// - int id() const; + DocIterator const & dit() const { return dit_; } /// int depth() const { return depth_; } /// @@ -91,29 +72,24 @@ public: /// void str(docstring const & s) { str_ = s; } /// - docstring const & tooltip() const; - /// String for display, e.g. it has a mark if output is inactive - docstring const asString() const; - /// - DocIterator const & dit() const { return dit_; } - /// bool isOutput() const { return output_; } /// void setAction(FuncRequest a) { action_ = a; } + /// custom action, or the default one (paragraph-goto) if not customised FuncRequest action() const; + /// + int id() const; + /// String for display, e.g. it has a mark if output is inactive + docstring const asString() const; -protected: +private: /// Current position of item. DocIterator dit_; - -private: /// nesting depth int depth_; /// Full item string docstring str_; - /// The tooltip string - docstring tooltip_; /// Is this item in a note, inactive branch, etc? bool output_; /// Custom action @@ -121,80 +97,16 @@ private: }; -/// -class Toc : public std::vector +/// Class to build and access the Tocs of a particular buffer. +class TocBackend { public: - typedef std::vector::const_iterator const_iterator; - typedef std::vector::iterator iterator; - const_iterator item(DocIterator const & dit) const; + static Toc::const_iterator findItem(Toc const & toc, + DocIterator const & dit); /// Look for a TocItem given its depth and string. /// \return The first matching item. /// \retval end() if no item was found. - iterator item(int depth, docstring const & str); -}; - -typedef Toc::const_iterator TocIterator; - - -/// Caption-enabled TOC builders -class TocBuilder -{ -public: - TocBuilder(shared_ptr const toc); - /// When entering a float - void pushItem(DocIterator const & dit, docstring const & s, - bool output_active, bool is_captioned = false); - /// When encountering a caption - void captionItem(DocIterator const & dit, docstring const & s, - bool output_active); - /// When exiting a float - void pop(); -private: - TocBuilder(){} - /// - struct frame { - Toc::size_type pos; - bool is_captioned; - }; - /// - shared_ptr const toc_; - /// - std::stack stack_; -}; - - -/// The ToC list. -/// A class and no typedef because we want to forward declare it. -class TocList : public std::map > -{ -private: - // this can create null pointers - using std::map >::operator[]; -}; - - -/// -class TocBuilderStore -{ -public: - TocBuilderStore() {}; - /// - shared_ptr get(std::string const & type, shared_ptr toc); - /// - void clear() { map_.clear(); }; -private: - typedef std::map > map_t; - map_t map_; -}; - - -/// -/** -*/ -class TocBackend -{ -public: + static Toc::iterator findItem(Toc & toc, int depth, docstring const & str); /// TocBackend(Buffer const * buffer) : buffer_(buffer) {} /// @@ -206,25 +118,38 @@ public: /// TocList const & tocs() const { return tocs_; } /// never null - shared_ptr toc(std::string const & type) const; - shared_ptr toc(std::string const & type); - /// nevel null - shared_ptr builder(std::string const & type); - /// Return the first Toc Item before the cursor - TocIterator item( - std::string const & type, ///< Type of Toc. - DocIterator const & dit ///< The cursor location in the document. - ) const; + std::shared_ptr toc(std::string const & type) const; + /// never null + std::shared_ptr toc(std::string const & type); + /// \return the current TocBuilder for the Toc of type \param type, or + /// creates one if it does not already exist. + TocBuilder & builder(std::string const & type); + /// \return the first Toc Item before the cursor. + /// \param type: Type of Toc. + /// \param dit: The cursor location in the document. + Toc::const_iterator + item(std::string const & type, DocIterator const & dit) const; /// void writePlaintextTocList(std::string const & type, odocstringstream & os, size_t max_length) const; + /// Localised name for type + docstring outlinerName(std::string const & type) const; + /// Add a new (localised) name if yet unknown + void addName(std::string const & type, docstring const & name); + /// Whether a toc type is less important and appears in the "Other lists" + /// submenu + static bool isOther(std::string const & type); private: + /// + void resetOutlinerNames(); /// TocList tocs_; /// - TocBuilderStore builders_; + std::map> builders_; + /// Stores localised outliner names from this buffer and its children + std::map outliner_names_; /// Buffer const * buffer_; }; // TocBackend