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

  1. /*
  2.       sdpglt.c
  3.  
  4.     % sed_PageLeft
  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.     11/18/87 jmd     changed names of some low-level funcs
  13.      4/08/88 jmd     changed sed->fieldcount to sed_GetFieldCount()
  14.      7/07/88 jmd     added call to sed_GetWidth
  15.      8/25/88 jmd     monkeyed with LeftField loop
  16.  
  17.      3/24/89 jmd    added sed_ macros
  18.  
  19.      3/17/90 jmd    added Cache/Flush
  20.      3/28/90 jmd    ansi-fied
  21. */
  22.  
  23. #include "sed.h"
  24.  
  25. int sed_PageLeft(sed_type sed)
  26. /*
  27.     modifies:    sed passed.
  28.     effects:    scrolls the window left by a screen.  tries to be smart about
  29.                 scrolling past the edge.  tries to be smarter about 
  30.                 repositioning the field.  
  31.     returns:    SED_MOVED if successful.
  32.                 SED_STUCK if it couldn't move.
  33.                 SED_INVALID if the fexit function of the current field failed.
  34. */
  35. {
  36.     register int newfld, lastfld;
  37.     int     fld_x, disp_size, xoffset, lines;
  38.     menu_type    menu;
  39.  
  40.     cs_Assert(sed_Ok(sed), CS_SD_PGUP_SED, 0);
  41.  
  42.     menu = sed_GetMenu(sed);
  43.  
  44.     /* Get current position data. */
  45.     disp_size = sed_GetWidth(sed);
  46.     xoffset = sed_GetXoffset(sed);
  47.  
  48.     /* Figure out how much to scroll. */
  49.     lines = int_min(disp_size, xoffset);
  50.     if (lines < 1) {
  51.         return(SED_STUCK);
  52.     }
  53.  
  54.     /* If there are fields, find the best one to move to. */
  55.     if (sed_GetFieldCount(sed) > 0) {
  56.         newfld = sed_GetFieldNo(sed);
  57.         fld_x = menu_GetFieldCol(menu, sed_GetFieldNo(sed));
  58.         while (menu_GetFieldCol(menu, newfld) > fld_x - lines) {
  59.             lastfld = newfld;
  60.             do {
  61.                 if ((newfld = menu_GetFieldLeft(menu, newfld)) < 0) {
  62.                     newfld = lastfld;
  63.                     break;
  64.                 }
  65.             } while (menu_IsProtected(menu, newfld));
  66.             if (newfld == lastfld) {
  67.                 break;
  68.             }
  69.         }
  70.  
  71.         /* If newfld won't be visible find best alternative. 
  72.            If newfld is off the left then try lastfld which should 
  73.            the closest field to the right of the correct position. 
  74.         */
  75.             
  76.         if (menu_GetFieldCol(menu, newfld) < xoffset - lines) {
  77.             newfld = lastfld;
  78.         }
  79.                 
  80.         /* Now see if the field will be past the right edge of the window
  81.            If so, don't change fields.
  82.         */
  83.  
  84.         if (menu_GetFieldCol(menu, newfld) > xoffset-lines+disp_size-1){
  85.             newfld = sed_GetFieldNo(sed);
  86.         }
  87.  
  88.         /* If the field will change, test fexit function of old field. */
  89.         if ((sed_GetFieldNo(sed) != newfld) && !sd_exitfield(sed)) {
  90.             return(SED_INVALID);
  91.         }
  92.     }
  93.  
  94.     disp_Cache();
  95.  
  96.     /* Scroll. */
  97.     sd_scroll(sed, 0, -lines, TRUE);
  98.  
  99.     /* Go to the new field if necessary. */    
  100.     if (menu_GetFieldCount(menu) >0 && sed_GetFieldNo(sed) != newfld) {
  101.         sd_goto_field(sed, newfld);
  102.         if (sed_IsActive(sed)) {
  103.             sed_DoFieldFenter(sed, sed_GetFieldNo(sed));
  104.         }
  105.     }
  106.     disp_Flush();
  107.  
  108.     return(SED_MOVED);
  109. }
  110.  
  111.  
  112.  
  113.