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

  1. /*
  2.     sdscrlrt.c
  3.  
  4.     % sed_ScrollRight
  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 use of menu_Find
  17.  
  18.      3/17/90 jmd    added Cache/Flush
  19.      3/28/90 jmd    ansi-fied
  20. */
  21.  
  22. #include "ted.h"
  23.  
  24. int sed_ScrollRight(sed_type sed, int lines)
  25. /*
  26.     modifies:    sed passed.
  27.     effects:    scrolls the window right by a line.  
  28.                 tries to be smart about    scrolling past the edge.  
  29.                 tries to be smarter about repositioning the field.  
  30.     returns:    SED_MOVED if successful.
  31.                 SED_STUCK if it couldn't move.
  32.                 SED_INVALID if the fexit function of the current field failed.
  33. */
  34. {
  35.     register int newfld, lastfld;
  36.     int         xoffset, disp_size, menu_wid, dif;
  37.     menu_type     menu;
  38.  
  39.     cs_Assert(sed_Ok(sed), CS_SD_SCRR_SED, 0);
  40.  
  41.     menu = sed_GetMenu(sed);
  42.  
  43.     /* Get current position data. */
  44.     menu_wid = menu_GetWidth(menu);
  45.     xoffset = sed_GetXoffset(sed);
  46.     disp_size = sed_GetWidth(sed);
  47.  
  48.     /* Are we at the right edge of the screen? */
  49.     if (menu_wid - disp_size - xoffset <= 0) {
  50.         return(SED_STUCK);
  51.     }
  52.  
  53.     /* Don't scroll too much */
  54.     lines = (lines > 0) ? lines : 0;
  55.     lines = (lines < menu_wid - disp_size - xoffset) 
  56.             ? lines : menu_wid - disp_size - xoffset;
  57.  
  58.     /* If there are fields, move if the current field will leave the window.*/
  59.     if (menu_GetFieldCount(menu) > 0) {
  60.         newfld = sed_GetFieldNo(sed);
  61.         while( menu_GetFieldCol(menu, newfld) < xoffset + lines) {
  62.             lastfld = newfld;
  63.             do {
  64.                 if((newfld = menu_GetFieldRight(menu, newfld)) < 0) {
  65.                     newfld = lastfld;
  66.                     break;
  67.                 }
  68.             } while (menu_IsProtected(menu, newfld));
  69.             if (newfld == lastfld) {
  70.                 /* We're stuck */
  71.                 break;
  72.             }
  73.         }
  74.  
  75.         /* Don't move if the new field is outside the window */
  76.         /* Check whole field */
  77.         if (menu_GetFieldCol(menu, newfld) > xoffset + lines + disp_size-1) {
  78.             newfld = sed_GetFieldNo(sed);
  79.         }
  80.  
  81.         /* If the field will change, test fexit function of old field. */
  82.         if ((sed_GetFieldNo(sed) != newfld) && !sd_exitfield(sed)) {
  83.             return(SED_INVALID);
  84.         }
  85.     }
  86.  
  87.     disp_Cache();
  88.  
  89.     /* Scroll. */
  90.     sd_scroll(sed, 0, lines, TRUE);
  91.  
  92.     /* Go to the new field if necessary. */    
  93.     if (menu_GetFieldCount(menu) > 0 && sed_GetFieldNo(sed) != newfld) {
  94.         sd_goto_field(sed, newfld);
  95.         if (sed_IsActive(sed)) {
  96.             sed_DoFieldFenter(sed, sed_GetFieldNo(sed));
  97.         }
  98.     }
  99.     /* do it for teds too */
  100.     if ( (dif = sed_GetXoffset(sed) - sed_GetTcol(sed)) > 0 ) {
  101.         ted_GotoPosition(sed, sed_GetTrow(sed), sed_GetTcol(sed) + dif);
  102.     }
  103.     disp_Flush();
  104.  
  105.     return(SED_MOVED);
  106. }
  107.  
  108.