]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/controllers/ControlErrorList.C
fix crash due to invalidated iterator
[lyx.git] / src / frontends / controllers / ControlErrorList.C
index a4eee56d3b8b126e47ec7737fad533d8d268b24d..690e52a763522fd5a1c8b5f9c61cca9005606179 100644 (file)
 #include <config.h>
 
 #include "ControlErrorList.h"
-#include "support/lstrings.h" // tostr
-#include "errorlist.h"
 #include "buffer.h"
 #include "BufferView.h"
-#include "lyxtext.h"
 #include "debug.h"
-
+#include "lyxtext.h"
+#include "paragraph.h"
+#include "pariterator.h"
 
 using std::endl;
+using std::string;
 
+namespace lyx {
+namespace frontend {
 
 ControlErrorList::ControlErrorList(Dialog & d)
        : Dialog::Controller(d)
@@ -31,8 +33,7 @@ void ControlErrorList::clearParams()
 {}
 
 
-ErrorList const &
-ControlErrorList::errorList() const
+ErrorList const & ControlErrorList::errorList() const
 {
        return errorlist_;
 }
@@ -63,21 +64,22 @@ void ControlErrorList::goTo(int item)
        ParIterator pit = buf.getParFromID(err.par_id);
 
        if (pit == buf.par_iterator_end()) {
-               lyxerr << "par id not found" << endl;
+               lyxerr << "par id " << err.par_id << " not found" << endl;
                return;
        }
 
-       int range = err.pos_end - err.pos_start;
-
-       if (err.pos_end > pit->size() || range <= 0)
-               range = pit->size() - err.pos_start;
-
        // Now make the selection.
-       BufferView * const bv = kernel().bufferview();
-       bv->insetUnlock();
-       bv->text->clearSelection();
-       bv->text->setCursor(pit.pit(), err.pos_start);
-       bv->text->setSelectionRange(range);
-       bv->fitCursor();
-       bv->update();
+       // This should be implemented using an LFUN. (Angus)
+       // if pos_end is 0, this means it is end-of-paragraph
+       pos_type const end = err.pos_end ? std::min(err.pos_end, pit->size())
+                                        : pit->size();
+       pos_type const start = std::min(err.pos_start, end);
+       pos_type const range = end - start;
+       DocIterator const dit = makeDocIterator(pit, start);
+       kernel().bufferview()->putSelectionAt(dit, range, false);
+       // If we used an LFUN, we would not need that
+       kernel().bufferview()->update();
 }
+
+} // namespace frontend
+} // namespace lyx