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

  1. /*
  2.     sdscrlad.c
  3.  
  4.     % sd_scroll_adjust
  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.      2/14/86 jmd    replaced scroll.
  13.      3/11/87 jmd    replaced scroll for horizontal scrolling.
  14.      3/11/87 jmd    added horizontal adjusting.
  15.      3/22/87 jmd    added search for first char of a field.
  16.     11/18/87 jmd     changed names of some low-level funcs
  17.      7/08/88 jmd    converted to menu coords
  18.      8/23/88 jmd    added check for dependent screens
  19.      9/12/88 jmd    Added in and out data to objects
  20.     11/25/88 jmd    Added check for sizeless fields
  21.     12/07/88 jmd    fixed sideways adjust bug
  22.  
  23.      3/24/89 jmd    added sed_ macros
  24.      4/13/89 jmd    added sed_GetField macro
  25.      8/08/89 jmd    converted bob calls to window calls
  26.  
  27.      3/28/90 jmd    ansi-fied
  28. */
  29.  
  30. #include "sed.h"
  31.  
  32. void sd_scroll_adjust(sed_type sed, int fieldno)
  33. /*
  34.     requires:    a field number within range.
  35.     effects:    if the field indicated is off the screen, scroll until
  36.                 it's on the screen.
  37.                 Always tries to make first position in a field visible.
  38.     Note:        Does not do anything if the field (and its bob)
  39.                 has no size.
  40.                 
  41. */
  42. {
  43.     int      vt_adj = 0;        /* adjustment components */
  44.     int      hz_adj = 0;
  45.     int      frow, lrow, fcol, lcol, edge, xoff, yoff;
  46.     bob_type bob;
  47.     boolean     isabob = FALSE;
  48.     field_type         field;
  49.  
  50.     cs_Assert(sed_Ok(sed), CS_SD_SCRA_SED, 0);
  51.  
  52.     xoff = sed_GetXoffset(sed);
  53.     yoff = sed_GetYoffset(sed);
  54.  
  55.     /* if the field has a dependent screen, adjust to it */
  56.     if ((bob = sed_GetFieldBob(sed, fieldno)) != NULL) {
  57.         if (bob_IsDepend(bob)) {
  58.             isabob = TRUE;
  59.         }
  60.     }
  61.  
  62.     /* get adjust parameters (from field or bob object) */
  63.     if (isabob) {
  64.         /* bob object */
  65.         frow = bord_GetTopRow(bob) - win_GetTopRow(sed) + yoff;
  66.         fcol = bord_GetLeftCol(bob) - win_GetLeftCol(sed) + xoff;
  67.  
  68.         lrow = frow + bord_GetHeight(bob) - 1;
  69.         lcol = fcol + bord_GetWidth(bob) - 1;
  70.     }
  71.     else {
  72.         /* field */
  73.         field = sed_GetField(sed, fieldno);
  74.  
  75.         frow = field_GetRow(field);                            /* first row */
  76.         lrow = frow;                                        /* last row */
  77.     
  78.         fcol = field_GetCol(field);                             /* first pos */
  79.         lcol = fcol + field_GetWidth(field) - 1;            /* last pos */
  80.     }
  81.  
  82.     /* Skip "sizeless" fields */
  83.     if (lcol < fcol || lrow < frow) {
  84.         return;
  85.     }
  86.  
  87.     /* compute vertical component */
  88.     edge = yoff + sed_GetHeight(sed) - 1;
  89.     if (frow < yoff) {
  90.         /* This case is first because the start of the field is more important */
  91.         vt_adj = frow - yoff;
  92.     }
  93.     else if (lrow > edge) {
  94.         /* scroll so that end is visible, but not so that start is hidden */
  95.         vt_adj = int_min(lrow - edge, frow - yoff);
  96.     }
  97.  
  98.     /* compute horizontal component */
  99.     edge = xoff + sed_GetWidth(sed) - 1;
  100.     if (fcol < xoff) {
  101.         /* This case is first because the start of the field is more important */
  102.         hz_adj = fcol - xoff;
  103.     }
  104.     else if (lcol > edge) {
  105.         /* scroll so that end is visible, but not so that start is hidden */
  106.         hz_adj = int_min(lcol - edge, fcol - xoff);
  107.     }
  108.  
  109.     /* do it */
  110.     if (vt_adj != 0 || hz_adj != 0) {
  111.         sd_scroll(sed, vt_adj, hz_adj, TRUE);
  112.     }
  113. }
  114.