X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetCaption.cpp;h=613249b6b25c28472c2134cbaf795e6ccc58153d;hb=239b9919ffe28338d789e6dc9122228f77ab77a7;hp=035a5feda0c5c272f3a447ca64347861cbba4e14;hpb=257edda49a6c5fb5e8d036b19ebde6d6cf82a1a5;p=lyx.git diff --git a/src/insets/InsetCaption.cpp b/src/insets/InsetCaption.cpp index 035a5feda0..613249b6b2 100644 --- a/src/insets/InsetCaption.cpp +++ b/src/insets/InsetCaption.cpp @@ -31,6 +31,9 @@ #include "output_xhtml.h" #include "OutputParams.h" #include "Paragraph.h" +#include "ParIterator.h" +#include "TexRow.h" +#include "texstream.h" #include "TextClass.h" #include "TextMetrics.h" #include "TocBackend.h" @@ -50,9 +53,9 @@ namespace lyx { InsetCaption::InsetCaption(Buffer * buf, string const & type) - : InsetText(buf, InsetText::PlainLayout), type_(type) + : InsetText(buf, InsetText::PlainLayout), + labelwidth_(0), is_subfloat_(false), type_(type) { - setAutoBreakRows(true); setDrawFrame(true); setFrameColor(Color_collapsableframe); } @@ -61,11 +64,9 @@ InsetCaption::InsetCaption(Buffer * buf, string const & type) void InsetCaption::write(ostream & os) const { os << "Caption"; - if (!type_.empty()) { - os << " " - << type_; - } - os << "\n"; + if (!type_.empty()) + os << ' ' << type_; + os << '\n'; text().write(os); } @@ -88,30 +89,29 @@ void InsetCaption::cursorPos(BufferView const & bv, void InsetCaption::setCustomLabel(docstring const & label) { - if (!isAscii(label) || label.empty()) - // This must be a user defined layout. We cannot translate - // this, since gettext accepts only ascii keys. - custom_label_ = label; - else - custom_label_ = _(to_ascii(label)); + custom_label_ = translateIfPossible(label); } -void InsetCaption::addToToc(DocIterator const & cpit, bool output_active) const +void InsetCaption::addToToc(DocIterator const & cpit, bool output_active, + UpdateType utype) const { - if (floattype_.empty()) - return; - + string const & type = floattype_.empty() ? "senseless" : floattype_; DocIterator pit = cpit; pit.push_back(CursorSlice(const_cast(*this))); - - Toc & toc = buffer().tocBackend().toc(floattype_); - docstring str = full_label_; - text().forToc(str, TOC_ENTRY_LENGTH); - toc.push_back(TocItem(pit, 0, str, output_active)); - + int length = (utype == OutputUpdate) ? + // For output (e.g. xhtml) all (bug #8603) or nothing + (output_active ? INT_MAX : 0) : + // TOC for LyX interface + TOC_ENTRY_LENGTH; + docstring str; + if (length > 0) { + str = full_label_; + text().forOutliner(str, length); + } + buffer().tocBackend().builder(type).captionItem(pit, str, output_active); // Proceed with the rest of the inset. - InsetText::addToToc(cpit, output_active); + InsetText::addToToc(cpit, output_active, utype); } @@ -202,10 +202,8 @@ void InsetCaption::doDispatch(Cursor & cur, FuncRequest & cmd) switch (cmd.action()) { case LFUN_INSET_MODIFY: { - string const first_arg = cmd.getArg(0); - bool const change_type = first_arg == "changetype"; - if (change_type) { - cur.recordUndoInset(ATOMIC_UNDO, this); + if (cmd.getArg(0) == "changetype") { + cur.recordUndoInset(this); type_ = cmd.getArg(1); cur.forceBufferUpdate(); break; @@ -229,12 +227,10 @@ bool InsetCaption::getStatus(Cursor & cur, FuncRequest const & cmd, if (first_arg == "changetype") { string const type = cmd.getArg(1); status.setOnOff(type == type_); - bool varia = true; + bool varia = type != "Unnumbered"; // check if the immediate parent inset allows caption variation if (cur.depth() > 1) { - if (&cur[cur.depth() - 2].inset() - && !cur[cur.depth() - 2].inset().allowsCaptionVariation()) - varia = false; + varia = cur[cur.depth() - 2].inset().allowsCaptionVariation(type); } status.setEnabled(varia && buffer().params().documentClass().hasInsetLayout( @@ -244,10 +240,6 @@ bool InsetCaption::getStatus(Cursor & cur, FuncRequest const & cmd, return InsetText::getStatus(cur, cmd, status); } - case LFUN_PARAGRAPH_BREAK: - status.setEnabled(false); - return true; - case LFUN_INSET_TOGGLE: // pass back to owner cur.undispatched(); @@ -271,10 +263,10 @@ void InsetCaption::latex(otexstream & os, // \caption{...}, later we will make it take advantage // of the one of the caption packages. (Lgb) OutputParams runparams = runparams_in; - // FIXME: actually, it is moving only when there is no - // optional argument. - runparams.moving_arg = !runparams.inTableCell; InsetText::latex(os, runparams); + // Backwards compatibility: We always had a linebreak after + // the caption (see #8514) + os << breakln; runparams_in.encoding = runparams.encoding; } @@ -306,13 +298,15 @@ docstring InsetCaption::xhtml(XHTMLStream & xs, OutputParams const & rp) const if (rp.html_disable_captions) return docstring(); InsetLayout const & il = getLayout(); - string const tag = il.htmltag(); + string const & tag = il.htmltag(); string attr = il.htmlattr(); if (!type_.empty()) { string const our_class = "float-caption-" + type_; size_t const loc = attr.find("class='"); if (loc != string::npos) - attr.insert(loc + 1, our_class); + attr.insert(loc + 7, our_class + " "); + else + attr = attr + " class='" + our_class + "'"; } xs << html::StartTag(tag, attr); docstring def = getCaptionAsHTML(xs, rp); @@ -328,7 +322,7 @@ void InsetCaption::getArgument(otexstream & os, if (!il.leftdelim().empty()) os << il.leftdelim(); - + OutputParams rp = runparams; if (isPassThru()) rp.pass_thru = true; @@ -338,6 +332,8 @@ void InsetCaption::getArgument(otexstream & os, rp.par_end = paragraphs().size(); // Output the contents of the inset + if (!paragraphs().empty()) + os.texrow().forceStart(paragraphs()[0].id(), 0); latexParagraphs(buffer(), text(), os, rp); runparams.encoding = rp.encoding; @@ -361,7 +357,7 @@ docstring InsetCaption::getCaptionAsHTML(XHTMLStream & xs, OutputParams const & runparams) const { xs << full_label_ << ' '; - InsetText::XHTMLOptions const opts = + InsetText::XHTMLOptions const opts = InsetText::WriteLabel | InsetText::WriteInnerTag; return InsetText::insetAsXHTML(xs, runparams, opts); } @@ -380,7 +376,7 @@ void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype) } // Memorize type for addToToc(). floattype_ = type; - if (type.empty()) + if (type.empty() || type == "senseless") full_label_ = master.B_("Senseless!!! "); else { // FIXME: life would be _much_ simpler if listings was @@ -391,7 +387,7 @@ void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype) else name = master.B_(tclass.floats().getType(type).name()); docstring counter = from_utf8(type); - if (cnts.isSubfloat()) { + if ((is_subfloat_ = cnts.isSubfloat())) { // only standard captions allowed in subfloats type_ = "Standard"; counter = "sub-" + from_utf8(type); @@ -399,19 +395,24 @@ void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype) master.B_(tclass.floats().getType(type).name())); } docstring sec; + docstring const lstring = getLayout().labelstring(); + docstring const labelstring = isAscii(lstring) ? + master.B_(to_ascii(lstring)) : lstring; if (cnts.hasCounter(counter)) { - cnts.step(counter, utype); + // for longtables, we step the counter upstream + if (!cnts.isLongtable()) + cnts.step(counter, utype); sec = cnts.theCounter(counter, lang); } - if (getLayout().labelstring() != master.B_("standard")) { + if (labelstring != master.B_("standard")) { if (!sec.empty()) sec += from_ascii(" "); - sec += bformat(from_ascii("(%1$s)"), getLayout().labelstring()); + sec += bformat(from_ascii("(%1$s)"), labelstring); } if (!sec.empty()) - full_label_ = bformat(from_ascii("%1$s %2$s:"), name, sec); + full_label_ = bformat(from_ascii("%1$s %2$s: "), name, sec); else - full_label_ = bformat(from_ascii("%1$s #:"), name); + full_label_ = bformat(from_ascii("%1$s #: "), name); } // Do the real work now.