]> git.lyx.org Git - lyx.git/blobdiff - src/TocBackend.cpp
Amend a754912 once more
[lyx.git] / src / TocBackend.cpp
index 1c1606608ebf884a8aeb2c58a252ac0b1f149539..a253d57ca337ec2903d4ecc6b9b8f5d9975e82e9 100644 (file)
 
 #include "Buffer.h"
 #include "BufferParams.h"
+#include "IndicesList.h"
 #include "InsetList.h"
 #include "Paragraph.h"
 #include "TextClass.h"
 
-#include "insets/InsetText.h"
+#include "insets/InsetArgument.h"
 
 #include "support/debug.h"
 #include "support/docstream.h"
@@ -161,7 +162,7 @@ bool TocBackend::updateItem(DocIterator const & dit_in)
                return false;
 
        if (toc("tableofcontents")->empty()) {
-               // FIXME: should not happen, 
+               // FIXME: should not happen,
                // a call to TocBackend::update() is missing somewhere
                LYXERR0("TocBackend::updateItem called but the TOC is empty!");
                return false;
@@ -180,18 +181,14 @@ bool TocBackend::updateItem(DocIterator const & dit_in)
        // FIXME: This is supposed to accomplish the same as the body of
        // InsetText::iterateForToc(), probably
        Paragraph & par = toc_item->dit().paragraph();
-       InsetList::const_iterator it = par.insetList().begin();
-       InsetList::const_iterator end = par.insetList().end();
-       for (; it != end; ++it) {
-               Inset & inset = *it->inset;
-               if (inset.lyxCode() == ARG_CODE) {
+       for (auto const & table : par.insetList())
+               if (InsetArgument const * arg = table.inset->asInsetArgument()) {
                        tocstring = par.labelString();
                        if (!tocstring.empty())
                                tocstring += ' ';
-                       inset.asInsetText()->text().forOutliner(tocstring,TOC_ENTRY_LENGTH);
+                       arg->text().forOutliner(tocstring,TOC_ENTRY_LENGTH);
                        break;
                }
-       }
 
        int const toclevel = toc_item->dit().text()->
                getTocLevel(toc_item->dit().pit());
@@ -213,9 +210,10 @@ void TocBackend::update(bool output_active, UpdateType utype)
                it->second->clear();
        tocs_.clear();
        builders_.clear();
+       resetOutlinerNames();
        if (!buffer_->isInternal()) {
                DocIterator dit;
-               buffer_->inset().addToToc(dit, output_active, utype);
+               buffer_->inset().addToToc(dit, output_active, utype, *this);
        }
 }
 
@@ -249,8 +247,56 @@ void TocBackend::writePlaintextTocList(string const & type,
 
 docstring TocBackend::outlinerName(string const & type) const
 {
-       return translateIfPossible(
-           buffer_->params().documentClass().outlinerName(type));
+       map<string, docstring>::const_iterator const it
+               = outliner_names_.find(type);
+       if (it != outliner_names_.end())
+               return it->second;
+
+       // Legacy treatment of index:... type
+       if (support::prefixIs(type, "index:")) {
+               string const itype = support::split(type, ':');
+               IndicesList const & indiceslist = buffer_->params().indiceslist();
+               Index const * index = indiceslist.findShortcut(from_utf8(itype));
+               docstring indextype = _("unknown type!");
+               if (index)
+                       indextype = index->index();
+               return support::bformat(_("Index Entries (%1$s)"), indextype);
+       }
+
+       LYXERR0("Missing OutlinerName for " << type << "!");
+       return from_utf8(type);
+}
+
+
+void TocBackend::resetOutlinerNames()
+{
+       outliner_names_.clear();
+       // names from this document class
+       for (pair<string, docstring> const & name
+                    : buffer_->params().documentClass().outlinerNames())
+               addName(name.first, translateIfPossible(name.second));
+       // Hardcoded types
+       addName("tableofcontents", _("Table of Contents"));
+       addName("change", _("Changes"));
+       addName("senseless", _("Senseless"));
+       addName("citation", _("Citations"));
+       addName("label", _("Labels and References"));
+       // Customizable, but the corresponding insets have no layout definition
+       addName("child", _("Child Documents"));
+       addName("graphics", _("Graphics"));
+       addName("equation", _("Equations"));
+       addName("external", _("External Material"));
+       addName("math-macro", _("Math Macros"));
+       addName("nomencl", _("Nomenclature Entries"));
+}
+
+
+void TocBackend::addName(string const & type, docstring const & name)
+{
+       if (name.empty())
+               return;
+       // only inserts if the key does not exist
+       outliner_names_.insert({type, name});
 }