X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTocBackend.C;h=48847483a05e807b8ac893e735cd8798827b3128;hb=e7f4618bcce770369cf46335c2c7f0164b4b8857;hp=ad885cdf80a2acf3e7eadb06fe6b05403db35b13;hpb=da65e2b7fbe29c5bca2812a56d5bbdb7efb702e5;p=lyx.git diff --git a/src/TocBackend.C b/src/TocBackend.C index ad885cdf80..48847483a0 100644 --- a/src/TocBackend.C +++ b/src/TocBackend.C @@ -12,7 +12,7 @@ #include -#include "toc.h" +#include "TocBackend.h" #include "buffer.h" #include "bufferparams.h" @@ -20,33 +20,24 @@ #include "funcrequest.h" #include "LyXAction.h" #include "paragraph.h" -#include "cursor.h" #include "debug.h" -#include "frontends/LyXView.h" - -#include "insets/insetfloat.h" #include "insets/insetoptarg.h" -#include "insets/insetwrap.h" #include "support/convert.h" -#include + +namespace lyx { using std::vector; -using std::max; -using std::ostream; using std::string; -using std::cout; -using std::endl; -namespace lyx { /////////////////////////////////////////////////////////////////////////// -// TocBackend::Item implementation +// TocItem implementation -TocBackend::Item::Item(ParConstIterator const & par_it, int d, - std::string const & s) +TocItem::TocItem(ParConstIterator const & par_it, int d, + docstring const & s) : par_it_(par_it), depth_(d), str_(s) { /* @@ -78,43 +69,37 @@ TocBackend::Item::Item(ParConstIterator const & par_it, int d, */ } -bool const TocBackend::Item::isValid() const +bool const TocItem::isValid() const { return depth_ != -1; } -int const TocBackend::Item::id() const +int const TocItem::id() const { return par_it_->id(); } -int const TocBackend::Item::depth() const +int const TocItem::depth() const { return depth_; } -std::string const & TocBackend::Item::str() const +docstring const & TocItem::str() const { return str_; } -string const TocBackend::Item::asString() const +docstring const TocItem::asString() const { - return string(4 * depth_, ' ') + str_; + return docstring(4 * depth_, ' ') + str_; } -void TocBackend::Item::goTo(LyXView & lv_) const -{ - string const tmp = convert(id()); - lv_.dispatch(FuncRequest(LFUN_PARAGRAPH_GOTO, tmp)); -} - -FuncRequest TocBackend::Item::action() const +FuncRequest TocItem::action() const { return FuncRequest(LFUN_PARAGRAPH_GOTO, convert(id())); } @@ -126,7 +111,7 @@ FuncRequest TocBackend::Item::action() const /////////////////////////////////////////////////////////////////////////// // TocBackend implementation -TocBackend::Toc const & TocBackend::toc(std::string const & type) +Toc const & TocBackend::toc(std::string const & type) const { // Is the type already supported? TocList::const_iterator it = tocs_.find(type); @@ -158,34 +143,29 @@ void TocBackend::update() BufferParams const & bufparams = buffer_->params(); const int min_toclevel = bufparams.getLyXTextClass().min_toclevel(); + Toc & toc = tocs_["tableofcontents"]; ParConstIterator pit = buffer_->par_iterator_begin(); ParConstIterator end = buffer_->par_iterator_end(); for (; pit != end; ++pit) { // the string that goes to the toc (could be the optarg) - string tocstring; + docstring tocstring; - // For each paragraph, traverse its insets and look for - // FLOAT_CODE or WRAP_CODE + // For each paragraph, traverse its insets and let them add + // their toc items InsetList::const_iterator it = pit->insetlist.begin(); InsetList::const_iterator end = pit->insetlist.end(); for (; it != end; ++it) { - switch (it->inset->lyxCode()) { - case InsetBase::FLOAT_CODE: - static_cast(it->inset) - ->addToToc(tocs_, *buffer_); - break; - case InsetBase::WRAP_CODE: - static_cast(it->inset) - ->addToToc(tocs_, *buffer_); - break; + InsetBase & inset = *it->inset; + inset.addToToc(tocs_, *buffer_); + switch (inset.lyxCode()) { case InsetBase::OPTARG_CODE: { if (!tocstring.empty()) break; - Paragraph const & par = *static_cast(it->inset)->paragraphs().begin(); + Paragraph const & par = + *static_cast(inset).paragraphs().begin(); if (!pit->getLabelstring().empty()) - tocstring = pit->getLabelstring() - + ' '; + tocstring = pit->getLabelstring() + ' '; tocstring += par.asString(*buffer_, false); break; } @@ -202,10 +182,8 @@ void TocBackend::update() // insert this into the table of contents if (tocstring.empty()) tocstring = pit->asString(*buffer_, true); - Item const item(pit, toclevel - min_toclevel, tocstring); - tocs_["TOC"].push_back(item); - //cout << "item inserted str " << item.str() - // << " id " << item.id() << endl; + toc.push_back( + TocItem(pit, toclevel - min_toclevel, tocstring)); } } @@ -215,17 +193,29 @@ void TocBackend::update() } -TocBackend::TocIterator const TocBackend::item(std::string const & type, ParConstIterator const & par_it) +TocIterator const TocBackend::item( + std::string const & type, ParConstIterator const & par_it) const { - TocList::iterator toclist_it = tocs_.find(type); + TocList::const_iterator toclist_it = tocs_.find(type); // Is the type supported? BOOST_ASSERT(toclist_it != tocs_.end()); Toc const & toc_vector = toclist_it->second; - TocBackend::TocIterator last = toc_vector.begin(); - TocBackend::TocIterator it = toc_vector.end(); + 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: @@ -236,7 +226,7 @@ TocBackend::TocIterator const TocBackend::item(std::string const & type, ParCons // 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; } @@ -245,12 +235,12 @@ TocBackend::TocIterator const TocBackend::item(std::string const & type, ParCons } -void TocBackend::asciiTocList(string const & type, ostream & os) const +void TocBackend::writePlaintextTocList(string const & type, odocstream & os) const { TocList::const_iterator cit = tocs_.find(type); if (cit != tocs_.end()) { - Toc::const_iterator ccit = cit->second.begin(); - Toc::const_iterator end = cit->second.end(); + TocIterator ccit = cit->second.begin(); + TocIterator end = cit->second.end(); for (; ccit != end; ++ccit) os << ccit->asString() << '\n'; }