commit 17516267769abde8c02ae44bd838e3fce373d9a4
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Sat Mar 5 23:11:45 2016 +0100

    Simplify redoParagraph by merging duplicate code
    
    Let breakRow return a boolean indicating whether an additional row is
    required (after a newline) and use that to replace the code that added
    an extra row when a paragraph ends with a newline.

diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index 69ab7b5..2ce990b 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -437,6 +437,7 @@ bool TextMetrics::redoParagraph(pit_type const pit)
        par.setBeginOfBody();
        pos_type first = 0;
        size_t row_index = 0;
+       bool need_new_row = false;
        // maximum pixel width of a row
        do {
                if (row_index == pm.rows().size())
@@ -444,7 +445,7 @@ bool TextMetrics::redoParagraph(pit_type const pit)
                Row & row = pm.rows()[row_index];
                row.pit(pit);
                row.pos(first);
-               breakRow(row, right_margin, pit);
+               need_new_row = breakRow(row, right_margin, pit);
                setRowHeight(row, pit);
                row.setChanged(false);
                if (row_index || row.endpos() < par.size()
@@ -468,26 +469,11 @@ bool TextMetrics::redoParagraph(pit_type const pit)
 
                pm.dim().wid = max(pm.dim().wid, row.width());
                pm.dim().des += row.height();
-       } while (first < par.size());
+       } while (first < par.size() || need_new_row);
 
        if (row_index < pm.rows().size())
                pm.rows().resize(row_index);
 
-       // Make sure that if a par ends in newline, there is one more row
-       // under it
-       if (first > 0 && par.isNewline(first - 1)) {
-               if (row_index == pm.rows().size())
-                       pm.rows().push_back(Row());
-               Row & row = pm.rows()[row_index];
-               row.pos(first);
-               breakRow(row, right_margin, pit);
-               setRowHeight(row, pit);
-               row.setChanged(false);
-               int const max_row_width = max(dim_.wid, row.width());
-               computeRowMetrics(pit, row, max_row_width);
-               pm.dim().des += row.height();
-       }
-
        pm.dim().asc += pm.rows()[0].ascent();
        pm.dim().des -= pm.rows()[0].ascent();
 
@@ -786,7 +772,7 @@ private:
  * very sensitive to small changes :) Note that part of the
  * intelligence is also in Row::shortenIfNeeded.
  */
-void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const 
pit) const
+bool TextMetrics::breakRow(Row & row, int const right_margin, pit_type const 
pit) const
 {
        Paragraph const & par = text_->getPar(pit);
        pos_type const end = par.size();
@@ -806,7 +792,10 @@ void TextMetrics::breakRow(Row & row, int const 
right_margin, pit_type const pit
        // the width available for the row.
        int const width = max_width_ - row.right_margin;
 
-       ParagraphList const & pars = text_->paragraphs();
+       if (pos >= end || row.width() > width) {
+               row.endpos(end);
+               return need_new_row;
+       }
 
 #if 0
        //FIXME: As long as leftMargin() is not correctly implemented for
@@ -900,6 +889,7 @@ void TextMetrics::breakRow(Row & row, int const 
right_margin, pit_type const pit
        row.endpos(i);
 
        // End of paragraph marker
+       ParagraphList const & pars = text_->paragraphs();
        if (lyxrc.paragraph_markers && !need_new_row
            && i == end && size_type(pit + 1) < pars.size()) {
                // add a virtual element for the end-of-paragraph
@@ -921,6 +911,8 @@ void TextMetrics::breakRow(Row & row, int const 
right_margin, pit_type const pit
        // make sure that the RTL elements are in reverse ordering
        row.reverseRTL(is_rtl);
        //LYXERR0("breakrow: row is " << row);
+
+       return need_new_row;
 }
 
 
diff --git a/src/TextMetrics.h b/src/TextMetrics.h
index eef00ff..8d2a12c 100644
--- a/src/TextMetrics.h
+++ b/src/TextMetrics.h
@@ -131,7 +131,8 @@ private:
 
        /// sets row.end to the pos value *after* which a row should break.
        /// for example, the pos after which isNewLine(pos) == true
-       void breakRow(Row & row, int right_margin, pit_type const pit) const;
+       /// \return true when another row is required (after a newline)
+       bool breakRow(Row & row, int right_margin, pit_type const pit) const;
 
        // Expand the alignment of row \param row in paragraph \param par
        LyXAlignment getAlign(Paragraph const & par, Row const & row) const;

Reply via email to