Fix for bug #7572. The basic problem here is that we are trusting the

viewer to give us sensible information, but that information may be out-
generated. So we need to check and make sure the values we get are
valid.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@38859 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2011-05-27 20:37:29 +00:00
parent 80cb1f7674
commit 3f8ae08390

View File

@ -2190,14 +2190,38 @@ void BufferView::setCursorFromRow(int row)
{
int tmpid;
int tmppos;
pit_type newpit = 0;
pos_type newpos = 0;
buffer_.texrow().getIdFromRow(row, tmpid, tmppos);
bool posvalid = (tmpid != -1);
if (posvalid) {
// we need to make sure that the row and position
// we got back are valid, because the buffer may well
// have changed since we last generated the LaTeX.
DocIterator const dit = buffer_.getParFromID(tmpid);
if (dit == doc_iterator_end(&buffer_))
posvalid = false;
else {
newpit = dit.pit();
// now have to check pos.
newpos = tmppos;
Paragraph const & par = buffer_.text().getPar(newpit);
if (newpos > par.size()) {
LYXERR0("Requested position no longer valid.");
newpos = par.size() - 1;
}
}
}
if (!posvalid) {
frontend::Alert::error(_("Inverse Search Failed"),
_("Invalid position requested by inverse search.\n"
"You need to update the viewed document."));
return;
}
d->cursor_.reset();
if (tmpid == -1)
buffer_.text().setCursor(d->cursor_, 0, 0);
else
buffer_.text().setCursor(d->cursor_, buffer_.getParFromID(tmpid).pit(), tmppos);
buffer_.text().setCursor(d->cursor_, newpit, newpos);
d->cursor_.setSelection(false);
d->cursor_.resetAnchor();
recenter();