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

  1. /*
  2.     sddisp.c
  3.  
  4.     % sed display routines
  5.  
  6.     The former mdisplay.
  7.     This file contains the routines used to display seds.
  8.  
  9.     C-scape 3.2
  10.     Copyright (c) 1986, 1987, by Oakland Group, Inc.
  11.     ALL RIGHTS RESERVED.
  12.  
  13.     Revision History:
  14.     -----------------
  15.      1/22/87 jmd    moved senter funcs from sed_Go()
  16.      1/22/87 jmd    added new borders.
  17.      1/24/87 jmd    added edge clipping.
  18.      2/19/87 jmd    added draw_ functions
  19.      3/11/87 jmd    added horizontal scrolling
  20.      3/28/87 jmd    sed_Repaint now ignores the cursor.
  21.      8/15/87 jmd    added calls to vid_Cache and vid_Flush
  22.      9/04/87 jmd    Removed clear_window before hz scroll
  23.      9/09/87 jmd     added NO_PROTO option
  24.     10/07/87 jmd     Sped up Horizontal scrolling
  25.     11/18/87 jmd     changed names of some low-level funcs
  26.      2/25/88 jmd     split up GetR2M macro for UNIX compilers
  27.      4/05/88 jmd     Moved senter calls in sed_Draw
  28.      4/05/88 jmd     Added check for virtual fields in draw_field
  29.      4/08/88 jmd     changed sed->fieldcount to sed_GetFieldCount()
  30.      4/11/88 jmd    added scrollable fields (changed draw_field and goto_char)
  31.      5/31/88 jmd    added sed_DrawText
  32.      6/29/88 jmd    added windows
  33.      7/07/88 jmd    moved in adjust_cursor
  34.      8/22/88 jmd    changed plot fields loop
  35.                     added bob support
  36.      9/12/88 jmd    added Caching to sd_refreshfield
  37.      9/19/88 jmd    added sed_GetCursorType
  38.     10/02/88 jmd    added win_ShowCursor
  39.     10/08/88 jmd    added Flags for sed_Draw
  40.     10/11/88 jdc    added dependent chech for children in sed_Draw
  41.     11/14/88 jmd    added newest border scheme
  42.     12/02/88 jmd    removed assert from draw_field
  43.     12/13/88 jmd    added blank to PlotFields
  44.     12/14/88 jmd    hand optimized
  45.  
  46.      2/07/89 jmd    Removed bordobj.h
  47.      3/24/89 jmd    added sed_ macros
  48.      3/29/89 jmd    Removed unused draw code
  49.      4/11/89 jmd    added single field paint optimization
  50.                     moved Plot code to sdwin
  51.      4/13/89 jmd    added sed_GetField
  52.      4/26/89 jmd    added Aux support
  53.      5/24/89 jmd    added clipping to refresh_field
  54.      5/29/89 jmd    simplified paint flags
  55.      8/08/89 jdc    added LNF senter suppression
  56.      8/24/89 jdc    Fixed call to opbox_clip
  57.  
  58.      3/17/90 jmd    added Cache/Flush
  59.      3/28/90 jmd    ansi-fied
  60. */
  61.  
  62. #include "sed.h"
  63. #include "tbpriv.h"            /* For tb_FindLine() */
  64.  
  65.                             /**** Operations *****/
  66.  
  67. void sed_Draw(sed_type sed, unsigned int mode)
  68. /*
  69.     mode is a bit masked flag...
  70.     effects:    if WPD_SENTER calls the senter funcs.
  71.                 if WPD_BORDER repaints the border.
  72.                 if WPD_TEXT   repaints the textbuffer.
  73.                 if WPD_FIELDS repaints the fields.
  74. */
  75. {
  76.     cs_Assert(sed_Ok(sed), CS_MD_DRAW_SED, 0);
  77.  
  78.     win_Do(sed, WINM_PAINTREQ, &mode, NULL);
  79. }
  80.  
  81. void sd_refresh_field(sed_type sed, int fieldno)
  82. /*
  83.     effects:    refreshes the field specified, then resets the cursor.
  84.     requires:    that the sed have at least one field in it, and that
  85.                 the field number is within the proper range.
  86. */
  87. {
  88.     field_type field;
  89.  
  90.     cs_Assert(menu_GetFieldCount(sed_GetMenu(sed)) != 0, CS_MD_RF_NOF, 0);
  91.     cs_Assert(fieldno >= 0 && fieldno < menu_GetFieldCount(sed_GetMenu(sed)), CS_MD_RF_FNO, 0);
  92.  
  93.     field = sed_GetField(sed, fieldno);
  94.  
  95.     sd_paintbox(sed, field_GetRow(field), field_GetCol(field),
  96.                       1, field_GetWidth(field), fieldno);
  97. }
  98.  
  99. void sd_paintbox(sed_type sed, int row, int col, int hgt, int wid, int mode)
  100. /*
  101.     Paints a rectangular region of a sed
  102.     row and column are in menu coordinates
  103.     the region is clipped against the sed.
  104.     mode is the paint flag:
  105.         values >= 0 indicate a single field to be painted.
  106.         values < 0 paint everything
  107. */
  108. {
  109.     opbox      box, sedbox;
  110.  
  111.     win_GetPixBox(sed, &sedbox);
  112.  
  113.     /* Convert coords to sed, pix coords */
  114.  
  115.     box.xmin = win_GetFontWidth(sed) * (col - sed_GetXoffset(sed));
  116.     box.xmax = box.xmin + (win_GetFontWidth(sed) * wid);
  117.  
  118.     box.ymin = win_GetFontHeight(sed) * (row - sed_GetYoffset(sed));
  119.     box.ymax = box.ymin + (win_GetFontHeight(sed) * hgt);
  120.  
  121.     if (opbox_clipbox(&sedbox, &box) != 0) {
  122.  
  123.         sed_SetPaintFlag(sed, (mode < 0) ? SDPF_ALL : mode);
  124.  
  125.         win_PaintPixBox(sed, &box);
  126.  
  127.         /* reset paint flags */
  128.         sed_SetPaintFlag(sed, SDPF_ALL);
  129.     }
  130. }
  131.  
  132. void sd_adjust_cur(sed_type sed)
  133. /*
  134.     adjusts the sed's window cursor position
  135.     to correctly reflect the current state.
  136.     If the sed is not active or if it has no fields
  137.     or if the the current field has no writeable positions
  138.     then the window cursor is hidden.
  139. */
  140. {
  141.     int         fp, row, col;
  142.     field_type     field;
  143.  
  144.     if (sed_IsActive(sed) &&
  145.         sed_GetFieldCount(sed) > 0 &&
  146.         sed_GetRecordPos(sed) != NO_WRITEABLES ) {
  147.  
  148.         field = sed_GetCurrField(sed);
  149.  
  150.         /* calculate correct cursor location */
  151.         row = field_GetRow(field) - sed_GetYoffset(sed);
  152.         col = field_GetCol(field) - sed_GetXoffset(sed);
  153.  
  154.         fp = (sed_GetRecordPos(sed) > 0) ? (sed_GetRecordPos(sed)) : 0;
  155.         col += field_GetR2M(field, fp);
  156.         col -= field_GetXoffset(field);
  157.  
  158.         disp_Cache();
  159.         win_SetCursorPos(sed, row, col);
  160.         win_ShowCursor(sed);
  161.         disp_Flush();
  162.     }
  163.     else {
  164.         /* hide the cursor */
  165.         win_HideCursor(sed);
  166.     }
  167. }
  168.  
  169. boolean sd_goto_char(sed_type sed, int fieldpos)
  170. /*
  171.     modifies:   sed.
  172.     effects:    moves to the field position given.
  173.                 adjusts field's xoffset if it has to.
  174.     returns:    TRUE if the field needs to be scrolled.
  175. */
  176. {
  177.     field_type     field;
  178.     int     pos, offset, width;
  179.     boolean scroll = FALSE;
  180.  
  181.     cs_Assert(sed_Ok(sed), CS_MD_GC_SED, 0);
  182.     cs_Assert(fieldpos >= -1, CS_MD_GC_NFP, 0);
  183.     cs_Assert(menu_GetFieldCount(sed_GetMenu(sed)) > 0, CS_MD_GC_SED, 0);
  184.  
  185.     sed_SetRecordPos(sed, fieldpos);
  186.  
  187.     field = sed_GetCurrField(sed);
  188.  
  189.     /* if the fieldpos is not visible, adjust the xoffset until it is */
  190.     offset = field_GetXoffset(field);
  191.     width = field_GetWidth(field);
  192.     pos = field_GetR2M(field, fieldpos);
  193.  
  194.     if (pos < offset) {
  195.         offset -= (offset - pos);
  196.         field_SetXoffset(field, offset);
  197.         scroll = TRUE;
  198.     }
  199.     else if (pos >= offset + width) {
  200.         offset += (pos - (offset + width) + 1);
  201.         field_SetXoffset(field, offset);
  202.         scroll = TRUE;
  203.     }
  204.  
  205.     /* adjust the cursor position */
  206.     sd_adjust_cur(sed);
  207.  
  208.     return(scroll);
  209. }
  210.  
  211. void sd_scroll(sed_type sed, int deltarow, int deltacol, boolean preset)
  212. /*
  213.     modifies:   the sed.
  214.     effects:    scroll the text vertically by deltarow rows
  215.                 and scroll the text horizontally by deltacol columns.
  216.                 e.g., if deltarow is 1, move the text up one row.
  217.                 If deltarow is -1 scroll down one row.
  218.                 e.g., if deltacol is 1, move the text left one row.
  219.                 If deltacol is -1 scroll right one row.
  220.                 it is an error to call this routine if
  221.                 scrolling is not possible.
  222.     if preset is TRUE then tb hints are preset.
  223. */
  224. {
  225.     register int i;
  226.     int      oldrow, oldcol;
  227.     obj_type bob;
  228.  
  229.     cs_Assert(sed_Ok(sed), CS_MD_SCR_SED, 0);
  230.  
  231.     disp_Cache();
  232.  
  233.     if (deltarow != 0 || deltacol != 0 ) {
  234.         sed_SetYoffset(sed, sed_GetYoffset(sed) + deltarow);
  235.         sed_SetXoffset(sed, sed_GetXoffset(sed) + deltacol);
  236.  
  237.         if (preset) {
  238.             tb_FindLine(sed_GetTextbuf(sed), sed_GetYoffset(sed));
  239.         }
  240.         win_Scroll(sed, deltarow, deltacol);
  241.  
  242.         /* reposition the sed's dependent bobs */
  243.         for (i = 0; i < menu_GetBobCount(sed_GetMenu(sed)); i++) {
  244.             if ((bob = menu_GetBob(sed_GetMenu(sed), i)) != NULL) {
  245.                 if (bob_IsDepend(bob)) {
  246.                     oldrow = win_GetTopRow(bob);
  247.                     oldcol = win_GetLeftCol(bob);
  248.  
  249.                     win_SetPosition(bob, oldrow - deltarow, oldcol - deltacol);
  250.                 }
  251.             }
  252.         }
  253.     }
  254.  
  255.     /* Send Scroll message to the border */
  256.     sed_SendBorderMsg(sed, BDM_SCROLL, NULL, NULL);
  257.  
  258.     disp_Flush();
  259. }
  260.  
  261.