home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QBasic & Borland Pascal & C
/
Delphi5.iso
/
C
/
Samples
/
CSAPE32.ARJ
/
SOURCE
/
CSSRC
/
SDPGDN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1990-03-28
|
3KB
|
127 lines
/*
sdpgdn.c
% sed_PageDown
C-scape 3.2
Copyright (c) 1986, 1987, by Oakland Group, Inc.
ALL RIGHTS RESERVED.
Revision History:
-----------------
09/22/86 jmd added call to fenter()
10/30/86 jmd removed ifdefs
11/05/86 jmd converted to boolean
11/05/86 jmd replaced d_ymin and
sng d_ymax with disp_size
11/06/86 sng fixed fexit bug.
11/08/86 jmd added calls to do_funcs
11/18/86 jmd rewrote completely.
2/14/87 jmd replaced scroll.
3/11/87 jmd replaced scroll for horizontal scrolling.
4/21/87 jmd check for active mode
11/18/87 jmd changed names of some low-level funcs
4/08/88 jmd changed sed->fieldcount to sed_GetFieldCount()
7/07/88 jmd added call to sed_GetHeight
8/25/88 jmd monkeyed with DownField loop
12/12/88 jmd revised use of menu_Find...
12/16/88 jmd fixed search
3/24/89 jmd added sed_ macros
3/17/90 jmd added Cache/Flush
3/28/90 jmd ansi-fied
*/
#include "sed.h"
int sed_PageDown(sed_type sed)
/*
modifies: sed passed.
effects: scrolls the window down by a screen. tries to be smart about
scrolling past the edge. tries to be smarter about
repositioning the field.
returns: SED_MOVED if successful.
SED_STUCK if it couldn't move.
SED_INVALID if the fexit function of the current field failed.
*/
{
register int newfld, lastfld;
int menu_hgt, fld_y, disp_size, yoffset, lines;
menu_type menu;
cs_Assert(sed_Ok(sed), CS_SD_PGDN_SED, 0);
menu = sed_GetMenu(sed);
/* Get current position data. */
menu_hgt = menu_GetHeight(menu);
disp_size = sed_GetHeight(sed);
yoffset = sed_GetYoffset(sed);
/* Figure out how much to scroll. */
/* display size, menusize - display size - offset */
lines = int_min(disp_size, menu_hgt - disp_size - yoffset);
if (lines < 1) {
return(SED_STUCK);
}
/* If there are fields, find the best one to move to. */
if (menu_GetFieldCount(menu) > 0) {
newfld = sed_GetFieldNo(sed);
fld_y = menu_GetFieldRow(menu, sed_GetFieldNo(sed));
while (menu_GetFieldRow(menu, newfld) < fld_y + lines) {
lastfld = newfld;
do {
if ((newfld = menu_FindDownField(menu, newfld)) < 0) {
newfld = lastfld;
break;
}
} while (menu_IsProtected(menu, newfld));
if (newfld == lastfld) {
break;
}
}
/* If newfld won't be visible find best alternative.
If newfld is off the bottom then try lastfld which should
the closest field above the correct position.
*/
if (menu_GetFieldRow(menu, newfld) > yoffset + lines + disp_size-1) {
newfld = lastfld;
}
/* Now see if the field will be above the top of the window
If so, don't change fields.
*/
if (menu_GetFieldRow(menu, newfld) < yoffset + lines) {
newfld = sed_GetFieldNo(sed);
}
/* If the field will change, test fexit function of old field. */
if ((sed_GetFieldNo(sed) != newfld) && !sd_exitfield(sed)) {
return(SED_INVALID);
}
}
disp_Cache();
/* Scroll. */
sd_scroll(sed, lines, 0, TRUE);
/* Go to the new field if necessary. */
if (menu_GetFieldCount(menu) >0 && sed_GetFieldNo(sed) != newfld) {
sd_goto_field(sed, newfld);
if (sed_IsActive(sed)) {
sed_DoFieldFenter(sed, sed_GetFieldNo(sed));
}
}
disp_Flush();
return(SED_MOVED);
}