X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftoc.C;h=d90cab6e37812c83ce88fc07193b6ce72ecda316;hb=9ee46b846e5e84ad40ceda4f4af94aeb86cd90a2;hp=42141c3dc2f29c027069fc88b3467a7aec7cf861;hpb=6a55be9506b112110826cf63bc21786044569f1d;p=lyx.git diff --git a/src/toc.C b/src/toc.C index 42141c3dc2..d90cab6e37 100644 --- a/src/toc.C +++ b/src/toc.C @@ -15,6 +15,7 @@ #include "buffer.h" #include "bufferparams.h" +#include "FloatList.h" #include "funcrequest.h" #include "LyXAction.h" #include "paragraph.h" @@ -23,9 +24,10 @@ #include "frontends/LyXView.h" #include "insets/insetfloat.h" +#include "insets/insetoptarg.h" #include "insets/insetwrap.h" -#include "support/tostr.h" +#include "support/convert.h" using std::vector; using std::max; @@ -64,36 +66,72 @@ string const getType(string const & cmdName) } +string const getGuiName(string const & type, Buffer const & buffer) +{ + FloatList const & floats = + buffer.params().getLyXTextClass().floats(); + if (floats.typeExist(type)) + return floats.getType(type).name(); + else + return type; +} + + TocList const getTocList(Buffer const & buf) { TocList toclist; BufferParams const & bufparams = buf.params(); + const int min_toclevel = bufparams.getLyXTextClass().min_toclevel(); ParConstIterator pit = buf.par_iterator_begin(); ParConstIterator end = buf.par_iterator_end(); for (; pit != end; ++pit) { - int const toclevel = pit->layout()->toclevel; - if (toclevel > 0 && toclevel <= bufparams.tocdepth) { - // insert this into the table of contents - TocItem const item(pit->id(), toclevel - 1, pit->asString(buf, true)); - toclist["TOC"].push_back(item); - } + // the string that goes to the toc (could be the optarg) + string tocstring; // For each paragraph, traverse its insets and look for // FLOAT_CODE or WRAP_CODE InsetList::const_iterator it = pit->insetlist.begin(); InsetList::const_iterator end = pit->insetlist.end(); for (; it != end; ++it) { - if (it->inset->lyxCode() == InsetBase::FLOAT_CODE) { + switch (it->inset->lyxCode()) { + case InsetBase::FLOAT_CODE: static_cast(it->inset) ->addToToc(toclist, buf); - } else if (it->inset->lyxCode() == InsetBase::WRAP_CODE) { + break; + case InsetBase::WRAP_CODE: static_cast(it->inset) ->addToToc(toclist, buf); + break; + case InsetBase::OPTARG_CODE: { + if (!tocstring.empty()) + break; + Paragraph const & par = *static_cast(it->inset)->paragraphs().begin(); + if (!pit->getLabelstring().empty()) + tocstring = pit->getLabelstring() + + ' '; + tocstring += par.asString(buf, false); + break; + } + default: + break; } } + + /// now the toc entry for the paragraph + int const toclevel = pit->layout()->toclevel; + if (toclevel != LyXLayout::NOT_IN_TOC + && toclevel >= min_toclevel + && toclevel <= bufparams.tocdepth) { + // insert this into the table of contents + if (tocstring.empty()) + tocstring = pit->asString(buf, true); + TocItem const item(pit->id(), toclevel - min_toclevel, + tocstring); + toclist["TOC"].push_back(item); + } } return toclist; }