make endpos behave

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7977 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Alfredo Braunstein 2003-10-24 15:04:17 +00:00
parent 3e8ce5ac6c
commit d8428d8976
5 changed files with 50 additions and 23 deletions

View File

@ -1,3 +1,11 @@
2003-10-24 Alfredo Braunstein <abraunst@libero.it>
* paragraph.C (getChar): add strong asserts
* lyxrow_funcs.C (lastPos): remove hideous hack
* text.C (addressBreakPoint, rowBreakPoint): put endpos in place
(fill): adjust to that (avoid an infinite loop)
2003-10-23 Alfredo Braunstein <abraunst@libero.it>

View File

@ -29,8 +29,8 @@ pos_type lastPos(Paragraph const & par, Row const & row)
if (par.empty())
return 0;
pos_type pos = row.endpos() - 1;
if (pos == par.size())
--pos;
// if (pos == par.size())
// --pos;
return pos;
}

View File

@ -1327,12 +1327,13 @@ Paragraph::value_type Paragraph::getChar(pos_type pos) const
// This is in the critical path!
pos_type const siz = text_.size();
BOOST_ASSERT(pos <= siz);
BOOST_ASSERT(0 <= pos && pos <= siz);
if (pos == siz) {
lyxerr << "getChar() on pos " << pos << " in par id "
<< id() << " of size " << siz
<< " is a bit silly !" << endl;
BOOST_ASSERT(false);
return '\0';
}

View File

@ -456,7 +456,7 @@ pos_type addressBreakPoint(pos_type i, Paragraph const & par)
{
for (; i < par.size(); ++i)
if (par.isNewline(i))
return i;
return i + 1;
return par.size();
}
@ -466,6 +466,11 @@ pos_type addressBreakPoint(pos_type i, Paragraph const & par)
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)
@ -474,24 +479,24 @@ void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
// 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;
}
@ -511,13 +516,13 @@ void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
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;
@ -560,7 +565,7 @@ void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
// 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:
@ -568,7 +573,7 @@ void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
}
}
// emergency exit:
if (i + 1 < last)
if (i + 1 < end)
break;
}
@ -583,13 +588,13 @@ void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
}
}
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
@ -1227,8 +1232,10 @@ void LyXText::prepareToPrint(ParagraphList::iterator pit, Row & row) const
// 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;
}
@ -1895,7 +1902,8 @@ void LyXText::redoParagraphInternal(ParagraphList::iterator pit)
// 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();
@ -1906,7 +1914,8 @@ void LyXText::redoParagraphInternal(ParagraphList::iterator pit)
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";
}

View File

@ -1311,18 +1311,27 @@ void LyXText::setCursor(LyXCursor & cur, paroffset_type par,
// 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