X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FRow.cpp;h=58a23805f2ff35491df7fe56d265fcda40e85b52;hb=af5f69cea77a4ebf277f0e951b66f1d833d46bf4;hp=e3e8a3430a177e6982b930903c12704afacc7bec;hpb=8b89709fc9e128f85757642db3bfe1ec3145e9c8;p=lyx.git diff --git a/src/Row.cpp b/src/Row.cpp index e3e8a3430a..58a23805f2 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -41,7 +41,19 @@ int Row::Element::countSeparators() const { if (type != STRING) return 0; - return count(str.begin(), str.end(), ' '); + // Consecutive spaces count as only one separator. + bool wasspace = false; + int nsep = 0; + for (size_t i = 0 ; i < str.size() ; ++i) { + if (str[i] == ' ') { + if (!wasspace) { + ++nsep; + wasspace = true; + } + } else + wasspace = false; + } + return nsep; } @@ -54,8 +66,7 @@ double Row::Element::pos2x(pos_type const i) const double w = 0; //handle first the two bounds of the element - if (i == endpos && type != VIRTUAL - && !(inset && inset->lyxCode() == SEPARATOR_CODE)) + if (i == endpos && type != VIRTUAL) w = isRTL() ? 0 : full_width(); else if (i == pos || type != STRING) w = isRTL() ? full_width() : 0; @@ -116,6 +127,7 @@ bool Row::Element::breakAt(int w, bool force) //lyxerr << "breakAt(" << w << ") Row element Broken at " << x << "(w(str)=" << fm.width(str) << "): e=" << *this << endl; return true; } + return false; } @@ -136,7 +148,8 @@ Row::Row() : separator(0), label_hfill(0), left_margin(0), right_margin(0), sel_beg(-1), sel_end(-1), begin_margin_sel(false), end_margin_sel(false), - changed_(false), crc_(0), pos_(0), end_(0), right_boundary_(false) + changed_(false), crc_(0), + pit_(0), pos_(0), end_(0), right_boundary_(false) {} @@ -259,6 +272,35 @@ ostream & operator<<(ostream & os, Row const & row) } +int Row::left_x() const +{ + double x = left_margin; + const_iterator const end = elements_.end(); + const_iterator cit = elements_.begin(); + while (cit != end && cit->isVirtual()) { + x += cit->full_width(); + ++cit; + } + return int(x + 0.5); +} + + +int Row::right_x() const +{ + double x = dim_.wid; + const_iterator const begin = elements_.begin(); + const_iterator cit = elements_.end(); + while (cit != begin) { + --cit; + if (cit->isVirtual()) + x -= cit->full_width(); + else + break; + } + return int(x + 0.5); +} + + int Row::countSeparators() const { int n = 0; @@ -371,10 +413,10 @@ void Row::pop_back() } -void Row::shortenIfNeeded(pos_type const keep, int const w) +bool Row::shortenIfNeeded(pos_type const keep, int const w) { if (empty() || width() <= w) - return; + return false; Elements::iterator const beg = elements_.begin(); Elements::iterator const end = elements_.end(); @@ -391,7 +433,7 @@ void Row::shortenIfNeeded(pos_type const keep, int const w) if (cit == end) { // This should not happen since the row is too long. LYXERR0("Something is wrong cannot shorten row: " << *this); - return; + return false; } // Iterate backwards over breakable elements and try to break them @@ -425,7 +467,7 @@ void Row::shortenIfNeeded(pos_type const keep, int const w) /* after breakAt, there may be spaces at the end of the * string, but they are not counted in the string length * (QTextLayout feature, actually). We remove them, but do - * not change the endo of the row, since the spaces at row + * not change the end of the row, since spaces at row * break are invisible. */ brk.str = rtrim(brk.str); @@ -434,7 +476,7 @@ void Row::shortenIfNeeded(pos_type const keep, int const w) dim_.wid = wid_brk + brk.dim.wid; // If there are other elements, they should be removed. elements_.erase(cit_brk + 1, end); - return; + return true; } } @@ -451,7 +493,7 @@ void Row::shortenIfNeeded(pos_type const keep, int const w) end_ = cit->pos; dim_.wid = wid; elements_.erase(cit, end); - return; + return true; } /* If we are here, it means that we have not found a separator to @@ -466,7 +508,9 @@ void Row::shortenIfNeeded(pos_type const keep, int const w) dim_.wid = wid + cit->dim.wid; // If there are other elements, they should be removed. elements_.erase(next(cit, 1), end); + return true; } + return false; }