- scrolled = scrollUp(- ypos + row_dim.ascent());
- else if (ypos + row_dim.descent() > height_)
- scrolled = scrollDown(ypos - height_ + defaultRowHeight() );
+ scrolled = scrollUp(-ypos + row_dim.ascent());
+
+ // If the bottom of the row falls of the screen, we scroll down.
+ // However, we have to be careful not to scroll that much that
+ // the top falls of the screen.
+ else if (ypos + row_dim.descent() > height_) {
+ int ynew = height_ - row_dim.descent();
+ if (ynew < row_dim.ascent())
+ ynew = row_dim.ascent();
+ int const scroll = ypos - ynew;
+ scrolled = scrollDown(scroll);
+ }