X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftoc.C;h=d90cab6e37812c83ce88fc07193b6ce72ecda316;hb=9ee46b846e5e84ad40ceda4f4af94aeb86cd90a2;hp=53e55d80f392cdd8117b3e88b72aec777bddd88c;hpb=1c52d8f898a221afca246a808df86266023d022e;p=lyx.git diff --git a/src/toc.C b/src/toc.C index 53e55d80f3..d90cab6e37 100644 --- a/src/toc.C +++ b/src/toc.C @@ -1,59 +1,58 @@ -// -*- C++ -*- -/* This file is part of - * ====================================================== - * - * LyX, The Document Processor - * - * Copyright 2002 The LyX Team. +/** + * \file toc.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * ====================================================== + * \author Jean-Marc Lasgouttes + * \author Angus Leeming * - * \file toc.C - * \author Angus Leeming - * \author Jean-Marc Lasgouttes + * Full author contact details are available in file CREDITS. */ #include -#ifdef __GNUG__ -#pragma implementation -#endif - -#include "support/lstrings.h" #include "toc.h" + #include "buffer.h" -#include "frontends/LyXView.h" -#include "lyxfunc.h" +#include "bufferparams.h" +#include "FloatList.h" +#include "funcrequest.h" #include "LyXAction.h" #include "paragraph.h" -#include "lyxtextclasslist.h" +#include "pariterator.h" + +#include "frontends/LyXView.h" + #include "insets/insetfloat.h" -#include "debug.h" +#include "insets/insetoptarg.h" +#include "insets/insetwrap.h" + +#include "support/convert.h" using std::vector; +using std::max; +using std::ostream; +using std::string; -extern LyXAction lyxaction; - -namespace toc -{ +namespace lyx { +namespace toc { string const TocItem::asString() const { return string(4 * depth, ' ') + str; } - + void TocItem::goTo(LyXView & lv_) const { - string const tmp = tostr(par->id()); - lv_.getLyXFunc()->dispatch(LFUN_GOTO_PARAGRAPH, tmp, false); + string const tmp = convert(id_); + lv_.dispatch(FuncRequest(LFUN_GOTO_PARAGRAPH, tmp)); } -int TocItem::action() const +FuncRequest TocItem::action() const { - return lyxaction.getPseudoAction(LFUN_GOTO_PARAGRAPH, - tostr(par->id())); + return FuncRequest(LFUN_GOTO_PARAGRAPH, convert(id_)); } @@ -67,71 +66,78 @@ string const getType(string const & cmdName) } -TocList const getTocList(Buffer const * buf) +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; - Paragraph * par = buf->paragraph; - - LyXTextClass const & textclass = textclasslist[buf->params.textclass]; - bool found = textclass.hasLayout("Caption"); - string const layout("Caption"); - - while (par) { -#ifdef WITH_WARNINGS -#warning bogus type (Lgb) -#endif - char const labeltype = par->layout()->labeltype; - - if (labeltype >= LABEL_COUNTER_CHAPTER - && labeltype <= LABEL_COUNTER_CHAPTER + buf->params.tocdepth) { - // insert this into the table of contents - const int depth = max(0, labeltype - textclass.maxcounter()); - TocItem const item(par, depth, - par->asString(buf, true)); - toclist["TOC"].push_back(item); - } + + 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) { + + // the string that goes to the toc (could be the optarg) + string tocstring; + // For each paragraph, traverse its insets and look for - // FLOAT_CODE - - if (found) { - Paragraph::inset_iterator it = - par->inset_iterator_begin(); - Paragraph::inset_iterator end = - par->inset_iterator_end(); - - for (; it != end; ++it) { - if ((*it)->lyxCode() == Inset::FLOAT_CODE) { - InsetFloat * il = - static_cast(*it); - - string const type = il->type(); - - // Now find the caption in the float... - // We now tranverse the paragraphs of - // the inset... - Paragraph * tmp = il->inset.paragraph(); - while (tmp) { - if (tmp->layout()->name() == layout) { - string const str = - tostr(toclist[type].size()+1) + ". " + tmp->asString(buf, false); - TocItem const item(tmp, 0 , str); - toclist[type].push_back(item); - } - tmp = tmp->next(); - } - } + // FLOAT_CODE or WRAP_CODE + 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(toclist, buf); + 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; } - } else { - lyxerr << "Caption not found" << endl; } - par = par->next(); + /// 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; } -vector const getTypes(Buffer const * buffer) +vector const getTypes(Buffer const & buffer) { vector types; @@ -148,7 +154,7 @@ vector const getTypes(Buffer const * buffer) } -void asciiTocList(string const & type, Buffer const * buffer, ostream & os) +void asciiTocList(string const & type, Buffer const & buffer, ostream & os) { TocList const toc_list = getTocList(buffer); TocList::const_iterator cit = toc_list.find(type); @@ -162,4 +168,4 @@ void asciiTocList(string const & type, Buffer const * buffer, ostream & os) } // namespace toc - +} // namespace lyx