]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetCaption.cpp
Refactor OutputParams
[lyx.git] / src / insets / InsetCaption.cpp
index fcd03343065a95fb8ae7865137b88776f10a5415..58242a100a0cb00d01d3c5937e7f3113051a2bf0 100644 (file)
 #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"
@@ -53,7 +54,7 @@ namespace lyx {
 
 InsetCaption::InsetCaption(Buffer * buf, string const & type)
     : InsetText(buf, InsetText::PlainLayout),
-      labelwidth_(0), is_subfloat_(false), type_(type)
+      labelwidth_(0), is_subfloat_(false), is_deleted_(false), type_(type)
 {
        setDrawFrame(true);
        setFrameColor(Color_collapsibleframe);
@@ -114,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
@@ -131,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));
 }
 
@@ -150,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;
@@ -260,7 +265,7 @@ void InsetCaption::latex(otexstream & os,
        OutputParams runparams = runparams_in;
        // Some fragile commands (labels, index entries)
        // are output after the caption (#2154)
-       runparams.postpone_fragile_stuff = true;
+       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.)
@@ -286,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 << "<title>";
-       ret = InsetText::docbook(os, runparams);
-       os << "</title>\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();
@@ -312,9 +312,9 @@ docstring InsetCaption::xhtml(XHTMLStream & xs, OutputParams const & rp) const
                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;
 }
 
@@ -359,7 +359,19 @@ 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_ << ' ';
@@ -369,7 +381,7 @@ docstring InsetCaption::getCaptionAsHTML(XHTMLStream & xs,
 }
 
 
-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();
@@ -380,6 +392,7 @@ 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() || type == "senseless")
@@ -406,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())
@@ -423,7 +440,7 @@ void InsetCaption::updateBuffer(ParIterator const & it, UpdateType utype)
        }
 
        // Do the real work now.
-       InsetText::updateBuffer(it, utype);
+       InsetText::updateBuffer(it, utype, deleted);
        if (utype == OutputUpdate)
                cnts.restoreLastCounter();
 }