]> git.lyx.org Git - lyx.git/blob - src/frontends/controllers/ControlErrorList.C
fix crash due to invalidated iterator
[lyx.git] / src / frontends / controllers / ControlErrorList.C
1 /**
2  * \file ControlErrorList.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Alfredo Braunstein
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 #include "ControlErrorList.h"
14 #include "buffer.h"
15 #include "BufferView.h"
16 #include "debug.h"
17 #include "lyxtext.h"
18 #include "paragraph.h"
19 #include "pariterator.h"
20
21 using std::endl;
22 using std::string;
23
24 namespace lyx {
25 namespace frontend {
26
27 ControlErrorList::ControlErrorList(Dialog & d)
28         : Dialog::Controller(d)
29 {}
30
31
32 void ControlErrorList::clearParams()
33 {}
34
35
36 ErrorList const & ControlErrorList::errorList() const
37 {
38         return errorlist_;
39 }
40
41
42 bool ControlErrorList::initialiseParams(string const & name)
43 {
44         errorlist_ = kernel().bufferview()->getErrorList();
45         name_ = name;
46         return true;
47 }
48
49
50 string const & ControlErrorList::name()
51 {
52         return name_;
53 }
54
55
56 void ControlErrorList::goTo(int item)
57 {
58         ErrorItem const & err = errorlist_[item];
59
60         if (err.par_id == -1)
61                 return;
62
63         Buffer & buf = kernel().buffer();
64         ParIterator pit = buf.getParFromID(err.par_id);
65
66         if (pit == buf.par_iterator_end()) {
67                 lyxerr << "par id " << err.par_id << " not found" << endl;
68                 return;
69         }
70
71         // Now make the selection.
72         // This should be implemented using an LFUN. (Angus)
73         // if pos_end is 0, this means it is end-of-paragraph
74         pos_type const end = err.pos_end ? std::min(err.pos_end, pit->size())
75                                          : pit->size();
76         pos_type const start = std::min(err.pos_start, end);
77         pos_type const range = end - start;
78         DocIterator const dit = makeDocIterator(pit, start);
79         kernel().bufferview()->putSelectionAt(dit, range, false);
80         // If we used an LFUN, we would not need that
81         kernel().bufferview()->update();
82 }
83
84 } // namespace frontend
85 } // namespace lyx