X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FRow.cpp;h=1c17fb299283b7a66df9e7034c096d5b2136c026;hb=d4d4654d6325e92aff96523b64e1d403655a71cc;hp=d1921a6d3fed15b5af7e0e65d5a608fbaf6892c0;hpb=da3c3796ee96473fbcede4c33545dc16fe53580d;p=features.git diff --git a/src/Row.cpp b/src/Row.cpp index d1921a6d3f..1c17fb2992 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -42,19 +42,11 @@ using frontend::FontMetrics; static double const MAX_SPACE_STRETCH = 1.5; //em -int Row::Element::countSeparators() const -{ - if (type != STRING) - return 0; - return count(str.begin(), str.end(), ' '); -} - - int Row::Element::countExpanders() const { if (type != STRING) return 0; - return theFontMetrics(font).countExpanders(str); + return support::countExpanders(str); } @@ -152,7 +144,7 @@ bool Row::Element::splitAt(int const width, int next_width, bool force, isRTL(), wrap_any | force); // if breaking did not really work, give up - if (!force && breaks.front().wid > width) { + if (!force && breaks.front().nspc_wid > width) { if (dim.wid == 0) dim.wid = fm.width(str); return false; @@ -344,7 +336,7 @@ ostream & operator<<(ostream & os, Row const & row) << " descent: " << row.dim_.des << " separator: " << row.separator << " label_hfill: " << row.label_hfill - << " right_boundary: " << row.right_boundary() + << " end_boundary: " << row.end_boundary() << " flushed: " << row.flushed() << "\n"; // We cannot use the operator above, unfortunately double x = row.left_margin; @@ -385,16 +377,6 @@ int Row::right_x() const } -int Row::countSeparators() const -{ - int n = 0; - const_iterator const end = elements_.end(); - for (const_iterator cit = elements_.begin() ; cit != end ; ++cit) - n += cit->countSeparators(); - return n; -} - - bool Row::setExtraWidth(int w) { if (w < 0) @@ -537,7 +519,7 @@ void moveElements(Row::Elements & from, Row::Elements::iterator const & it, to.insert(to.end(), it, from.end()); from.erase(it, from.end()); if (!from.empty()) - from.back().row_flags = (from.back().row_flags & ~AfterFlags) | BreakAfter; + from.back().row_flags = (from.back().row_flags & ~AfterFlags) | AlwaysBreakAfter; } } @@ -580,7 +562,7 @@ Row::Elements Row::shortenIfNeeded(int const w, int const next_width) Element brk = *cit_brk; /* If the current element is an inset that allows breaking row * after itself, and if the row is already short enough after - * this inset, then cut right after this element. + * this element, then cut right after it. */ if (wid_brk <= w && brk.row_flags & CanBreakAfter) { end_ = brk.endpos; @@ -590,6 +572,16 @@ Row::Elements Row::shortenIfNeeded(int const w, int const next_width) } // assume now that the current element is not there wid_brk -= brk.dim.wid; + /* If the current element is an inset that allows breaking row + * before itself, and if the row is already short enough before + * this element, then cut right before it. + */ + if (wid_brk <= w && brk.row_flags & CanBreakBefore && cit_brk != beg) { + end_ = (cit_brk -1)->endpos; + dim_.wid = wid_brk; + moveElements(elements_, cit_brk, tail); + return tail; + } /* We have found a suitable separable element. This is the common case. * Try to break it cleanly at a length that is both * - less than the available space on the row @@ -645,7 +637,9 @@ Row::Elements Row::shortenIfNeeded(int const w, int const next_width) return tail; } - return Elements(); + // cit == beg; remove all elements after the first one. + moveElements(elements_, cit + 1, tail); + return tail; }