- ParIterator par = buffer_->getParFromID(par_id);
- if (par == buffer_->par_iterator_end())
- return;
-
- setCursor(makeDocIterator(par, min(par->size(), par_pos)));
+ // if a valid par_id is given, try it first
+ if (par_id > 0) {
+ ParIterator par = buffer_->getParFromID(par_id);
+ if (par != buffer_->par_iterator_end()) {
+ setCursor(makeDocIterator(par, min(par->size(), par_pos)));
+ return boost::make_tuple(cursor_.pit(), par_id);
+ }
+ }
+ // if par_id == 0, or searching through par_id failed
+ if (static_cast<size_t>(par_pit) < buffer_->paragraphs().size()) {
+ ParIterator it = buffer_->par_iterator_begin();
+ ParIterator const end = buffer_->par_iterator_end();
+ for (; it != end; ++it)
+ if (it.pit() == par_pit) {
+ // restored pos may be bigger than it->size
+ setCursor(makeDocIterator(it, min(par_pos, it->size())));
+ return boost::make_tuple(par_pit, it->id());
+ }
+ }
+ // both methods fail
+ return boost::make_tuple(pit_type(0), 0);