5.2. Authoring (Authoring.rsl)
(*
* Module Authoring defines the operations needed to perform Authoring
* within a Lesson in CSTutor.
*
*)
-- Node Functions
--no nodes in lesson
operation AddInfoNode is
inputs: lesson:Lesson;
outputs: node:InfoNode, lesson':Lesson;
description: (*
Adding a node to an empty lesson requires only the lesson you are
working on. A new empty node is returned to you. This is the
first thing an instructor must do when creating a lesson.
*);
precondition: (* no nodes in the lesson. *)
(lesson.node_count = 0);
postcondition: (* the lesson contains the new node, node_count = 1 *)
(node in lesson'.info_node) and (lesson.node_count = 1);
end AddInfoNode;
-- if nodes exsist in the lesson
operation AddInfoNode is
inputs: old_node:InfoNode, lesson:Lesson;
outputs: new_node:Node;
description: (* Adding an info_node to the current lesson requires a
InfoNode and the Lesson it will be contained in. A new Lesson is
returned that contains the new InfoNode as the last node in the
lesson.
*);
precondition: (* The max number of nodes has not been exceeded *)
(lesson.node_count < (lesson.node_limit-1));
postcondition: (* The node is the last in the lesson, the lesson
gets the last node being worked on in the editor added to the
lesson.
*)
(lesson.node_count = lesson.node_count + 1)
and
(new_node = nil)
and
(* updates links *)
(new_node in lesson.info_node);
end AddInfoNode;
operation AddQuizNode is
inputs: quiz_node:Node, lesson:Lesson;
outputs: new_node:QuizNode;
description: (* Adding an quiz_node to the current lesson requires a
QuizNode and the Lesson it will be contained in. A new Lesson is
returned that contains the new QuizNode as the last node in the
lesson.
*);
precondition: (* The max number of nodes has not been exceeded *)
(lesson.node_count < (lesson.node_limit-1));
postcondition: (* The node is the last in the lesson, the lesson is 100%
intact and unchanged except for the addition of the quiz_node.
*)
(lesson.node_count = lesson.node_count + 1)
and
(new_node = nil)
and
(* updates links *)
(new_node in lesson.quiz_node);
end AddQuizNode;
operation DeleteNode is
inputs: node:Node, lesson:Lesson;
outputs: lesson':Lesson, node':Node;
description: (* Deleting any node requires the node and the lesson. The
lesson is returned without the selected node.
*);
preconditions: (* a node is in the current lesson *)
(exists(node in lesson.info_node) node = nil)
or
(exists(node in lesson.quiz_node) node = nil);
postconditions: (* The remaining nodes in the lesson fall linearly into place.
The lesson is 100% intact and unchanged except for the removal of the
quiz_node. *)
(lesson.node_count = lesson.node_count - 1)
and
(* update links *)
(node'.prev_node = node.prev_node)
and
(node'.nxt_node = node.nxt_node)
and
(lesson' = lesson);
end DeleteNode;
operation EditNodeProperties is
inputs: node:Node, old_properties:NodeProperties, new_properties:NodeProperties;
outputs: node':Node;
precondition: (* make sure the fields being edit are not empty *)
(old_properties.title != nil)
and
(old_properties.summary != nil)
and
(new_properties.title != nil)
and
(new_properties.summary != nil);
postcondition: (* The pertinent data edited by the author: title, summary
and position are contained in the Node, and this update is reflected in
the Lesson.
*)
(old_properties = new_properties)
and
(node' = node);
description: (* Editing the NodeProperties requires the Node you are
editing information on, its Lesson and its pertinent subdata. A new
Lesson is returned that contains the new nodes data.
*);
end EditNodeProperties;
-- End of Node Functions
-- Lesson Functions
operation EditLessonProperties is
inputs: lesson:Lesson, old_properties:LessonProperties, new_properties:LessonProperties;
outputs: lesson':Lesson;
precondition: (* make sure the fields are not empty *)
(lesson != nil)
and
(old_properties.author != nil)
and
(old_properties.made != nil)
and
(old_properties.title != nil)
and
(new_properties.author != nil)
and
(new_properties.made != nil)
and
(new_properties.title != nil);
postcondition: (* The pertinent data edited by the author are contained in
the Lesson, and this update is reflected in the Lesson.
*)
(old_properties = new_properties)
and
(lesson' = lesson);
description: (* Editing the LessonProperties requires the Lesson you are
editing and its pertinent subdata. A new Lesson is returned that
contains the new lesson properties.
*);
end EditLessonProperties;
-- NodeTool Functions
operation addText is
inputs: node:Node, text:Text;
outputs: node':Node;
description: (* Adding Text to a node requires the Lesson, the node you are
editing and all the data need for the Text to be in the node. A new node
is returned to the user with the updates, the lesson is also updated.
*);
preconditions: (* the maximum number of items in a node has not been reached *);
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. Also the lesson is updated to reflect these changes.
*);
end addText;
operation editText is
inputs: node:Node, text:Text;
outputs: node':Node;
description: (* Adding Text to a node requires the Lesson, the node you are
editing and all the data need for the Text to be in the node. A new node
is returned to the user with the updates, the lesson is also updated.
*);
preconditions: (* the maximum number of items in a node has not been reached *);
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. Also the lesson is updated to reflect these changes.
*);
end editText;
operation editFont is
inputs: node:Node, text:Text;
outputs: node':Node;
description: (* Adding Text to a node requires the Lesson, the node you are
editing and all the data need for the Text to be in the node. A new node
is returned to the user with the updates, the lesson is also updated.
*);
preconditions: (* the maximum number of items in a node has not been reached *);
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. Also the lesson is updated to reflect these changes.
*);
end editFont;
operation addCodeSegment is
inputs: node:Node, code_object:CodeSegment;
outputs: node':Node;
description: (* Adding a codeseg to a node requires the Lesson, the node you are
editing and all the data need for the codeseg to be in the node. A new node
is returned to the user with the codeseg object, the lesson is also updated.
*);
preconditions: (* the maximum number of items in a node has not been reached *);
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. Also the lesson is updated to reflect these changes.
*);
end addCodeSegment;
operation editCode is
inputs: node:Node, text:CodeTextArea;
outputs: node':Node;
description: (* editing code to a node requires the Lesson, the node you are
editing and all the data needed for the code to be in the node. A new node
is returned to the user with the updates, the lesson is also updated.
*);
preconditions: (* the maximum number of items in a node has not been reached *);
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. Also the lesson is updated to reflect these changes.
*);
end editCode;
-- NavLink type 1: URL given
operation addNavLink is
inputs: node:Node, url:URL;
outputs: node':Node, navlink:NavLink;
description: (* Adding a url navlink to a node requires the Lesson, the node you are
editing and all the data need for the url to be in the node. A new node
is returned to the user with the updates, the lesson is also updated.
*);
preconditions: (* the maximum number of items in a node has not been reached *);
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. Also the lesson is updated to reflect these changes.
*);
end addNavLink;
-- this operation is here from the Enter URL window...that operation has be modeled.
-- and get lesson path for a node not in the lesson also has to be modeled, this
-- action is done using a view of the Lesson Explorer.
operation GetURL(url:string)->URL;
operation GetLessonPath(path:string)->string;
operation addNavLink is
inputs: node:Node, lessonPath:LinkPath, title:LessonTitle;
outputs: node':Node, navlink:NavLink;
description: (*
Adding a navlink button requires information of the linkpath and
the lessons title (to be placed on top of the button.
*);
preconditions: (*
the maximum number of nodes has not been reached. CSTutor does not
check that lessons exist after a navlink is inserted. if they don't
exist an error is thrown.
*);
postconditions: (*
The navlink object is in the node and selected.
*);
end addNavLink;
operation InsertImage is
inputs: node:Node, lesson:Lesson, image:Image;
outputs: node':Node;
preconditions: (* the maximum number of items in a node has not been reached and
the image is supported by CSTutor *)
(node.item_count < ( node.item_limit-1 )) and canRead(image);
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. The image. *)
(node' in lesson.info_node) and (lesson.node_count = lesson.node_count + 1);
description: (* Adding an image to a node requires the Lesson, the node you are
editing and the file of the image to be in the node. A new node
is returned to the user with the updates, the lesson is also updated.
*);
end InsertImage;
operation addStraightLine is
inputs: node:Node, line:StraightLine;
outputs: node':Node;
description: (* adding a line *);
preconditions: (* The max number of items in a node has not been exceeded or met. *)
(node.item_count < (node.item_limit - 1));
postconditions: (* The selected items' bounding box appears. *)
(node.item_count = node.item_count + 1) and (node' = node);
end addStraightLine;
operation addCurveLine is
inputs: node: Node, line:CurveLine, lesson:Lesson;
outputs: node':InfoNode;
description: (* adding a curveline. *);
preconditions: (* The max number of items in a node has not been exceeded or met. *)
(node.item_count < (node.item_count - 1));
postconditions: (* The selected item appears in node *)
(node.item_count = node.item_count + 1)
and
(node'.item_count = node.item_count)
and
(node' in lesson.info_node);
end addCurveLine;
operation addRectangle is
inputs: node:Node, rectangle:Rectangle;
outputs: node':Node;
description: (* adding a rectangle outline *);
preconditions: (* the max number of items in a node has not been exceeded or met. *);
postconditions: (* the rectangle is in the node, it is update and so is the lesson. *);
end addRectangle;
operation addOval is
inputs: node:Node, oval:Oval;
outputs: node':Node;
description: (* adds a oval outline. *);
pre: (* the max number of items in a node has not been exceeded or met. *);
post: (* the rectangle is in the node, it is update and so is the lesson. *);
end addOval;
-- Support Functions
-- For all items except Image, and Text.
operation modifyColor is
inputs: color:Color;
outputs: color': Color;
description: (* Changing the color requires the current color and Item being edited, then that item
is returned with the new color.
*);
preconditions: (* the item has an editable color. *);
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. Also the lesson is updated to reflect these changes.
*);
end ChooseNewColor;
operation getRGB(red:Red, blue:Blue, green:Green)->Color;
(* this is the color function when a user views the color wheel and click on the
mouse, they get a color composed of a rgb. *)
operation SelectItem is
inputs: item: NodeItem, node:Node;
outputs: is_selected':boolean;
description: (* selecting an item. *);
preconditions: (* There are items in the Node. *);
postconditions: (* The selected items' bounding box appears. *);
end SelectItem;
-- support functions for Select/Move/Resize tool.
operation MoveItem is
inputs: item: NodeItem, node:Node;
outputs: region':Region, node':Node;
description: (* moving an item *);
preconditions: (* There is at least one item in the node and it is selected. *);
postconditions: (* the items region (x1, y1, x2, y2) values are changed. 'area' is unchanged. *);
end MoveItem;
operation ResizeItem is
inputs: item:NodeItem, region:Region, node:Node;
outputs: region':Region, node':Node;
description: (* Resizing an Item. *);
preconditions: (* An item is selected. *);
postconditions: (* The item (x1, y1) position stay the same, it's area variable is changed. *);
end ResizeItem;
operation changeFontStyle is
inputs: text:string, begin_index:integer, end_index:integer,
old_style:FontStyle, new_style:FontStyle;
outputs: text':string, old_style':FontStyle;
description: (* changing the font style *);
preconditions: (* The text field is selected *);
postconditions: (* The selected text field will show the desired changes *);
end changeFontStyle;
operation changeFontType is
inputs: text:string, begin_index:integer, end_index:integer,
old_style:FontStyle, new_style:FontStyle;
outputs: text':string, old_style':FontStyle;
description: (* changing the font type *);
preconditions: (* The text field is selected *);
postconditions: (* The selected text field will show the desired changes *);
end changeFontType;
operation changeFontSize is
inputs: text:string, begin_index:integer, end_index:integer,
old_style:FontStyle, new_style:FontStyle;
outputs: text':string, old_style':FontStyle;
description: (* changing the font size *);
preconditions: (* The text field is selected *);
postconditions: (* The selected text field will show the desired changes *);
end changeFontSize;
operation addBackground is
inputs: node:Node, color:Color, image:Image;
outputs: node':Node;
preconditions: (* a node is opened *);
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. *);
description: (* Adding a background to a node requires the Lesson, the node you are
editing and the file of the image to be in the node or a color. A new node
is returned to the user with the updates, the lesson is also updated.
*);
end addBackground;
-- QuizNode Funtions
operation AddQuestion is
inputs: node:QuizNode, question:Question, lesson:Lesson;
outputs: node':QuizNode;
preconditions: (* a node is opened and is a quiz node *)
node in lesson.quiz_node;
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. *)
(node' = node);
description: (* Adding a question in a node requires the node you are
editing. A new node is returned to the user with the updates,
node is also updated.
*);
end AddQuestion;
operation RemoveQuestion is
inputs: node:QuizNode, lesson:Lesson;
outputs: node':QuizNode;
preconditions: (* a node is opened and is a quiz node *)
node in lesson.quiz_node;
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. *)
(node.question = nil)
and
(node' = node);
description: (* Removing a question in a node requires the node you are
editing. A new node is returned to the user with the updates.
*);
end RemoveQuestion;
operation addScoreTable is
inputs: node:QuizNode, lesson:Lesson;
outputs: node':QuizNode;
preconditions: (* a node is opened and is a quiz node *)
node in lesson.quiz_node;
postconditions: (* The node you were working on is updated to reflect the
changes the author has done. *)
(node'.table = node.table);
description: (* Adding a background to a node requires the Lesson, the node you are
editing and the file of the image to be in the node or a color. A new node
is returned to the user with the updates, the lesson is also updated.
*);
end addScoreTable;
-- auxillury functions used by CSTutor behind the scenes.
function canRead(image:Image)->boolean = (
-- checking the type of file.
-- where '.name' is a component of the obj File in File.rsl
-- that is the filename of the file, checking the last chars.
(image.name = ".jpg") or (image.name = ".gif");
)
end;
Prev: LessonDB
| Next: Views
| Up: Formal Specification
| Top: index