if (!componentFits(co, new)) {
gotoComponent(form, -1);
form->vertOffset = form->elements[new].top - co->top - 1;
+ if (form->vertOffset > (form->numRows - co->height))
+ form->vertOffset = form->numRows - co->height;
}
gotoComponent(form, new);
static struct eventResult formEvent(newtComponent co, struct event ev) {
struct form * form = co->data;
newtComponent subco = form->elements[form->currComp].co;
- int new, wrap;
+ int new, wrap = 0;
struct eventResult er;
- int dir = 0;
+ int dir = 0, page = 0;
int i, num;
er.result = ER_IGNORED;
case ER_NEXTCOMP:
er.result = ER_SWALLOWED;
dir = 1;
- wrap = 0;
break;
default:
case NEWT_KEY_BKSPC:
er.result = ER_SWALLOWED;
dir = -1;
- wrap = 0;
break;
case NEWT_KEY_DOWN:
case NEWT_KEY_ENTER:
er.result = ER_SWALLOWED;
dir = 1;
- wrap = 0;
+ break;
+
+ case NEWT_KEY_PGUP:
+ er.result = ER_SWALLOWED;
+ dir = -1;
+ page = 1;
+ break;
+
+ case NEWT_KEY_PGDN:
+ er.result = ER_SWALLOWED;
+ dir = 1;
+ page = 1;
break;
}
}
if (dir) {
new = form->currComp;
- do {
- new += dir;
-
- if (wrap) {
- if (new < 0)
- new = form->numComps - 1;
- else if (new >= form->numComps)
- new = 0;
- } else if (new < 0 || new >= form->numComps)
- return er;
- } while (!form->elements[new].co->takesFocus);
+
+ if (page) {
+ new += dir * co->height;
+ if (new < 0)
+ new = 0;
+ else if (new >= form->numComps)
+ new = (form->numComps - 1);
+
+ while (!form->elements[new].co->takesFocus)
+ new = new - dir;
+ } else {
+ do {
+ new += dir;
+
+ if (wrap) {
+ if (new < 0)
+ new = form->numComps - 1;
+ else if (new >= form->numComps)
+ new = 0;
+ } else if (new < 0 || new >= form->numComps)
+ return er;
+ } while (!form->elements[new].co->takesFocus);
+ }
/* make sure this component is visible */
if (!componentFits(co, new)) {
}
if (form->vertOffset < 0) form->vertOffset = 0;
+ if (form->vertOffset > (form->numRows - co->height))
+ form->vertOffset = form->numRows - co->height;
newtDrawForm(co);
}