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

  1. /*
  2.     menuaftg.c     4/10/88
  3.  
  4.     % menu_AddFieldToGrid
  5.  
  6.     menu add field to grid
  7.  
  8.     C-scape 3.2
  9.     Copyright (c) 1988, by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.      6/24/88 jmd    converted to new xarray/iarray calls
  15.     12/11/88 jmd    fixed first field in row problem
  16.      7/17/89 jdc    added adjustment of menu->frowcount
  17.      3/28/90 jmd    ansi-fied
  18.      9/24/90 jmd    added call to ja_Ok
  19. */
  20.  
  21. #include "menu.h"
  22.  
  23. boolean menu_AddFieldToGrid(menu_type menu, int fieldno, int row, int col)
  24. /*
  25.     Add a new field to the menu's field grid.
  26.     returns TRUE if successful.
  27.     Sets the field's row and column.
  28.      
  29.     Since most fields are placed next to previous fields
  30.     take advantage of this with a hint:
  31.     If we are on the same row as the previous field and
  32.     we are past it and the previous field was the last field
  33.     in the row then simply add the field after the previous one.
  34. */
  35. {
  36.     int         rfldno, lfldno, prevfldno, temp;
  37.     field_type    field, prevfield, rfield, lfield;
  38.  
  39.     field = menu_GetField(menu, fieldno);
  40.  
  41.     if ((prevfldno = fieldno - 1) >= 0) {
  42.         /* Get a handle to the previous field */
  43.         prevfield = menu_GetField(menu, prevfldno);
  44.     }
  45.     
  46.     if ((prevfldno >= 0) && 
  47.         (row == field_GetRow(prevfield)) &&
  48.         (col >= field_GetCol(prevfield)) &&
  49.         (field_GetRight(prevfield) == -1) ) {
  50.  
  51.         /* place the field after the previous one */
  52.         field_SetLeft(field, prevfldno);
  53.         field_SetRight(field, -1);
  54.         field_SetGCol(field, field_GetGCol(prevfield) + 1);
  55.  
  56.         /* adjust previous field */
  57.         field_SetRight(prevfield, fieldno);
  58.     }
  59.  
  60.     else if ((rfldno = ia_Get((menu)->fgrid, row)) == 0) {
  61.         /* first field in its row */
  62.         temp = fieldno + 1;        /* So that ia_Put macro works correctly */
  63.         if (!ja_Ok((menu)->fgrid) || !ia_Put((menu)->fgrid, row, temp)) {
  64.             return(FALSE);
  65.         }
  66.         field_SetLeft(field, -1);
  67.         field_SetRight(field, -1);
  68.     }
  69.     else {
  70.         /* insert field in the row */
  71.         rfldno--;
  72.         lfldno = -1;
  73.         while (rfldno >= 0) {
  74.             if (field_GetCol( (rfield = menu_GetField(menu, rfldno)) ) > col) {
  75.                 field_SetLeft(field, lfldno);
  76.                 field_SetRight(field, rfldno);
  77.                 field_SetGCol(field, field_GetGCol(rfield));
  78.  
  79.                 /* adjust the neighbors */
  80.                 field_SetLeft(rfield, fieldno);
  81.  
  82.                 if (lfldno >= 0) {
  83.                     field_SetRight(menu_GetField(menu, lfldno), fieldno);
  84.                 }
  85.                 else {
  86.                     /* adjust the grid array */
  87.                     temp = fieldno + 1;        /* So that ia_Put macro works correctly */
  88.                     if (!ja_Ok((menu)->fgrid) || !ia_Put((menu)->fgrid, row, temp)) {
  89.                         return(FALSE);
  90.                     }
  91.                 }
  92.                 break;
  93.             }
  94.  
  95.             lfldno = rfldno;
  96.             rfldno = field_GetRight(rfield);
  97.         }
  98.         if (rfldno >= 0) {
  99.             /* adjust the gcols for the rest of the line */
  100.             while (rfldno >= 0) {
  101.                 field_IncGCol( rfield = menu_GetField(menu, rfldno) );
  102.                 rfldno = field_GetRight(rfield);
  103.             }
  104.         }
  105.         else {
  106.             /* Add field at the end of the line */
  107.             field_SetLeft(field, lfldno);
  108.             field_SetRight(field, -1);
  109.             field_SetGCol(field, field_GetGCol(lfield = menu_GetField(menu, lfldno)) + 1);
  110.  
  111.             /* adjust previous field */
  112.             field_SetRight(lfield, fieldno);
  113.         }
  114.     }
  115.  
  116.     field_SetRow(field, row);
  117.     field_SetCol(field, col);
  118.  
  119.     if (row >= menu->frowcount) {
  120.         menu->frowcount = row + 1;
  121.     }
  122.  
  123.     return(TRUE);
  124. }
  125.