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

  1. /*
  2.     sdscrllt.c
  3.  
  4.     % sed_ScrollLeft
  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.     12/16/88 jmd     fixed use of menu_Find
  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 "ted.h"
  25.  
  26. int sed_ScrollLeft(sed_type sed, int lines)
  27. /*
  28.     modifies:    sed passed.
  29.     effects:    scrolls the window left by lines.  tries to be smart about
  30.                 scrolling past the edge.  tries to be smarter about 
  31.                 repositioning the field.  
  32.     returns:    SED_MOVED if successful.
  33.                 SED_STUCK if it couldn't move.
  34.                 SED_INVALID if the fexit function of the current field failed.
  35. */
  36. {
  37.     register int newfld, lastfld;
  38.     int         xoffset, disp_size, dif;
  39.     menu_type    menu;
  40.  
  41.     cs_Assert(sed_Ok(sed), CS_SD_SCRL_SED, 0);
  42.  
  43.     menu = sed_GetMenu(sed);
  44.  
  45.     /* Get current position data. */
  46.     xoffset = sed_GetXoffset(sed);
  47.     disp_size = sed_GetWidth(sed) - 1;
  48.  
  49.     /* Are we at the left edge of the screen? */
  50.     if (xoffset <= 0) {
  51.         return(SED_STUCK);
  52.     }
  53.  
  54.     /* Don't scroll too much */
  55.     lines = (lines > 0) ? lines : 0;
  56.     lines = (lines < xoffset) ? lines : 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+disp_size){
  62.             lastfld = newfld;
  63.             do {
  64.                 if ((newfld = menu_GetFieldLeft(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 above the window */
  76.         if (menu_GetFieldCol(menu, newfld) < xoffset - lines) {
  77.             newfld = sed_GetFieldNo(sed);
  78.         }
  79.  
  80.         /* If the field will change, test fexit function of old field. */
  81.         if ((sed_GetFieldNo(sed) != newfld) && !sd_exitfield(sed)) {
  82.             return(SED_INVALID);
  83.         }
  84.     }
  85.  
  86.     disp_Cache();
  87.  
  88.     /* Scroll. */
  89.     sd_scroll(sed, 0, -lines, TRUE);
  90.  
  91.     /* Go to the new field if necessary. */    
  92.     if (menu_GetFieldCount(menu) >0 && sed_GetFieldNo(sed) != newfld) {
  93.         sd_goto_field(sed, newfld);
  94.         if (sed_IsActive(sed)) {
  95.             sed_DoFieldFenter(sed, sed_GetFieldNo(sed));
  96.         }
  97.     }
  98.     /* do it for teds too */
  99.     if ( (dif = sed_GetTcol(sed) - (sed_GetXoffset(sed) + sed_GetWidth(sed) - 1)) > 0 ) {
  100.         ted_GotoPosition(sed, sed_GetTrow(sed), sed_GetTcol(sed) - dif);
  101.     }
  102.     disp_Flush();
  103.  
  104.     return(SED_MOVED);
  105. }
  106.  
  107.  
  108.  
  109.