bool ScrollBar::Set(int apagepos) { int op = pagepos; pagepos = apagepos; if(pagepos > totalsize - pagesize) pagepos = totalsize - pagesize; if(pagepos < 0) pagepos = 0; int slsize = GetRange(); int mint = max(minthumb, style->thumbmin); if(totalsize <= 0) SetThumb(0, slsize); else { double thumbsize = slsize * pagesize / (double) totalsize; double rest = slsize * pagesize - thumbsize * totalsize; double ts, ps; if(thumbsize >= slsize || thumbsize < 0) { ts = slsize; ps = 0; } else if(thumbsize <= mint) { ps = ((slsize - mint) * (double)pagepos + rest) / (double) (totalsize - pagesize); ts = mint; } else { ps = (slsize * (double)pagepos + rest) / (double) totalsize; ts = thumbsize; } SetThumb(ffloor(ps), fceil(ts)); } if(pagepos != op) { Refresh(); WhenScroll(); return true; } return false; }
/* ARGSUSED */ static void VerticalScroll(Widget w, XtPointer client_data, XtPointer call_data) { int pos = (int)(long) call_data; int new_line; /* The new location for the line pointer. */ ScrollByLineWidget sblw = (ScrollByLineWidget) XtParent(w); new_line = sblw->scroll.line_pointer + (pos / sblw->scroll.font_height); (void) ScrollVerticalText( (Widget) sblw, new_line, FALSE); SetThumb( (Widget) sblw); }
/* ARGSUSED */ static void VerticalJump(Widget w, XtPointer junk, XtPointer percent_ptr) { float percent = *((float *) percent_ptr); int new_line; /* The new location for the line pointer. */ ScrollByLineWidget sblw = (ScrollByLineWidget) XtParent(w); new_line = (int) ((float) sblw->scroll.lines * percent); if (ScrollVerticalText( (Widget) sblw, new_line, FALSE)) SetThumb((Widget) sblw); }
void ScrollBar::Drag(Point p) { if(SetThumb(max(0, IsHorz() ? p.x - delta : p.y - delta), thumbsize) && track) Position(); }