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

  1. /*
  2.     sdfindf.c
  3.  
  4.     % sed_FindField
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1988, by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.     12/14/88 jmd    Added preferred direction, optimized
  13.      2/02/89 jdc    fixed outside menu cases and added bob support
  14.      6/04/89 jdc    added prot flag
  15.      7/02/89 jdc    added frowcount change
  16.      3/03/90 ted/pmcm Added return(-2) in case of protected fields for mouse handlers.
  17.      3/28/90 jmd    ansi-fied
  18. */
  19.  
  20. #include "sed.h"
  21.  
  22. int sd_findfield(sed_type sed, ocbox *boxp, int pref, int prot)
  23. /*
  24.     Finds the first field in the given box. The box should be in menu coords.
  25.     Returns (-1) if no field was found in the box.
  26.  
  27.     If 'prot' is TRUE will find protected fields also.
  28.     If 'prot' is FALSE and only protected fields are in the box, returns -2.
  29.  
  30.     'pref' is the preferred direction to search from.
  31.     (OAK_UP, OAK_DOWN, OAK_LEFT, OAK_RIGHT)
  32.     (UP means we are moving UP into the box, startsearching from the 
  33.         bottom, etc. )
  34. */
  35. {
  36.     register int row, fldno;
  37.     int    firstrow, lastrow, rowstep, lastfld = -1;
  38.     menu_type     menu;
  39.     field_type     field;
  40.  
  41.     menu = sed_GetMenu(sed);
  42.  
  43.     if (pref == OAK_UP) {
  44.         if ( (firstrow = int_min(boxp->botrow, menu->frowcount - 1)) <=
  45.             (lastrow = boxp->toprow - 1) ) {
  46.             return(-1);
  47.         }
  48.         rowstep = -1;
  49.     }
  50.     else {
  51.         if ( (firstrow = boxp->toprow) >=
  52.             (lastrow = int_min(boxp->botrow + 1, menu->frowcount)) )    {
  53.             return(-1);
  54.         }
  55.         rowstep = 1;
  56.     }
  57.     for (row = firstrow; row != lastrow; row += rowstep) {
  58.         /* now find the matching field in the row */
  59.         fldno = menu_GetGRow(menu, row) - 1;
  60.         while (fldno >= 0) {
  61.  
  62.             field = menu_GetField(menu, fldno);
  63.  
  64.             if (boxp->leftcol <= field_GetLastCol(field) &&
  65.                 boxp->rightcol >= field_GetCol(field)) {
  66.                 if (prot || !field_GetProtected(field)) {
  67.                     if (pref != OAK_LEFT) {
  68.                         return(fldno);
  69.                     }
  70.                     else {
  71.                         /* remember this field, see if the next one is good */
  72.                         lastfld = fldno;
  73.                     }
  74.                 }
  75.                 else {
  76.                     if (prot == FALSE) {
  77.                         lastfld = -2;    /* Return -2 for a protected field */
  78.                     }
  79.                 }
  80.             }
  81.             if (field_GetCol(field) > boxp->rightcol) {
  82.                 /* we've gone past the end, break */
  83.                 break;
  84.             }
  85.  
  86.             /* get the next field in the row */
  87.             fldno = field_GetRight(field);
  88.         }
  89.     }
  90.     return(lastfld);
  91. }
  92.