home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 16 / 16.iso / w / w055 / 4.ddi / SOURCES.LIF / LINEDRAW.PEL < prev    next >
Encoding:
Text File  |  1990-09-27  |  11.0 KB  |  414 lines

  1. # $Header:   P:/source/ppee/macros/linedraw.pev   1.17   20 Aug 1990 11:33:00   ericj  $
  2.  
  3. ##############################################################################
  4. #
  5. #           Sage Software - POLYTRON Division
  6. #             1700 NW 167th Place
  7. #               Beaverton, OR 97006
  8. #
  9. #   Copyright 1990, Sage Software, Inc.
  10. #
  11. #   Permission is hereby granted for licensed users of Sage Professional
  12. #   Editor and PolyAwk to copy and modify this source code for their own
  13. #   personal use.  These derivative works may be distributed only to other
  14. #   licensed Sage Professional Editor and PolyAwk users.  All other usage
  15. #   is prohibited without express written permission from Sage Software.
  16. #
  17. ##############################################################################
  18.  
  19. #### $Workfile:   linedraw.pel  $: Line drawing binding code
  20. #
  21. #
  22.  
  23. local    v_bar = 179        # │
  24. local    h_bar = 196        # ─
  25. local    tl_corner = 218        # ┌
  26. local    tr_corner = 191        # ┐
  27. local    ll_corner = 192        # └
  28. local    lr_corner = 217        # ┘
  29. local    x_inter    = 197        # ┼
  30. local    t_inter = 193        # ┴
  31. local    b_inter = 194        # ┬
  32. local    l_inter = 180        # ┤
  33. local    r_inter = 195        # ├
  34.  
  35. local    up_array
  36. local    down_array
  37. local    left_array
  38. local    right_array
  39.  
  40. local    t_char_array
  41. local    b_char_array
  42. local    r_char_array
  43. local    l_char_array
  44.  
  45. local    VERT_C    = 1
  46. local    HORZ_C    = 2
  47.  
  48. local    NO_C    = 0
  49. local    TOP_C    = 1
  50. local    LEFT_C    = 2
  51. local    BOT_C    = 4
  52. local    RIGHT_C    = 8
  53.  
  54.  
  55. #
  56. # init_lines() sets the characters for the type of lines to be drawn.
  57. # The line styles are determined by borderStyle in the following manner:
  58. #
  59. #    1              2              3              4
  60. #      ┌───┬───┐      ╒═══╤═══╕         ╓───╥───╖         ╔═══╦═══╗
  61. #      │   │   │      │      │   │         ║     ║   ║         ║   ║   ║
  62. #      ├───┼───┤      ╞═══╪═══╡         ╟───╫───╢         ╠═══╬═══╣
  63. #      │   │   │      │      │   │         ║     ║   ║         ║   ║   ║
  64. #      └───┴───┘      ╘═══╧═══╛         ╙───╨───╜         ╚═══╩═══╝
  65. #
  66. local function init_lines( borderStyle ) {
  67.  
  68.     if (borderStyle == 2) {
  69.         v_bar = 179        # │
  70.         h_bar = 205        # ═
  71.         tl_corner = 213        # ╒
  72.         tr_corner = 184        # ╕
  73.         ll_corner = 212        # ╘
  74.         lr_corner = 190        # ╛
  75.         x_inter    = 216        # ╪
  76.         t_inter = 207        # ╧
  77.         b_inter = 209        # ╤
  78.         l_inter = 181        # ╡
  79.         r_inter = 198        # ╞
  80.     } else if (borderStyle == 3) {
  81.         v_bar = 186        # ║
  82.         h_bar = 196        # ─
  83.         tl_corner = 214        # ╓
  84.         tr_corner = 183        # ╖
  85.         ll_corner = 211        # ╙
  86.         lr_corner = 189        # ╜
  87.         x_inter    = 215        # ╫
  88.         t_inter = 208        # ╨
  89.         b_inter = 210        # ╥
  90.         l_inter = 182        # ╢
  91.         r_inter = 199        # ╟
  92.     } else if (borderStyle == 4) {
  93.         v_bar = 186        # ║
  94.         h_bar = 205        # ═
  95.         tl_corner = 201        # ╔
  96.         tr_corner = 187        # ╗
  97.         ll_corner = 200        # ╚
  98.         lr_corner = 188        # ╝
  99.         x_inter    = 206        # ╬
  100.         t_inter = 202        # ╩
  101.         b_inter = 203        # ╦
  102.         l_inter = 185        # ╣
  103.         r_inter = 204        # ╠
  104.     } else {
  105.         v_bar = 179        # │
  106.         h_bar = 196        # ─
  107.         tl_corner = 218        # ┌
  108.         tr_corner = 191        # ┐
  109.         ll_corner = 192        # └
  110.         lr_corner = 217        # ┘
  111.         x_inter    = 197        # ┼
  112.         t_inter = 193        # ┴
  113.         b_inter = 194        # ┬
  114.         l_inter = 180        # ┤
  115.         r_inter = 195        # ├
  116.     }
  117.  
  118.     up_array[ chr(h_bar) ] = HORZ_C;
  119.     up_array[ chr(v_bar) ] = VERT_C;
  120.     up_array[ chr(tl_corner) ] = VERT_C;
  121.     up_array[ chr(tr_corner) ] = VERT_C;
  122.     up_array[ chr(ll_corner) ] = HORZ_C;
  123.     up_array[ chr(lr_corner) ] = HORZ_C;
  124.     up_array[ chr(x_inter) ] = VERT_C;
  125.     up_array[ chr(t_inter) ] = HORZ_C;
  126.     up_array[ chr(b_inter) ] = VERT_C;
  127.     up_array[ chr(l_inter) ] = VERT_C;
  128.     up_array[ chr(r_inter) ] = VERT_C;
  129.     
  130.     down_array[ chr(h_bar) ] = HORZ_C;
  131.     down_array[ chr(v_bar) ] = VERT_C;
  132.     down_array[ chr(tl_corner) ] = HORZ_C;
  133.     down_array[ chr(tr_corner) ] = HORZ_C;
  134.     down_array[ chr(ll_corner) ] = VERT_C;
  135.     down_array[ chr(lr_corner) ] = VERT_C;
  136.     down_array[ chr(x_inter) ] = VERT_C;
  137.     down_array[ chr(t_inter) ] = VERT_C;
  138.     down_array[ chr(b_inter) ] = HORZ_C;
  139.     down_array[ chr(l_inter) ] = VERT_C;
  140.     down_array[ chr(r_inter) ] = VERT_C;
  141.  
  142.     left_array[ chr(h_bar) ] = HORZ_C;
  143.     left_array[ chr(v_bar) ] = VERT_C;
  144.     left_array[ chr(tl_corner) ] = HORZ_C;
  145.     left_array[ chr(tr_corner) ] = VERT_C;
  146.     left_array[ chr(ll_corner) ] = HORZ_C;
  147.     left_array[ chr(lr_corner) ] = VERT_C;
  148.     left_array[ chr(x_inter) ] = HORZ_C;
  149.     left_array[ chr(t_inter) ] = HORZ_C;
  150.     left_array[ chr(b_inter) ] = HORZ_C;
  151.     left_array[ chr(l_inter) ] = VERT_C;
  152.     left_array[ chr(r_inter) ] = HORZ_C;
  153.  
  154.     right_array[ chr(h_bar) ] = HORZ_C;
  155.     right_array[ chr(v_bar) ] = VERT_C;
  156.     right_array[ chr(tl_corner) ] = VERT_C;
  157.     right_array[ chr(tr_corner) ] = HORZ_C;
  158.     right_array[ chr(ll_corner) ] = VERT_C;
  159.     right_array[ chr(lr_corner) ] = HORZ_C;
  160.     right_array[ chr(x_inter) ] = HORZ_C;
  161.     right_array[ chr(t_inter) ] = HORZ_C;
  162.     right_array[ chr(b_inter) ] = HORZ_C;
  163.     right_array[ chr(l_inter) ] = HORZ_C;
  164.     right_array[ chr(r_inter) ] = VERT_C;
  165.  
  166.     t_char_array[ 0 ] = v_bar            # "│"
  167.     t_char_array[ 1 ] = v_bar            # "│"
  168.     t_char_array[ 2 ] = lr_corner            # "┘"
  169.     t_char_array[ 3 ] = lr_corner            # "┘"
  170.     t_char_array[ 4 ] = v_bar            # "│"
  171.     t_char_array[ 5 ] = v_bar            # "│"
  172.     t_char_array[ 6 ] = l_inter            # "┤"
  173.     t_char_array[ 7 ] = l_inter            # "┤"
  174.     t_char_array[ 8 ] = ll_corner            # "└"
  175.     t_char_array[ 9 ] = ll_corner            # "└"
  176.     t_char_array[ 10 ] = t_inter            # "┴"
  177.     t_char_array[ 11 ] = t_inter            # "┴"
  178.     t_char_array[ 12 ] = r_inter            # "├"
  179.     t_char_array[ 13 ] = r_inter            # "├"
  180.     t_char_array[ 14 ] = x_inter            # "┼"
  181.     t_char_array[ 15 ] = x_inter            # "┼"
  182.  
  183.     l_char_array[ 0 ] = h_bar            # "─"
  184.     l_char_array[ 1 ] = lr_corner            # "┘"
  185.     l_char_array[ 2 ] = h_bar            # "─"
  186.     l_char_array[ 3 ] = lr_corner            # "┘"
  187.     l_char_array[ 4 ] = tr_corner            # "┐"
  188.     l_char_array[ 5 ] = l_inter            # "┤"
  189.     l_char_array[ 6 ] = tr_corner            # "┐"
  190.     l_char_array[ 7 ] = l_inter            # "┤"
  191.     l_char_array[ 8 ] = h_bar            # "─"
  192.     l_char_array[ 9 ] = t_inter            # "┴"
  193.     l_char_array[ 10 ] = h_bar             # "─"
  194.     l_char_array[ 11 ] = t_inter            # "┴"
  195.     l_char_array[ 12 ] = b_inter            # "┬"
  196.     l_char_array[ 13 ] = x_inter            # "┼"
  197.     l_char_array[ 14 ] = b_inter            # "┬"
  198.     l_char_array[ 15 ] = x_inter            # "┼"
  199.  
  200.     b_char_array[ 0 ] = v_bar            # "│"
  201.     b_char_array[ 1 ] = v_bar            # "│"
  202.     b_char_array[ 2 ] = tr_corner            # "┐"
  203.     b_char_array[ 3 ] = l_inter            # "┤"
  204.     b_char_array[ 4 ] = v_bar            # "│"
  205.     b_char_array[ 5 ] = v_bar            # "│"
  206.     b_char_array[ 6 ] = tr_corner            # "┐"
  207.     b_char_array[ 7 ] = l_inter            # "┤"
  208.     b_char_array[ 8 ] = tl_corner            # "┌"
  209.     b_char_array[ 9 ] = r_inter            # "├"
  210.     b_char_array[ 10 ] = b_inter            # "┬"
  211.     b_char_array[ 11 ] = x_inter            # "┼"
  212.     b_char_array[ 12 ] = tl_corner            # "┌"
  213.     b_char_array[ 13 ] = r_inter            # "├"
  214.     b_char_array[ 14 ] = b_inter            # "┬"
  215.     b_char_array[ 15 ] = x_inter            # "┼"
  216.  
  217.     r_char_array[ 0 ] = h_bar            # "─"
  218.     r_char_array[ 1 ] = ll_corner            # "└"
  219.     r_char_array[ 2 ] = h_bar            # "─"
  220.     r_char_array[ 3 ] = t_inter            # "┴"
  221.     r_char_array[ 4 ] = tl_corner            # "┌"
  222.     r_char_array[ 5 ] = r_inter            # "├"
  223.     r_char_array[ 6 ] = b_inter            # "┬"
  224.     r_char_array[ 7 ] = x_inter            # "┼"
  225.     r_char_array[ 8 ] = h_bar            # "─"
  226.     r_char_array[ 9 ] = ll_corner            # "└"
  227.     r_char_array[ 10 ] = h_bar            # "─"
  228.     r_char_array[ 11 ] = t_inter            # "┴"
  229.     r_char_array[ 12 ] = tl_corner            # "┌"
  230.     r_char_array[ 13 ] = r_inter            # "├"
  231.     r_char_array[ 14 ] = b_inter            # "┬"
  232.     r_char_array[ 15 ] = x_inter            # "┼"
  233. }
  234.  
  235. local function getlevel() {
  236.     local    ch1 = ""        # char above
  237.     local    ch2 = ""        # char to the left
  238.     local    ch3 = ""        # char below
  239.     local    ch4 = ""        # char to the right
  240.     local    cc;
  241.     local    level = NO_C;        # 0 = no surrounding character
  242.                     # 1 = top char needs to connect
  243.                     # 2 = left char needs to connect
  244.                     # 4 = bottom char needs to connect
  245.                     # 8 = right char needs to connect
  246.  
  247.     if ( up() ) {
  248.         ch1 = read_buffer( 1 );
  249.         down();
  250.     }
  251.     if ( left() ) {
  252.         ch2 = read_buffer( 1 );
  253.         right()
  254.     }
  255.     cc = current_column;
  256.     if ( down() ) {
  257.         if (current_column == cc )
  258.             ch3 = read_buffer( 1 );
  259.         up();
  260.     }
  261.     current_column = cc;
  262.  
  263.     if ( right() ) {
  264.         ch4 = read_buffer( 1 );
  265.         left();
  266.     }
  267.  
  268.     if (ch1 in up_array)
  269.         if (up_array[ ch1 ] == VERT_C)
  270.             level += TOP_C
  271.     if (ch2 in left_array)
  272.         if (left_array[ ch2 ] == HORZ_C)
  273.             level += LEFT_C
  274.     if (ch3 in down_array)
  275.         if (down_array[ ch3 ] == VERT_C)
  276.             level += BOT_C
  277.     if (ch4 in right_array)
  278.         if (right_array[ ch4 ] == HORZ_C)
  279.             level += RIGHT_C
  280.  
  281.     return level;
  282. }
  283.  
  284.  
  285. global function moveup() {
  286.     local flags = reset_buffer_flags();
  287.     insert_key( t_char_array[ getlevel() ] );
  288.     left();
  289.     up();
  290.     reset_buffer_flags( flags );
  291. }
  292.  
  293. global function movedown() {
  294.     local flags = reset_buffer_flags();
  295.     local cc;
  296.  
  297.     insert_key( b_char_array[ getlevel() ] );
  298.     left();
  299.     cc = current_column;
  300.     if (!down() || cc != current_column){        # allow drawing past eof
  301.         save_position()
  302.         goto_eol()
  303. #EJ        buffer_flags = or( buffer_flags, not( BUFFER_OVERTYPE_MODE ) );
  304.         insert_newline();
  305.         restore_position( 1 );
  306.     }
  307.     current_column = cc;
  308.     reset_buffer_flags( flags );
  309. }
  310.  
  311. global function moveleft() {
  312.     local flags = reset_buffer_flags();
  313.     insert_key( l_char_array[ getlevel() ] );
  314.     left( 2 );
  315.     reset_buffer_flags( flags );
  316. }
  317.  
  318. global function moveright() {
  319.     local flags = reset_buffer_flags();
  320.     insert_key( r_char_array[ getlevel() ] );
  321.     reset_buffer_flags( flags );
  322. }
  323.  
  324.  
  325.  
  326. local function reset_buffer_flags( bf ){
  327.     local     flags;
  328.  
  329.     if (argcount()){
  330.         buffer_flags = or(and( buffer_flags, 
  331.             not(BUFFER_TABS_TO_SPACES + BUFFER_OVERTYPE_MODE)),
  332.             bf );
  333.     } else {
  334.         flags = and( buffer_flags,
  335.                     BUFFER_TABS_TO_SPACES + 
  336.                     BUFFER_OVERTYPE_MODE  +
  337.                     BUFFER_WP_ENABLED +
  338.                     BUFFER_REAL_SPACE_ONLY +
  339.                     BUFFER_SNAP_TO_EOL );
  340.  
  341.  
  342.         buffer_flags = and(buffer_flags, not( flags ));
  343.  
  344.         buffer_flags = or(buffer_flags, 
  345.             BUFFER_TABS_TO_SPACES + BUFFER_OVERTYPE_MODE);
  346.  
  347.         return flags;
  348.     }
  349. }
  350.  
  351.  
  352.  
  353. local    localKeymap = 0;
  354. local    localKeymapInitialized = 0;
  355.  
  356. #
  357. # toggle_drawing() 
  358. #
  359. # toggles the line drawing capability assigned to
  360. # the shift-arrow keys.  The lineStyle parameter is passed on to init_lines
  361. # if it is different from the last call.
  362. #
  363. global function toggle_drawing( style ) {
  364.     local    cur_keymap
  365.     local    lineStyle
  366.     local    inBorderMode
  367.  
  368.     
  369.     #
  370.     # get the border drawing mode of the current buffer
  371.     #
  372.     inBorderMode = ((buffer_keymap == localKeymap) && localKeymapInitialized);
  373.  
  374.  
  375.     #
  376.     # toggle or set the mode
  377.     #
  378.     if( argcount() < 1 )
  379.         inBorderMode = !inBorderMode;
  380.     else {
  381.         if ( (inBorderMode = 0+style) )
  382.             lineStyle = inBorderMode;
  383.     }
  384.  
  385.     
  386.  
  387.     if ( !inBorderMode ) {
  388.         buffer_keymap = empty_keymap;
  389.         message( "Line drawing keys inactive. ")
  390.     } else {
  391.         #
  392.         # Initialize a local keymap for the arrow key assignment.
  393.         # This local keymap can then be assign to multiple buffers
  394.         #
  395.         if (!localKeymapInitialized) {
  396.             localKeymapInitialized = 1;
  397.             cur_keymap = current_keymap;
  398.             localKeymap = \
  399.                 current_keymap = create_keymap( empty_keymap );
  400.             assign_key( "<Keypad-8>", "moveup" );
  401.             assign_key( "<Keypad-2>", "movedown" );
  402.             assign_key( "<Keypad-4>", "moveleft" );
  403.             assign_key( "<Keypad-6>", "moveright" );
  404.             current_keymap = cur_keymap;
  405.         }
  406.  
  407.         buffer_keymap = localKeymap;
  408.         init_lines( lineStyle );
  409.         message( "Line drawing keys active. ")
  410.  
  411.     }
  412. }
  413.