PROCEDURE DO_TOGGLE; BEGIN Hide_Mouse; toggle_inverse(Black,data_row,data_col); Show_Mouse END; { DO_TOGGLE } PROCEDURE DO_DRAW; BEGIN Hide_Mouse; draw_cell(data_row,data_col,FALSE); Show_Mouse; write_cell_name END; { DO_DRAW } FUNCTION ASSIGN_IF_POSSIBLE : BOOLEAN; VAR ptr : CellPtr; BEGIN assign_if_possible := FALSE; IF NOT null_input THEN BEGIN ptr := assign(temp); IF ptr <> NIL THEN IF ptr^.status <> Full THEN BEGIN cell_on_screen(1,data_row,data_col,TRUE); write_cell_name; GOTO 2 { label in evaluate_input in opus.pas; so we } END { stay in the cell where the error occurred } ELSE assign_if_possible := TRUE END END; { ASSIGN_IF_POSSIBLE } PROCEDURE DO_SINCE_AT_BOUNDS ( msg_num : INTEGER; changed : BOOLEAN ); { was at edge of screen and move off-screen } BEGIN IF changed THEN cell_on_screen(1,data_row,data_col,TRUE); simulate_message(WM_Arrowed,act_hdl,msg_num) END; PROCEDURE ROW_CONSTANT_DRAW ( direction : INTEGER; changed : BOOLEAN ); { moved a column, within screen area } BEGIN IF changed THEN cell_on_screen(1,data_row,data_col,TRUE); do_toggle; data_col := data_col+direction; do_draw END; PROCEDURE COL_CONSTANT_DRAW ( direction : INTEGER; changed : BOOLEAN ); { moved a row, within screen area } BEGIN IF changed THEN cell_on_screen(1,data_row,data_col,TRUE); do_toggle; data_row := data_row+direction; do_draw END; PROCEDURE LEFT_ARROW; VAR did_assign : BOOLEAN; BEGIN did_assign := assign_if_possible; IF data_col = start_col THEN do_since_at_bounds(6,did_assign) ELSE row_constant_draw(-1,did_assign) END; (* LEFT ARROW *) PROCEDURE RIGHT_ARROW; VAR did_assign : BOOLEAN; BEGIN did_assign := assign_if_possible; IF data_col = finish_col THEN do_since_at_bounds(7,did_assign) ELSE row_constant_draw(1,did_assign) END; (* RIGHT_ARROW *) PROCEDURE UP_ARROW; VAR did_assign : BOOLEAN; BEGIN did_assign := assign_if_possible; IF data_row = start_row THEN do_since_at_bounds(2,did_assign) ELSE col_constant_draw(-1,did_assign) END; (* UP_ARROW *) PROCEDURE DOWN_ARROW; VAR did_assign : BOOLEAN; BEGIN did_assign := assign_if_possible; IF data_row = finish_row THEN do_since_at_bounds(3,did_assign) ELSE col_constant_draw(1,did_assign) END; (* DOWN_ARROW *) FUNCTION ON_SCREEN ( what : INTEGER; rows : BOOLEAN ) : BOOLEAN; BEGIN on_screen := FALSE; IF rows THEN IF (what >= start_row) AND (what <= finish_row) THEN on_screen := TRUE ELSE ELSE IF (what >= start_col) AND (what <= finish_col) THEN on_screen := TRUE END; { ON_SCREEN } PROCEDURE DO_AUTO_CURSOR; VAR did_assign : BOOLEAN; BEGIN did_assign := assign_if_possible; IF did_assign THEN cell_on_screen(1,data_row,data_col,TRUE); IF cursor_direction = CursorRight THEN IF data_col = b_e_col THEN IF data_row <> b_e_row THEN IF data_row = finish_row THEN IF on_screen(b_s_col,FALSE) THEN BEGIN simulate_message(WM_Arrowed,act_hdl,3); do_toggle; data_col := b_s_col; do_draw END ELSE BEGIN data_row := data_row+1; data_col := b_s_col; start_row := data_row; start_col := data_col; Send_Redraw(FALSE,0,0,screen_width,screen_height) END ELSE IF on_screen(b_s_col,FALSE) THEN BEGIN do_toggle; data_row := data_row+1; data_col := b_s_col; do_draw END ELSE BEGIN data_row := data_row+1; data_col := b_s_col; start_row := data_row; start_col := data_col; Send_Redraw(FALSE,0,0,screen_width,screen_height) END ELSE ELSE IF data_col = finish_col THEN simulate_message(WM_Arrowed,act_hdl,7) ELSE BEGIN do_toggle; data_col := data_col+1; do_draw END { direction was CursorDown } ELSE IF data_row = b_e_row THEN { last marked row } IF data_col <> b_e_col THEN { is it last marked cell? } IF data_col = finish_col THEN IF on_screen(b_s_row,TRUE) THEN BEGIN simulate_message(WM_Arrowed,act_hdl,7); do_toggle; { the blit assumed that cell on right is new } data_row := b_s_row; { current cell but it is not! } do_draw END ELSE BEGIN data_row := b_s_row; data_col := data_col+1; start_row := data_row; start_col := data_col; Send_Redraw(FALSE,0,0,screen_width,screen_height) END ELSE IF on_screen(b_s_row,TRUE) THEN BEGIN do_toggle; data_row := b_s_row; data_col := data_col+1; do_draw END ELSE BEGIN data_row := b_s_row; data_col := data_col+1; start_row := data_row; start_col := data_col; Send_Redraw(FALSE,0,0,screen_width,screen_height) END ELSE ELSE IF data_row = finish_row THEN simulate_message(WM_Arrowed,act_hdl,3) ELSE BEGIN do_toggle; data_row := data_row+1; do_draw END END; { DO_AUTO_CURSOR }