X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FRow.cpp;h=16ae9aecb6e0f988535493cd8f5841f2ef2e039a;hb=5366666c831b6ad726e848a60d738b57ec8b0501;hp=117b2ac9faea9945452fb4bf44187026d48e99a3;hpb=bf88ad495cead6e97a05fee59e41414648145fc1;p=lyx.git diff --git a/src/Row.cpp b/src/Row.cpp index 117b2ac9fa..16ae9aecb6 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -26,8 +26,9 @@ #include "support/debug.h" #include "support/lassert.h" #include "support/lstrings.h" -#include "support/lyxalgo.h" +#include "support/lyxlib.h" +#include #include using namespace std; @@ -297,7 +298,7 @@ int Row::left_x() const x += cit->full_width(); ++cit; } - return int(x + 0.5); + return support::iround(x); } @@ -313,7 +314,7 @@ int Row::right_x() const else break; } - return int(x + 0.5); + return support::iround(x); } @@ -335,7 +336,7 @@ bool Row::setExtraWidth(int w) // amount of expansion: number of expanders time the em value for each // string element int exp_amount = 0; - for (Row::Element const & e : elements_) + for (Element const & e : elements_) exp_amount += e.expansionAmount(); if (!exp_amount) return false; @@ -345,8 +346,8 @@ bool Row::setExtraWidth(int w) // do not stretch more than MAX_SPACE_STRETCH em per expander return false; // add extra length to each element proportionally to its em. - for (Row::Element & e : elements_) - if (e.type == Row::STRING) + for (Element & e : elements_) + if (e.type == STRING) e.setExtra(extra_per_em); // update row dimension dim_.wid += w; @@ -392,6 +393,7 @@ void Row::add(pos_type const pos, Inset const * ins, Dimension const & dim, e.dim = dim; elements_.push_back(e); dim_.wid += dim.wid; + changebar_ |= ins->isChanged(); } @@ -479,6 +481,18 @@ bool Row::shortenIfNeeded(pos_type const keep, int const w, int const next_width --cit_brk; // make a copy of the element to work on it. Element brk = *cit_brk; + /* If the current element is an inset that allows breaking row + * after itself, and it the row is already short enough after + * this inset, then cut right after this element. + */ + if (wid_brk <= w && brk.type == INSET + && brk.inset->rowFlags() & Inset::CanBreakAfter) { + end_ = brk.endpos; + dim_.wid = wid_brk; + elements_.erase(cit_brk + 1, end); + return true; + } + // assume now that the current element is not there wid_brk -= brk.dim.wid; /* * Some Asian languages split lines anywhere (no notion of @@ -488,9 +502,6 @@ bool Row::shortenIfNeeded(pos_type const keep, int const w, int const next_width * * FIXME: Something shall be done about characters which are * not allowed at the beginning or end of line. - * - * FIXME: hardcoding languages is bad. Put this information in - * `languages' file. */ bool const word_wrap = brk.font.language()->wordWrap(); // When there is text before the body part (think description @@ -613,17 +624,19 @@ Row::findElement(pos_type const pos, bool const boundary, double & x) const && !begin()->isVirtual())) return begin(); - Row::const_iterator cit = begin(); + const_iterator cit = begin(); for ( ; cit != end() ; ++cit) { - /** Look whether the cursor is inside the element's - * span. Note that it is necessary to take the - * boundary into account, and to accept virtual - * elements, which have pos == endpos. + /** Look whether the cursor is inside the element's span. Note + * that it is necessary to take the boundary into account, and + * to accept virtual elements, in which case the position + * will be before the virtual element. */ - if (pos + boundary_corr >= cit->pos - && (pos + boundary_corr < cit->endpos || cit->isVirtual())) { - x += cit->pos2x(pos); - break; + if (cit->isVirtual() && pos + boundary_corr == cit->pos) + break; + else if (pos + boundary_corr >= cit->pos + && pos + boundary_corr < cit->endpos) { + x += cit->pos2x(pos); + break; } x += cit->full_width(); }