]> git.lyx.org Git - lyx.git/blobdiff - src/TocBackend.C
* src/tabular.[Ch]: simplify plaintext methods, because there
[lyx.git] / src / TocBackend.C
index 25f8cf4c67378bf56f93d76f049dfa4392aa514f..48847483a05e807b8ac893e735cd8798827b3128 100644 (file)
@@ -12,7 +12,7 @@
 
 #include <config.h>
 
-#include "toc.h"
+#include "TocBackend.h"
 
 #include "buffer.h"
 #include "bufferparams.h"
 #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 <iostream>
 
 namespace lyx {
 
 using std::vector;
-using std::max;
-using std::ostream;
 using std::string;
-using std::cout;
-using std::endl;
 
 
 ///////////////////////////////////////////////////////////////////////////
-// TocBackend::Item implementation
+// TocItem implementation
 
-TocBackend::Item::Item(ParConstIterator const & par_it, int d,
+TocItem::TocItem(ParConstIterator const & par_it, int d,
                docstring const & s)
                : par_it_(par_it), depth_(d), str_(s)
 {
@@ -79,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_;
 }
 
 
-docstring const & TocBackend::Item::str() const
+docstring const & TocItem::str() const
 {
        return str_;
 }
 
 
-docstring const TocBackend::Item::asString() const
+docstring const TocItem::asString() const
 {
        return docstring(4 * depth_, ' ') + str_;
 }
 
 
-void TocBackend::Item::goTo(LyXView & lv_) const
-{
-       string const tmp = convert<string>(id());
-       lv_.dispatch(FuncRequest(LFUN_PARAGRAPH_GOTO, tmp));
-}
-
-FuncRequest TocBackend::Item::action() const
+FuncRequest TocItem::action() const
 {
        return FuncRequest(LFUN_PARAGRAPH_GOTO, convert<string>(id()));
 }
@@ -127,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);
@@ -159,6 +143,7 @@ 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) {
@@ -166,26 +151,20 @@ void TocBackend::update()
                // the string that goes to the toc (could be the optarg)
                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<InsetFloat*>(it->inset)
-                                       ->addToToc(tocs_, *buffer_);
-                               break;
-                       case InsetBase::WRAP_CODE:
-                               static_cast<InsetWrap*>(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<InsetOptArg*>(it->inset)->paragraphs().begin();
+                               Paragraph const & par = 
+                                       *static_cast<InsetOptArg&>(inset).paragraphs().begin();
                                if (!pit->getLabelstring().empty())
-                                       // FIXME UNICODE
                                        tocstring = pit->getLabelstring() + ' ';
                                tocstring += par.asString(*buffer_, false);
                                break;
@@ -203,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));
                }
        }
 
@@ -216,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:
@@ -237,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;
        }
 
@@ -246,12 +235,12 @@ TocBackend::TocIterator const TocBackend::item(std::string const & type, ParCons
 }
 
 
-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()) {
-               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';
        }