X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetCaption.cpp;h=58242a100a0cb00d01d3c5937e7f3113051a2bf0;hb=ecf62a8f21e457936ed285d4fbcbed7348bb636b;hp=709f55881bbaee287fc716dcb9ba9329d0b7eb62;hpb=9d824a04d11c3223db26d2fe146e86e90a432a6e;p=lyx.git diff --git a/src/insets/InsetCaption.cpp b/src/insets/InsetCaption.cpp index 709f55881b..58242a100a 100644 --- a/src/insets/InsetCaption.cpp +++ b/src/insets/InsetCaption.cpp @@ -17,7 +17,6 @@ #include "Buffer.h" #include "BufferParams.h" #include "BufferView.h" -#include "Counters.h" #include "Cursor.h" #include "Dimension.h" #include "Floating.h" @@ -26,12 +25,15 @@ #include "FuncStatus.h" #include "InsetList.h" #include "Language.h" +#include "LyXRC.h" #include "MetricsInfo.h" +#include "xml.h" #include "output_latex.h" #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" @@ -51,22 +53,20 @@ namespace lyx { InsetCaption::InsetCaption(Buffer * buf, string const & type) - : InsetText(buf, InsetText::PlainLayout), type_(type) + : InsetText(buf, InsetText::PlainLayout), + labelwidth_(0), is_subfloat_(false), is_deleted_(false), type_(type) { - setAutoBreakRows(true); setDrawFrame(true); - setFrameColor(Color_collapsableframe); + setFrameColor(Color_collapsibleframe); } 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); } @@ -87,28 +87,25 @@ void InsetCaption::cursorPos(BufferView const & bv, } -void InsetCaption::setCustomLabel(docstring const & 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, TocBackend & backend) 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_; - int length = output_active ? INT_MAX : TOC_ENTRY_LENGTH; - text().forOutliner(str, 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); + } + backend.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, backend); } @@ -118,7 +115,7 @@ void InsetCaption::metrics(MetricsInfo & mi, Dimension & dim) const mi.base.font = mi.base.bv->buffer().params().getFont().fontInfo(); 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; + labelwidth_ += leftOffset(mi.base.bv) + rightOffset(mi.base.bv); dim.wid = labelwidth_; Dimension textdim; // Correct for button and label width @@ -135,8 +132,8 @@ void InsetCaption::metrics(MetricsInfo & mi, Dimension & dim) const void InsetCaption::drawBackground(PainterInfo & pi, int x, int y) const { TextMetrics & tm = pi.base.bv->textMetrics(&text()); - int const h = tm.height() + 2 * TEXT_TO_INSET_OFFSET; - int const yy = y - TEXT_TO_INSET_OFFSET - tm.ascent(); + int const h = tm.height() + topOffset(pi.base.bv) + bottomOffset(pi.base.bv); + int const yy = y - topOffset(pi.base.bv) - tm.ascent(); pi.pain.fillRectangle(x, yy, labelwidth_, h, pi.backgroundColor(this)); } @@ -154,7 +151,11 @@ void InsetCaption::draw(PainterInfo & pi, int x, int y) const FontInfo tmpfont = pi.base.font; pi.base.font = pi.base.bv->buffer().params().getFont().fontInfo(); pi.base.font.setColor(pi.textColor(pi.base.font.color()).baseColor); - int const xx = x + TEXT_TO_INSET_OFFSET; + if (is_deleted_) + pi.base.font.setStrikeout(FONT_ON); + else if (isChanged() && lyxrc.ct_additions_underlined) + pi.base.font.setUnderbar(FONT_ON); + int const xx = x + leftOffset(pi.base.bv); pi.pain.text(xx, y, full_label_, pi.base.font); InsetText::draw(pi, x + labelwidth_, y); pi.base.font = tmpfont; @@ -200,12 +201,14 @@ void InsetCaption::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_INSET_MODIFY: { if (cmd.getArg(0) == "changetype") { - cur.recordUndoInset(ATOMIC_UNDO, this); + cur.recordUndoInset(this); type_ = cmd.getArg(1); cur.forceBufferUpdate(); break; } } + // no "changetype": + // fall through default: InsetText::doDispatch(cur, cmd); @@ -224,7 +227,7 @@ bool InsetCaption::getStatus(Cursor & cur, FuncRequest const & cmd, if (first_arg == "changetype") { string const type = cmd.getArg(1); status.setOnOff(type == type_); - bool varia = type != "LongTableNoNumber"; + bool varia = type != "Unnumbered"; // check if the immediate parent inset allows caption variation if (cur.depth() > 1) { varia = cur[cur.depth() - 2].inset().allowsCaptionVariation(type); @@ -260,7 +263,16 @@ 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; + // Some fragile commands (labels, index entries) + // are output after the caption (#2154) + runparams.postpone_fragile_stuff = buffer().masterParams().postpone_fragile_content; InsetText::latex(os, runparams); + if (!runparams.post_macro.empty()) { + // Output the stored fragile commands (labels, indices etc.) + // that need to be output after the caption. + os << runparams.post_macro; + runparams.post_macro.clear(); + } // Backwards compatibility: We always had a linebreak after // the caption (see #8514) os << breakln; @@ -279,18 +291,13 @@ int InsetCaption::plaintext(odocstringstream & os, } -int InsetCaption::docbook(odocstream & os, - OutputParams const & runparams) const +void InsetCaption::docbook(XMLStream &, OutputParams const &) const { - int ret; - os << ""; - ret = InsetText::docbook(os, runparams); - os << "\n"; - return ret; + // This function should never be called (rather InsetFloat::docbook, the titles should be skipped in floats). } -docstring InsetCaption::xhtml(XHTMLStream & xs, OutputParams const & rp) const +docstring InsetCaption::xhtml(XMLStream & xs, OutputParams const & rp) const { if (rp.html_disable_captions) return docstring(); @@ -301,13 +308,13 @@ docstring InsetCaption::xhtml(XHTMLStream & xs, OutputParams const & rp) const string const our_class = "float-caption-" + type_; size_t const loc = attr.find("class='"); if (loc != string::npos) - attr.insert(loc + 7, our_class+ " "); + attr.insert(loc + 7, our_class + " "); else attr = attr + " class='" + our_class + "'"; } - xs << html::StartTag(tag, attr); + xs << xml::StartTag(tag, attr); docstring def = getCaptionAsHTML(xs, rp); - xs << html::EndTag(tag); + xs << xml::EndTag(tag); return def; } @@ -319,16 +326,20 @@ void InsetCaption::getArgument(otexstream & os, if (!il.leftdelim().empty()) os << il.leftdelim(); - + OutputParams rp = runparams; if (isPassThru()) rp.pass_thru = true; if (il.isNeedProtect()) rp.moving_arg = true; + if (il.isNeedMBoxProtect()) + ++rp.inulemcmd; rp.par_begin = 0; 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; @@ -348,17 +359,29 @@ int InsetCaption::getCaptionAsPlaintext(odocstream & os, } -docstring InsetCaption::getCaptionAsHTML(XHTMLStream & xs, +void InsetCaption::getCaptionAsDocBook(XMLStream & xs, + OutputParams const & runparams) const +{ + if (runparams.docbook_in_float) + return; + + // Ignore full_label_, as the DocBook processor will deal with the numbering. + InsetText::XHTMLOptions opts = InsetText::WriteInnerTag; + InsetText::docbook(xs, runparams, opts); +} + + +docstring InsetCaption::getCaptionAsHTML(XMLStream & 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); } -void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype) +void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype, bool const deleted) { Buffer const & master = *buffer().masterBuffer(); DocumentClass const & tclass = master.params().documentClass(); @@ -369,9 +392,10 @@ void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype) // counters are local to the caption cnts.saveLastCounter(); } + is_deleted_ = deleted; // 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 @@ -382,7 +406,8 @@ 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()) { + is_subfloat_ = cnts.isSubfloat(); + if (is_subfloat_) { // only standard captions allowed in subfloats type_ = "Standard"; counter = "sub-" + from_utf8(type); @@ -394,10 +419,14 @@ void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype) docstring const labelstring = isAscii(lstring) ? master.B_(to_ascii(lstring)) : lstring; if (cnts.hasCounter(counter)) { + int val = cnts.value(counter); // for longtables, we step the counter upstream if (!cnts.isLongtable()) cnts.step(counter, utype); sec = cnts.theCounter(counter, lang); + if (deleted && !cnts.isLongtable()) + // un-step after deleted counter + cnts.set(counter, val); } if (labelstring != master.B_("standard")) { if (!sec.empty()) @@ -405,13 +434,13 @@ void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype) 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. - InsetText::updateBuffer(it, utype); + InsetText::updateBuffer(it, utype, deleted); if (utype == OutputUpdate) cnts.restoreLastCounter(); }