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

  1. /*
  2.     tedcopy.c
  3.  
  4.     % ted block functions
  5.  
  6.     C-scape 3.2
  7.     Copyright (c) 1988 by Oakland Group, Inc.
  8.     ALL RIGHTS RESERVED.
  9.  
  10.     Revision History:
  11.     -----------------
  12.      6/01/88 jdc    create
  13.     10/21/88 jmd    Removed memory.h
  14.     12/22/88 jmd    Added NULL test in ted_copy
  15.  
  16.      3/24/89 jmd    added sed_ macros
  17.      4/06/89 jmd    made this match teddecl (int to boolean)
  18.      5/23/89 jdc    made tb_setcursor menu_setcursor
  19.      5/24/89 jdc    replaced sed_Repaint's with sed_Update's
  20.      8/04/89 jdc    played with tb->set_cursor
  21.     11/04/89 jdc    added paint optimization
  22.     11/10/89 jdc    preened
  23.  
  24.     12/15/89 jdc    fixed cursor positioning
  25.      3/28/90 jmd    ansi-fied
  26.      5/07/90 jmd    changed '?' operation to if/else in ted_copy
  27.     10/28/90 jdc    fixed boolean/int ret conflict
  28. */
  29.  
  30. #include "ted.h"
  31.  
  32. int ted_GetMark(sed_type sed)
  33. {
  34.     tb_type tb;
  35.  
  36.     tb = sed_GetTextbuf(sed);
  37.  
  38.     return((tb->m_stop) ? TED_FIXMARK : tb->mark);
  39. }
  40.  
  41. void ted_SetMark(sed_type sed, int mode)
  42. /*
  43. */
  44. {
  45.     tb_type tb;
  46.     int lmark;
  47.  
  48.     tb = sed_GetTextbuf(sed);
  49.  
  50.     if (mode == TED_FIXMARK) {
  51.         if (tb->mark == TED_NOMARK) {
  52.             tb->m_stop = FALSE;
  53.         }
  54.         else {
  55.             tb->m_stop = TRUE;
  56.             ted_GetPosition(sed, &(tb->markbox.cleat_row), &(tb->markbox.cleat_col));
  57.             tb->cleat = tb->cursor;
  58.         }
  59.     }
  60.     else {
  61.         lmark = tb->mark;
  62.         tb->mark = mode;
  63.         if (mode == TED_NOMARK) {
  64.             tb->m_stop = FALSE;
  65.         }
  66.         else {
  67.             ted_GetPosition(sed, &(tb->markbox.anchor_row), &(tb->markbox.anchor_col));
  68.             tb->anchor = tb->cursor;
  69.             ted_GetPosition(sed, &(tb->markbox.cleat_row), &(tb->markbox.cleat_col));
  70.             tb->cleat = tb->cursor;
  71.         }
  72.         if (!ted_GetRefresh(sed))
  73.             ;
  74.         else if (lmark == TED_NOMARK && mode != TED_NOMARK) {        
  75.             sed_RepaintRow(sed, tb->markbox.anchor_row, 
  76.                 tb->markbox.anchor_col, 1);
  77.         }
  78.         else {
  79.             win_Paint(sed);
  80.         }
  81.     }
  82. }
  83.  
  84. boolean ted_copy(sed_type sed, menu_type cmenu, byte attr, int mode)
  85. /*
  86. */
  87. {
  88.     tb_type tb, copytb;
  89.     int row, col, srow, drow, width, newline, ins;
  90.     long cursor, len;
  91.     ocbox markbox;
  92.     boolean ret = TRUE;
  93.     
  94.     tb = sed_GetTextbuf(sed);
  95.     if (tb->mark == TED_NOMARK) {
  96.         return(FALSE);
  97.     }
  98.  
  99.     ted_GetPosition(sed, &row, &col);
  100.     cursor = tb->cursor;
  101.  
  102.     if (cmenu == NULL) {
  103.         copytb = NULL;
  104.     }
  105.     else {
  106.         copytb = menu_GetTextbuf(cmenu);
  107.     }
  108.  
  109.     if (mode & B_COPY) {                /* clear copy buffer */
  110.         if (cmenu == NULL) {
  111.             mode &= ~B_COPY;
  112.             ret = FALSE;
  113.         }
  114.         else {
  115.             menu_ClearTB(cmenu);
  116.         }
  117.     }        
  118.     box_sort(&markbox, &(tb->markbox), (tb->mark == TED_MARK) ? BOXSORT_ROW:BOXSORT_COL);
  119.     if (tb->mark == TED_MARK) {    /* rowwise */
  120.  
  121.         len = ((len = tb->anchor - tb->cleat) < 0) ? -len + 1 : len + 1;
  122.         if (mode & B_ATTR) {
  123.             tb_strattr(tb, markbox.toprow, markbox.leftcol, len, attr);
  124.         }
  125.         if (mode & B_COPY) {
  126.             copytb->buf_type = TED_MARK;
  127.             menu_strcpy(cmenu, 0, 0, tb, markbox.toprow, markbox.leftcol, len, TB_LEN);
  128.         }
  129.         if (mode & B_CUT) {
  130.             menu_strdel(sed_GetMenu(sed), markbox.toprow, markbox.leftcol, len);
  131.             tb->mark = TED_NOMARK;    /* turn off marking if text is gone */
  132.             tb->m_stop = FALSE;
  133.  
  134.             /* cursor placement. cases: before, in, & after marked block */
  135.             if (cursor > tb->cursor) {
  136.                 if (cursor >= tb->cursor + len) {     /* after */
  137.                     tb->cursor = cursor - len;
  138.                 }
  139.                 else {                                    /* in */
  140.                     tb->cursor = cursor - (len - 1);
  141.                 }
  142.             }
  143.             else {                                        /* before */
  144.                 tb->cursor = cursor;
  145.             }
  146.             menu_setcursor(sed_GetMenu(sed));
  147.             row = tb_GetRow(tb);
  148.             col = tb_GetCol(tb);
  149.         }
  150.     }
  151.     else {                                     /* colunmwise */
  152.         width = markbox.rightcol - markbox.leftcol + 1;
  153.  
  154.         /* work from the bottom up! */
  155.         for (srow = markbox.botrow, drow = markbox.botrow - markbox.toprow; 
  156.             srow >= markbox.toprow; srow--, drow--) {
  157.  
  158.             len = (long)tb_strlen(tb, srow, markbox.leftcol, width, &newline);    /* calls tb_FindPosition */
  159.             if (mode & B_ATTR) {
  160.                 tb_strattr(tb, srow, markbox.leftcol, len + (long)newline, attr);
  161.             }
  162.             if (mode & B_COPY) {
  163.                 copytb->buf_type = TED_COLMARK;
  164.                 menu_strcpy(cmenu, drow, 0, tb, srow, markbox.leftcol, len, TB_LEN);
  165.             }
  166.             if (mode & B_CUT) {    
  167.                 menu_strdel(sed_GetMenu(sed), srow, markbox.leftcol, len);
  168.             }
  169.             if (mode & B_PAD) {    
  170.                 if (tb->exp_len > markbox.rightcol + 1 + tb->nend) {
  171.                     ins = tb->insert;
  172.                     tb->insert = FALSE;
  173.                     menu_Addc(sed_GetMenu(sed), srow, markbox.leftcol, ' ', markbox.rightcol - markbox.leftcol + 1);
  174.                     tb->insert = ins;
  175.                 }
  176.                 else if (tb->exp_len > markbox.leftcol + tb->nend) {
  177.                     menu_strdel(sed_GetMenu(sed), srow, markbox.leftcol, len);
  178.                 }
  179.             }
  180.         }
  181.         if (mode & B_CUT) {            /* turn off marking if text is gone */
  182.             tb->mark = TED_NOMARK;
  183.             tb->m_stop = FALSE;
  184.  
  185.             /* cursor placement. cases: in or out of marked block */
  186.             if (row >= markbox.toprow && row <= markbox.botrow 
  187.                 && col >= markbox.leftcol && col < markbox.leftcol + width) {
  188.  
  189.                 col = markbox.leftcol;        /* in */
  190.             }
  191.         }
  192.     }
  193.     if (mode & B_COPY) {
  194.         tb_FindPosition(copytb, 0, 0);
  195.     }
  196.     ted_GotoPosition(sed, row, col);
  197.     if (ted_GetRefresh(sed) && mode & B_CUT) {
  198.         win_Paint(sed);
  199.         sed_SendBorderMsg(sed, BDM_SCROLL, NULL, NULL);
  200.     }
  201.     return(ret);
  202. }
  203.  
  204. boolean ted_insert(sed_type sed, menu_type cmenu)
  205. {
  206.     tb_type tb, copytb;
  207.     int row, col, srow, r;
  208.     int crow, ccol;
  209.     boolean ret = TRUE;
  210.     
  211.     tb = sed_GetTextbuf(sed);
  212.     if (cmenu == NULL || (copytb = cmenu->textbuf)->buf_type == TED_NOMARK) { 
  213.         return(FALSE);
  214.     }
  215.  
  216.     crow = tb_GetRow(copytb);            /* save cut buf pos */
  217.     ccol = tb_GetCol(copytb);
  218.  
  219.     ted_GetPosition(sed, &row, &col);
  220.  
  221.     if (copytb->buf_type == TED_COLMARK) {        /* colwise insert */
  222.  
  223.         for (srow = 0, r = row; tb_FindLine(copytb, srow) == TRUE; r++, srow++) {
  224.  
  225.             if (!menu_strcpy(sed_GetMenu(sed), r, col, copytb, srow, 0, 
  226.                 (long)(copytb->len - copytb->nend), TB_LEN)) {
  227.                 
  228.                 ret = FALSE;
  229.             }
  230.         }
  231.     }
  232.     else {                                            /* rowwise insert */
  233.         if (!menu_strcpy(sed_GetMenu(sed), row, col, copytb, 0, 0, 0L, TB_ALL)) {
  234.             ret = FALSE;
  235.         }
  236.     }
  237.     tb_FindPosition(copytb, crow, ccol);            /* restore cut buf pos */
  238.  
  239.     if (tb_GetRow(tb) >= row) {
  240.         row  = tb_GetRow(tb);
  241.         col = (tb_GetCol(tb) > col) ? tb_GetCol(tb) : col;
  242.     }
  243.     ted_GotoPosition(sed, row, col);
  244.     if (ted_GetRefresh(sed)) {
  245.         win_Paint(sed);
  246.         sed_SendBorderMsg(sed, BDM_SCROLL, NULL, NULL);
  247.     }
  248.     return(ret);
  249. }
  250.  
  251.  
  252.