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

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