!Last Modified:  11-DEC-1988 21:55:54.09, By: FLEMING 
procedure eve$$store_remove (the_paste_buffer, delete_range) ! Store/remove text

local	remove_range,		! Range being removed
	saved_mark,		! Marker for current cursor position
	done_message;		! Id of announcement message

on_error
    [TPU$_CONTROLC]:
	eve$$restore_position (saved_mark);
	eve$learn_abort;
	abort;
    [OTHERWISE]:
	eve$$restore_position (saved_mark);
	eve$learn_abort;
endon_error;

remove_range := eve$selection (TRUE);
if remove_range <> 0
then
    saved_mark := mark (NONE);	! OK to pad now
    erase (the_paste_buffer);
    position (the_paste_buffer);
    if delete_range
    then
	done_message := EVE$_REMCOMPL;
	move_text (remove_range);
    else
	done_message := EVE$_COPYCOMPL;
	copy_text (remove_range);
    endif;
    if mark (NONE) = end_of (the_paste_buffer)
    then
	split_line;
    endif;
    position (saved_mark);
    remove_range := 0;
    eve$message (done_message);
    return (TRUE);
endif;

eve$learn_abort;
return (FALSE);

endprocedure;

! MOD 8-Dec-1988 allow selection independent of buffer location

procedure eve$selection (do_messages)	! Get the select range or implied SR

local   possible_range,save_buffer,selected_buffer;

on_error
    [TPU$_SELRANGEZERO]:
    [OTHERWISE]:
endon_error;

if eve$x_select_position <> 0
then
	!!!! MOD to get selected region no matter which buffer it's in
	save_buffer := current_buffer; ! save our home
	selected_buffer := get_info (eve$x_select_position, "buffer");
	if selected_buffer  <> current_buffer
	then 
		!there is a select on but it's in another buffer so 
		!position there
		position(selected_buffer);
	endif;
	possible_range := select_range;
	eve$x_select_position := 0;
	if possible_range = 0
	then				! <SELECT><REMOVE>
	    if mark (NONE) <> end_of (current_buffer)
	    then
		! eve$x_select_remove_flag = true allows removing char under
		! cursor; otherwise, means clear paste buffer without removing
		! the char under the cursor (for EDT-like remove)
		if eve$x_select_remove_flag
		then
		    possible_range := create_range (mark (NONE), mark (NONE),
						    NONE);
		else
		    erase (paste_buffer);
		    eve$clear_message;
		endif;
	    else
		if do_messages
		then
		    eve$message (EVE$_SELRNGEMPTY);
		endif;
		
		if save_buffer <> current_buffer then
			position(save_buffer);
		endif;
		return (0);
	    endif;
	endif;
	! before each position return we have to get back to the starting
	! buffer
	if save_buffer <> current_buffer then
		position(save_buffer);
	endif;
	return (possible_range);
else
    if get_info (eve$x_found_range, "type") <> RANGE
    then
	if do_messages
	then
	    eve$message (EVE$_NOSELECT);
	endif;
	if save_buffer <> current_buffer then
		position(save_buffer);
	endif;
	return (0);
    else
	if get_info (eve$x_found_range, "buffer") = current_buffer
	then
	    eve$selection := eve$x_found_range;
	    eve$$remove_found_range
	else
	    if do_messages
	    then
		eve$message (EVE$_FINDSAMEBUF);
		if save_buffer <> current_buffer then
			position(save_buffer);
		endif;
		return (0);
	    endif;
	endif;
    endif;
endif;

endprocedure
