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;
 	///

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to