home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / software / unix / saoimage / sao1_07.tar / editrdrw.c < prev    next >
C/C++ Source or Header  |  1990-04-20  |  6KB  |  178 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    editrdrw.c (Editor Redraw)
  6.  * Purpose:    Move cursor and redraw the line after editing
  7.  * Subroutine:    move_edit_cursor()        returns: void
  8.  * Subroutine:    place_edit_cursor()        returns: void
  9.  * Subroutine:    redraw_after_delete()        returns: void
  10.  * Subroutine:    redraw_after_insert()        returns: void
  11.  * Xlib calls:    none
  12.  * Copyright:    1989 Smithsonian Astrophysical Observatory
  13.  *        You may do anything you like with this file except remove
  14.  *        this copyright.  The Smithsonian Astrophysical Observatory
  15.  *        makes no representations about the suitability of this
  16.  *        software for any purpose.  It is provided "as is" without
  17.  *        express or implied warranty.
  18.  * Modified:    {0} Michael VanHilst    initial version          4 July 1989
  19.  *        {n} <who> -- <does what> -- <when>
  20.  */
  21.  
  22. #include <stdio.h>
  23. #include <X11/Xlib.h>
  24. #include "hfiles/edit.h"
  25.  
  26. /*
  27.  * Subroutine:    move_edit_cursor
  28.  */
  29. void move_edit_cursor ( edit, movement )
  30.      EditStruct *edit;
  31.      int movement;
  32. {
  33.   void place_edit_cursor();
  34.   place_edit_cursor(edit, edit->active_position + movement);
  35. }
  36.  
  37. /*
  38.  * Subroutine:    place_edit_cursor
  39.  */
  40. void place_edit_cursor ( edit, new_position )
  41.      EditStruct *edit;
  42.      int new_position;
  43. {
  44.   int first_char, nchars;
  45.   int size, i;
  46.   void draw_edit_string(), draw_edit_cursor();
  47.  
  48.   if( new_position < 0 )
  49.     new_position = 0;
  50.   if( new_position > edit->char_cnt )
  51.     new_position = edit->char_cnt;
  52.   if( edit->oversize ) {
  53.     if( new_position < edit->first_char_shown ) {
  54.       first_char = new_position;
  55.       edit->first_char_shown = new_position;
  56.       size = edit->pixlen[first_char] + edit->max_pixlen;
  57.       for( i = edit->char_cnt; edit->pixlen[i] > size; i-- );
  58.       nchars = i - first_char;
  59.       edit->active_position = new_position;
  60.       draw_edit_string(edit, first_char, 0, nchars);
  61.     } else if( new_position > edit->last_char_shown ) {
  62.       size = edit->pixlen[new_position + 1] - edit->max_pixlen;
  63.       for( i = 0; edit->pixlen[i] < size; i++ );
  64.       first_char = i;
  65.       edit->first_char_shown = i;
  66.       nchars = 1 + new_position - i;
  67.       edit->active_position = new_position;
  68.       draw_edit_string(edit, first_char, 0, nchars);
  69.     } else {
  70.       draw_edit_cursor(edit, 1);
  71.       edit->active_position = new_position;
  72.       draw_edit_cursor(edit, 0);
  73.     }
  74.   }
  75.   draw_edit_cursor (edit, 1);
  76.   edit->active_position = new_position;
  77.   draw_edit_cursor (edit, 0);
  78. }
  79.  
  80. /*
  81.  * Subroutine:    redraw_after_delete
  82.  * Purpose:    Update the displayed string after character deletion
  83.  * Note:    Characters not moved are not redrawn
  84.  * Note:    Characters after any change are redrawn.  If proportional
  85.  *        spacing font is used, they might need it.
  86.  */
  87. void redraw_after_delete ( edit )
  88.      EditStruct *edit;
  89. {
  90.   int i;
  91.   int first_char, first_x, nchars;
  92.   int size, excess;
  93.   void draw_edit_string();
  94.  
  95.   /* this section covers deciding what to print */
  96.   first_char = edit->active_position;
  97.   first_x = edit->pixlen[first_char];
  98.   nchars = 1 + edit->char_cnt - edit->active_position;
  99.   if( edit->oversize ) {
  100.     /* line was oversized before */
  101.     if( (edit->pixlen[edit->active_position+1] <= edit->max_pixlen) ) {
  102.       /* line is no longer oversized */
  103.       edit->oversize = 0;
  104.       first_char = 0;
  105.       first_x = 0;
  106.       nchars = edit->char_cnt + 1;
  107.       edit->first_char_shown = 0;
  108.     } else {
  109.       /* line is still oversized */
  110.       if( edit->active_position < edit->first_char_shown )
  111.     /* active position moves back before section shown */
  112.     edit->first_char_shown = edit->active_position;
  113.       size = edit->pixlen[edit->first_char_shown] + edit->max_pixlen;
  114.       if( (excess = size - edit->pixlen[edit->char_cnt+1]) >
  115.       edit->charsz[edit->first_char_shown - 1]) {
  116.     /* offset section ends short of end of window (space for more chars) */
  117.     for( i = edit->first_char_shown - 1;
  118.          (i >= 0) && (excess > edit->charsz[i]); i-- )
  119.       excess -= edit->charsz[i];
  120.     /* move first_char_shown to use up entire space */
  121.     edit->first_char_shown = i + 1;
  122.     first_char = edit->first_char_shown;
  123.     nchars = 1 + edit->char_cnt - first_char;
  124.       } else {
  125.     /* line will run beyond space, determine how many chars will fit */
  126.     for( i = edit->char_cnt; edit->pixlen[i+1] > size; i-- );
  127.     nchars = 1 + i - first_char;
  128.       }
  129.       first_x =
  130.     edit->pixlen[edit->first_char_shown] - edit->pixlen[first_char];
  131.     }
  132.   }
  133.   draw_edit_string(edit, first_char, first_x, nchars);
  134. }
  135.  
  136. /*
  137.  * Subroutine:    redraw_after_insert
  138.  * Purpose:    Update the displayed string after character insertion
  139.  * Note:    Insertion is assumed to be directly before active position
  140.  * Note:    Characters not moved are not redrawn
  141.  * Note:    Characters after any change are redrawn.  If proportional
  142.  *        spacing font is used, they might need it.
  143.  */
  144. void redraw_after_insert ( edit, insert_cnt )
  145.      EditStruct *edit;
  146.      int insert_cnt;    /* i: number of characters just inserted */
  147. {
  148.   int i;
  149.   int first_char, first_x, nchars;
  150.   int excess, size;
  151.   void draw_edit_string();
  152.  
  153.   if( edit->pixlen[edit->char_cnt + 1] > edit->max_pixlen ) {
  154.     edit->oversize = 1;
  155.     if( (edit->pixlen[edit->active_position + 1] -
  156.      edit->pixlen[edit->first_char_shown]) > edit->max_pixlen ) {
  157.       /* first_char_shown must be moved up to put active position in display */
  158.       excess = edit->pixlen[edit->active_position + 1] - edit->max_pixlen;
  159.       for( i=0; (i < edit->char_cnt) && (edit->pixlen[i] < excess); i++ );
  160.       edit->first_char_shown = i;
  161.       first_char = i;
  162.       nchars = 1 + edit->active_position - i;
  163.     } else {
  164.       /* first_char_shown can stay in place, which chars must be drawn? */
  165.       first_char = edit->active_position - insert_cnt;
  166.       size = edit->max_pixlen + edit->pixlen[edit->first_char_shown];
  167.       for( i = edit->char_cnt; edit->pixlen[i] > size; i-- );
  168.       nchars = 1 + i - first_char;
  169.     }
  170.     first_x = edit->pixlen[first_char] - edit->pixlen[edit->first_char_shown];
  171.   } else {
  172.     first_char = edit->active_position - insert_cnt;
  173.     nchars = 1 + edit->char_cnt - first_char;
  174.     first_x = edit->pixlen[first_char];
  175.   }
  176.   draw_edit_string(edit, first_char, first_x, nchars);
  177. }
  178.