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

  1. /*
  2.     sdopen.c
  3.  
  4.     % sed_ReallyOpen
  5.  
  6.                                  Screen Editor
  7.  
  8.     C-scape 3.2
  9.     Copyright (c) 1986-1989, by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     written by stephen ng.
  13.  
  14.     Sed (for "Screen EDitor") retrieves formatted input from the user.
  15.  
  16.     Rep Invariant:  the sed, from creation on, should always be at a valid
  17.     field and field position number.  If a field has no valid positions (i.e.
  18.     it's a menu), then its position is -1.
  19.  
  20.     Revision History:
  21.     -----------------
  22.      2/17/86 sng    wrote it.
  23.      3/12/86 sng    added sed_SetPosition.
  24.      3/14/86 sng    added field update flag to sed_Go; added static function
  25.                     RefreshFields to support it.
  26.      3/15/86 sng    added vertical scrolling support.
  27.      3/22/86 sng    fixed field dragging during scrolling so that fields
  28.                     don't wrap around.
  29.                     added sed_GetFieldCount.
  30.      3/23/86 sng    sed_Go now extinguishes the selected field when it exits.
  31.                     added sed_SetSides.
  32.      3/24/86 sng    added sed_IncField, sed_DecField.
  33.      4/04/86 sng    added passing starting field to sed_Go.
  34.      4/09/86 sng    added sed_SetExitHigh.
  35.      4/10/86 sng    added pull/push left/right field editing functions
  36.      4/14/86 sng    added screen scrolling, fixed line scrolling.
  37.      4/22/86 sng    added sed_GetSize, added #defines for some functions,
  38.                     sed up, down, left, right
  39.      4/24/86 sng    fixed push, pull bugs that affected fields with literals
  40.                     in them, added sed_GetRecordPos.
  41.      4/28/86 sng    added sed_MarkField.
  42.      5/02/86 sng    added static version variable;    added fieldno arg to
  43.                     sed_GetRecord; made repaintfield a macro, and fixed a
  44.                     bug in it.
  45.      5/05/86 sng    fixed sed_GotoField not calling entry and exit functions.
  46.      5/14/86 sng    fixed scrolling field tracking.
  47.      5/19/86 sng    fixed sed_SetRecord bug that ignored field number,
  48.                     cs_Assert checks for closed sed.
  49.      5/24/86 sng    added s_enter, s_exit functions (type support).
  50.      6/15/86 sng    added torch, and support routines, changed sed_Go.
  51.      6/18/86 sng    added sed_GetPosition.
  52.      6/23/86 sng    changed torch to baton.
  53.      6/29/86 sng    fixed sed_Open bug that trashed field-less menus.
  54.      6/30/86 sng    added sed_GetColors.
  55.      7/08/86 sng    put cs_Asserts on one line to make egrep'ing easier.
  56.      7/09/86 sng    #defined out xprint for size.
  57.      7/14/86 sng    fixed bug in sed_SetHeight; field-less scrolling bug.
  58.      8/03/86 sng    rearranged includes.
  59.      8/09/86 sng    fractured files.
  60.     10/30/86 jmd    removed ifdefs
  61.     11/06/86 jmd    sed_Go() now returns baton when there are no fields
  62.                     rewrote main loop of sed_Go()
  63.     11/07/86 jmd    removed references to toggled_in_exit
  64.     11/25/86 jmd    added sed->label
  65.     12/08/86 jmd    moved the mdisplay to the sed.
  66.     12/29/86 jmd    sed->baton is now initialized to -1.
  67.      1/21/87 jmd    integrated new borders.
  68.      3/11/87 jmd    added xoffset
  69.      3/28/87 jmd    added cursor info and active flag
  70.      2/25/88 jmd     split up GetR2M macro for UNIX compilers
  71.      4/05/88 jmd     added special function to sed
  72.      4/08/88 jmd     changed sed->fieldcount to sed_GetFieldCount()
  73.      4/12/88 jmd     init'd field xoffset and added adjust_cur()
  74.      6/03/88 jmd    removed fieldcount check before adjust_cur
  75.      6/23/88 jmd    now initializes sed->data to NULL
  76.      6/29/88 jmd    added windows
  77.      8/09/88 jmd    revised to use new object stuff
  78.      8/12/88 jmd    added explode flag
  79.      8/13/88 jmd    added bord_Close
  80.      8/13/88 jmd    turn off painting in sed_Close
  81.      8/16/88 jmd    added calls to omalloc
  82.      8/23/88 jmd    close sed before border
  83.      9/14/88 jmd    removed cursor info
  84.      9/30/88 jmd    removed size check
  85.     10/05/88 jmd    added sedptr to menu
  86.     10/19/88 jdc    added sed->bob
  87.     11/14/88 jmd    removed border references, added prompt window
  88.     11/19/88 jmd    made msg func into mouse func
  89.     11/25/88 jdc    added sed_RewindTB function
  90.     11/28/88 jmd    reorganized headers
  91.     12/02/88 jmd    added nextwin
  92.     12/08/88 jmd    added winclass arg, turned it into sed_ReallyOpen
  93.     12/15/88 jmd    moved sed_Close to sdclose.c
  94.     12/16/88 jmd    added currfield
  95.  
  96.      3/24/89 jmd    removed sed back color, added Aux function
  97.      3/29/89 jmd    converted seds to 'pure' objects
  98.      4/06/89 jmd    made default_move the boolean it was meant to be
  99.      4/11/89 jmd    added single field paint optimization
  100.      4/13/89 jmd    put field array into sed_xd as well
  101.  
  102.     12/10/89 jdm    added initialization of go func
  103.     12/14/89 jdc    fixed default_move bug
  104.      1/24/90 jdc    fixed default_move again
  105.      3/28/90 jmd    ansi-fied
  106.      4/23/90 jmd    changed class to winclass
  107.      5/11/90 jdc    made sed_ReallyGo a conditional assignment (gofunc saved)
  108.      6/27/90 jdc    preened the GoFunc code
  109.      9/27/90 jmd    removed the GoFunc code
  110. */
  111.  
  112. #include "sed.h"
  113.  
  114. #include "tbpriv.h"            /* For tb_Rewind() */
  115. #include "winspriv.h"        /* For win_SetGoHandle() */
  116.  
  117.                        /**** Static Declarations ****/
  118.  
  119. static char *_cscape = "C-scape: Copyright (c) 1986-1990 by Oakland Group, Inc.";
  120. static char *_csver = "3.2";
  121.                             /**** Operations *****/
  122.  
  123. sed_type sed_ReallyOpen(menu_type menu, class_fptr winclass)
  124. /*
  125.     effects:    creates an sed object associated with the given menu.
  126.                 Creates the sed using 'class'
  127.     returns:    if there is sufficient memory, the routine returns the new
  128.                 sed object; otherwise it returns NULL.
  129. */
  130. {
  131.     sed_type sed;
  132.     ocbox wcbox;
  133.  
  134.     /* set the height and width of the sed */
  135.     wcbox.toprow   = 0;
  136.     wcbox.leftcol  = 0;
  137.     wcbox.botrow   = int_min(menu_GetHeight(menu), disp_GetHeight()) - 1;
  138.     wcbox.rightcol = int_min(menu_GetWidth(menu), disp_GetWidth()) - 1;
  139.  
  140.     if ((sed = win_Open(winclass, &wcbox)) == NULL) {
  141.         return(NULL);
  142.     }
  143.  
  144.     if(!sed_Init(sed, menu)) {
  145.         obj_Close(sed);
  146.         return(NULL);
  147.     }
  148.  
  149.     return(sed);
  150. }
  151.  
  152. boolean sed_Init(obj_type sed, menu_type menu)
  153. /*
  154.     effects:    initializes a sed object for Open or Load
  155.     returns:    TRUE, FALSE
  156. */
  157. {
  158.     int i;
  159.  
  160.     if (menu == NULL) {
  161.         return(FALSE);
  162.     }
  163.  
  164.     /* Initialize sed_xd */
  165.     sed_SetMenu(sed, menu);
  166.     sed_SetFa(sed, menu_GetFa(menu));    /* short circuit menu to get fields */
  167.  
  168.     if (menu_GetFieldCount(menu) > 0) {
  169.         sed_SetFieldNo(sed, 0);
  170.         sed_SetCurrField(sed, menu_GetField(menu, 0));
  171.         sed_SetRecordPos(sed, menu_GetFirstFieldPos(menu, 0));
  172.         menu_SetFieldXoffset(menu, 0, 0);
  173.     }
  174.     else {
  175.         sed_SetFieldNo(sed, -1);
  176.         sed_SetCurrField(sed, NULL);
  177.         sed_SetRecordPos(sed, NO_WRITEABLES);
  178.     }
  179.  
  180.     sd_adjust_cur(sed);
  181.  
  182.     /* Set the sed's field bob parent pointers */
  183.     for (i = 0; i < menu_GetBobCount(menu); i++) {
  184.         bob_SetParent(menu_GetBob(menu, i), sed);
  185.     }
  186.  
  187.     /* point the menu's sedptr to the sed */
  188.     (sed_GetMenu(sed))->sedptr = sed;
  189.  
  190.     return(TRUE);
  191. }
  192.  
  193. /*----------------------------------------------------------------------------*/
  194.  
  195. boolean default_move(sed_type sed, int row, int col)
  196. /*
  197.     A default cursor move method,
  198.     moves the ted cursor but doesn't refresh screen.
  199. */
  200. {
  201.     tb_type tb;
  202.  
  203.     tb = sed_GetTextbuf(sed);
  204.  
  205.     if (tb_FindPosition(tb, row, col)) {
  206.         sed_SetTrow(sed, tb_GetRow(tb));
  207.         sed_SetTcol(sed, tb_GetCol(tb));
  208.     }
  209.     else {
  210.         sed_SetTrow(sed, row);
  211.         sed_SetTcol(sed, col);
  212.     }
  213.     return(TRUE);
  214. }
  215.  
  216. void sed_RewindTB(sed_type sed)
  217. /*
  218.     Move the sed cursor to the beginning of the sed.
  219. */
  220. {
  221.     tb_Rewind(sed_GetTextbuf(sed));
  222.  
  223.     sed_SetTrow(sed, 0);
  224.     sed_SetTcol(sed, 0);
  225. }
  226.  
  227. /**** Misc ****/
  228.  
  229. field_type sed_GetField(sed_type sed, int fld)
  230. /*
  231.     Extracts a field from the field array.
  232. */
  233. {
  234.     return((field_type) xa_Get(sed_GetFa(sed), fld));
  235. }
  236.