]> git.lyx.org Git - lyx.git/blobdiff - src/TocBackend.C
Scons: update_po target, part one: language_l10n.pot
[lyx.git] / src / TocBackend.C
index 841c4cf090d175da8363592a9443357a743d867c..6b12ad2bee7fa1d4b60b02bc08b1153bb458fdc6 100644 (file)
@@ -121,24 +121,47 @@ Toc const & TocBackend::toc(std::string const & type) const
 }
 
 
-bool TocBackend::addType(std::string const & type)
+void TocBackend::updateItem(ParConstIterator const & par_it)
 {
-       // Is the type already supported?
-       TocList::iterator toclist_it = tocs_.find(type);
-       if (toclist_it != tocs_.end())
-               return false;
+       BufferParams const & bufparams = buffer_->params();
+       const int min_toclevel = bufparams.getLyXTextClass().min_toclevel();
+
+       TocIterator toc_item = item("tableofcontents", par_it);
+
+       docstring tocstring;
+
+       // For each paragraph, traverse its insets and let them add
+       // their toc items
+       InsetList::const_iterator it = toc_item->par_it_->insetlist.begin();
+       InsetList::const_iterator end = toc_item->par_it_->insetlist.end();
+       for (; it != end; ++it) {
+               InsetBase & inset = *it->inset;
+               if (inset.lyxCode() == InsetBase::OPTARG_CODE) {
+                       if (!tocstring.empty())
+                               break;
+                       Paragraph const & par = 
+                               *static_cast<InsetOptArg&>(inset).paragraphs().begin();
+                       if (!toc_item->par_it_->getLabelstring().empty())
+                               tocstring = toc_item->par_it_->getLabelstring() + ' ';
+                       tocstring += par.asString(*buffer_, false);
+                       break;
+               }
+       }
 
-       tocs_.insert(make_pair(type, Toc()));
-       types_.push_back(type);
+       int const toclevel = toc_item->par_it_->layout()->toclevel;
+       if (toclevel != LyXLayout::NOT_IN_TOC
+           && toclevel >= min_toclevel
+           && toclevel <= bufparams.tocdepth
+               && tocstring.empty())
+                       tocstring = toc_item->par_it_->asString(*buffer_, true);
 
-       return true;
+       const_cast<TocItem &>(*toc_item).str_ = tocstring;
 }
 
 
 void TocBackend::update()
 {
        tocs_.clear();
-       types_.clear();
 
        BufferParams const & bufparams = buffer_->params();
        const int min_toclevel = bufparams.getLyXTextClass().min_toclevel();
@@ -186,10 +209,6 @@ void TocBackend::update()
                                TocItem(pit, toclevel - min_toclevel, tocstring));
                }
        }
-
-       TocList::iterator it = tocs_.begin();
-       for (; it != tocs_.end(); ++it)
-               types_.push_back(it->first);
 }
 
 
@@ -203,8 +222,19 @@ TocIterator const TocBackend::item(
        Toc const & toc_vector = toclist_it->second;
        TocIterator last = toc_vector.begin();
        TocIterator it = toc_vector.end();
+       if (it == last)
+               return it;
+
        --it;
 
+       ParConstIterator par_it_text = par_it;
+       if (par_it_text.inMathed())
+               // It would be better to do
+               //   par_it_text.backwardInset();
+               // but this method does not exist.
+               while (par_it_text.inMathed())
+                       par_it_text.backwardPos();
+
        for (; it != last; --it) {
                
                // A good solution for Items inside insets would be to do:
@@ -215,7 +245,7 @@ TocIterator const TocBackend::item(
                // But for an unknown reason, std::distance(current, it->par_it_) always
                // returns  a positive value and std::distance(it->par_it_, current) takes forever...
                // So for now, we do:
-               if (it->par_it_.pit() <= par_it.pit())
+               if (it->par_it_.pit() <= par_it_text.pit())
                        return it;
        }
 
@@ -224,7 +254,7 @@ TocIterator const TocBackend::item(
 }
 
 
-void TocBackend::asciiTocList(string const & type, odocstream & os) const
+void TocBackend::writePlaintextTocList(string const & type, odocstream & os) const
 {
        TocList::const_iterator cit = tocs_.find(type);
        if (cit != tocs_.end()) {