home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QBasic & Borland Pascal & C
/
Delphi5.iso
/
C
/
Samples
/
CSAPE32.ARJ
/
SOURCE
/
CSSRC
/
SDSCRLRT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1990-03-28
|
3KB
|
108 lines
/*
sdscrlrt.c
% sed_ScrollRight
C-scape 3.2
Copyright (c) 1986, 1987, by Oakland Group, Inc.
ALL RIGHTS RESERVED.
Revision History:
-----------------
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_GetWidth
8/25/88 jmd monkeyed with RightField loop
12/16/88 jmd fixed use of menu_Find
3/17/90 jmd added Cache/Flush
3/28/90 jmd ansi-fied
*/
#include "ted.h"
int sed_ScrollRight(sed_type sed, int lines)
/*
modifies: sed passed.
effects: scrolls the window right by a line.
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 xoffset, disp_size, menu_wid, dif;
menu_type menu;
cs_Assert(sed_Ok(sed), CS_SD_SCRR_SED, 0);
menu = sed_GetMenu(sed);
/* Get current position data. */
menu_wid = menu_GetWidth(menu);
xoffset = sed_GetXoffset(sed);
disp_size = sed_GetWidth(sed);
/* Are we at the right edge of the screen? */
if (menu_wid - disp_size - xoffset <= 0) {
return(SED_STUCK);
}
/* Don't scroll too much */
lines = (lines > 0) ? lines : 0;
lines = (lines < menu_wid - disp_size - xoffset)
? lines : menu_wid - disp_size - xoffset;
/* If there are fields, move if the current field will leave the window.*/
if (menu_GetFieldCount(menu) > 0) {
newfld = sed_GetFieldNo(sed);
while( menu_GetFieldCol(menu, newfld) < xoffset + lines) {
lastfld = newfld;
do {
if((newfld = menu_GetFieldRight(menu, newfld)) < 0) {
newfld = lastfld;
break;
}
} while (menu_IsProtected(menu, newfld));
if (newfld == lastfld) {
/* We're stuck */
break;
}
}
/* Don't move if the new field is outside the window */
/* Check whole field */
if (menu_GetFieldCol(menu, newfld) > xoffset + lines + disp_size-1) {
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, 0, lines, 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));
}
}
/* do it for teds too */
if ( (dif = sed_GetXoffset(sed) - sed_GetTcol(sed)) > 0 ) {
ted_GotoPosition(sed, sed_GetTrow(sed), sed_GetTcol(sed) + dif);
}
disp_Flush();
return(SED_MOVED);
}