MODULE TPUPlus_DRAW IDENT "900409" ! ! TPUPlus code module ! ! Line Drawing Routines by Roger Jenkins ! Modified by Robert Leithiser to work with TPUPLUS - 11-JUN-1991 ! ! Description: ! Contains line drawing routines. All of the line drawing routines ! use ASCII characters. The line-drawing routine does not re-map ! the keypad, instead it operates in a READ_KEY loop and interprets ! the entered characters. CONNECT and JUMP procedures can be invoked ! independently. ! ! In addition to the line-drawing capacity, an object insertion ! procedure is defined. This procedure will insert the contents of ! any buffer at the current row and column position. This provides ! a quick way to insert diagrams. Some sample buffers are defined ! in the routine TED_DIAGRAMS (Type TPU TED_DIAGRAMS) to activate.) ! ! This procedure provides an ascii method for performing the ! line drawing routines in TPUPlus_LINE. It can be used either ! in addition to or instead of TPUPlus_LINE. No keys are defined ! here for the line drawing commands in this module, but the following ! is suggested: ! ! GOLD-| Draw ! GOLD-CTRL-V Connect Down ! GOLD-^ Connect Up ! GOLD-> Connect Right ! GOLD-CTRL-UP Jump Up ! GOLD-CTRL-DOWN Jump Down ! GOLD-CTRL-RIGHT Jump Up ! GOLD-CTRL-UP Jump Up ! GOLD-CTRL-INSERT Box Buffer Insert ! ! Note: This Module calls the EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD routine ! defined in TPUPLUS_RECT. ! ! Bugs: Control-c/Error trapping is not defined for all of the procedures. ! A control-c could land you in a funny place, especially if doing ! the BOX_BUFFER_INSERT procedure. ! ! Also, the BOX_BUFFER_INSERT works funny if an ambiguous buffer name ! is entered, the buffer is switched to, but execution never returns ! to the procedure so the user ends up in the wrong buffer. I've run ! into the same problem on other types of EVE routines that can bring ! up the choices buffer (Such as EVE_GET_FILE.) Does anyone know how ! to get around this? ! ! Procedures: ! EVE_DRAW ! EVE_CONNECT_UP ! EVE_CONNECT_DOWN ! EVE_CONNECT_RIGHT ! EVE_CONNECT_LEFT ! EVE_BOX_BUFFER_INSERT ! EVE_JUMP_UP ! EVE_JUMP_DOWN ! EVE_JUMP_RIGHT ! EVE_JUMP_LEFT ! ! Support Routines: ! TED_line_drawing_del ! TED_draw_arrow_up ! TED_draw_arrow_down ! TED_draw_arrow_left ! TED_draw_arrow_right ! TED_draw_ptr_up ! TED_draw_ptr_down ! TED_draw_ptr_left ! TED_draw_ptr_right ! ! Sample Diagram Routine ! TED_MAKE_DIAGRAM_BUFFERS ! ! EVE_DRAW allows lines to be drawn and keeps track of all characters drawn. ! The delete key can be used to back-track and return the lines back to the ! previous values. ! PROCEDURE EVE_draw ! L/D Control prog (Gold T) LOCAL prev_mode, cur_position, line_length, key_value, key; ! ! save old mode, set to overstrike ! prev_mode := GET_INFO (CURRENT_BUFFER, "MODE"); SET (OVERSTRIKE, CURRENT_BUFFER); ! ! init variables ! TED_X_erased_chrs := ""; TED_X_entered_keys := ""; TED_X_prev_line_dir := ""; ! ! Cleanup/extend current line. ! if we are at end of buffer, make it at least 1 chr long. ! cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 1; IF MARK (NONE) = END_OF (CURRENT_BUFFER) THEN line_length := 1; ELSE line_length := LENGTH (CURRENT_LINE); ENDIF; EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD(line_length); MOVE_HORIZONTAL (cur_position); ! ! Get key pressed by user. ! Exit line drawing mode if user enters return ! LOOP MESSAGE ("Enter del to backtrack, return to stop drawing"); key := READ_KEY; IF key = RET_KEY THEN MESSAGE ("End of line-drawing session"); EXITIF; ENDIF; ! ! Check for valid keys and execute the appropriate procedure ! IF key = DEL_KEY THEN TED_line_drawing_del ENDIF; IF key = UP THEN TED_draw_arrow_up; ENDIF; IF key = DOWN THEN TED_draw_arrow_down; ENDIF; IF key = LEFT THEN TED_draw_arrow_left; ENDIF; IF key = RIGHT THEN TED_draw_arrow_right; ENDIF; ! ! Redraw the window to show what just took place ! UPDATE (CURRENT_WINDOW); ENDLOOP; ! ! Reset insert/overstrike ! SET (prev_mode, CURRENT_BUFFER); ENDPROCEDURE ! ! Draws line up until top or another chr is hit. ! PROCEDURE EVE_CONNECT_UP ! L/D support routine LOCAL prev_mode, cur_position; prev_mode := GET_INFO (CURRENT_BUFFER, "MODE"); TED_X_erased_chrs := ""; TED_X_entered_keys := ""; SET (OVERSTRIKE, CURRENT_BUFFER); IF (CURRENT_CHARACTER <> "-") AND (CURRENT_CHARACTER <> "+") THEN TED_X_prev_line_dir := "V"; ELSE TED_X_prev_line_dir := "H"; ENDIF; LOOP cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 1; MOVE_HORIZONTAL (-cur_position); IF MARK(NONE) = BEGINNING_OF (CURRENT_BUFFER) THEN MOVE_HORIZONTAL (cur_position); EXITIF; ELSE MOVE_HORIZONTAL (cur_position); TED_draw_arrow_UP; IF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " ") THEN TED_line_drawing_del; TED_draw_ptr_UP; ENDIF; EXITIF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " "); ENDIF; ENDLOOP; UPDATE (CURRENT_WINDOW); SET (prev_mode, CURRENT_BUFFER); ENDPROCEDURE ! ! Draws line down until another chr or end of buffer is hit. ! PROCEDURE EVE_CONNECT_DOWN ! L/D support routine LOCAL end_test, prev_mode, cur_position; prev_mode := GET_INFO (CURRENT_BUFFER, "MODE"); TED_X_erased_chrs := ""; TED_X_entered_keys := ""; SET (OVERSTRIKE, CURRENT_BUFFER); IF (CURRENT_CHARACTER <> "-") AND (CURRENT_CHARACTER <> "+") THEN TED_X_prev_line_dir := "V"; ELSE TED_X_prev_line_dir := "H"; ENDIF; LOOP MOVE_VERTICAL (1); end_test := MARK (NONE); MOVE_VERTICAL (-1); EXITIF end_test = END_OF (CURRENT_BUFFER); TED_draw_arrow_DOWN; IF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " ") THEN TED_line_drawing_del; TED_draw_ptr_DOWN; ENDIF; EXITIF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " "); ENDLOOP; UPDATE (CURRENT_WINDOW); SET (prev_mode, CURRENT_BUFFER); ENDPROCEDURE ! ! Draws line RIGHT until another chr or end of line is hit. ! PROCEDURE EVE_CONNECT_RIGHT ! L/D support routine LOCAL prev_mode, cur_position; cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 1; IF LENGTH (EDIT(CURRENT_LINE,TRIM_TRAILING)) = CUR_POSITION THEN RETURN (FALSE) ENDIF; prev_mode := GET_INFO (CURRENT_BUFFER, "MODE"); TED_X_erased_chrs := ""; TED_X_entered_keys := ""; SET (OVERSTRIKE, CURRENT_BUFFER); EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD(cur_position); MOVE_HORIZONTAL (cur_position); IF (CURRENT_CHARACTER <> "|") AND (CURRENT_CHARACTER <> "+") THEN TED_X_prev_line_dir := "H"; ELSE TED_X_prev_line_dir := "V"; ENDIF; LOOP TED_draw_arrow_RIGHT; IF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " ") THEN TED_line_drawing_del; TED_draw_ptr_RIGHT; ENDIF; EXITIF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " "); ENDLOOP; UPDATE (CURRENT_WINDOW); SET (prev_mode, CURRENT_BUFFER); ENDPROCEDURE ! ! Draws line left until another chr or beginning of line is hit. ! PROCEDURE EVE_CONNECT_LEFT ! L/D support routine LOCAL prev_mode, cur_position; prev_mode := GET_INFO (CURRENT_BUFFER, "MODE"); cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 1; TED_X_erased_chrs := ""; TED_X_entered_keys := ""; SET (OVERSTRIKE, CURRENT_BUFFER); IF (CURRENT_CHARACTER <> "|") AND (CURRENT_CHARACTER <> "+") THEN TED_X_prev_line_dir := "H"; ELSE TED_X_prev_line_dir := "V"; ENDIF; EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD(cur_position); MOVE_HORIZONTAL (cur_position); LOOP EXITIF 1 = GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN"); TED_draw_arrow_LEFT; IF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " ") THEN TED_line_drawing_del; TED_draw_ptr_LEFT; ENDIF; EXITIF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " "); ENDLOOP; UPDATE (CURRENT_WINDOW); SET (prev_mode, CURRENT_BUFFER); ENDPROCEDURE; ! ! Jumps straight up to next non-blank character ! PROCEDURE EVE_JUMP_UP ! L/D support routine LOCAL prev_mode, cur_position, line_length; prev_mode := GET_INFO (CURRENT_BUFFER, "MODE"); SET (OVERSTRIKE, CURRENT_BUFFER); LOOP cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 1; MOVE_HORIZONTAL (-cur_position); IF MARK(NONE) = BEGINNING_OF (CURRENT_BUFFER) THEN MOVE_HORIZONTAL (cur_position); EXITIF; ELSE MOVE_HORIZONTAL (cur_position); MOVE_VERTICAL (-1); ENDIF; IF cur_position = 0 THEN line_length := 1; ELSE line_length := cur_position; ENDIF; EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD(line_length); MOVE_HORIZONTAL (cur_position); EXITIF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " "); COPY_TEXT (""); ENDLOOP; UPDATE (CURRENT_WINDOW); SET (prev_mode, CURRENT_BUFFER); ENDPROCEDURE ! ! Jumps straight down to next non-blank character ! PROCEDURE EVE_JUMP_DOWN ! L/D support routine LOCAL prev_mode, end_test, cur_position, line_length; prev_mode := GET_INFO (CURRENT_BUFFER, "MODE"); SET (OVERSTRIKE, CURRENT_BUFFER); LOOP MOVE_VERTICAL (1); end_test := MARK (NONE); MOVE_VERTICAL (-1); EXITIF end_test = END_OF (CURRENT_BUFFER); cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") -1; MOVE_VERTICAL (1); IF cur_position = 0 THEN line_length := 1; ELSE line_length := cur_position; ENDIF; EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD(line_length); MOVE_HORIZONTAL (cur_position); EXITIF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " "); COPY_TEXT (""); ENDLOOP; UPDATE (CURRENT_WINDOW); SET (prev_mode, CURRENT_BUFFER); ENDPROCEDURE; ! ! Jumps right to next non-blank character ! PROCEDURE EVE_JUMP_RIGHT ! L/D support routine LOCAL prev_mode, cur_position, line_length; prev_mode := GET_INFO (CURRENT_BUFFER, "MODE"); SET (OVERSTRIKE, CURRENT_BUFFER); cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 1; IF LENGTH (EDIT(CURRENT_LINE,TRIM_TRAILING)) = CUR_POSITION THEN RETURN (FALSE) ENDIF; LOOP cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 1; IF cur_position = 0 THEN line_length := 1; ELSE line_length := cur_position; ENDIF; EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD(line_length); MOVE_HORIZONTAL (cur_position + 1); EXITIF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " "); ENDLOOP; UPDATE (CURRENT_WINDOW); SET (prev_mode, CURRENT_BUFFER); ENDPROCEDURE ! ! Jumps left until another chr or beginning of line is hit. ! PROCEDURE EVE_JUMP_LEFT ! L/D support routine LOCAL prev_mode, cur_position, line_length; prev_mode := GET_INFO (CURRENT_BUFFER, "MODE"); SET (OVERSTRIKE, CURRENT_BUFFER); LOOP cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 1; EXITIF 1 = GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN"); IF cur_position = 0 THEN line_length := 1; ELSE line_length := cur_position; ENDIF; EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD(line_length); MOVE_HORIZONTAL (cur_position - 1); EXITIF (CURRENT_CHARACTER <> "") AND (CURRENT_CHARACTER <> " "); ENDLOOP; UPDATE (CURRENT_WINDOW); SET (prev_mode, CURRENT_BUFFER); ENDPROCEDURE; ! ! Insert contents of buffer in box mode at current column and row ! PROCEDURE EVE_BOX_BUFFER_INSERT (buffer_parameter) LOCAL save_position, start_column, paste_line, save_buffer, save_mode, save_buffer_name; save_buffer_name := GET_INFO (CURRENT_BUFFER, "NAME"); save_buffer := CURRENT_BUFFER; save_position := MARK (NONE); save_mode := GET_INFO (CURRENT_BUFFER, "MODE"); start_column := EDD_current_column; SET (OVERSTRIKE, CURRENT_BUFFER); IF EVE_BUFFER (buffer_parameter) THEN box_buffer := GET_INFO (BUFFERS, "current"); EVE_BUFFER (save_buffer_name); POSITION (save_position); POSITION (BEGINNING_OF (box_buffer)); IF MARK (NONE) < END_OF (box_buffer) THEN LOOP EXITIF MARK (NONE) = END_OF (box_buffer); paste_line := current_line; MOVE_VERTICAL (1); POSITION (save_buffer); EDD_replace_tabs_with_blanks_and_pad (start_column+1); MOVE_HORIZONTAL (start_column); COPY_TEXT (paste_line); MOVE_VERTICAL (1); POSITION (box_buffer); ENDLOOP; ENDIF; POSITION (save_position); MOVE_HORIZONTAL (-CURRENT_OFFSET); MOVE_HORIZONTAL (start_column); SET (save_mode, CURRENT_BUFFER); ENDIF; ENDPROCEDURE; ! ! Line drawing delete procedure. Support routine for EVE_line_draw. ! PROCEDURE TED_line_drawing_del ! L/D chr delete key LOCAL prev_key, prev_chr; ! ! We can only delete if we have drawn something. ! IF LENGTH (TED_X_entered_keys) <> 0 THEN ! ! get the previous key entered and the previous chr it replaced. ! prev_key := SUBSTR (TED_X_entered_keys, LENGTH (TED_X_entered_keys), 1); TED_X_entered_keys := SUBSTR (TED_X_entered_keys, 1, LENGTH (TED_X_entered_keys) - 1); prev_chr := SUBSTR (TED_X_erased_chrs, LENGTH (TED_X_erased_chrs), 1); TED_X_erased_chrs := SUBSTR (TED_X_erased_chrs, 1, LENGTH (TED_X_erased_chrs) - 1); ! ! move the oposite direction ! IF prev_key = "U" THEN MOVE_VERTICAL (1); ELSE IF prev_key = "D" THEN MOVE_VERTICAL (-1); ELSE IF prev_key = "L" THEN MOVE_HORIZONTAL (1); ELSE MOVE_HORIZONTAL (-1); ENDIF; ENDIF; ENDIF; ! ! replace the chr the line overwrote ! COPY_TEXT (prev_chr); MOVE_HORIZONTAL (-1); ! ! check the key before the one we just deleted so we can set the previous ! direction correctly. ! prev_key := SUBSTR (TED_X_entered_keys, LENGTH (TED_X_entered_keys), 1); IF prev_key = "" THEN TED_X_prev_line_dir := ""; ELSE IF (prev_key = "L") OR (prev_key = "R") THEN TED_X_prev_line_dir := "H"; ELSE TED_X_prev_line_dir := "V"; ENDIF; ENDIF; ENDIF; ENDPROCEDURE PROCEDURE TED_draw_arrow_up ! L/D support routine LOCAL cur_position, line_length; ! ! if we are on the top line, we can't go any farther. ! cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 1; MOVE_HORIZONTAL (-cur_position); IF MARK(NONE) = BEGINNING_OF (CURRENT_BUFFER) THEN MOVE_HORIZONTAL (cur_position); MESSAGE ("Attempt to move past the top line of the buffer"); ELSE MOVE_HORIZONTAL (cur_position); ! ! save the character we are about to erase (if none, save a blank). ! save the key the user just typed ! IF CURRENT_CHARACTER = "" THEN TED_X_erased_chrs := TED_X_erased_chrs + " "; ELSE TED_X_erased_chrs := TED_X_erased_chrs + CURRENT_CHARACTER; ENDIF; TED_X_entered_keys := TED_X_entered_keys + "U"; ! ! Draw the line. If we are switching directions, draw a "+". ! Set new direction. ! IF TED_X_prev_line_dir = "H" THEN COPY_TEXT ("+"); ELSE COPY_TEXT ("|"); ENDIF; TED_X_prev_line_dir := "V"; ! ! Reposition cursor. ! Extend/fixup new line too. ! cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 2; MOVE_VERTICAL (-1); IF cur_position = 0 THEN line_length := 1; ELSE line_length := cur_position; ENDIF; EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD(line_length); MOVE_HORIZONTAL (cur_position); ENDIF; ENDPROCEDURE ! ! Down arrow line drawing procedure. ! Support routine for EVE_line_draw. ! PROCEDURE TED_draw_arrow_down ! L/D support routine LOCAL cur_position, line_length; ! ! save the character we are about to erase (if none, save a blank). ! save the key the user just typed ! IF CURRENT_CHARACTER = "" THEN TED_X_erased_chrs := TED_X_erased_chrs + " "; ELSE TED_X_erased_chrs := TED_X_erased_chrs + CURRENT_CHARACTER; ENDIF; TED_X_entered_keys := TED_X_entered_keys + "D"; ! ! Draw the line. If we are switching directions, draw a "+". ! Set new direction. ! IF TED_X_prev_line_dir = "H" THEN COPY_TEXT ("+"); ELSE COPY_TEXT ("|"); ENDIF; TED_X_prev_line_dir := "V"; ! ! Reposition cursor. ! Extend/fixup new line too. ! cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 2; MOVE_VERTICAL (1); IF cur_position = 0 THEN line_length := 1; ELSE line_length := cur_position; ENDIF; EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD(line_length); MOVE_HORIZONTAL (cur_position); ENDPROCEDURE ! ! Left arrow line drawing procedure ! Support routine for EVE_line_draw ! PROCEDURE TED_draw_arrow_left ! L/D support routine ! ! If we are on the left edge, we can't go any farther. ! IF 1 = GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") THEN MESSAGE ("Attempt to move past left edge of buffer"); ELSE ! ! save the character we are about to erase (if none, save a blank). ! save the key the user just typed ! IF CURRENT_CHARACTER = "" THEN TED_X_erased_chrs := TED_X_erased_chrs + " "; ELSE TED_X_erased_chrs := TED_X_erased_chrs + CURRENT_CHARACTER; ENDIF; TED_X_entered_keys := TED_X_entered_keys + "L"; ! ! Draw the line. If we are switching directions, draw a "+". ! Set new direction. ! IF TED_X_prev_line_dir = "V" THEN COPY_TEXT ("+"); ELSE COPY_TEXT ("-"); ENDIF; TED_X_prev_line_dir := "H"; ! ! Reposition cursor. ! MOVE_HORIZONTAL (-2); ENDIF; ENDPROCEDURE ! ! Left arrow line drawing procedure ! Support routine for EVE_line_draw ! PROCEDURE TED_draw_arrow_right ! L/D support routine ! ! save the character we are about to erase (if none, save a blank). ! save the key the user just typed ! IF CURRENT_CHARACTER = "" THEN TED_X_erased_chrs := TED_X_erased_chrs + " "; ELSE TED_X_erased_chrs := TED_X_erased_chrs + CURRENT_CHARACTER; ENDIF; TED_X_entered_keys := TED_X_entered_keys + "R"; ! ! Draw the line. If we are switching directions, draw a "+". ! Set new direction. ! IF TED_X_prev_line_dir = "V" THEN COPY_TEXT ("+"); ELSE COPY_TEXT ("-"); ENDIF; TED_X_prev_line_dir := "H"; ENDPROCEDURE ! ! Connect up from current location to next non-blank position ! PROCEDURE TED_draw_ptr_up ! L/D support routine LOCAL cur_position, line_length; ! ! if we are on the top line, we can't go any farther. ! cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 1; MOVE_HORIZONTAL (-cur_position); IF MARK(NONE) = BEGINNING_OF (CURRENT_BUFFER) THEN MOVE_HORIZONTAL (cur_position); MESSAGE ("Attempt to move past the top line of the buffer"); ELSE MOVE_HORIZONTAL (cur_position); ! ! save the character we are about to erase (if none, save a blank). ! save the key the user just typed ! IF CURRENT_CHARACTER = "" THEN TED_X_erased_chrs := TED_X_erased_chrs + " "; ELSE TED_X_erased_chrs := TED_X_erased_chrs + CURRENT_CHARACTER; ENDIF; TED_X_entered_keys := TED_X_entered_keys + "U"; ! ! Copy pointer symbol and set new direction. ! COPY_TEXT ("^"); TED_X_prev_line_dir := "V"; ! ! Reposition cursor. ! Extend/fixup new line too. ! cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 2; MOVE_VERTICAL (-1); IF cur_position = 0 THEN line_length := 1; ELSE line_length := cur_position; ENDIF; EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD(line_length); MOVE_HORIZONTAL (cur_position); ENDIF; ENDPROCEDURE ! ! Down ptr line drawing procedure. ! Support routine for EVE_line_draw. ! PROCEDURE TED_draw_ptr_down ! L/D support routine LOCAL cur_position, line_length; ! ! save the character we are about to erase (if none, save a blank). ! save the key the user just typed ! IF CURRENT_CHARACTER = "" THEN TED_X_erased_chrs := TED_X_erased_chrs + " "; ELSE TED_X_erased_chrs := TED_X_erased_chrs + CURRENT_CHARACTER; ENDIF; TED_X_entered_keys := TED_X_entered_keys + "D"; ! ! Copy pointer symbol and set new direction. ! COPY_TEXT ("v"); TED_X_prev_line_dir := "V"; ! ! Reposition cursor. ! Extend/fixup new line too. ! cur_position := GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") - 2; MOVE_VERTICAL (1); IF cur_position = 0 THEN line_length := 1; ELSE line_length := cur_position; ENDIF; EDD_REPLACE_TABS_WITH_BLANKS_AND_PAD(line_length); MOVE_HORIZONTAL (cur_position); ENDPROCEDURE ! ! Left ptr line drawing procedure ! Support routine for EVE_line_draw ! PROCEDURE TED_draw_ptr_left ! L/D support routine ! ! If we are on the left edge, we can't go any farther. ! IF 1 = GET_INFO (CURRENT_BUFFER, "OFFSET_COLUMN") THEN MESSAGE ("Attempt to move past left edge of buffer"); ELSE ! ! save the character we are about to erase (if none, save a blank). ! save the key the user just typed ! IF CURRENT_CHARACTER = "" THEN TED_X_erased_chrs := TED_X_erased_chrs + " "; ELSE TED_X_erased_chrs := TED_X_erased_chrs + CURRENT_CHARACTER; ENDIF; TED_X_entered_keys := TED_X_entered_keys + "L"; ! ! Copy pointer symbol and set new direction. ! COPY_TEXT ("<"); TED_X_prev_line_dir := "H"; ! ! Reposition cursor. ! MOVE_HORIZONTAL (-2); ENDIF; ENDPROCEDURE ! ! Left ptr line drawing procedure ! Support routine for EVE_line_draw ! PROCEDURE TED_draw_ptr_right ! L/D support routine ! ! save the character we are about to erase (if none, save a blank). ! save the key the user just typed ! IF CURRENT_CHARACTER = "" THEN TED_X_erased_chrs := TED_X_erased_chrs + " "; ELSE TED_X_erased_chrs := TED_X_erased_chrs + CURRENT_CHARACTER; ENDIF; TED_X_entered_keys := TED_X_entered_keys + "R"; ! ! Copy pointer symbol and set new direction. ! COPY_TEXT (">"); TED_X_prev_line_dir := "H"; ENDPROCEDURE ! ! Sample Digrams Procedure ! PROCEDURE TED_DIAGRAMS ! Load diagrams into buffers LOCAL save_buffer_name; save_buffer_name := GET_INFO (CURRENT_BUFFER, "NAME"); EVE$INIT_BUFFER("DISK","[EOB]"); EVE_BUFFER("DISK"); COPY_TEXT (" ======== "); SPLIT_LINE; COPY_TEXT (" = = "); SPLIT_LINE; COPY_TEXT ("= ="); SPLIT_LINE; COPY_TEXT ("= ="); SPLIT_LINE; COPY_TEXT (" = = "); SPLIT_LINE; COPY_TEXT (" ======== "); EVE$INIT_BUFFER("TAPE","[EOB]"); EVE_BUFFER("TAPE"); COPY_TEXT (" ttttttt "); SPLIT_LINE; COPY_TEXT (" tt tt "); SPLIT_LINE; COPY_TEXT (" t t "); SPLIT_LINE; COPY_TEXT ("t t"); SPLIT_LINE; COPY_TEXT (" t t "); SPLIT_LINE; COPY_TEXT (" tt tt "); SPLIT_LINE; COPY_TEXT (" ttttttttttt"); EVE$INIT_BUFFER("LOGIC","[EOB]"); EVE_BUFFER("LOGIC"); COPY_TEXT (" /\ "); SPLIT_LINE; COPY_TEXT (" / \ "); SPLIT_LINE; COPY_TEXT (" / \ "); SPLIT_LINE; COPY_TEXT ("< >"); SPLIT_LINE; COPY_TEXT (" \ / "); SPLIT_LINE; COPY_TEXT (" \ / "); SPLIT_LINE; COPY_TEXT (" \/ "); EVE$INIT_BUFFER("BOX","[EOB]"); EVE_BUFFER("BOX"); COPY_TEXT ("+------------+"); SPLIT_LINE; COPY_TEXT ("| |"); SPLIT_LINE; COPY_TEXT ("| |"); SPLIT_LINE; COPY_TEXT ("| |"); SPLIT_LINE; COPY_TEXT ("| |"); SPLIT_LINE; COPY_TEXT ("+------------+"); EVE$INIT_BUFFER("ENTITY","[EOB]"); EVE_BUFFER("ENTITY"); COPY_TEXT ("+--------------+"); SPLIT_LINE; COPY_TEXT ("| |"); SPLIT_LINE; COPY_TEXT ("+--------------+"); SPLIT_LINE; COPY_TEXT ("| |"); SPLIT_LINE; COPY_TEXT ("| |"); SPLIT_LINE; COPY_TEXT ("| |"); SPLIT_LINE; COPY_TEXT ("| |"); SPLIT_LINE; COPY_TEXT ("+--------------+"); EVE$INIT_BUFFER("SCREEN","[EOB]"); EVE_BUFFER("SCREEN"); COPY_TEXT (" ssssssss "); SPLIT_LINE; COPY_TEXT (" s s "); SPLIT_LINE; COPY_TEXT ("s s"); SPLIT_LINE; COPY_TEXT (" s s "); SPLIT_LINE; COPY_TEXT (" ssssssss "); EVE$INIT_BUFFER("REPORT","[EOB]"); EVE_BUFFER("REPORT"); COPY_TEXT ("hhhhhhhhhhhhh "); SPLIT_LINE; COPY_TEXT ("h h "); SPLIT_LINE; COPY_TEXT ("h h "); SPLIT_LINE; COPY_TEXT ("h h "); SPLIT_LINE; COPY_TEXT ("h h "); SPLIT_LINE; COPY_TEXT ("h h "); SPLIT_LINE; COPY_TEXT ("hhhhhhhh "); EVE_BUFFER (save_buffer_name); ENDPROCEDURE; ENDMODULE;