owner_->updateWindowTitle();
// This is done after the layout combox has been populated
- if (buffer_)
- owner_->setLayout(cursor_.paragraph().layout()->name());
+ if (buffer_) {
+ size_t i = cursor_.depth() - 1;
+ // we know we'll eventually find a paragraph
+ while (true) {
+ CursorSlice const & slice = cursor_[i];
+ if (!slice.inset().inMathed()) {
+ LyXLayout_ptr const layout = slice.paragraph().layout();
+ owner_->setLayout(layout->name());
+ break;
+ }
+ BOOST_ASSERT(i>0);
+ --i;
+ }
+ }
if (buffer_ && lyx::graphics::Previews::status() != LyXRC::PREVIEW_OFF)
lyx::graphics::Previews::get().generateBufferPreviews(*buffer_);
// It would be better to fix the scrollbar to understand
// values in [0..1] and divide everything by wh
- int const wh = workarea().workHeight() / 4;
- int const h = t.getPar(anchor_ref_).height();
- workarea().setScrollbarParams(t.paragraphs().size() * wh, anchor_ref_ * wh + int(offset_ref_ * wh / float(h)), int (wh * defaultRowHeight() / float(h)));
+
+ // estimated average paragraph height:
+ int const wh = workarea().workHeight() / 4;
+ int h = t.getPar(anchor_ref_).height();
+ // Normalize anchor/offset (MV):
+ while (offset_ref_ > h) {
+ anchor_ref_++;
+ offset_ref_ -= h;
+ h = t.getPar(anchor_ref_).height();
+ }
+
+ // The "+ 2" makes inoculates doc bottom display against
+ // unrealistic wh values (docs with very large paragraphs) (MV)
+ workarea().setScrollbarParams((t.paragraphs().size() + 2) * wh,
+ anchor_ref_ * wh + int(offset_ref_ * wh / float(h)),
+ int(wh * defaultRowHeight() / float(h)));
// workarea().setScrollbarParams(t.paragraphs().size(), anchor_ref_, 1);
}
// We cannot allow undos beyond the freeze point
buffer_->undostack().clear();
} else {
- update();
- bv_->text()->setCursor(cursor_, 0, 0);
-#ifdef WITH_WARNINGS
-#warning changes FIXME
-#endif
+ cursor_.setCursor(doc_iterator_begin(buffer_->inset()));
bool const found = lyx::find::findNextChange(bv_);
if (found) {
+ // We reset the cursor to the start of the
+ // document, since the Changes Dialog is going
+ // to search for the next change anyway.
+ cursor_.setCursor(doc_iterator_begin(buffer_->inset()));
owner_->getDialogs().show("changes");
return;
}