+2002-05-03 Juergen Vigna <jug@sad.it>
+
+ * screen.C (drawFromTo): recalculate the rowpointer if we had a
+ change in LyXText as we can not be sure it was not freed.
+ (drawOneRow): remove unused code.
+
+ * text.C (drawInset): redo the calculation of the need_break_row as
+ it could have a row which was already freed.
+ (draw): look at the return value of drawInset and return false if
+ it also returned false.
+ (paintRowText): look at the return value of draw and return false if
+ it also returned false.
+
+ * lyxtext.h: added bool return type to drawInset() and draw() so that
+ if we have a change in the row so that the rowbreak has to be redone
+ we abort drawing as it will be called again.
+
2002-05-02 Juergen Vigna <jug@sad.it>
* BufferView_pimpl.C (moveCursorUpdate): make repaint if we had
/// draw a mark for foreign language, starting from orig_x
void drawForeignMark(DrawRowParams & p, float const orig_x, LyXFont const & orig_font);
/// draw an inset
- void drawInset(DrawRowParams & p, lyx::pos_type const pos);
+ bool drawInset(DrawRowParams & p, lyx::pos_type const pos);
/// draw new line marker
void drawNewline(DrawRowParams & p, lyx::pos_type const pos);
/// draw text
- void draw(DrawRowParams & p, lyx::pos_type & vpos);
+ bool draw(DrawRowParams & p, lyx::pos_type & vpos);
/// get the next breakpoint in a given paragraph
lyx::pos_type nextBreakPoint(BufferView *, Row const * row, int width) const;
text->setCursor(bv, text->cursor.par(),
text->cursor.pos());
text->status(bv, st);
+ // we should be sure our row-pointer is still valid, so it's
+ // better to recompute it.
+ y_text = y + text->first_y;
+ row = text->getRowNearY(y_text);
+ y = y_text - text->first_y;
text->getVisibleRow(bv, y + y_offset,
x_offset, row, y + text->first_y);
}
if (((y + row->height()) > 0) &&
((y - row->height()) <= static_cast<int>(owner.height()))) {
// ok there is something visible
-#if 0
- LyXText::text_status st = bv->text->status();
- do {
- bv->text->status(bv, st);
- text->getVisibleRow(bv, y, x_offset, row,
- y + text->first_y);
- } while (!text->inset_owner &&
- text->status() == LyXText::CHANGED_IN_DRAW);
- bv->text->status(bv, st);
-#else
text->getVisibleRow(bv, y, x_offset, row, y + text->first_y);
-#endif
}
force_clear = false;
}
}
-void LyXText::drawInset(DrawRowParams & p, pos_type const pos)
+bool LyXText::drawInset(DrawRowParams & p, pos_type const pos)
{
Inset * inset = p.row->par()->getInset(pos);
// FIXME: shouldn't happen
if (!inset) {
- return;
+ return true;
}
LyXFont const & font = getFont(p.bv->buffer(), p.row->par(), pos);
+ // we need this here as the row pointer may be illegal
+ // at a later time (Jug20020502)
+ Row * prev = p.row->previous();
inset->update(p.bv, font, false);
inset->draw(p.bv, font, p.yo + p.row->baseline(), p.x, p.cleared);
if (!need_break_row && !inset_owner
&& p.bv->text->status() == CHANGED_IN_DRAW) {
- Row * prev = p.row->previous();
if (prev && prev->par() == p.row->par()) {
breakAgainOneRow(p.bv, prev);
if (prev->next() != p.row) {
} else {
need_break_row = p.row;
}
+ } else if (!prev) {
+ need_break_row = firstrow;
} else {
- need_break_row = p.row;
+ need_break_row = prev->next();
}
setCursor(p.bv, cursor.par(), cursor.pos());
+ return false;
}
+ return true;
}
}
-void LyXText::draw(DrawRowParams & p, pos_type & vpos)
+bool LyXText::draw(DrawRowParams & p, pos_type & vpos)
{
pos_type const pos = vis2log(vpos);
Paragraph * par = p.row->par();
if (IsNewlineChar(c)) {
++vpos;
drawNewline(p, pos);
- return;
+ return true;
} else if (IsInsetChar(c)) {
- drawInset(p, pos);
+ if (!drawInset(p, pos))
+ return false;
++vpos;
drawForeignMark(p, orig_x, orig_font);
- return;
+ return true;
}
// usual characters, no insets
lyxerr << "No this shouldn't happen!\n";
#endif
#endif
+ return true;
}
p.x += p.separator;
++vpos;
} else {
- draw(p, vpos);
+ if (!draw(p, vpos))
+ break;
}
}
}