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);
void InsetCaption::write(ostream & os) const
{
- os << "Caption\n";
+ os << "Caption";
+ if (!type_.empty()) {
+ os << " "
+ << type_;
+ }
+ os << "\n";
text().write(os);
}
-docstring InsetCaption::name() const
+docstring InsetCaption::layoutName() const
{
if (type_.empty())
return from_ascii("Caption");
}
-void InsetCaption::read(Lexer & lex)
-{
-#if 0
- // We will enably this check again when the compability
- // code is removed from Buffer::Read (Lgb)
- lex.setContext("InsetCaption::Read: consistency check");
- lex >> "Caption";
-#endif
- InsetText::read(lex);
-}
-
-
void InsetCaption::cursorPos(BufferView const & bv,
CursorSlice const & sl, bool boundary, int & x, int & y) const
{
}
-void InsetCaption::addToToc(DocIterator const & cpit)
+void InsetCaption::addToToc(DocIterator const & cpit) const
{
- if (type_.empty())
+ if (floattype_.empty())
return;
DocIterator pit = cpit;
- pit.push_back(CursorSlice(*this));
+ pit.push_back(CursorSlice(const_cast<InsetCaption &>(*this)));
- Toc & toc = buffer().tocBackend().toc(type_);
- docstring str = full_label_ + ". ";
+ Toc & toc = buffer().tocBackend().toc(floattype_);
+ docstring str = full_label_;
text().forToc(str, TOC_ENTRY_LENGTH);
toc.push_back(TocItem(pit, 0, str));
}
+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);
+ 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_BREAK_PARAGRAPH:
- 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 = true;
+ // 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;
+ }
+ status.setEnabled(varia
+ && buffer().params().documentClass().hasInsetLayout(
+ from_ascii("Caption:" + type)));
+ return true;
+ }
+ return InsetText::getStatus(cur, cmd, status);
+ }
- case LFUN_ARGUMENT_INSERT:
- status.setEnabled(cur.paragraph().insetList().find(ARG_CODE) == -1);
+ case LFUN_PARAGRAPH_BREAK:
+ status.setEnabled(false);
return true;
case LFUN_INSET_TOGGLE:
}
-int InsetCaption::latex(odocstream & os,
- OutputParams const & runparams_in) const
+void InsetCaption::latex(otexstream & os,
+ OutputParams const & runparams_in) const
{
if (runparams_in.inFloat == OutputParams::SUBFLOAT)
// caption is output as an optional argument
- return 0;
+ return;
// This is a bit too simplistic to take advantage of
// caption options we must add more later. (Lgb)
// This code is currently only able to handle the simple
OutputParams runparams = runparams_in;
// FIXME: actually, it is moving only when there is no
// optional argument.
- runparams.moving_arg = true;
- os << "\\caption";
- int l = latexArgInsets(paragraphs()[0], os, runparams, 0, 1);
- os << '{';
- l += InsetText::latex(os, runparams);
- os << "}\n";
+ runparams.moving_arg = !runparams.inTableCell;
+ InsetText::latex(os, runparams);
runparams_in.encoding = runparams.encoding;
- return l + 1;
}
if (rp.html_disable_captions)
return docstring();
string attr = "class='float-caption";
- if (!type_.empty())
- attr += " float-caption-" + type_;
+ if (!floattype_.empty())
+ attr += " float-caption-" + floattype_;
attr += "'";
xs << html::StartTag("div", attr);
docstring def = getCaptionAsHTML(xs, rp);
}
-int InsetCaption::getArgument(odocstream & os,
- OutputParams const & runparams) const
-{
- return InsetText::latex(os, runparams);
-}
-
-
-int InsetCaption::getOptArg(odocstream & os,
+void InsetCaption::getArgument(otexstream & os,
OutputParams const & runparams) const
{
- return latexArgInsets(paragraphs()[0], os, runparams, 0, 1);
+ 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();
}
cnts.saveLastCounter();
}
// Memorize type for addToToc().
- type_ = type;
+ floattype_ = type;
if (type.empty())
full_label_ = master.B_("Senseless!!! ");
else {
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;
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);
+ sec = cnts.theCounter(counter, lang);
+ }
+ if (getLayout().labelstring() != master.B_("standard")) {
+ if (!sec.empty())
+ sec += from_ascii(" ");
+ sec += bformat(from_ascii("(%1$s)"), getLayout().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