#include "output_xhtml.h"
#include "OutputParams.h"
#include "Paragraph.h"
+#include "ParIterator.h"
#include "TextClass.h"
#include "TextMetrics.h"
#include "TocBackend.h"
namespace lyx {
-InsetCaption::InsetCaption(Buffer * buf)
- : InsetText(buf, InsetText::PlainLayout)
+InsetCaption::InsetCaption(Buffer * buf, string const & type)
+ : InsetText(buf, InsetText::PlainLayout),
+ labelwidth_(0), is_subfloat_(false), type_(type)
{
- setAutoBreakRows(true);
setDrawFrame(true);
setFrameColor(Color_collapsableframe);
}
void InsetCaption::write(ostream & os) const
{
- os << "Caption\n";
+ os << "Caption";
+ if (!type_.empty())
+ os << ' ' << type_;
+ os << '\n';
text().write(os);
}
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,
+ UpdateType utype) const
{
- if (type_.empty())
- return;
-
+ string const & type = floattype_.empty() ? "senseless" : floattype_;
DocIterator pit = cpit;
pit.push_back(CursorSlice(const_cast<InsetCaption &>(*this)));
-
- Toc & toc = buffer().tocBackend().toc(type_);
- docstring str = full_label_ + ". ";
- text().forToc(str, TOC_ENTRY_LENGTH);
- toc.push_back(TocItem(pit, 0, str));
-
+ 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);
+ InsetText::addToToc(cpit, output_active, utype);
}
}
+void InsetCaption::doDispatch(Cursor & cur, FuncRequest & cmd)
+{
+ switch (cmd.action()) {
+
+ case LFUN_INSET_MODIFY: {
+ if (cmd.getArg(0) == "changetype") {
+ cur.recordUndoInset(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 != "Unnumbered";
+ // 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
// \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
{
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;
}
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
+ if (!paragraphs().empty())
+ os.texrow().forceStart(paragraphs()[0].id(), 0);
+ latexParagraphs(buffer(), text(), os, rp);
+ runparams.encoding = rp.encoding;
+
+ if (!il.rightdelim().empty())
+ os << il.rightdelim();
}
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;
}
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);
}
cnts.saveLastCounter();
}
// Memorize type for addToToc().
- type_ = type;
- if (type.empty())
+ floattype_ = type;
+ if (type.empty() || type == "senseless")
full_label_ = master.B_("Senseless!!! ");
else {
// FIXME: life would be _much_ simpler if listings was
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);
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.
}
+string InsetCaption::contextMenuName() const
+{
+ return "context-caption";
+}
+
+
} // namespace lyx