(* Chris Noe *) (* describe the actions and objects of the edit menu of testtool *) module Edit; from Test import Test; export UserWorkSpace, Clipboard, Selection, SelectionContext; object UserWorkSpace is components: test:Test and previous_state:PreviousState and clipboard:Clipboard and selection:Selection and context:SelectionContext; description: (* The UserWorkSpace contains the active test upon which the user is working. The Test component contains the active test. The previous_state component is used to support one level of command undo. The Clipboard is used with the Edit cut, copy, and paste operations. *); end; object PreviousState is components: test:Test; description: (* PreviousState is the snapshot of the test before the most recently performed test operation. Any operations that modify the test must save the previous state to support Undo. *); end PreviousState; 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 scheduling operation. Only one level of undo/redo is specified here. Successive invocations of undo toggle between the current and previous states of the calendar. Note that the calendar editing operations support undo by saving a snapshot of the input calendar in the previous_state component of the workspace. *); precondition: (* * The previous saved test state is not nil. *) (uws.previous_state.test != nil); postcondition: (* * Swap the current and previous states of the test *) (uws'.previous_state.test = uws.test) and (uws.test = uws.previous_state.test); 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 EditPaste; 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;