Fix bug 1814 (scrolling)

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@10595 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Martin Vermeer 2005-11-07 15:06:42 +00:00
parent 4288e62d08
commit e5cb61130f
3 changed files with 37 additions and 16 deletions

View File

@ -141,8 +141,8 @@ T * getInsetByCode(LCursor & cur, InsetBase::Code code)
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(int value)
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);

View File

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

View File

@ -1,8 +1,13 @@
2005-11-07 Martin Vermeer <martin.vermeer@hut.fi>
* BufferView_pimpl.[Ch]: Fix bug 1814: better scroll behaviour for
docs containing very large paragraphs.
2005-11-07 Martin Vermeer <martin.vermeer@hut.fi>
* cursor.C (selectionBegin, selectionEnd):
* text.C (drawSelection): Fix bug 2115: assertion when anchor and
cursor at different depths
cursor at different depths.
2005-11-03 Jürgen Spitzmüller <j.spitzmueller@gmx.de>