On Wed, 2005-10-26 at 17:45 +0200, Jean-Marc Lasgouttes wrote: > >>>>> "Georg" == Georg Baum <[EMAIL PROTECTED]> writes: > > Georg> That is true, but please let's not forget that we want to > Georg> create 1.4.0 as soon as possible. This bug is certainly not > Georg> release-critical, so it would be better to work on one of the > Georg> 12 open bugs with target 1.4.0. > > Definitely. > > Georg> My favorite one is > Georg> http://bugzilla.lyx.org/show_bug.cgi?id=1814. > > Actually, most of the remaining open bugs are reasonably challenging > to fix and _have_ to be fixed. > > JMarc
Try this on for size. - Martin
Index: BufferView_pimpl.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView_pimpl.C,v retrieving revision 1.598 diff -u -p -r1.598 BufferView_pimpl.C --- BufferView_pimpl.C 11 Oct 2005 11:29:35 -0000 1.598 +++ BufferView_pimpl.C 27 Oct 2005 09:58:20 -0000 @@ -141,8 +141,8 @@ T * getInsetByCode(LCursor & cur, InsetB BufferView::Pimpl::Pimpl(BufferView & bv, LyXView * owner, int width, int height) - : bv_(&bv), owner_(owner), buffer_(0), cursor_timeout(400), - using_xterm_cursor(false), cursor_(bv) , + : bv_(&bv), owner_(owner), buffer_(0), wh_(0), cursor_timeout(400), + using_xterm_cursor(false), cursor_(bv), anchor_ref_(0), offset_ref_(0) { xsel_cache_.set = false; @@ -439,8 +439,9 @@ void BufferView::Pimpl::updateScrollbar( } LyXText & t = *bv_->text(); - if (anchor_ref_ > int(t.paragraphs().size()) - 1) { - anchor_ref_ = int(t.paragraphs().size()) - 1; + int const parsize = int(t.paragraphs().size() - 1); + if (anchor_ref_ > parsize) { + anchor_ref_ = parsize; offset_ref_ = 0; } @@ -454,21 +455,34 @@ void BufferView::Pimpl::updateScrollbar( // values in [0..1] and divide everything by wh // estimated average paragraph height: - int const wh = workarea().workHeight() / 4; + if (wh_ == 0) + wh_ = workarea().workHeight() / 4; int h = t.getPar(anchor_ref_).height(); + // Normalize anchor/offset (MV): - while (offset_ref_ > h) { + while (offset_ref_ > h && anchor_ref_ < parsize) { anchor_ref_++; offset_ref_ -= h; h = t.getPar(anchor_ref_).height(); } + // Look at paragraph heights on-screen + int sumh = 0; + int nh = 0; + for (lyx::pit_type pit = anchor_ref_; pit <= parsize; ++pit) { + if (sumh > workarea().workHeight()) + break; + int const h2 = t.getPar(pit).height(); + sumh += h2; + nh++; + } + int const hav = sumh / nh; + // More realistic average paragraph height + if (hav > wh_) + wh_ = hav; - // 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); + workarea().setScrollbarParams((parsize + 1) * wh_, + anchor_ref_ * wh_ + int(offset_ref_ * wh_ / float(h)), + int(wh_ * defaultRowHeight() / float(h))); } @@ -482,13 +496,13 @@ void BufferView::Pimpl::scrollDocView(in screen().hideCursor(); - int const wh = workarea().workHeight() / 4; - LyXText & t = *bv_->text(); - float const bar = value / float(wh * t.paragraphs().size()); + float const bar = value / float(wh_ * t.paragraphs().size()); anchor_ref_ = int(bar * t.paragraphs().size()); + if (anchor_ref_ > int(t.paragraphs().size()) - 1) + anchor_ref_ = int(t.paragraphs().size()) - 1; t.redoParagraph(anchor_ref_); int const h = t.getPar(anchor_ref_).height(); offset_ref_ = int((bar * t.paragraphs().size() - anchor_ref_) * h); Index: BufferView_pimpl.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView_pimpl.h,v retrieving revision 1.128 diff -u -p -r1.128 BufferView_pimpl.h --- BufferView_pimpl.h 31 May 2005 14:40:24 -0000 1.128 +++ BufferView_pimpl.h 27 Oct 2005 09:58:20 -0000 @@ -145,6 +145,8 @@ private: boost::scoped_ptr<LyXScreen> screen_; /// boost::scoped_ptr<WorkArea> workarea_; + /// Estimated average par height for scrollbar + int wh_; /// Timeout cursor_timeout; ///
signature.asc
Description: This is a digitally signed message part