DEFINITION MODULE RowEditor;

	(********************************************************)
	(*							*)
	(*	  Screen data capture, for a single row		*)
	(*							*)
	(*  Programmer:		P. Moylan			*)
	(*  Last edited:	6 October 1990			*)
	(*  Status:						*)
	(*	Basic features working.  Known faults are:	*)
	(*	  1.	(fixed)					*)
	(*	  2.	The criterion for deciding in which	*)
	(*		field to start editing could be better.	*)
	(*							*)
	(********************************************************)

FROM SYSTEM IMPORT
    (* type *)	ADDRESS;

FROM Windows IMPORT
    (* type *)	Window;

FROM FieldEditor IMPORT
    (* type *)	FieldType;

FROM ListEditor IMPORT
    (* type *)	List, ListFormat;

FROM Menus IMPORT
    (* type *)	Menu;

(************************************************************************)

TYPE
    StructureRow;		(* is private *)

(************************************************************************)
(*			      SCREEN OUTPUT				*)
(************************************************************************)

PROCEDURE WriteRow (w: Window;  R: StructureRow;  line: CARDINAL);

    (* Writes R on row "line" of window w.	*)

PROCEDURE StartColumn (R: StructureRow): CARDINAL;

    (* Returns the screen column of the first field in R.	*)

PROCEDURE DumpRow (w: Window;  R: StructureRow);

    (* For debugging: writes a representation of R to the screen.	*)

(************************************************************************)
(*		CREATING MULTI-FIELD EDITING STRUCTURES			*)
(************************************************************************)

PROCEDURE NewRow (VariableAddress: ADDRESS;  ftype: FieldType;
			screencolumn, width: CARDINAL): StructureRow;

    (* Creates a new row containing a single field.	*)

PROCEDURE NewMenu (VAR (*IN*) variable: CARDINAL;  M: Menu;
			screencolumn, rows, columns: CARDINAL): StructureRow;

    (* Creates a new row containing a menu field.  The screencolumn	*)
    (* field specifies the leftmost column within the screen window,	*)
    (* the rows and columns fields give the size on the screen.		*)

PROCEDURE NewList (VAR (*IN*) variable: List;  f: ListFormat;
				screencolumn: CARDINAL): StructureRow;

    (* Creates a new row containing a list field.	*)

PROCEDURE CombineRows (VAR (*INOUT*) A: StructureRow;  B: StructureRow);

    (* Strips all of the fields from B and adds them to the existing	*)
    (* fields of A.  Note that B is destroyed in the process.		*)

(************************************************************************)
(*	The next few procedures are to support array operations.	*)
(************************************************************************)

PROCEDURE CopyOfRow (R: StructureRow): StructureRow;

    (* Returns a duplicate copy of R.  Note that the variables to be	*)
    (* edited are not duplicated - only the editor structure which	*)
    (* keeps track of what is being edited.				*)

PROCEDURE AdjustRow (R: StructureRow;  addroffset, columnoffset: CARDINAL);

    (* Modifies every entry in R by adding addroffset to the variable	*)
    (* address and columnoffset to the screen column.			*)

PROCEDURE DeleteRow (R: StructureRow);

    (* Deallocates the storage which was used in setting up row R.	*)
    (* Note that this has nothing to do with the space used by		*)
    (* variables to which R gives access; we delete only the overhead	*)
    (* space which was originally allocated by this module.		*)

(************************************************************************)
(*				EDITING					*)
(************************************************************************)

PROCEDURE EditRow (w: Window;  R: StructureRow;  screenrow: CARDINAL);

    (* Displays structure R in window w, and allows the keyboard user	*)
    (* to edit the components of R.  It is assumed that w is already	*)
    (* open and that R has already been fully defined.			*)

END RowEditor.
