]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetText.cpp
Allow row-breaking after some insets
[lyx.git] / src / insets / InsetText.cpp
index e7ec78a8f9023e0743cafbb4ec9663f01babc4e0..ac10443d00bcf04f67094c442db42e079dfc8b4f 100644 (file)
@@ -45,7 +45,7 @@
 #include "ParagraphParameters.h"
 #include "ParIterator.h"
 #include "Row.h"
-#include "sgml.h"
+#include "xml.h"
 #include "TexRow.h"
 #include "texstream.h"
 #include "TextClass.h"
@@ -56,7 +56,6 @@
 #include "frontends/alert.h"
 #include "frontends/Painter.h"
 
-#include "support/bind.h"
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/gettext.h"
@@ -141,9 +140,9 @@ Dimension const InsetText::dimensionHelper(BufferView const & bv) const
 {
        TextMetrics const & tm = bv.textMetrics(&text_);
        Dimension dim = tm.dim();
-       dim.wid += 2 * TEXT_TO_INSET_OFFSET;
-       dim.des += TEXT_TO_INSET_OFFSET;
-       dim.asc += TEXT_TO_INSET_OFFSET;
+       dim.wid += leftOffset(&bv) + rightOffset(&bv);
+       dim.des += bottomOffset(&bv);
+       dim.asc += topOffset(&bv);
        return dim;
 }
 
@@ -190,9 +189,11 @@ void InsetText::metrics(MetricsInfo & mi, Dimension & dim) const
 
        //lyxerr << "InsetText::metrics: width: " << mi.base.textwidth << endl;
 
+       int const horiz_offset = leftOffset(mi.base.bv) + rightOffset(mi.base.bv);
+
        // Hand font through to contained lyxtext:
        tm.font_.fontInfo() = mi.base.font;
-       mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET;
+       mi.base.textwidth -= horiz_offset;
 
        // This can happen when a layout has a left and right margin,
        // and the view is made very narrow. We can't do better than
@@ -204,10 +205,10 @@ void InsetText::metrics(MetricsInfo & mi, Dimension & dim) const
                tm.metrics(mi, dim, mi.base.textwidth);
        else
                tm.metrics(mi, dim);
-       mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
-       dim.asc += TEXT_TO_INSET_OFFSET;
-       dim.des += TEXT_TO_INSET_OFFSET;
-       dim.wid += 2 * TEXT_TO_INSET_OFFSET;
+       mi.base.textwidth += horiz_offset;
+       dim.asc += topOffset(mi.base.bv);
+       dim.des += bottomOffset(mi.base.bv);
+       dim.wid += horiz_offset;
 }
 
 
@@ -215,10 +216,11 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
 {
        TextMetrics & tm = pi.base.bv->textMetrics(&text_);
 
-       int const w = tm.width() + TEXT_TO_INSET_OFFSET;
-       int const yframe = y - TEXT_TO_INSET_OFFSET - tm.ascent();
-       int const h = tm.height() + 2 * TEXT_TO_INSET_OFFSET;
-       int const xframe = x + TEXT_TO_INSET_OFFSET / 2;
+       int const horiz_offset = leftOffset(pi.base.bv) + rightOffset(pi.base.bv);
+       int const w = tm.width() + (horiz_offset - horiz_offset / 2);
+       int const yframe = y - topOffset(pi.base.bv) - tm.ascent();
+       int const h = tm.height() + topOffset(pi.base.bv) + bottomOffset(pi.base.bv);
+       int const xframe = x + leftOffset(pi.base.bv) / 2;
        bool change_drawn = false;
        if (pi.full_repaint)
                        pi.pain.fillRectangle(xframe, yframe, w, h,
@@ -229,7 +231,7 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
                                            pi.backgroundColor(this, false));
                // The change tracking cue must not be inherited
                Changer dummy2 = make_change(pi.change, Change());
-               tm.draw(pi, x + TEXT_TO_INSET_OFFSET, y);
+               tm.draw(pi, x + leftOffset(pi.base.bv), y);
        }
 
        if (drawFrame_) {
@@ -565,7 +567,7 @@ int InsetText::plaintext(odocstringstream & os,
        for (; it != end; ++it) {
                if (it != beg) {
                        os << '\n';
-                       if (runparams.linelen > 0)
+                       if (runparams.linelen > 0 && !getLayout().parbreakIsNewline())
                                os << '\n';
                }
                odocstringstream oss;
@@ -588,19 +590,19 @@ int InsetText::docbook(odocstream & os, OutputParams const & runparams) const
        ParagraphList::const_iterator const beg = paragraphs().begin();
 
        if (!undefined())
-               sgml::openTag(os, getLayout().latexname(),
+               xml::openTag(os, getLayout().latexname(),
                              beg->getID(buffer(), runparams) + getLayout().latexparam());
 
        docbookParagraphs(text_, buffer(), os, runparams);
 
        if (!undefined())
-               sgml::closeTag(os, getLayout().latexname());
+               xml::closeTag(os, getLayout().latexname());
 
        return 0;
 }
 
 
-docstring InsetText::xhtml(XHTMLStream & xs, OutputParams const & runparams) const
+docstring InsetText::xhtml(XMLStream & xs, OutputParams const & runparams) const
 {
        return insetAsXHTML(xs, runparams, WriteEverything);
 }
@@ -619,7 +621,7 @@ docstring InsetText::xhtml(XHTMLStream & xs, OutputParams const & runparams) con
 // if so, try to close fonts, etc.
 // There are probably limits to how well we can do here, though, and we will
 // have to rely upon users not putting footnotes inside noun-type insets.
-docstring InsetText::insetAsXHTML(XHTMLStream & xs, OutputParams const & rp,
+docstring InsetText::insetAsXHTML(XMLStream & xs, OutputParams const & rp,
                                   XHTMLOptions opts) const
 {
        // we will always want to output all our paragraphs when we are
@@ -637,7 +639,7 @@ docstring InsetText::insetAsXHTML(XHTMLStream & xs, OutputParams const & rp,
 
        InsetLayout const & il = getLayout();
        if (opts & WriteOuterTag)
-               xs << html::StartTag(il.htmltag(), il.htmlattr());
+               xs << xml::StartTag(il.htmltag(), il.htmlattr());
 
        if ((opts & WriteLabel) && !il.counter().empty()) {
                BufferParams const & bp = buffer().masterBuffer()->params();
@@ -649,15 +651,15 @@ docstring InsetText::insetAsXHTML(XHTMLStream & xs, OutputParams const & rp,
                                cntrs.counterLabel(from_utf8(il.htmllabel()), bp.language->code());
                        // FIXME is this check necessary?
                        if (!lbl.empty()) {
-                               xs << html::StartTag(il.htmllabeltag(), il.htmllabelattr());
+                               xs << xml::StartTag(il.htmllabeltag(), il.htmllabelattr());
                                xs << lbl;
-                               xs << html::EndTag(il.htmllabeltag());
+                               xs << xml::EndTag(il.htmllabeltag());
                        }
                }
        }
 
        if (opts & WriteInnerTag)
-               xs << html::StartTag(il.htmlinnertag(), il.htmlinnerattr());
+               xs << xml::StartTag(il.htmlinnertag(), il.htmlinnerattr());
 
        // we will eventually lose information about the containing inset
        if (!allowMultiPar() || opts == JustText)
@@ -670,10 +672,10 @@ docstring InsetText::insetAsXHTML(XHTMLStream & xs, OutputParams const & rp,
        xs.endDivision();
 
        if (opts & WriteInnerTag)
-               xs << html::EndTag(il.htmlinnertag());
+               xs << xml::EndTag(il.htmlinnertag());
 
        if (opts & WriteOuterTag)
-               xs << html::EndTag(il.htmltag());
+               xs << xml::EndTag(il.htmltag());
 
        return docstring();
 }
@@ -699,7 +701,7 @@ void InsetText::getArgs(otexstream & os, OutputParams const & runparams_in,
 void InsetText::cursorPos(BufferView const & bv,
                CursorSlice const & sl, bool boundary, int & x, int & y) const
 {
-       x = bv.textMetrics(&text_).cursorX(sl, boundary) + TEXT_TO_INSET_OFFSET;
+       x = bv.textMetrics(&text_).cursorX(sl, boundary) + leftOffset(&bv);
        y = bv.textMetrics(&text_).cursorY(sl, boundary);
 }
 
@@ -746,8 +748,9 @@ void InsetText::appendParagraphs(ParagraphList & plist)
        mergeParagraph(buffer().params(), pl,
                       distance(pl.begin(), ins) - 1);
 
-       for_each(pit, plist.end(),
-                bind(&ParagraphList::push_back, ref(pl), _1));
+       ParagraphList::iterator const pend = plist.end();
+       for (; pit != pend; ++pit)
+               pl.push_back(*pit);
 }
 
 
@@ -812,7 +815,7 @@ bool InsetText::insetAllowed(InsetCode code) const
 }
 
 
-void InsetText::updateBuffer(ParIterator const & it, UpdateType utype)
+void InsetText::updateBuffer(ParIterator const & it, UpdateType utype, bool const deleted)
 {
        ParIterator it2 = it;
        it2.forwardPos();
@@ -826,7 +829,7 @@ void InsetText::updateBuffer(ParIterator const & it, UpdateType utype)
                        cnt.clearLastLayout();
                        // FIXME cnt.saveLastCounter()?
                }
-               buffer().updateBuffer(it2, utype);
+               buffer().updateBuffer(it2, utype, deleted);
                if (save_layouts) {
                        // LYXERR0("Exiting " << name());
                        cnt.restoreLastLayout();
@@ -842,7 +845,7 @@ void InsetText::updateBuffer(ParIterator const & it, UpdateType utype)
                // we need float information even in note insets (#9760)
                tclass.counters().current_float(savecnt.current_float());
                tclass.counters().isSubfloat(savecnt.isSubfloat());
-               buffer().updateBuffer(it2, utype);
+               buffer().updateBuffer(it2, utype, deleted);
                tclass.counters() = move(savecnt);
        }
 }