5.5. Edit (Edit.rsl)
(****
*
* Module Edit defines the objects and operations related to generic editing
* in the CSTutor system.
*
*)
--module Edit;
-- from LessonDB import UserWorkSpace, UserLesson, PreviousState;
-- export Clipboard, Selection, SelectionContext;
object Clipboard is
components: string;
description: (*
The clipboard holds a selection of cut or copied text.
*);
end Clipboard;
object Selection is
components: start_position:integer and end_position:integer and
context:string;
description: (*
The workspace text selection is the defined as the starting and ending
character positions in current workspace text context.
*);
end Selection;
object SelectionContext is
components: string;
description: (*
SelectionContext is the text context in which the user makes a
selection.
*);
end SelectionContext;
operation EditUndo is
inputs: uws:UserWorkSpace;
outputs: uws':UserWorkSpace;
description: (*
Undo the most recent authoring operation. Only one level of undo/redo
is specified here. Successive invocations of undo toggle between the
current and previous states of the lesson. Note that the lesson
editing operations support undo by saving a snapshot of the input
lesson in the previous_state component of the workspace.
*);
precondition:
(*
* The previous saved lesson state is not nil.
*)
(uws.previous_state != nil);
postcondition:
(*
* The state of the current lesson is the previous state, and vice
* versa.
*)
(uws'.previous_state = uws.lesson) and
(uws'.lesson = uws.previous_state);
end EditUndo;
operation EditCut is
inputs: uws:UserWorkSpace;
outputs: uws':UserWorkSpace;
description: (*
The currently selected text segment is copied into the clipboard and
removed from its context. The workspace selection in set to empty.
*);
precondition:
(*
* The selection is not empty.
*)
uws.selection != nil;
postcondition:
(*
* The clipboard of the output workspace equals the selection. The
* selection context of the output workspace has the selection removed.
* The selection of the output workspace is nil.
*)
(uws'.clipboard = uws.context[
uws.selection.start_position:uws.selection.end_position])
and
(uws'.context = uws.context[1:uws.selection.start_position-1] +
uws.context[uws.selection.start_position+1:
#(uws.context)])
and
(uws'.selection = nil);
end EditCut;
operation EditCopy is
inputs: uws:UserWorkSpace;
outputs: uws':UserWorkSpace;
description: (*
The currently selected text segment is copied into the clipboard;
*);
precondition:
(*
* The selection is not empty.
*)
uws.selection != nil;
postcondition:
(*
* The clipboard of the output workspace equals the selection. The
* context and selection of the output workspace are unchanged.
*)
(uws'.clipboard = uws.context[
uws.selection.start_position:uws.selection.end_position])
and
(uws'.context = uws.context)
and
(uws'.selection = uws.selection);
end EditCopy;
operation EditPaste is
inputs: uws:UserWorkSpace;
outputs: uws':UserWorkSpace;
description: (*
Paste the contents of the clipboard into the currently selected
start position, replacing any selected text from start to end position.
*);
precondition:
(*
* The clipboard is not empty.
*)
uws.clipboard != nil;
postcondition:
(*
* The context in the output workspace is the string consiting of
* everything up to the selection, followed by the clipboard, followed
* by everything after the selection. The selection of the output
* workspace is nil and the clipboard is unchanged.
*)
(uws'.context = uws.context[1:uws.selection.start_position-1] +
uws.clipboard +
uws.context[uws.selection.start_position+1:
#(uws.context)])
and
(uws'.selection = nil)
and
(uws'.clipboard = uws.clipboard);
end EditPast;
operation EditDelete is
inputs: uws:UserWorkSpace;
outputs: uws':UserWorkSpace;
description: (*
The currently selected text is removed from the context. The workspace
selection in set to empty.
*);
precondition:
(*
* The selection is not empty.
*)
uws.selection != nil;
postcondition:
(*
* The selection context of the output workspace has the selection
* removed. The selection of the output workspace is nil.
*)
(uws'.context = uws.context[1:uws.selection.start_position-1] +
uws.context[uws.selection.start_position+1:
#(uws.context)])
and
(uws'.selection = nil);
end EditDelete;
--end Edit;