home *** CD-ROM | disk | FTP | other *** search
- # $Header: P:/source/ppee/macros/linedraw.pev 1.17 20 Aug 1990 11:33:00 ericj $
-
- ##############################################################################
- #
- # Sage Software - POLYTRON Division
- # 1700 NW 167th Place
- # Beaverton, OR 97006
- #
- # Copyright 1990, Sage Software, Inc.
- #
- # Permission is hereby granted for licensed users of Sage Professional
- # Editor and PolyAwk to copy and modify this source code for their own
- # personal use. These derivative works may be distributed only to other
- # licensed Sage Professional Editor and PolyAwk users. All other usage
- # is prohibited without express written permission from Sage Software.
- #
- ##############################################################################
-
- #### $Workfile: linedraw.pel $: Line drawing binding code
- #
- #
-
- local v_bar = 179 # │
- local h_bar = 196 # ─
- local tl_corner = 218 # ┌
- local tr_corner = 191 # ┐
- local ll_corner = 192 # └
- local lr_corner = 217 # ┘
- local x_inter = 197 # ┼
- local t_inter = 193 # ┴
- local b_inter = 194 # ┬
- local l_inter = 180 # ┤
- local r_inter = 195 # ├
-
- local up_array
- local down_array
- local left_array
- local right_array
-
- local t_char_array
- local b_char_array
- local r_char_array
- local l_char_array
-
- local VERT_C = 1
- local HORZ_C = 2
-
- local NO_C = 0
- local TOP_C = 1
- local LEFT_C = 2
- local BOT_C = 4
- local RIGHT_C = 8
-
-
- #
- # init_lines() sets the characters for the type of lines to be drawn.
- #
- # The line styles are determined by borderStyle in the following manner:
- #
- # 1 2 3 4
- # ┌───┬───┐ ╒═══╤═══╕ ╓───╥───╖ ╔═══╦═══╗
- # │ │ │ │ │ │ ║ ║ ║ ║ ║ ║
- # ├───┼───┤ ╞═══╪═══╡ ╟───╫───╢ ╠═══╬═══╣
- # │ │ │ │ │ │ ║ ║ ║ ║ ║ ║
- # └───┴───┘ ╘═══╧═══╛ ╙───╨───╜ ╚═══╩═══╝
- #
- local function init_lines( borderStyle ) {
-
- if (borderStyle == 2) {
- v_bar = 179 # │
- h_bar = 205 # ═
- tl_corner = 213 # ╒
- tr_corner = 184 # ╕
- ll_corner = 212 # ╘
- lr_corner = 190 # ╛
- x_inter = 216 # ╪
- t_inter = 207 # ╧
- b_inter = 209 # ╤
- l_inter = 181 # ╡
- r_inter = 198 # ╞
- } else if (borderStyle == 3) {
- v_bar = 186 # ║
- h_bar = 196 # ─
- tl_corner = 214 # ╓
- tr_corner = 183 # ╖
- ll_corner = 211 # ╙
- lr_corner = 189 # ╜
- x_inter = 215 # ╫
- t_inter = 208 # ╨
- b_inter = 210 # ╥
- l_inter = 182 # ╢
- r_inter = 199 # ╟
- } else if (borderStyle == 4) {
- v_bar = 186 # ║
- h_bar = 205 # ═
- tl_corner = 201 # ╔
- tr_corner = 187 # ╗
- ll_corner = 200 # ╚
- lr_corner = 188 # ╝
- x_inter = 206 # ╬
- t_inter = 202 # ╩
- b_inter = 203 # ╦
- l_inter = 185 # ╣
- r_inter = 204 # ╠
- } else {
- v_bar = 179 # │
- h_bar = 196 # ─
- tl_corner = 218 # ┌
- tr_corner = 191 # ┐
- ll_corner = 192 # └
- lr_corner = 217 # ┘
- x_inter = 197 # ┼
- t_inter = 193 # ┴
- b_inter = 194 # ┬
- l_inter = 180 # ┤
- r_inter = 195 # ├
- }
-
- up_array[ chr(h_bar) ] = HORZ_C;
- up_array[ chr(v_bar) ] = VERT_C;
- up_array[ chr(tl_corner) ] = VERT_C;
- up_array[ chr(tr_corner) ] = VERT_C;
- up_array[ chr(ll_corner) ] = HORZ_C;
- up_array[ chr(lr_corner) ] = HORZ_C;
- up_array[ chr(x_inter) ] = VERT_C;
- up_array[ chr(t_inter) ] = HORZ_C;
- up_array[ chr(b_inter) ] = VERT_C;
- up_array[ chr(l_inter) ] = VERT_C;
- up_array[ chr(r_inter) ] = VERT_C;
-
- down_array[ chr(h_bar) ] = HORZ_C;
- down_array[ chr(v_bar) ] = VERT_C;
- down_array[ chr(tl_corner) ] = HORZ_C;
- down_array[ chr(tr_corner) ] = HORZ_C;
- down_array[ chr(ll_corner) ] = VERT_C;
- down_array[ chr(lr_corner) ] = VERT_C;
- down_array[ chr(x_inter) ] = VERT_C;
- down_array[ chr(t_inter) ] = VERT_C;
- down_array[ chr(b_inter) ] = HORZ_C;
- down_array[ chr(l_inter) ] = VERT_C;
- down_array[ chr(r_inter) ] = VERT_C;
-
- left_array[ chr(h_bar) ] = HORZ_C;
- left_array[ chr(v_bar) ] = VERT_C;
- left_array[ chr(tl_corner) ] = HORZ_C;
- left_array[ chr(tr_corner) ] = VERT_C;
- left_array[ chr(ll_corner) ] = HORZ_C;
- left_array[ chr(lr_corner) ] = VERT_C;
- left_array[ chr(x_inter) ] = HORZ_C;
- left_array[ chr(t_inter) ] = HORZ_C;
- left_array[ chr(b_inter) ] = HORZ_C;
- left_array[ chr(l_inter) ] = VERT_C;
- left_array[ chr(r_inter) ] = HORZ_C;
-
- right_array[ chr(h_bar) ] = HORZ_C;
- right_array[ chr(v_bar) ] = VERT_C;
- right_array[ chr(tl_corner) ] = VERT_C;
- right_array[ chr(tr_corner) ] = HORZ_C;
- right_array[ chr(ll_corner) ] = VERT_C;
- right_array[ chr(lr_corner) ] = HORZ_C;
- right_array[ chr(x_inter) ] = HORZ_C;
- right_array[ chr(t_inter) ] = HORZ_C;
- right_array[ chr(b_inter) ] = HORZ_C;
- right_array[ chr(l_inter) ] = HORZ_C;
- right_array[ chr(r_inter) ] = VERT_C;
-
- t_char_array[ 0 ] = v_bar # "│"
- t_char_array[ 1 ] = v_bar # "│"
- t_char_array[ 2 ] = lr_corner # "┘"
- t_char_array[ 3 ] = lr_corner # "┘"
- t_char_array[ 4 ] = v_bar # "│"
- t_char_array[ 5 ] = v_bar # "│"
- t_char_array[ 6 ] = l_inter # "┤"
- t_char_array[ 7 ] = l_inter # "┤"
- t_char_array[ 8 ] = ll_corner # "└"
- t_char_array[ 9 ] = ll_corner # "└"
- t_char_array[ 10 ] = t_inter # "┴"
- t_char_array[ 11 ] = t_inter # "┴"
- t_char_array[ 12 ] = r_inter # "├"
- t_char_array[ 13 ] = r_inter # "├"
- t_char_array[ 14 ] = x_inter # "┼"
- t_char_array[ 15 ] = x_inter # "┼"
-
- l_char_array[ 0 ] = h_bar # "─"
- l_char_array[ 1 ] = lr_corner # "┘"
- l_char_array[ 2 ] = h_bar # "─"
- l_char_array[ 3 ] = lr_corner # "┘"
- l_char_array[ 4 ] = tr_corner # "┐"
- l_char_array[ 5 ] = l_inter # "┤"
- l_char_array[ 6 ] = tr_corner # "┐"
- l_char_array[ 7 ] = l_inter # "┤"
- l_char_array[ 8 ] = h_bar # "─"
- l_char_array[ 9 ] = t_inter # "┴"
- l_char_array[ 10 ] = h_bar # "─"
- l_char_array[ 11 ] = t_inter # "┴"
- l_char_array[ 12 ] = b_inter # "┬"
- l_char_array[ 13 ] = x_inter # "┼"
- l_char_array[ 14 ] = b_inter # "┬"
- l_char_array[ 15 ] = x_inter # "┼"
-
- b_char_array[ 0 ] = v_bar # "│"
- b_char_array[ 1 ] = v_bar # "│"
- b_char_array[ 2 ] = tr_corner # "┐"
- b_char_array[ 3 ] = l_inter # "┤"
- b_char_array[ 4 ] = v_bar # "│"
- b_char_array[ 5 ] = v_bar # "│"
- b_char_array[ 6 ] = tr_corner # "┐"
- b_char_array[ 7 ] = l_inter # "┤"
- b_char_array[ 8 ] = tl_corner # "┌"
- b_char_array[ 9 ] = r_inter # "├"
- b_char_array[ 10 ] = b_inter # "┬"
- b_char_array[ 11 ] = x_inter # "┼"
- b_char_array[ 12 ] = tl_corner # "┌"
- b_char_array[ 13 ] = r_inter # "├"
- b_char_array[ 14 ] = b_inter # "┬"
- b_char_array[ 15 ] = x_inter # "┼"
-
- r_char_array[ 0 ] = h_bar # "─"
- r_char_array[ 1 ] = ll_corner # "└"
- r_char_array[ 2 ] = h_bar # "─"
- r_char_array[ 3 ] = t_inter # "┴"
- r_char_array[ 4 ] = tl_corner # "┌"
- r_char_array[ 5 ] = r_inter # "├"
- r_char_array[ 6 ] = b_inter # "┬"
- r_char_array[ 7 ] = x_inter # "┼"
- r_char_array[ 8 ] = h_bar # "─"
- r_char_array[ 9 ] = ll_corner # "└"
- r_char_array[ 10 ] = h_bar # "─"
- r_char_array[ 11 ] = t_inter # "┴"
- r_char_array[ 12 ] = tl_corner # "┌"
- r_char_array[ 13 ] = r_inter # "├"
- r_char_array[ 14 ] = b_inter # "┬"
- r_char_array[ 15 ] = x_inter # "┼"
- }
-
- local function getlevel() {
- local ch1 = "" # char above
- local ch2 = "" # char to the left
- local ch3 = "" # char below
- local ch4 = "" # char to the right
- local cc;
- local level = NO_C; # 0 = no surrounding character
- # 1 = top char needs to connect
- # 2 = left char needs to connect
- # 4 = bottom char needs to connect
- # 8 = right char needs to connect
-
- if ( up() ) {
- ch1 = read_buffer( 1 );
- down();
- }
- if ( left() ) {
- ch2 = read_buffer( 1 );
- right()
- }
- cc = current_column;
- if ( down() ) {
- if (current_column == cc )
- ch3 = read_buffer( 1 );
- up();
- }
- current_column = cc;
-
- if ( right() ) {
- ch4 = read_buffer( 1 );
- left();
- }
-
- if (ch1 in up_array)
- if (up_array[ ch1 ] == VERT_C)
- level += TOP_C
- if (ch2 in left_array)
- if (left_array[ ch2 ] == HORZ_C)
- level += LEFT_C
- if (ch3 in down_array)
- if (down_array[ ch3 ] == VERT_C)
- level += BOT_C
- if (ch4 in right_array)
- if (right_array[ ch4 ] == HORZ_C)
- level += RIGHT_C
-
- return level;
- }
-
-
- global function moveup() {
- local flags = reset_buffer_flags();
- insert_key( t_char_array[ getlevel() ] );
- left();
- up();
- reset_buffer_flags( flags );
- }
-
- global function movedown() {
- local flags = reset_buffer_flags();
- local cc;
-
- insert_key( b_char_array[ getlevel() ] );
- left();
- cc = current_column;
- if (!down() || cc != current_column){ # allow drawing past eof
- save_position()
- goto_eol()
- #EJ buffer_flags = or( buffer_flags, not( BUFFER_OVERTYPE_MODE ) );
- insert_newline();
- restore_position( 1 );
- }
- current_column = cc;
- reset_buffer_flags( flags );
- }
-
- global function moveleft() {
- local flags = reset_buffer_flags();
- insert_key( l_char_array[ getlevel() ] );
- left( 2 );
- reset_buffer_flags( flags );
- }
-
- global function moveright() {
- local flags = reset_buffer_flags();
- insert_key( r_char_array[ getlevel() ] );
- reset_buffer_flags( flags );
- }
-
-
-
- local function reset_buffer_flags( bf ){
- local flags;
-
- if (argcount()){
- buffer_flags = or(and( buffer_flags,
- not(BUFFER_TABS_TO_SPACES + BUFFER_OVERTYPE_MODE)),
- bf );
- } else {
- flags = and( buffer_flags,
- BUFFER_TABS_TO_SPACES +
- BUFFER_OVERTYPE_MODE +
- BUFFER_WP_ENABLED +
- BUFFER_REAL_SPACE_ONLY +
- BUFFER_SNAP_TO_EOL );
-
-
- buffer_flags = and(buffer_flags, not( flags ));
-
- buffer_flags = or(buffer_flags,
- BUFFER_TABS_TO_SPACES + BUFFER_OVERTYPE_MODE);
-
- return flags;
- }
- }
-
-
-
- local localKeymap = 0;
- local localKeymapInitialized = 0;
-
- #
- # toggle_drawing()
- #
- # toggles the line drawing capability assigned to
- # the shift-arrow keys. The lineStyle parameter is passed on to init_lines
- # if it is different from the last call.
- #
- global function toggle_drawing( style ) {
- local cur_keymap
- local lineStyle
- local inBorderMode
-
-
- #
- # get the border drawing mode of the current buffer
- #
- inBorderMode = ((buffer_keymap == localKeymap) && localKeymapInitialized);
-
-
- #
- # toggle or set the mode
- #
- if( argcount() < 1 )
- inBorderMode = !inBorderMode;
- else {
- if ( (inBorderMode = 0+style) )
- lineStyle = inBorderMode;
- }
-
-
-
- if ( !inBorderMode ) {
- buffer_keymap = empty_keymap;
- message( "Line drawing keys inactive. ")
- } else {
- #
- # Initialize a local keymap for the arrow key assignment.
- # This local keymap can then be assign to multiple buffers
- #
- if (!localKeymapInitialized) {
- localKeymapInitialized = 1;
- cur_keymap = current_keymap;
- localKeymap = \
- current_keymap = create_keymap( empty_keymap );
- assign_key( "<Keypad-8>", "moveup" );
- assign_key( "<Keypad-2>", "movedown" );
- assign_key( "<Keypad-4>", "moveleft" );
- assign_key( "<Keypad-6>", "moveright" );
- current_keymap = cur_keymap;
- }
-
- buffer_keymap = localKeymap;
- init_lines( lineStyle );
- message( "Line drawing keys active. ")
-
- }
- }
-