X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FTextMetrics.cpp;h=fc7e09d8628ca79cc4069f4b4f29ff04a97b12ec;hb=5b84f11f80d1ec160dbfa312bc2358cfd7abec72;hp=88ffa6f874bef6aa8f9badab41a9615235081d01;hpb=7f0525e9e09459e5bccc8442d889a1aafffa071f;p=lyx.git diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 88ffa6f874..fc7e09d862 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -436,8 +436,9 @@ bool TextMetrics::redoParagraph(pit_type const pit, bool const align_rows) // FIXME: This check ought to be done somewhere else. It is the reason // why text_ is not const. But then, where else to do it? // Well, how can you end up with either (a) a biblio environment that - // has no InsetBibitem or (b) a biblio environment with more than one - // InsetBibitem? I think the answer is: when paragraphs are merged; + // has no InsetBibitem, (b) a biblio environment with more than one + // InsetBibitem or (c) a paragraph that has a bib item but is no biblio + // environment? I think the answer is: when paragraphs are merged; // when layout is set; when material is pasted. if (par.brokenBiblio()) { Cursor & cur = const_cast(bv_->cursor()); @@ -889,7 +890,7 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const pos_type const end = par.size(); pos_type const pos = row.pos(); pos_type const body_pos = par.beginOfBody(); - bool const is_rtl = text_->isRTL(par); + bool const is_rtl = text_->isRTL(row.pit()); bool need_new_row = false; row.clear(); @@ -983,11 +984,17 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const Inset const * inset = 0; if (par.isNewline(i) || par.isEnvSeparator(i) || (i + 1 < end && (inset = par.getInset(i + 1)) - && inset->display()) + && inset->display()) || (!row.empty() && row.back().inset - && row.back().inset->display())) { + && row.back().inset->display())) { row.flushed(true); - need_new_row = par.isNewline(i); + // We will force a row creation after either + // - a newline; + // - a display inset followed by a end label. + need_new_row = + par.isNewline(i) + || (inset && inset->display() && i + 1 == end + && text_->getEndLabel(row.pit()) != END_LABEL_NO_LABEL); ++i; break; } @@ -1001,7 +1008,9 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const // End of paragraph marker. The logic here is almost the // same as in redoParagraph, remember keep them in sync. ParagraphList const & pars = text_->paragraphs(); - if (lyxrc.paragraph_markers && !need_new_row + Change const & change = par.lookupChange(i); + if ((lyxrc.paragraph_markers || change.changed()) + && !need_new_row && i == end && size_type(row.pit() + 1) < pars.size()) { // add a virtual element for the end-of-paragraph // marker; it is shown on screen, but does not exist @@ -1012,7 +1021,7 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const = text_->inset().buffer().params(); f.setLanguage(par.getParLanguage(bparams)); // ¶ U+00B6 PILCROW SIGN - row.addVirtual(end, docstring(1, char_type(0x00B6)), f, Change()); + row.addVirtual(end, docstring(1, char_type(0x00B6)), f, change); } // Is there a end-of-paragaph change?