]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView_pimpl.C
Fix bug 2029 (RtL space width)
[lyx.git] / src / BufferView_pimpl.C
index 4ff3e93b293df92569d2bf73f3afa548e6207a4a..5df76a3ea3415328f1af43ba95d7aadbfa52b9ca 100644 (file)
@@ -386,8 +386,20 @@ void BufferView::Pimpl::setBuffer(Buffer * b)
        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_);
@@ -440,9 +452,22 @@ void BufferView::Pimpl::updateScrollbar()
 
        // 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);
 }
 
@@ -864,13 +889,13 @@ void BufferView::Pimpl::trackChanges()
                // 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;
                }