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

  1. /*
  2.       sdpgdn.c
  3.  
  4.     % sed_PageDown
  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.     09/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/06/86 sng    fixed fexit bug.
  18.     11/08/86 jmd    added calls to do_funcs
  19.     11/18/86 jmd    rewrote completely.
  20.      2/14/87 jmd    replaced scroll.    
  21.      3/11/87 jmd    replaced scroll for horizontal scrolling.
  22.      4/21/87 jmd    check for active mode
  23.     11/18/87 jmd     changed names of some low-level funcs
  24.      4/08/88 jmd     changed sed->fieldcount to sed_GetFieldCount()
  25.      7/07/88 jmd     added call to sed_GetHeight
  26.      8/25/88 jmd     monkeyed with DownField loop
  27.     12/12/88 jmd     revised use of menu_Find...
  28.     12/16/88 jmd     fixed search
  29.  
  30.      3/24/89 jmd    added sed_ macros
  31.  
  32.      3/17/90 jmd    added Cache/Flush
  33.      3/28/90 jmd    ansi-fied
  34. */
  35.  
  36. #include "sed.h"
  37.  
  38. int sed_PageDown(sed_type sed)
  39. /*
  40.     modifies:    sed passed.
  41.     effects:    scrolls the window down by a screen.  tries to be smart about
  42.                 scrolling past the edge.  tries to be smarter about 
  43.                 repositioning the field.  
  44.     returns:    SED_MOVED if successful.
  45.                 SED_STUCK if it couldn't move.
  46.                 SED_INVALID if the fexit function of the current field failed.
  47. */
  48. {
  49.     register int newfld, lastfld;
  50.     int         menu_hgt, fld_y, disp_size, yoffset, lines;
  51.     menu_type     menu;
  52.  
  53.     cs_Assert(sed_Ok(sed), CS_SD_PGDN_SED, 0);
  54.  
  55.     menu = sed_GetMenu(sed);
  56.  
  57.     /* Get current position data. */
  58.     menu_hgt = menu_GetHeight(menu);
  59.     disp_size = sed_GetHeight(sed);
  60.     yoffset = sed_GetYoffset(sed);
  61.  
  62.     /* Figure out how much to scroll. */
  63.     /*              display size, menusize - display size - offset */
  64.     lines = int_min(disp_size, menu_hgt - disp_size - yoffset);
  65.     if (lines < 1) {
  66.         return(SED_STUCK);
  67.     }
  68.  
  69.     /* If there are fields, find the best one to move to. */
  70.     if (menu_GetFieldCount(menu) > 0) {
  71.         newfld = sed_GetFieldNo(sed);
  72.         fld_y = menu_GetFieldRow(menu, sed_GetFieldNo(sed));
  73.         while (menu_GetFieldRow(menu, newfld) < fld_y + lines) {
  74.             lastfld = newfld;
  75.             do {
  76.                 if ((newfld = menu_FindDownField(menu, newfld)) < 0) {
  77.                     newfld = lastfld;
  78.                     break;
  79.                 }
  80.             } while (menu_IsProtected(menu, newfld));
  81.             if (newfld == lastfld) {
  82.                 break;
  83.             }
  84.         }
  85.  
  86.         /* If newfld won't be visible find best alternative. 
  87.            If newfld is off the bottom then try lastfld which should 
  88.            the closest field above the correct position. 
  89.         */
  90.             
  91.         if (menu_GetFieldRow(menu, newfld) > yoffset + lines + disp_size-1) {
  92.             newfld = lastfld;
  93.         }
  94.                 
  95.         /* Now see if the field will be above the top of the window
  96.            If so, don't change fields.
  97.         */
  98.  
  99.         if (menu_GetFieldRow(menu, newfld) < yoffset + lines) {
  100.             newfld = sed_GetFieldNo(sed);
  101.         }
  102.  
  103.         /* If the field will change, test fexit function of old field. */
  104.         if ((sed_GetFieldNo(sed) != newfld) && !sd_exitfield(sed)) {
  105.             return(SED_INVALID);
  106.         }
  107.     }
  108.  
  109.     disp_Cache();
  110.  
  111.     /* Scroll. */
  112.     sd_scroll(sed, lines, 0, TRUE);
  113.  
  114.     /* Go to the new field if necessary. */    
  115.     if (menu_GetFieldCount(menu) >0 && sed_GetFieldNo(sed) != newfld) {
  116.         sd_goto_field(sed, newfld);
  117.         if (sed_IsActive(sed)) {
  118.             sed_DoFieldFenter(sed, sed_GetFieldNo(sed));
  119.         }
  120.     }
  121.     disp_Flush();
  122.  
  123.     return(SED_MOVED);
  124. }
  125.  
  126.  
  127.