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

  1. /*
  2.     sdscrlup.c
  3.  
  4.     % sed_ScrollUp
  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.      4/21/87 jmd    check for active mode
  22.      5/05/87 jmd    added multilines
  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 UpField loop
  27.     12/12/88 jmd     revised use of menu_Find...
  28.     12/16/88 jmd     fixed use of menu_Find
  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 "ted.h"
  37.  
  38. int sed_ScrollUp(sed_type sed, int lines)
  39. /*
  40.     modifies:    sed passed.
  41.     effects:    scrolls the window up by lines.  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         yoffset, disp_size, dif;
  51.     menu_type     menu;
  52.  
  53.     cs_Assert(sed_Ok(sed), CS_SD_SCRU_SED, 0);
  54.  
  55.     menu = sed_GetMenu(sed);
  56.  
  57.     /* Get current position data. */
  58.     yoffset = sed_GetYoffset(sed);
  59.     disp_size = sed_GetHeight(sed) - 1;
  60.  
  61.     /* Are we at the top of the screen? */
  62.     if (yoffset <= 0) {
  63.         return(SED_STUCK);
  64.     }
  65.  
  66.     /* Don't scroll too much */
  67.     lines = (lines > 0) ? lines : 0;
  68.     lines = (lines < yoffset) ? lines : yoffset;
  69.  
  70.     /* If there are fields, move if the current field will leave the window.*/
  71.     if (menu_GetFieldCount(menu) > 0) {
  72.         newfld = sed_GetFieldNo(sed);
  73.         while (menu_GetFieldRow(menu, newfld) > yoffset-lines+disp_size){
  74.             lastfld = newfld;
  75.             do {
  76.                 if ((newfld = menu_FindUpField(menu, newfld)) < 0) {
  77.                     /* No more fields to be found */
  78.                     newfld = lastfld;
  79.                     break;
  80.                 }
  81.             } while (menu_IsProtected(menu, newfld));
  82.             if (newfld == lastfld) {
  83.                 /* We're stuck */
  84.                 break;
  85.             }
  86.         }
  87.  
  88.         /* Don't move if the new field is above the window */
  89.         if (menu_GetFieldRow(menu, newfld) < yoffset - lines) {
  90.             newfld = sed_GetFieldNo(sed);
  91.         }
  92.  
  93.         /* If the field will change, test fexit function of old field. */
  94.         if ((sed_GetFieldNo(sed) != newfld) && !sd_exitfield(sed)) {
  95.             return(SED_INVALID);
  96.         }
  97.     }
  98.  
  99.     disp_Cache();
  100.  
  101.     /* Scroll. */
  102.     sd_scroll(sed, -lines, 0, TRUE);
  103.  
  104.     /* Go to the new field if necessary. */    
  105.     if (menu_GetFieldCount(menu) >0 && sed_GetFieldNo(sed) != newfld) {
  106.         sd_goto_field(sed, newfld);
  107.         if (sed_IsActive(sed)) {
  108.             sed_DoFieldFenter(sed, sed_GetFieldNo(sed));
  109.         }
  110.     }
  111.     /* do it for teds too */
  112.     if ( (dif = sed_GetTrow(sed) - (sed_GetYoffset(sed) + sed_GetHeight(sed) - 1)) > 0 ) {
  113.         ted_GotoPosition(sed, sed_GetTrow(sed) - dif, sed_GetTcol(sed));
  114.     }
  115.     disp_Flush();
  116.  
  117.     return(SED_MOVED);
  118. }
  119.  
  120.