]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetCaption.cpp
Internal buffers are valid
[lyx.git] / src / insets / InsetCaption.cpp
index ad6ec01d1a278246a439a2a4780e79c9bd28638b..0850363bc43f98d40f8004b7227a3572411855ec 100644 (file)
@@ -32,6 +32,8 @@
 #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), 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);
 }
 
@@ -93,22 +93,25 @@ void InsetCaption::setCustomLabel(docstring const & 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<InsetCaption &>(*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);
 }
 
 
@@ -200,12 +203,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 +229,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);
@@ -237,10 +242,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();
@@ -305,7 +306,7 @@ 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 + "'";
        }
@@ -323,7 +324,7 @@ void InsetCaption::getArgument(otexstream & os,
 
        if (!il.leftdelim().empty())
                os << il.leftdelim();
-  
+
        OutputParams rp = runparams;
        if (isPassThru())
                rp.pass_thru = true;
@@ -333,6 +334,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;
 
@@ -356,7 +359,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);
 }
@@ -375,7 +378,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
@@ -386,7 +389,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);
@@ -409,9 +412,9 @@ 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.