]> 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 0c87819e65dd3ef6a5a814c32197d176446b6846..690e52a763522fd5a1c8b5f9c61cca9005606179 100644 (file)
 #include "buffer.h"
 #include "BufferView.h"
 #include "debug.h"
-#include "iterators.h"
 #include "lyxtext.h"
 #include "paragraph.h"
-#include "PosIterator.h"
-
+#include "pariterator.h"
 
 using std::endl;
 using std::string;
 
+namespace lyx {
+namespace frontend {
 
 ControlErrorList::ControlErrorList(Dialog & d)
        : Dialog::Controller(d)
@@ -64,15 +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 const end = std::min(err.pos_end, pit->size());
-       int const start = std::min(err.pos_start, end);
-       int const range = end - start;
-
        // Now make the selection.
-       PosIterator const pos = pit.asPosIterator(start);
-       kernel().bufferview()->putSelectionAt(pos, range, false);
+       // 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