{
for (; i < par.size(); ++i)
if (par.isNewline(i))
- return i;
+ return i + 1;
return par.size();
}
void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
{
+ if (pit->empty()) {
+ row.endpos(pit->size());
+ return;
+ }
+
// maximum pixel width of a row.
int width = workWidth()
- rightMargin(*pit, *bv()->buffer(), row)
// inset->textWidth() returns -1 via workWidth(),
// but why ?
if (width < 0) {
- row.endpos(pit->size() + 1);
+ row.endpos(pit->size());
return;
}
LyXLayout_ptr const & layout = pit->layout();
if (layout->margintype == MARGIN_RIGHT_ADDRESS_BOX) {
- row.endpos(addressBreakPoint(row.pos(), *pit) + 1);
+ row.endpos(addressBreakPoint(row.pos(), *pit));
return;
}
pos_type const pos = row.pos();
pos_type const body_pos = pit->beginningOfBody();
- pos_type const last = pit->size();
- pos_type point = last;
+ pos_type const end = pit->size();
+ pos_type point = end - 1;
- if (pos == last) {
- row.endpos(last + 1);
+ if (pos == end) {
+ row.endpos(end);
return;
}
LyXFont font = getFont(pit, i);
lyx::pos_type endPosOfFontSpan = pit->getEndPosOfFontSpan(i);
- for ( ; i < last; ++i) {
+ for ( ; i < end; ++i) {
if (pit->isNewline(i)) {
point = i;
break;
}
// Break before...
- if (i + 1 < last) {
+ if (i + 1 < end) {
InsetOld * in = pit->getInset(i + 1);
if (in && in->display()) {
point = i;
// the right of the row
if (x >= width) {
// if no break before, break here
- if (point == last || chunkwidth >= width - left) {
+ if (point == end || chunkwidth >= width - left) {
if (pos < i) {
point = i - 1;
// exit on last registered breakpoint:
}
}
// emergency exit:
- if (i + 1 < last)
+ if (i + 1 < end)
break;
}
}
}
- if (point == last && x >= width) {
+ if (point == end && x >= width) {
// didn't find one, break at the point we reached the edge
point = i;
- } else if (i == last && x < width) {
+ } else if (i == end && x < width) {
// found one, but we fell off the end of the par, so prefer
// that.
- point = last;
+ point = end - 1;
}
// manual labels cannot be broken in LaTeX. But we
// The test on pit->size() is to catch zero-size pars, which
// would trigger the assert in Paragraph::getInset().
//inset = pit->size() ? pit->getInset(row.pos()) : 0;
- inset = pit->isInset(row.pos()) ? pit->getInset(row.pos()) : 0;
- if (inset && inset->display()) {
+ if (!pit->empty()
+ && pit->isInset(row.pos())
+ && pit->getInset(row.pos())->display())
+ {
align = LYX_ALIGN_CENTER;
}
// rebreak the paragraph
int const ww = workWidth();
- for (pos_type z = 0; z < pit->size() + 1; ) {
+ pos_type z = 0;
+ do {
Row row(z);
rowBreakPoint(pit, row);
z = row.endpos();
pit->rows.push_back(row);
pit->width = std::max(pit->width, row.width());
pit->height += row.height();
- }
+ } while (z < pit->size());
+
height += pit->height;
//lyxerr << "redoParagraph: " << pit->rows.size() << " rows\n";
}
// None of these should happen, but we're scaredy-cats
if (pos > pit->size()) {
- lyxerr << "dont like 1, pos: " << pos << " size: " << pit->size() << endl;
+ lyxerr << "dont like 1, pos: " << pos
+ << " size: " << pit->size()
+ << " row.pos():" << row.pos()
+ << " paroffset: " << par << endl;
pos = 0;
cur.pos(0);
+ BOOST_ASSERT(false);
} else if (pos > last + 1) {
lyxerr << "dont like 2 please report" << endl;
// This shouldn't happen.
pos = last + 1;
cur.pos(pos);
+ BOOST_ASSERT(false);
} else if (pos < row.pos()) {
- lyxerr << "dont like 3 please report" << endl;
+ lyxerr << "dont like 3 please report pos:" << pos
+ << " size: " << pit->size()
+ << " row.pos():" << row.pos()
+ << " paroffset: " << par << endl;
pos = row.pos();
cur.pos(pos);
+ BOOST_ASSERT(false);
}
// now get the cursors x position