static void KPScrollTo(KPData *kpd, unichar_t uch, enum sortby sort) { int i; if ( sort==sb_first ) { for ( i=0; i<kpd->kcnt && kpd->kerns[i].first->unicodeenc<uch; ++i ); } else { for ( i=0; i<kpd->kcnt && kpd->kerns[i].second->unicodeenc<uch; ++i ); } if ( kpd->wh<=2 ) /* As is */; else if ( kpd->wh<5 ) --i; else i -= kpd->wh/5; if ( i>kpd->kcnt-kpd->wh ) i = kpd->kcnt-kpd->wh; if ( i<0 ) i = 0; if ( i!=kpd->off_top ) { int off = i-kpd->off_top; kpd->off_top = i; GScrollBarSetPos(GWidgetGetControl(kpd->gw,CID_ScrollBar),kpd->off_top); GDrawScroll(kpd->v,NULL,0,off*kpd->uh); } }
static int KP_Scrolled(GGadget *g, GEvent *e) { if ( e->type==et_controlevent && e->u.control.subtype == et_scrollbarchange ) { KPData *kpd = GDrawGetUserData(GGadgetGetWindow(g)); int newpos = kpd->off_top; switch( e->u.control.u.sb.type ) { case et_sb_top: newpos = 0; break; case et_sb_halfup: case et_sb_uppage: newpos -= kpd->wh==1?1:kpd->wh-1; break; case et_sb_up: newpos -= 1; break; case et_sb_halfdown: case et_sb_down: newpos += 1; break; case et_sb_downpage: newpos += kpd->wh==1?1:kpd->wh-1; break; case et_sb_bottom: newpos = kpd->kcnt-kpd->wh; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = e->u.control.u.sb.pos; break; } if ( newpos>kpd->kcnt-kpd->wh ) newpos = kpd->kcnt-kpd->wh; if ( newpos<0 ) newpos = 0; if ( newpos!=kpd->off_top ) { int off = newpos-kpd->off_top; kpd->off_top = newpos; GScrollBarSetPos(g,kpd->off_top); GDrawScroll(kpd->v,NULL,0,off*kpd->uh); } } return( true ); }
static void BdfP_VScroll(struct bdf_dlg *bd,struct sbevent *sb) { int newpos = bd->cur->top_prop; int page = bd->vheight/(bd->fh+1); switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= 9*page/10; break; case et_sb_up: newpos--; break; case et_sb_down: newpos++; break; case et_sb_downpage: newpos += 9*page/10; break; case et_sb_bottom: newpos = bd->cur->bdf->prop_cnt+1; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos + page > bd->cur->bdf->prop_cnt+1 ) newpos = bd->cur->bdf->prop_cnt+1 - page; if ( newpos<0 ) newpos = 0; if ( newpos!=bd->cur->top_prop ) { int diff = (newpos-bd->cur->top_prop)*(bd->fh+1); GRect r; bd->cur->top_prop = newpos; GScrollBarSetPos(bd->vsb,newpos); GGadgetGetSize(bd->tf,&r); GGadgetMove(bd->tf,r.x,r.y+diff); r.x = 0; r.y = 0; r.width = bd->vwidth; r.height = (bd->vheight/(bd->fh+1))*(bd->fh+1); GDrawScroll(bd->v,&r,0,diff); } }
static void AnchorD_HScroll(AnchorDlg *a,struct sbevent *sb) { int newpos = a->xoff; GRect rect; switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= a->sb_width; break; case et_sb_up: newpos -= a->pixelsize*a->magfactor/2; break; case et_sb_down: newpos = a->pixelsize*a->magfactor/2; break; case et_sb_downpage: newpos += a->sb_width; break; case et_sb_bottom: newpos = a->xlen - a->sb_width; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos + a->sb_width >= a->xlen ) newpos = a->xlen - a->sb_width; if ( newpos < 0 ) newpos = 0; if ( newpos!=a->xoff ) { int diff = newpos-a->xoff; a->xoff = newpos; GScrollBarSetPos(a->hsb,newpos); if ( a->cnt!=0 ) { rect.x = a->apmatch[0].xstart+1; rect.y = 0; rect.width = a->sb_width; rect.height = a->sb_base; GDrawScroll(a->gw,&rect,-diff,0); } } }
static void GroupHScroll(struct groupdlg *grp,struct sbevent *sb) { int newpos = grp->off_left; switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= grp->page_width; break; case et_sb_up: --newpos; break; case et_sb_down: ++newpos; break; case et_sb_downpage: newpos += grp->page_width; break; case et_sb_bottom: newpos = grp->maxl-grp->page_width; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos>grp->maxl-grp->page_width ) newpos = grp->maxl-grp->page_width; if ( newpos<0 ) newpos =0; if ( newpos!=grp->off_left ) { int diff = newpos-grp->off_left; grp->off_left = newpos; GScrollBarSetPos(grp->hsb,grp->off_left); GDrawScroll(grp->v,NULL,-diff,0); } }
static void GroupScroll(struct groupdlg *grp,struct sbevent *sb) { int newpos = grp->off_top; switch( sb->type ) { case et_sb_top: newpos = 0; break; case et_sb_uppage: newpos -= grp->lines_page; break; case et_sb_up: --newpos; break; case et_sb_down: ++newpos; break; case et_sb_downpage: newpos += grp->lines_page; break; case et_sb_bottom: newpos = grp->open_cnt-grp->lines_page; break; case et_sb_thumb: case et_sb_thumbrelease: newpos = sb->pos; break; } if ( newpos>grp->open_cnt-grp->lines_page ) newpos = grp->open_cnt-grp->lines_page; if ( newpos<0 ) newpos =0; if ( newpos!=grp->off_top ) { int diff = newpos-grp->off_top; grp->off_top = newpos; GScrollBarSetPos(grp->vsb,grp->off_top); GDrawScroll(grp->v,NULL,0,diff*grp->fh); } }
static void GRowColScrollBy(GRowCol *grc,int loff,int xoff) { int top = GRowColTopInWindow(grc,grc->ltot-1); int ydiff, i; if ( grc->loff + loff < 0 ) loff = -grc->loff; else if ( grc->loff + loff > top ) loff = top-grc->loff; if ( xoff+grc->xoff<0 ) xoff = -grc->xoff; else if ( xoff+grc->xoff+grc->g.inner.width > grc->xmax ) { xoff = grc->xmax-grc->g.inner.width-grc->xoff; if ( xoff<0 ) xoff = 0; } if ( loff == 0 && xoff==0 ) return; ydiff = 0; if ( loff>0 ) { for ( i=0; i<loff && ydiff<grc->g.inner.height; ++i ) ydiff += GTextInfoGetHeight(grc->g.base,grc->ti[i+grc->loff],grc->font); } else if ( loff<0 ) { for ( i=loff; i<0 && -ydiff<grc->g.inner.height; ++i ) ydiff -= GTextInfoGetHeight(grc->g.base,grc->ti[i+grc->loff],grc->font); } if ( !GDrawIsVisible(grc->g.base)) return; GDrawForceUpdate(grc->g.base); grc->loff += loff; grc->xoff += xoff; if ( ydiff>=grc->g.inner.height || -ydiff >= grc->g.inner.height ) _ggadget_redraw(&grc->g); else if ( ydiff!=0 || xoff!=0 ) GDrawScroll(grc->g.base,&grc->g.inner,xoff,ydiff); if ( loff!=0 ) GScrollBarSetPos(&grc->vsb->g,grc->loff); }