home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / SDSCRLDN.C < prev    next >
C/C++ Source or Header  |  1990-03-28  |  3KB  |  123 lines

  1. /*
  2.     sdscrldn.c
  3.  
  4.     % sed_ScrollDown
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1986, 1987, by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.      9/22/86 jmd    added call to fenter() 
  13.     10/30/86 jmd    removed ifdefs 
  14.     11/05/86 jmd    converted to boolean    
  15.     11/05/86 jmd    replaced d_ymin and     
  16.              sng    d_ymax with disp_size    
  17.     11/08/86 jmd    added calls to do_funcs
  18.     11/18/86 jmd    rewrote completely.
  19.      1/22/87 jmd    added new borders.
  20.      2/14/86 jmd    replaced scroll.
  21.      3/11/87 jmd    replaced scroll for horizontal scrolling.
  22.      4/21/87 jmd    check for active mode
  23.      5/05/87 jmd    added multilines
  24.     11/18/87 jmd     changed names of some low-level funcs
  25.      4/08/88 jmd     changed sed>fieldcount to sed_GetFieldCount()
  26.      7/07/88 jmd     added call to sed_GetHeight
  27.      8/25/88 jmd     monkeyed with DownField loop
  28.     12/12/88 jmd     revised use of menu_Find...
  29.     12/16/88 jmd     fixed use of menu_Find
  30.  
  31.      3/24/89 jmd    added sed_ macros
  32.  
  33.      3/17/90 jmd    added Cache/Flush
  34.      3/28/90 jmd    ansi-fied
  35. */
  36.  
  37. #include "ted.h"
  38.  
  39. int sed_ScrollDown(sed_type sed, int lines)
  40. /*
  41.     modifies:    sed passed.
  42.     effects:    scrolls the window down by a line.  
  43.                 tries to be smart about    scrolling past the edge.  
  44.                 tries to be smarter about repositioning the field.  
  45.     returns:    SED_MOVED if successful.
  46.                 SED_STUCK if it couldn't move.
  47.                 SED_INVALID if the fexit function of the current field failed.
  48. */
  49. {
  50.     register int newfld, lastfld;
  51.     int         yoffset, disp_size, menu_hgt, dif;
  52.     menu_type     menu;
  53.  
  54.     cs_Assert(sed_Ok(sed), CS_SD_SCRD_SED, 0);
  55.  
  56.     menu = sed_GetMenu(sed);
  57.  
  58.     /* Get current position data. */
  59.     menu_hgt = menu_GetHeight(menu);
  60.     yoffset = sed_GetYoffset(sed);
  61.     disp_size = sed_GetHeight(sed);
  62.  
  63.     /* Are we at the bottom of the screen? */
  64.     if (menu_hgt - disp_size - yoffset <= 0) {
  65.         return(SED_STUCK);
  66.     }
  67.  
  68.     /* Don't scroll too much */
  69.     lines = (lines > 0) ? lines : 0;
  70.     lines = (lines < menu_hgt - disp_size - yoffset) 
  71.             ? lines : menu_hgt - disp_size - yoffset;
  72.  
  73.     /* If there are fields, move if the current field will leave the window.*/
  74.     if (menu_GetFieldCount(menu) > 0) {
  75.         newfld = sed_GetFieldNo(sed);
  76.         while (menu_GetFieldRow(menu, newfld) < yoffset + lines) {
  77.             lastfld = newfld;
  78.             do {
  79.                 if ((newfld = menu_FindDownField(menu, newfld)) < 0) {
  80.                     /* No more down fields */
  81.                     newfld = lastfld;
  82.                     break;
  83.                 }
  84.             } while (menu_IsProtected(menu, newfld));
  85.             if (newfld == lastfld) {
  86.                 /* We're stuck */
  87.                 break;
  88.             }
  89.         }
  90.  
  91.         /* Don't move if the new field is beneath the window */
  92.         if (menu_GetFieldRow(menu, newfld) > yoffset + lines + disp_size-1) {
  93.             newfld = sed_GetFieldNo(sed);
  94.         }
  95.  
  96.         /* If the field will change, test fexit function of old field. */
  97.         if ((sed_GetFieldNo(sed) != newfld) && !sd_exitfield(sed)) {
  98.             return(SED_INVALID);
  99.         }
  100.     }
  101.  
  102.     disp_Cache();
  103.  
  104.     /* Scroll. */
  105.     sd_scroll(sed, lines, 0, TRUE);
  106.  
  107.     /* Go to the new field if necessary. */    
  108.     if (menu_GetFieldCount(menu) >0 && sed_GetFieldNo(sed) != newfld) {
  109.         sd_goto_field(sed, newfld);
  110.         if (sed_IsActive(sed)) {
  111.             sed_DoFieldFenter(sed, sed_GetFieldNo(sed));
  112.         }
  113.     }
  114.     /* do it for teds too */
  115.     if ( (dif = sed_GetYoffset(sed) - sed_GetTrow(sed)) > 0 ) {
  116.         ted_GotoPosition(sed, sed_GetTrow(sed) + dif, sed_GetTcol(sed));
  117.     }
  118.     disp_Flush();
  119.  
  120.     return(SED_MOVED);
  121. }
  122.  
  123.