From 4060153d693edbff4b78ea4f924928f8900cb721 Mon Sep 17 00:00:00 2001 From: Vincent van Ravesteijn Date: Mon, 15 Mar 2010 22:28:48 +0000 Subject: [PATCH] branch: Fix bug #6462: Out-of-bounds index in GuiErrorList::goTo when new buffer is active. Cache the buffer and errorList in the GuiErrorList? dialog. Now, we can check whether the active buffer is also the buffer for which the errors are shown. We switch back to the correct buffer, when one clicks on an item or clicks "View complete log". see r33726. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@33757 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/frontends/qt4/GuiErrorList.cpp | 26 ++++++++++++++++++-------- src/frontends/qt4/GuiErrorList.h | 4 ++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/frontends/qt4/GuiErrorList.cpp b/src/frontends/qt4/GuiErrorList.cpp index 04d5117e60..2e56b12412 100644 --- a/src/frontends/qt4/GuiErrorList.cpp +++ b/src/frontends/qt4/GuiErrorList.cpp @@ -15,7 +15,9 @@ #include "qt_helpers.h" #include "Buffer.h" +#include "BufferList.h" #include "BufferView.h" +#include "FuncRequest.h" #include "ParIterator.h" #include "Text.h" @@ -91,8 +93,9 @@ void GuiErrorList::paramsToDialog() errorsLW->clear(); descriptionTB->setPlainText(QString()); - ErrorList::const_iterator it = errorList().begin(); - ErrorList::const_iterator end = errorList().end(); + ErrorList const & el = errorList(); + ErrorList::const_iterator it = el.begin(); + ErrorList::const_iterator end = el.end(); for (; it != end; ++it) errorsLW->addItem(toqstr(it->error)); errorsLW->setCurrentRow(0); @@ -101,17 +104,19 @@ void GuiErrorList::paramsToDialog() ErrorList const & GuiErrorList::errorList() const { - return bufferview()->buffer().errorList(error_type_); + if (bufferview() && &bufferview()->buffer() == buf_) + error_list_ = bufferview()->buffer().errorList(error_type_); + return error_list_; } bool GuiErrorList::initialiseParams(string const & error_type) { error_type_ = error_type; - Buffer const & buf = bufferview()->buffer(); + buf_ = &bufferview()->buffer(); name_ = bformat(_("%1$s Errors (%2$s)"), _(guiErrorType(error_type)), - from_utf8(buf.absFileName())); + from_utf8(buf_->absFileName())); paramsToDialog(); return true; } @@ -119,15 +124,20 @@ bool GuiErrorList::initialiseParams(string const & error_type) bool GuiErrorList::goTo(int item) { + if (!bufferview() || &buffer() != buf_) { + if (!theBufferList().isLoaded(buf_)) + return false; + FuncRequest fr(LFUN_BUFFER_SWITCH, buf_->absFileName()); + dispatch(fr); + } ErrorItem const & err = errorList()[item]; if (err.par_id == -1) return false; - Buffer const & buf = buffer(); - DocIterator dit = buf.getParFromID(err.par_id); + DocIterator dit = buf_->getParFromID(err.par_id); - if (dit == doc_iterator_end(buf.inset())) { + if (dit == doc_iterator_end(buf_->inset())) { // FIXME: Happens when loading a read-only doc with // unknown layout. Should this be the case? LYXERR0("par id " << err.par_id << " not found"); diff --git a/src/frontends/qt4/GuiErrorList.h b/src/frontends/qt4/GuiErrorList.h index 8b7d3f6a42..b2e0b83da1 100644 --- a/src/frontends/qt4/GuiErrorList.h +++ b/src/frontends/qt4/GuiErrorList.h @@ -57,6 +57,10 @@ private: std::string error_type_; /// the parent document name docstring name_; + /// + Buffer const * buf_; + /// + mutable ErrorList error_list_; }; } // namespace frontend