Author: rgheck
Date: Fri May 27 22:37:29 2011
New Revision: 38859
URL: http://www.lyx.org/trac/changeset/38859

Log:
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.

Modified:
   lyx-devel/trunk/src/BufferView.cpp

Modified: lyx-devel/trunk/src/BufferView.cpp
==============================================================================
--- lyx-devel/trunk/src/BufferView.cpp  Fri May 27 21:47:10 2011        (r38858)
+++ lyx-devel/trunk/src/BufferView.cpp  Fri May 27 22:37:29 2011        (r38859)
@@ -2190,14 +2190,38 @@
 {
        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();

Reply via email to