X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetCaption.cpp;h=ee0c3e0d1d24587325b226c43e2953456fff76ec;hb=245c2b3c45dce1f5f385665e932ee19c9a904081;hp=a637d90e5adeaa3eca0fa0b393b6e033a3408bf5;hpb=2e69c66195544ee06e2b286f84fdfb6a2515a36d;p=lyx.git diff --git a/src/insets/InsetCaption.cpp b/src/insets/InsetCaption.cpp index a637d90e5a..ee0c3e0d1d 100644 --- a/src/insets/InsetCaption.cpp +++ b/src/insets/InsetCaption.cpp @@ -31,6 +31,7 @@ #include "output_xhtml.h" #include "OutputParams.h" #include "Paragraph.h" +#include "ParIterator.h" #include "TextClass.h" #include "TextMetrics.h" #include "TocBackend.h" @@ -49,8 +50,8 @@ using namespace lyx::support; namespace lyx { -InsetCaption::InsetCaption(Buffer * buf) - : InsetText(buf, InsetText::PlainLayout) +InsetCaption::InsetCaption(Buffer * buf, string const & type) + : InsetText(buf, InsetText::PlainLayout), type_(type) { setAutoBreakRows(true); setDrawFrame(true); @@ -60,7 +61,10 @@ InsetCaption::InsetCaption(Buffer * buf) void InsetCaption::write(ostream & os) const { - os << "Caption\n"; + os << "Caption"; + if (!type_.empty()) + os << ' ' << type_; + os << '\n'; text().write(os); } @@ -83,30 +87,26 @@ 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) const +void InsetCaption::addToToc(DocIterator const & cpit, bool output_active) const { - if (type_.empty()) + if (floattype_.empty()) return; DocIterator pit = cpit; pit.push_back(CursorSlice(const_cast(*this))); - Toc & toc = buffer().tocBackend().toc(type_); - docstring str = full_label_ + ". "; - text().forToc(str, TOC_ENTRY_LENGTH); - toc.push_back(TocItem(pit, 0, str)); + 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)); // Proceed with the rest of the inset. - InsetText::addToToc(cpit); + InsetText::addToToc(cpit, output_active); } @@ -192,14 +192,48 @@ bool InsetCaption::insetAllowed(InsetCode code) const } +void InsetCaption::doDispatch(Cursor & cur, FuncRequest & cmd) +{ + switch (cmd.action()) { + + case LFUN_INSET_MODIFY: { + if (cmd.getArg(0) == "changetype") { + cur.recordUndoInset(ATOMIC_UNDO, this); + type_ = cmd.getArg(1); + cur.forceBufferUpdate(); + break; + } + } + + default: + InsetText::doDispatch(cur, cmd); + break; + } +} + + bool InsetCaption::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & status) const { switch (cmd.action()) { - case LFUN_PARAGRAPH_BREAK: - status.setEnabled(false); - return true; + case LFUN_INSET_MODIFY: { + string const first_arg = cmd.getArg(0); + if (first_arg == "changetype") { + string const type = cmd.getArg(1); + status.setOnOff(type == type_); + bool varia = type != "LongTableNoNumber"; + // check if the immediate parent inset allows caption variation + if (cur.depth() > 1) { + varia = cur[cur.depth() - 2].inset().allowsCaptionVariation(type); + } + status.setEnabled(varia + && buffer().params().documentClass().hasInsetLayout( + from_ascii("Caption:" + type))); + return true; + } + return InsetText::getStatus(cur, cmd, status); + } case LFUN_INSET_TOGGLE: // pass back to owner @@ -224,23 +258,19 @@ 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 = true; - os << "\\caption"; - getOptArg(os, runparams); - os << '{'; InsetText::latex(os, runparams); - os << "}\n"; + // Backwards compatibility: We always had a linebreak after + // the caption (see #8514) + os << breakln; runparams_in.encoding = runparams.encoding; } -int InsetCaption::plaintext(odocstream & os, - OutputParams const & runparams) const +int InsetCaption::plaintext(odocstringstream & os, + OutputParams const & runparams, size_t max_length) const { os << '[' << full_label_ << "\n"; - InsetText::plaintext(os, runparams); + InsetText::plaintext(os, runparams, max_length); os << "\n]"; return PLAINTEXT_NEWLINE + 1; // one char on a separate line @@ -262,13 +292,20 @@ docstring InsetCaption::xhtml(XHTMLStream & xs, OutputParams const & rp) const { if (rp.html_disable_captions) return docstring(); - string attr = "class='float-caption"; - if (!type_.empty()) - attr += " float-caption-" + type_; - attr += "'"; - xs << html::StartTag("div", attr); + InsetLayout const & il = getLayout(); + 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 + 7, our_class+ " "); + else + attr = attr + " class='" + our_class + "'"; + } + xs << html::StartTag(tag, attr); docstring def = getCaptionAsHTML(xs, rp); - xs << html::EndTag("div"); + xs << html::EndTag(tag); return def; } @@ -276,14 +313,25 @@ docstring InsetCaption::xhtml(XHTMLStream & xs, OutputParams const & rp) const void InsetCaption::getArgument(otexstream & os, OutputParams const & runparams) const { - InsetText::latex(os, runparams); -} - - -void InsetCaption::getOptArg(otexstream & os, - OutputParams const & runparams) const -{ - latexArgInsets(paragraphs()[0], os, runparams, getLayout().latexargs()); + InsetLayout const & il = getLayout(); + + if (!il.leftdelim().empty()) + os << il.leftdelim(); + + OutputParams rp = runparams; + if (isPassThru()) + rp.pass_thru = true; + if (il.isNeedProtect()) + rp.moving_arg = true; + rp.par_begin = 0; + rp.par_end = paragraphs().size(); + + // Output the contents of the inset + latexParagraphs(buffer(), text(), os, rp); + runparams.encoding = rp.encoding; + + if (!il.rightdelim().empty()) + os << il.rightdelim(); } @@ -291,7 +339,10 @@ int InsetCaption::getCaptionAsPlaintext(odocstream & os, OutputParams const & runparams) const { os << full_label_ << ' '; - return InsetText::plaintext(os, runparams); + odocstringstream ods; + int const retval = InsetText::plaintext(ods, runparams); + os << ods.str(); + return retval; } @@ -299,7 +350,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); } @@ -317,7 +368,7 @@ void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype) cnts.saveLastCounter(); } // Memorize type for addToToc(). - type_ = type; + floattype_ = type; if (type.empty()) full_label_ = master.B_("Senseless!!! "); else { @@ -330,17 +381,31 @@ void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype) name = master.B_(tclass.floats().getType(type).name()); docstring counter = from_utf8(type); if (cnts.isSubfloat()) { + // only standard captions allowed in subfloats + type_ = "Standard"; counter = "sub-" + from_utf8(type); name = bformat(_("Sub-%1$s"), 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); - full_label_ = bformat(from_ascii("%1$s %2$s:"), - name, - cnts.theCounter(counter, lang)); - } else - full_label_ = bformat(from_ascii("%1$s #:"), name); + // for longtables, we step the counter upstream + if (!cnts.isLongtable()) + cnts.step(counter, utype); + sec = cnts.theCounter(counter, lang); + } + if (labelstring != master.B_("standard")) { + if (!sec.empty()) + sec += from_ascii(" "); + sec += bformat(from_ascii("(%1$s)"), labelstring); + } + if (!sec.empty()) + full_label_ = bformat(from_ascii("%1$s %2$s:"), name, sec); + else + full_label_ = bformat(from_ascii("%1$s #:"), name); } // Do the real work now. @@ -350,4 +415,10 @@ void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype) } +string InsetCaption::contextMenuName() const +{ + return "context-caption"; +} + + } // namespace lyx