DEFINITION MODULE ScreenEditor;

	(********************************************************)
	(*							*)
	(*		Screen data capture			*)
	(*							*)
	(*  Programmer:		P. Moylan			*)
	(*  Last edited:	28 April 1993			*)
	(*  Status:						*)
	(*	Basic features working, but see faults in	*)
	(*	module RowEditor.				*)
	(*							*)
	(********************************************************)

FROM SYSTEM IMPORT
    (* type *)	BYTE, ADDRESS;

FROM Windows IMPORT
    (* type *)	Window;

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

FROM Menus IMPORT
    (* type *)	Menu;

FROM FieldEditor IMPORT
    (* type *)	FieldType;

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

TYPE
    Structure;		(* is private *)

(************************************************************************)
(*		   INTRODUCING A NEW FIELD TO THE SYSTEM		*)
(************************************************************************)

PROCEDURE ByteField (VAR (*IN*) variable: BYTE;
			screenrow, screencolumn, width: CARDINAL): Structure;

    (* Creates a one-field structure for editing a BYTE variable.	*)

PROCEDURE CardinalField (VAR (*IN*) variable: CARDINAL;
			screenrow, screencolumn, width: CARDINAL): Structure;

    (* Creates a one-field structure for editing the given CARDINAL	*)
    (* variable.							*)

PROCEDURE RealField (VAR (*IN*) variable: REAL;
			screenrow, screencolumn, width: CARDINAL): Structure;

    (* Creates a one-field structure for editing a REAL variable.	*)

(************************************************************************)
(*			   FOR ADVANCED USERS				*)
(************************************************************************)

PROCEDURE MenuField (VAR (*IN*) variable: CARDINAL;
		screenrow, screencolumn, lines, width: CARDINAL;
		M: Menu): Structure;

    (* Creates a one-field structure for editing a cardinal variable	*)
    (* via menu selection.  The caller must ensure that M has already	*)
    (* been defined by a call to Menus.					*)

PROCEDURE ListField (VAR (*IN*) variable: List;
				screenrow, screencolumn: CARDINAL;
					f: ListFormat): Structure;

    (* Creates a structure for editing a linear list.  The caller must	*)
    (* ensure that f has been defined by a call to module ListEditor.	*)
    (* This procedure does not add any features beyond what ListEditor	*)
    (* provides, but by returning a result of type Structure it allows	*)
    (* lists and scalars to be mixed in the same editing window.	*)

PROCEDURE CreateField (VariableAddress: ADDRESS;  ftype: FieldType;
			screenrow, screencolumn, width: CARDINAL): Structure;

    (* Creates a new structure consisting of a single field.  Before	*)
    (* calling this procedure, the caller should make sure, by calling	*)
    (* FieldEditor.DefineFieldType if necessary, that ftype is a type	*)
    (* already known to module FieldEditor.				*)

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

PROCEDURE Combine (VAR (*INOUT*) A: Structure;  B: Structure);

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

PROCEDURE MakeArray (VAR (*INOUT*) S: Structure;  count: CARDINAL;
		addroffset, rowoffset, coloffset: CARDINAL);

    (* Creates a structure for an array of count elements, where on	*)
    (* entry S is a structure already created for the first array	*)
    (* element.  Parameter addroffset is the difference between		*)
    (* adjacent array elements.  The remaining two parameters give the	*)
    (* offset on the screen between the starting positions of adjacent	*)
    (* array elements.							*)

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

PROCEDURE ScreenEdit (w: Window;  S: Structure;  VAR (*OUT*) abort: BOOLEAN);

    (* Displays structure S in window w, and allows the keyboard user	*)
    (* to edit the components of S.  It is assumed that w is already	*)
    (* open and that S has already been fully defined.  Returns		*)
    (* abort=TRUE if user aborted the editing with the Esc key.		*)

(************************************************************************)
(*			  CLOSING A STRUCTURE				*)
(************************************************************************)

PROCEDURE DeleteStructure (VAR (*INOUT*) S: Structure);

    (* Deletes structure S.  Calling this procedure is optional, but is	*)
    (* recommended in order to reclaim memory space when S is no longer	*)
    (* needed (and it makes it clearer in the program listing that S	*)
    (* will no longer be used).  Note that this procedure does NOT	*)
    (* delete the variables to which S gives access; if, for example,	*)
    (* you were working with lists and menus then those lists and menus	*)
    (* continue to exist.  DeleteStructure simply deletes the overhead	*)
    (* data which was originally allocated by this module for its own	*)
    (* purposes.							*)

END ScreenEditor.
