]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.cpp
Fix bug #12772
[lyx.git] / src / TextMetrics.cpp
index 00fb217c0ad5628d8c628376288affe680c773e0..f4241181c295e15f440d78a48f05dbf6d7621d5f 100644 (file)
@@ -35,6 +35,7 @@
 #include "TextClass.h"
 #include "VSpace.h"
 
+#include "insets/InsetSeparator.h"
 #include "insets/InsetText.h"
 
 #include "mathed/MacroTable.h"
@@ -621,7 +622,7 @@ LyXAlignment TextMetrics::getAlign(Paragraph const & par, Row const & row) const
        if (Inset const * inset = par.getInset(row.pos())) {
                if (inset->rowFlags() & Display) {
                        if (inset->rowFlags() & AlignLeft)
-                               align = LYX_ALIGN_BLOCK;
+                               align = LYX_ALIGN_LEFT;
                        else if (inset->rowFlags() & AlignRight)
                                align = LYX_ALIGN_RIGHT;
                        else
@@ -979,7 +980,7 @@ class flexible_const_iterator {
 public:
 
        //
-       flexible_const_iterator operator++() {
+       flexible_const_iterator operator++() {
                if (pile_.empty())
                        ++cit_;
                else
@@ -1131,7 +1132,9 @@ RowList TextMetrics::breakParagraph(Row const & bigrow) const
                rb.push_back(elt);
                rb.finalizeLast();
                if (rb.width() > width) {
-                       LATTEST(tail.empty());
+                       // Keep the tail for later; this ought to be rare, but play safe.
+                       if (!tail.empty())
+                               fcit.put(tail);
                        // if the row is too large, try to cut at last separator.
                        tail = rb.shortenIfNeeded(width, next_width);
                }
@@ -1790,11 +1793,13 @@ int TextMetrics::leftMargin(pit_type const pit, pos_type const pos) const
                }
        }
 
-       // This happens after sections or environments in standard classes.
-       // We have to check the previous layout at same depth.
+       // Check for reasons to remove indentation.
+       // First, at document level.
        if (buffer.params().paragraph_separation ==
                        BufferParams::ParagraphSkipSeparation)
                parindent.erase();
+       // This happens after sections or environments in standard classes.
+       // We have to check the previous layout at same depth.
        else if (pit > 0 && pars[pit - 1].getDepth() >= par.getDepth()) {
                pit_type prev = text_->depthHook(pit, par.getDepth());
                if (par.layout() == pars[prev].layout()) {
@@ -1804,6 +1809,15 @@ int TextMetrics::leftMargin(pit_type const pit, pos_type const pos) const
                } else if (pars[prev].layout().nextnoindent)
                        parindent.erase();
        }
+       // The previous paragraph may have ended with a separator inset.
+       if (pit > 0) {
+               Paragraph const & ppar = pars[pit - 1];
+               if (ppar.size() > 0) {
+                       auto * in = dynamic_cast<InsetSeparator const *>(ppar.getInset(ppar.size() - 1));
+                       if (in != nullptr && in->nextnoindent())
+                               parindent.erase();
+               }
+       }
 
        FontInfo const labelfont = text_->labelFont(par);
        FontMetrics const & lfm = theFontMetrics(labelfont);
@@ -1984,7 +1998,7 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
                swap(pi.leftx, pi.rightx);
 
        BookmarksSection::BookmarkPosList bpl =
-               theSession().bookmarks().bookmarksInPar(bv_->buffer().fileName(), pm.par().id());
+               theSession().bookmarks().bookmarksInPar(bv_->buffer().fileName(), pm.id());
 
        for (size_t i = 0; i != nrows; ++i) {