~
BEGIN
ROPE: TYPE ~ Rope.ROPE;
Viewer: TYPE ~ ViewerClasses.Viewer;
ConstraintClass: TYPE ~ REF ConstraintClassRep;
ConstraintClassRep: TYPE;
Constraint: TYPE ~ REF ConstraintRep;
ConstraintRep: TYPE;
Error: ERROR [type: ErrorType, reason: ROPE];
ErrorType: TYPE ~ {invalidConstraintClass, invalidConstraint, constraintConflict};
CreateConstraintClass:
PROC [enforce: EnforceProc, nFrom, nTo:
NAT, classData:
REF ←
NIL]
RETURNS [class: ConstraintClass];
EnforceProc: TYPE ~ PROC [from, to: Values, classData, instanceData: REF];
EstablishConstraint:
PROC [class: ConstraintClass, fetch: InitProc, instanceData:
REF ←
NIL]
RETURNS [constraint: Constraint];
InitProc: TYPE ~ PROC [i: NAT, from: BOOL] RETURNS [e: Edge];
ViewerConstraints will place a call on fetch for each slot in the class.
The Contraint returned may be discarded, but may be kept to Break the constraint at a later time.
EnforceConstraintSystem:
PROC [v: Viewer];
Will enforce all constraints below the ancestor viewer, for v's ancestor.
PaintConstraintSystem:
PROC [v: Viewer, fork:
BOOL ←
TRUE];
Will enforce all constraints below the ancestor viewer, for v's ancestor, and then paint everything necessary. Passing fork~FALSE is for wizards only.
BreakConstraint: PROC [constraint: Constraint];
Suspect:
PROC [e: Edge];
Suspect that this edge has changed its value
WhatNeedsPainting:
PROC [v: Viewer, clear:
BOOL ←
TRUE]
RETURNS [l:
LIST
OF Viewer ←
NIL];
Finds all the viewers q, such that Ancestor[q]=Ancestor[v], and which needs painting (according to ViewerConstraints).
Values: TYPE ~ REF ValuesRep;
ValuesRep:
TYPE ~
RECORD [
SEQUENCE n:
NAT
OF
LASTINTEGER];
LASTINTEGER: TYPE ~ INTEGER ← INTEGER.LAST;
EdgeType: TYPE ~ {left, right, top, bottom};
Edge: TYPE ~ RECORD [v: Viewer, et: EdgeType];