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

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