From 601a8e0192b60274ab316c0bfa31811d236c972e Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 12 Aug 2007 21:43:58 +0000 Subject: [PATCH] Rewrite the label numbering code. * buffer_funcs.cpp (updateLabels): new function taking a buffer and a ParIterator as arguments. This one is used to update labels into an InsetText. Cleanup the code to reset depth. Call setLabel for each paragraph, and then updateLabel on each inset it contains. (setCaptionLabels, setCaptions): removed. (setLabel): use Counters::current_float to make caption paragraphs labels. * insets/Inset.h (updateLabels): new virtual method, empty by default; this numbers the inset itself (if relevant) and then all the paragraphs it may contain. * insets/InsetText.cpp (updateLabels): basically calls lyx::updateLabels from buffer_func.cpp. * insets/InsetCaption.cpp (addToToc): use the label constructed by updateLabels. (computeFullLabel): removed. (metrics, plaintext): don't use computeFullLabel. (updateLabels): new method; set the label from Counters::current_float. * insets/InsetWrap.cpp (updateLabels): * insets/InsetFloat.cpp (updateLabel): new method; sets Counters::current_float to the float type. * insets/InsetBranch.cpp (updateLabels): new method; the numbering is reset afterwards if the branch is inactive. (bug 2671) * insets/InsetNote.cpp (updateLabels): new method; the numbering is reset after the underlying InsetText has been numbered. (bug 2671) * insets/InsetTabular.cpp (updateLabels): new method (also handles longtable) * insets/InsetListings.cpp (updateLabels): new method; mimics what is done for Floats (although Listings are not floats technically) * insets/InsetInclude.cpp (getScreenLabel): in the listings case, use the computed label. (updateLabels): new method; that either renumbers the child document or number the current listing. * LyXFunc.cpp (menuNew): do not updateLabels on empty documents (why do we do that at all?) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19482 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/LyXFunc.cpp | 2 +- src/buffer_funcs.cpp | 191 +++++++++-------------------------- src/buffer_funcs.h | 3 + src/insets/Inset.h | 3 + src/insets/InsetBranch.cpp | 14 +++ src/insets/InsetBranch.h | 3 +- src/insets/InsetCaption.cpp | 34 +++++-- src/insets/InsetCaption.h | 8 +- src/insets/InsetFloat.cpp | 16 +++ src/insets/InsetFloat.h | 2 + src/insets/InsetInclude.cpp | 54 +++++----- src/insets/InsetInclude.h | 9 +- src/insets/InsetListings.cpp | 18 ++++ src/insets/InsetListings.h | 2 + src/insets/InsetNote.cpp | 10 ++ src/insets/InsetNote.h | 2 + src/insets/InsetTabular.cpp | 23 ++++- src/insets/InsetTabular.h | 2 + src/insets/InsetText.cpp | 11 ++ src/insets/InsetText.h | 2 + src/insets/InsetWrap.cpp | 16 +++ src/insets/InsetWrap.h | 2 + 22 files changed, 229 insertions(+), 198 deletions(-) diff --git a/src/LyXFunc.cpp b/src/LyXFunc.cpp index 19fd449c9d..94bd51cd65 100644 --- a/src/LyXFunc.cpp +++ b/src/LyXFunc.cpp @@ -1995,7 +1995,7 @@ void LyXFunc::menuNew(string const & name, bool fromTemplate) Buffer * const b = newFile(filename, templname, !name.empty()); if (b) { - updateLabels(*b); + //updateLabels(*b); lyx_view_->setBuffer(b); } } diff --git a/src/buffer_funcs.cpp b/src/buffer_funcs.cpp index 1f1cd7917c..502b8f35e5 100644 --- a/src/buffer_funcs.cpp +++ b/src/buffer_funcs.cpp @@ -16,6 +16,7 @@ #include "Buffer.h" #include "BufferList.h" #include "BufferParams.h" +#include "debug.h" #include "DocIterator.h" #include "Counters.h" #include "ErrorList.h" @@ -42,6 +43,7 @@ #include "insets/InsetInclude.h" #include "insets/InsetTabular.h" +#include "support/convert.h" #include "support/filetools.h" #include "support/fs_extras.h" #include "support/lyxlib.h" @@ -402,84 +404,11 @@ bool needEnumCounterReset(ParIterator const & it) } -void setCaptionLabels(Inset & inset, string const & type, - docstring const label, Counters & counters) -{ - Text * text = inset.getText(0); - if (!text) - return; - - ParagraphList & pars = text->paragraphs(); - if (pars.empty()) - return; - - docstring const counter = from_ascii(type); - - ParagraphList::iterator p = pars.begin(); - for (; p != pars.end(); ++p) { - InsetList::iterator it2 = p->insetlist.begin(); - InsetList::iterator end2 = p->insetlist.end(); - // Any caption within this float should have the same - // label prefix but different numbers. - for (; it2 != end2; ++it2) { - Inset & icap = *it2->inset; - // Look deeper just in case. - setCaptionLabels(icap, type, label, counters); - if (icap.lyxCode() == Inset::CAPTION_CODE) { - // We found a caption! - counters.step(counter); - int number = counters.value(counter); - InsetCaption & ic = static_cast(icap); - ic.setType(type); - ic.setCount(number); - ic.setCustomLabel(label); - } - } - } -} - - -void setCaptions(Paragraph & par, TextClass const & textclass) -{ - if (par.insetlist.empty()) - return; - - Counters & counters = textclass.counters(); - - InsetList::iterator it = par.insetlist.begin(); - InsetList::iterator end = par.insetlist.end(); - for (; it != end; ++it) { - Inset & inset = *it->inset; - if (inset.lyxCode() == Inset::FLOAT_CODE - || inset.lyxCode() == Inset::WRAP_CODE) { - docstring const name = inset.name(); - if (name.empty()) - continue; - - Floating const & fl = textclass.floats().getType(to_ascii(name)); - // FIXME UNICODE - string const & type = fl.type(); - docstring const label = from_utf8(fl.name()); - setCaptionLabels(inset, type, label, counters); - } - else if (inset.lyxCode() == Inset::TABULAR_CODE - && static_cast(inset).tabular.isLongTabular()) { - // FIXME: are "table" and "Table" the correct type and label? - setCaptionLabels(inset, "table", from_ascii("Table"), counters); - } - else if (inset.lyxCode() == Inset::LISTINGS_CODE) - setCaptionLabels(inset, "listing", from_ascii("Listing"), counters); - else if (inset.lyxCode() == Inset::INCLUDE_CODE) - // if this include inset contains lstinputlisting, and has a caption - // it will increase the 'listing' counter by one - static_cast(inset).updateCounter(counters); - } -} - // set the label of a paragraph. This includes the counters. -void setLabel(Buffer const & buf, ParIterator & it, TextClass const & textclass) +void setLabel(Buffer const & buf, ParIterator & it) { - Paragraph & par = *it; + TextClass const & textclass = buf.params().getTextClass(); + Paragraph & par = it.paragraph(); Layout_ptr const & layout = par.layout(); Counters & counters = textclass.counters(); @@ -501,11 +430,6 @@ void setLabel(Buffer const & buf, ParIterator & it, TextClass const & textclass) par.params().labelWidthString(docstring()); } - // Optimisation: setLabel() can be called for each for each - // paragraph of the document. So we make the string static to - // avoid the repeated instanciation. - static docstring itemlabel; - // is it a layout that has an automatic label? if (layout->labeltype == LABEL_COUNTER) { if (layout->toclevel <= buf.params().secnumdepth @@ -523,6 +447,7 @@ void setLabel(Buffer const & buf, ParIterator & it, TextClass const & textclass) // par.params().labelString( // buf.params().user_defined_bullet(par.itemdepth).getText()); // for now, use a simple hardcoded label + docstring itemlabel; switch (par.itemdepth) { case 0: itemlabel = char_type(0x2022); @@ -600,40 +525,21 @@ void setLabel(Buffer const & buf, ParIterator & it, TextClass const & textclass) par.translateIfPossible(layout->labelstring(), buf.params())); // In biblio shouldn't be following counters but... } else if (layout->labeltype == LABEL_SENSITIVE) { - // Search for the first float or wrap inset in the iterator - size_t i = it.depth(); - Inset * in = 0; - while (i > 0) { - --i; - Inset::Code const code = it[i].inset().lyxCode(); - if (code == Inset::FLOAT_CODE || - code == Inset::WRAP_CODE) { - in = &it[i].inset(); - break; - } - } - // FIXME Can Inset::name() return an empty name for wide or - // float insets? If not we can put the definition of type - // inside the if (in) clause and use that instead of - // if (!type.empty()). - docstring type; - if (in) - type = in->name(); - - if (!type.empty()) { - Floating const & fl = textclass.floats().getType(to_ascii(type)); - // FIXME UNICODE - counters.step(from_ascii(fl.type())); - - // Doesn't work... yet. - par.params().labelString(par.translateIfPossible( - bformat(from_ascii("%1$s #:"), from_utf8(fl.name())), - buf.params())); - } else { - // par->SetLayout(0); - par.params().labelString(par.translateIfPossible( - layout->labelstring(), buf.params())); + string const & type = counters.current_float(); + docstring full_label; + if (type.empty()) + full_label = buf.B_("Senseless!!! "); + else { + docstring name = buf.B_(textclass.floats().getType(type).name()); + if (counters.hasCounter(from_utf8(type))) { + counters.step(from_utf8(type)); + full_label = bformat(from_ascii("%1$s %2$s:"), + name, + convert(counters.value(from_utf8(type)))); + } else + full_label = bformat(from_ascii("%1$s #:"), name); } + par.params().labelString(full_label); } else if (layout->labeltype == LABEL_NO_LABEL) par.params().labelString(docstring()); @@ -644,6 +550,31 @@ void setLabel(Buffer const & buf, ParIterator & it, TextClass const & textclass) } // anon namespace +void updateLabels(Buffer const & buf, ParIterator & parit) +{ + BOOST_ASSERT(parit.pit() == 0); + + depth_type maxdepth = 0; + pit_type const lastpit = parit.lastpit(); + for ( ; parit.pit() <= lastpit ; ++parit.pit()) { + // reduce depth if necessary + parit->params().depth(min(parit->params().depth(), maxdepth)); + maxdepth = parit->getMaxDepthAfter(); + + // set the counter for this paragraph + setLabel(buf, parit); + + // Now the insets + InsetList::const_iterator iit = parit->insetlist.begin(); + InsetList::const_iterator end = parit->insetlist.end(); + for (; iit != end; ++iit) { + parit.pos() = iit->pos; + iit->inset->updateLabels(buf, parit); + } + } + +} + void updateLabels(Buffer const & buf, bool childonly) { @@ -662,34 +593,10 @@ void updateLabels(Buffer const & buf, bool childonly) textclass.counters().reset(); } - ParIterator const end = par_iterator_end(buf.inset()); - - for (ParIterator it = par_iterator_begin(buf.inset()); it != end; ++it) { - // reduce depth if necessary - if (it.pit()) { - Paragraph const & prevpar = it.plist()[it.pit() - 1]; - it->params().depth(min(it->params().depth(), - prevpar.getMaxDepthAfter())); - } else - it->params().depth(0); - - // set the counter for this paragraph - setLabel(buf, it, textclass); - - // It is better to set the captions after setLabel because - // the caption number might need the section number in the - // future. - setCaptions(*it, textclass); - - // Now included docs - InsetList::const_iterator iit = it->insetlist.begin(); - InsetList::const_iterator end = it->insetlist.end(); - for (; iit != end; ++iit) { - if (iit->inset->lyxCode() == Inset::INCLUDE_CODE) - static_cast(iit->inset) - ->updateLabels(buf); - } - } + // do the real work + ParIterator parit = par_iterator_begin(buf.inset()); + parit.forwardPos(); + updateLabels(buf, parit); Buffer & cbuf = const_cast(buf); cbuf.tocBackend().update(); diff --git a/src/buffer_funcs.h b/src/buffer_funcs.h index 655d59bf34..e059314b35 100644 --- a/src/buffer_funcs.h +++ b/src/buffer_funcs.h @@ -65,6 +65,9 @@ int countWords(DocIterator const & from, DocIterator const & to); /// updates all counters void updateLabels(Buffer const &, bool childonly = false); +/// +void updateLabels(Buffer const &, ParIterator &); + /// void checkBufferStructure(Buffer &, ParIterator const &); diff --git a/src/insets/Inset.h b/src/insets/Inset.h index c50820289f..982d1306db 100644 --- a/src/insets/Inset.h +++ b/src/insets/Inset.h @@ -28,6 +28,7 @@ namespace lyx { class Buffer; class BufferParams; class BufferView; +class ParIterator; class ParConstIterator; class CursorSlice; class FuncRequest; @@ -433,6 +434,8 @@ public: /// Add an entry to the TocList /// pit is the ParConstIterator of the paragraph containing the inset virtual void addToToc(TocList &, Buffer const &, ParConstIterator const &) const {} + // Update the counters of this inset and of its contents + virtual void updateLabels(Buffer const &, ParIterator const &) {} public: /// returns LyX code associated with the inset. Used for TOC, ...) diff --git a/src/insets/InsetBranch.cpp b/src/insets/InsetBranch.cpp index 62f6a57dbc..ce05c362c7 100644 --- a/src/insets/InsetBranch.cpp +++ b/src/insets/InsetBranch.cpp @@ -15,6 +15,7 @@ #include "Buffer.h" #include "BufferParams.h" #include "BranchList.h" +#include "Counters.h" #include "Cursor.h" #include "DispatchResult.h" #include "FuncRequest.h" @@ -231,6 +232,19 @@ bool InsetBranch::isBranchSelected(Buffer const & buffer) const } +void InsetBranch::updateLabels(Buffer const & buf, ParIterator const & it) +{ + if (isBranchSelected(buf)) + InsetCollapsable::updateLabels(buf, it); + else { + TextClass const & tclass = buf.params().getTextClass(); + Counters savecnt = tclass.counters(); + InsetCollapsable::updateLabels(buf, it); + tclass.counters() = savecnt; + } +} + + int InsetBranch::latex(Buffer const & buf, odocstream & os, OutputParams const & runparams) const { diff --git a/src/insets/InsetBranch.h b/src/insets/InsetBranch.h index 5df7b15d32..586176b9b6 100644 --- a/src/insets/InsetBranch.h +++ b/src/insets/InsetBranch.h @@ -80,7 +80,8 @@ public: bool isBranchSelected(Buffer const & buffer) const; /// bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const; - + // + virtual void updateLabels(Buffer const &, ParIterator const &); protected: /// InsetBranch(InsetBranch const &); diff --git a/src/insets/InsetCaption.cpp b/src/insets/InsetCaption.cpp index 7c986ea098..7c0121b864 100644 --- a/src/insets/InsetCaption.cpp +++ b/src/insets/InsetCaption.cpp @@ -123,8 +123,7 @@ void InsetCaption::addToToc(TocList & toclist, Buffer const & buf, ParConstItera ParConstIterator pit = par_const_iterator_begin(*this); Toc & toc = toclist[type_]; - docstring const str = convert(counter_) - + ". " + pit->asString(buf, false); + docstring const str = full_label_ + ". " + pit->asString(buf, false); toc.push_back(TocItem(pit, 0, str)); } @@ -134,8 +133,6 @@ bool InsetCaption::metrics(MetricsInfo & mi, Dimension & dim) const int const width_offset = TEXT_TO_INSET_OFFSET / 2; mi.base.textwidth -= width_offset; - computeFullLabel(*mi.base.bv->buffer()); - labelwidth_ = theFontMetrics(mi.base.font).width(full_label_); // add some space to separate the label from the inset text labelwidth_ += 2 * TEXT_TO_INSET_OFFSET; @@ -257,8 +254,6 @@ int InsetCaption::latex(Buffer const & buf, odocstream & os, int InsetCaption::plaintext(Buffer const & buf, odocstream & os, OutputParams const & runparams) const { - computeFullLabel(buf); - os << '[' << full_label_ << "\n"; InsetText::plaintext(buf, os, runparams); os << "\n]"; @@ -292,15 +287,32 @@ int InsetCaption::getOptArg(Buffer const & buf, odocstream & os, } -void InsetCaption::computeFullLabel(Buffer const & buf) const +void InsetCaption::updateLabels(Buffer const & buf, ParIterator const & it) { - if (type_.empty()) + TextClass const & tclass = buf.params().getTextClass(); + Counters & cnts = tclass.counters(); + string const & type = cnts.current_float(); + if (type.empty()) full_label_ = buf.B_("Senseless!!! "); else { - docstring const number = convert(counter_); - docstring label = custom_label_.empty()? buf.B_(type_): custom_label_; - full_label_ = bformat(from_ascii("%1$s %2$s:"), label, number); + // FIXME: life would be _much_ simpler if listings was + // listed in Floating. + docstring name; + if (type == "listing") + name = buf.B_("Listing"); + else + name = buf.B_(tclass.floats().getType(type).name()); + if (cnts.hasCounter(from_utf8(type))) { + cnts.step(from_utf8(type)); + full_label_ = bformat(from_ascii("%1$s %2$s:"), + name, + convert(cnts.value(from_utf8(type)))); + } else + full_label_ = bformat(from_ascii("%1$s #:"), name); } + + // Do the real work now. + InsetText::updateLabels(buf, it); } diff --git a/src/insets/InsetCaption.h b/src/insets/InsetCaption.h index e13cf46319..6a9d57e9b5 100644 --- a/src/insets/InsetCaption.h +++ b/src/insets/InsetCaption.h @@ -58,6 +58,8 @@ public: bool insetAllowed(Inset::Code code) const; /// virtual bool getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus &) const; + // Update the counters of this inset and of its contents + virtual void updateLabels(Buffer const &, ParIterator const &); /// virtual bool wide() const { return false; } /// @@ -76,8 +78,6 @@ public: int getOptArg(Buffer const & buf, odocstream & os, OutputParams const &) const; /// - void setCount(int c) { counter_ = c; } - /// std::string const & type() const { return type_; } /// void setType(std::string const & type) { type_ = type; } @@ -89,8 +89,6 @@ public: bool forceDefaultParagraphs(idx_type) const { return true; } private: - /// - void computeFullLabel(Buffer const & buf) const; /// virtual std::auto_ptr doClone() const; /// @@ -102,8 +100,6 @@ private: /// docstring custom_label_; /// - int counter_; - /// TextClass const & textclass_; }; diff --git a/src/insets/InsetFloat.cpp b/src/insets/InsetFloat.cpp index a60a4ddc3e..9a91f0c6cf 100644 --- a/src/insets/InsetFloat.cpp +++ b/src/insets/InsetFloat.cpp @@ -16,6 +16,7 @@ #include "Buffer.h" #include "BufferParams.h" #include "BufferView.h" +#include "Counters.h" #include "Cursor.h" #include "debug.h" #include "DispatchResult.h" @@ -183,6 +184,21 @@ bool InsetFloat::getStatus(Cursor & cur, FuncRequest const & cmd, } +void InsetFloat::updateLabels(Buffer const & buf, ParIterator const & it) +{ + Counters & cnts = buf.params().getTextClass().counters(); + string const saveflt = cnts.current_float(); + + // Tell to captions what the current float is + cnts.current_float(params().type); + + InsetCollapsable::updateLabels(buf, it); + + //reset afterwards + cnts.current_float(saveflt); +} + + void InsetFloatParams::write(ostream & os) const { os << "Float " << type << '\n'; diff --git a/src/insets/InsetFloat.h b/src/insets/InsetFloat.h index 21abf3be59..d56ededc5d 100644 --- a/src/insets/InsetFloat.h +++ b/src/insets/InsetFloat.h @@ -87,6 +87,8 @@ public: InsetFloatParams const & params() const { return params_; } /// bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const; + // Update the counters of this inset and of its contents + virtual void updateLabels(Buffer const &, ParIterator const &); protected: virtual void doDispatch(Cursor & cur, FuncRequest & cmd); private: diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index 16f46f7bb7..6ab2324a2b 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -111,7 +111,7 @@ bool isListings(InsetCommandParams const & params) InsetInclude::InsetInclude(InsetCommandParams const & p) : params_(p), include_label(uniqueID()), preview_(new RenderMonitoredPreview(this)), - set_label_(false), counter_(0) + set_label_(false) { preview_->fileChanged(boost::bind(&InsetInclude::fileChanged, this)); } @@ -122,7 +122,7 @@ InsetInclude::InsetInclude(InsetInclude const & other) params_(other.params_), include_label(other.include_label), preview_(new RenderMonitoredPreview(this)), - set_label_(false), counter_(0) + set_label_(false) { preview_->fileChanged(boost::bind(&InsetInclude::fileChanged, this)); } @@ -336,23 +336,19 @@ docstring const InsetInclude::getScreenLabel(Buffer const & buf) const switch (type(params_)) { case INPUT: - temp += buf.B_("Input"); + temp = buf.B_("Input"); break; case VERB: - temp += buf.B_("Verbatim Input"); + temp = buf.B_("Verbatim Input"); break; case VERBAST: - temp += buf.B_("Verbatim Input*"); + temp = buf.B_("Verbatim Input*"); break; case INCLUDE: - temp += buf.B_("Include"); + temp = buf.B_("Include"); break; case LISTINGS: { - if (counter_ > 0) - temp += buf.B_("Program Listing ") + convert(counter_); - else - temp += buf.B_("Program Listing"); - break; + temp = listings_label_; } } @@ -925,27 +921,25 @@ void InsetInclude::addToToc(TocList & toclist, Buffer const & buffer, ParConstIt } -void InsetInclude::updateLabels(Buffer const & buffer) const +void InsetInclude::updateLabels(Buffer const & buffer, + ParIterator const &) const { Buffer const * const childbuffer = getChildBuffer(buffer, params_); - if (!childbuffer) - return; - - lyx::updateLabels(*childbuffer, true); -} - - -void InsetInclude::updateCounter(Counters & counters) -{ - if (!isListings(params_)) - return; - - InsetListingsParams const par = params_.getOptions(); - if (par.getParamValue("caption").empty()) - counter_ = 0; - else { - counters.step(from_ascii("listing")); - counter_ = counters.value(from_ascii("listing")); + if (childbuffer) + lyx::updateLabels(*childbuffer, true); + else if (isListings(params_)) { + InsetListingsParams const par = params_.getOptions(); + if (par.getParamValue("caption").empty()) + listings_label_.clear(); + else { + Counters & counters = buffer.params().getTextClass().counters(); + docstring const cnt = from_ascii("listing"); + if (counters.hasCounter(cnt)) { + counters.step(cnt); + listings_label_ = buffer.B_("Program Listing ") + convert(counters.value(cnt)); + } else + listings_label_ = buffer.B_("Program Listing"); + } } } diff --git a/src/insets/InsetInclude.h b/src/insets/InsetInclude.h index 7e981b9c83..2f834d4aa6 100644 --- a/src/insets/InsetInclude.h +++ b/src/insets/InsetInclude.h @@ -97,12 +97,9 @@ public: /// void addToToc(TocList &, Buffer const &, ParConstIterator const &) const; /// - void updateLabels(Buffer const & buffer) const; - /// bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const; - /// if this inset contains lstinputlisting and has a caption, - /// update internal counter and passed counter - void updateCounter(Counters & counters); + /// + void updateLabels(Buffer const & buffer, ParIterator const &) const; protected: InsetInclude(InsetInclude const &); /// @@ -137,7 +134,7 @@ private: /// cache mutable bool set_label_; mutable RenderButton button_; - int counter_; + mutable docstring listings_label_; }; diff --git a/src/insets/InsetListings.cpp b/src/insets/InsetListings.cpp index e3f10b3f76..e756d4fb7b 100644 --- a/src/insets/InsetListings.cpp +++ b/src/insets/InsetListings.cpp @@ -14,6 +14,9 @@ #include "InsetListings.h" #include "InsetCaption.h" +#include "Buffer.h" +#include "BufferParams.h" +#include "Counters.h" #include "Language.h" #include "gettext.h" #include "DispatchResult.h" @@ -84,6 +87,21 @@ Inset::DisplayType InsetListings::display() const } +void InsetListings::updateLabels(Buffer const & buf, ParIterator const & it) +{ + Counters & cnts = buf.params().getTextClass().counters(); + string const saveflt = cnts.current_float(); + + // Tell to captions what the current float is + cnts.current_float("listing"); + + InsetCollapsable::updateLabels(buf, it); + + //reset afterwards + cnts.current_float(saveflt); +} + + void InsetListings::write(Buffer const & buf, ostream & os) const { os << "listings" << "\n"; diff --git a/src/insets/InsetListings.h b/src/insets/InsetListings.h index af0676e4f4..8fb21957d0 100644 --- a/src/insets/InsetListings.h +++ b/src/insets/InsetListings.h @@ -36,6 +36,8 @@ public: virtual DisplayType display() const; /// docstring name() const { return from_ascii("Listings"); } + // Update the counters of this inset and of its contents + virtual void updateLabels(Buffer const &, ParIterator const &); /// void write(Buffer const & buf, std::ostream & os) const; /// diff --git a/src/insets/InsetNote.cpp b/src/insets/InsetNote.cpp index 1406d0c687..9324af15e5 100644 --- a/src/insets/InsetNote.cpp +++ b/src/insets/InsetNote.cpp @@ -15,7 +15,9 @@ #include "InsetNote.h" #include "Buffer.h" +#include "BufferParams.h" #include "BufferView.h" +#include "Counters.h" #include "Cursor.h" #include "debug.h" #include "DispatchResult.h" @@ -280,6 +282,14 @@ bool InsetNote::getStatus(Cursor & cur, FuncRequest const & cmd, } } +void InsetNote::updateLabels(Buffer const & buf, ParIterator const & it) +{ + TextClass const & tclass = buf.params().getTextClass(); + Counters savecnt = tclass.counters(); + InsetCollapsable::updateLabels(buf, it); + tclass.counters() = savecnt; +} + int InsetNote::latex(Buffer const & buf, odocstream & os, OutputParams const & runparams_in) const diff --git a/src/insets/InsetNote.h b/src/insets/InsetNote.h index a17889aba4..91d5771ca2 100644 --- a/src/insets/InsetNote.h +++ b/src/insets/InsetNote.h @@ -77,6 +77,8 @@ public: InsetNoteParams const & params() const { return params_; } /// bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const; + // Update the counters of this inset and of its contents + virtual void updateLabels(Buffer const &, ParIterator const &); protected: InsetNote(InsetNote const &); /// diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index 8ff702ef1f..fb6b2c699f 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -21,8 +21,10 @@ #include "InsetTabular.h" #include "Buffer.h" +#include "buffer_funcs.h" #include "BufferParams.h" #include "BufferView.h" +#include "Counters.h" #include "Cursor.h" #include "CutAndPaste.h" #include "CoordCache.h" @@ -41,6 +43,7 @@ #include "Paragraph.h" #include "paragraph_funcs.h" #include "ParagraphParameters.h" +#include "ParIterator.h" #include "Undo.h" #include "support/convert.h" @@ -3181,6 +3184,25 @@ void InsetTabular::edit(Cursor & cur, bool left) } +void InsetTabular::updateLabels(Buffer const & buf, ParIterator const & it) +{ + // In a longtable, tell captions what the current float is + Counters & cnts = buf.params().getTextClass().counters(); + string const saveflt = cnts.current_float(); + if (tabular.isLongTabular()) + cnts.current_float("table"); + + ParIterator it2 = it; + it2.forwardPos(); + for ( ; it2.idx() <= it2.lastidx() ; it2.forwardIdx()) + lyx::updateLabels(buf, it2); + + //reset afterwards + if (tabular.isLongTabular()) + cnts.current_float(saveflt); +} + + void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) { LYXERR(Debug::DEBUG) << "# InsetTabular::doDispatch: cmd: " << cmd @@ -4792,7 +4814,6 @@ bool InsetTabular::tablemode(Cursor & cur) const - string const InsetTabularMailer::name_("tabular"); InsetTabularMailer::InsetTabularMailer(InsetTabular const & inset) diff --git a/src/insets/InsetTabular.h b/src/insets/InsetTabular.h index 32e1aa56e5..16a469afd7 100644 --- a/src/insets/InsetTabular.h +++ b/src/insets/InsetTabular.h @@ -758,6 +758,8 @@ public: Inset * editXY(Cursor & cur, int x, int y); /// can we go further down on mouse click? bool descendable() const { return true; } + // Update the counters of this inset and of its contents + virtual void updateLabels(Buffer const &, ParIterator const &); // // Public structures and variables diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp index 8af5ada648..7439ae7659 100644 --- a/src/insets/InsetText.cpp +++ b/src/insets/InsetText.cpp @@ -14,6 +14,7 @@ #include "InsetNewline.h" #include "Buffer.h" +#include "buffer_funcs.h" #include "BufferParams.h" #include "BufferView.h" #include "CoordCache.h" @@ -38,6 +39,7 @@ #include "Paragraph.h" #include "paragraph_funcs.h" #include "ParagraphParameters.h" +#include "ParIterator.h" #include "rowpainter.h" #include "Row.h" #include "sgml.h" @@ -461,4 +463,13 @@ ParagraphList & InsetText::paragraphs() } +void InsetText::updateLabels(Buffer const & buf, ParIterator const & it) +{ + ParIterator it2 = it; + it2.forwardPos(); + BOOST_ASSERT(&it2.inset() == this && it2.pit() == 0); + lyx::updateLabels(buf, it2); +} + + } // namespace lyx diff --git a/src/insets/InsetText.h b/src/insets/InsetText.h index 6ffdead4d3..cb38e4d574 100644 --- a/src/insets/InsetText.h +++ b/src/insets/InsetText.h @@ -138,6 +138,8 @@ public: virtual bool wide() const { return wide_inset_; } /// void setWide(bool wide_inset) { wide_inset_ = wide_inset; } + // Update the counters of this inset and of its contents + virtual void updateLabels(Buffer const &, ParIterator const &); protected: /// diff --git a/src/insets/InsetWrap.cpp b/src/insets/InsetWrap.cpp index dd655c3603..bdfd1ff50d 100644 --- a/src/insets/InsetWrap.cpp +++ b/src/insets/InsetWrap.cpp @@ -15,6 +15,7 @@ #include "Buffer.h" #include "BufferParams.h" #include "BufferView.h" +#include "Counters.h" #include "Cursor.h" #include "debug.h" #include "DispatchResult.h" @@ -108,6 +109,21 @@ bool InsetWrap::getStatus(Cursor & cur, FuncRequest const & cmd, } +void InsetWrap::updateLabels(Buffer const & buf, ParIterator const & it) +{ + Counters & cnts = buf.params().getTextClass().counters(); + string const saveflt = cnts.current_float(); + + // Tell to captions what the current float is + cnts.current_float(params().type); + + InsetCollapsable::updateLabels(buf, it); + + //reset afterwards + cnts.current_float(saveflt); +} + + void InsetWrapParams::write(ostream & os) const { os << "Wrap " << type << '\n'; diff --git a/src/insets/InsetWrap.h b/src/insets/InsetWrap.h index d8f5acae93..05da26566e 100644 --- a/src/insets/InsetWrap.h +++ b/src/insets/InsetWrap.h @@ -71,6 +71,8 @@ public: InsetWrapParams const & params() const { return params_; } /// bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const; + // Update the counters of this inset and of its contents + virtual void updateLabels(Buffer const &, ParIterator const &); protected: /// virtual void doDispatch(Cursor & cur, FuncRequest & cmd); -- 2.39.2