<ViewRec>ViewRec.Mesa>> <> <> DIRECTORY AMTypes, List, Rope, ViewerClasses, VFonts; ViewRec: CEDAR DEFINITIONS IMPORTS VFonts = BEGIN <> NotARecord: ERROR; <> NoSelectedProc: ERROR; <> AlreadyHandled: ERROR; <> BadID: ERROR [id: Id]; <> <<>> NotFound: ERROR [name: Path]; <> <<>> <<>> <> ROPE: TYPE = Rope.ROPE; Viewer: TYPE = ViewerClasses.Viewer; TypedVariable: TYPE = AMTypes.TypedVariable; Type: TYPE = AMTypes.Type; <> RecordViewer: TYPE = REF RecordViewerRep; RecordViewerRep: TYPE; BindingList: TYPE = LIST OF Binding; Binding: TYPE = RECORD [ name: Id, it: SELECT type: BindingType FROM Value => [val: TypedVariable, visible, editable: BOOLEAN _ FALSE], Editable => [editable: BOOLEAN _ FALSE], Notify => [notify: NotifyClientProc, clientData: REF ANY _ NIL], TryRecognizer => [recognizer: Recognizer], Group => [sublist, altSublist: BindingList _ NIL], ENDCASE]; Id: TYPE = REF ANY; --actually UNION [ROPE, REF TEXT, REF INT (origin 1)]; Path: TYPE = LIST OF Id; --outermost first BindingType: TYPE = {Value, Editable, Notify, TryRecognizer, Group}; NotifyClientProc: TYPE = PROC [clientData: REF ANY]; NotifyList: TYPE = LIST OF NotifyRequest; NotifyRequest: TYPE = RECORD [proc: NotifyClientProc, clientData: REF ANY]; Int: TYPE = REF INT; <> CreateOptions: TYPE = RECORD [ procFont: VFonts.Font _ NIL, --NIL means use Viewers default doitFont: VFonts.Font _ NIL, --for the Doit button in Proc's args rec stateFont: VFonts.Font _ NIL, --for the State label in Proc's args rec nameFont: VFonts.Font _ NIL, --for first half of name:value pairs labelFont: VFonts.Font _ NIL, --for the label of the RecordViewer bordElts: BOOLEAN _ FALSE, --draw border around every Name-Value pair bordRecs: BOOLEAN _ TRUE, --border a Value if it is a RECORD bordProcs: BOOLEAN _ TRUE, --border PROCEDUREs bordDoit: BOOLEAN _ TRUE, --border the Doit button in a Proc's args rec bordState: BOOLEAN _ FALSE, --border the State label in a Proc's args vSep: CARDINAL _ 2, --spacing between lines of stuff hSep: CARDINAL _ 5, --spacing between things on a line vPad: CARDINAL _ 3, --height of Value boxes, beyond font height hPad: CARDINAL _ 13, --width of Value boxes, beyond string width nvSep: CARDINAL _ 3, --seperation between Name and Value vStilts: CARDINAL _ 1, --artificially raise the Name Label this much feedBackHeight: CARDINAL _ 40, --how high the FeedBack Window is minRecordWidth: CARDINAL _ 100, --lower bound for RECORDs defaultTargetWidth: CARDINAL _ 400, doAllRecords: BOOLEAN _ FALSE, --if TRUE, every record is judged simple enough to attempt to display; components will still be judged individually other: List.AList _ NIL --passed to complex handlers ]; OtherStuffProc: TYPE = PROC [in: Viewer] RETURNS [stuff: LIST OF Viewer]; DoitProc: TYPE = PROC [rv: RecordViewer, data: REF ANY]; <> ViewTV: PROC [rec: TypedVariable, specs: BindingList _ NIL, label: ROPE _ NIL, otherStuff: OtherStuffProc _ NIL, toDo: DoitProc _ NIL, toDoData: REF ANY _ NIL, parent: RecordViewer _ NIL, sample: BOOLEAN _ TRUE, holdOff: BOOLEAN _ FALSE, highlightSelectedProc: BOOLEAN _ TRUE, createOptions: CreateOptions _ [], viewerInit: ViewerClasses.ViewerRec _ [], paint: BOOLEAN _ TRUE] RETURNS [rv: RecordViewer]; <> <<"specs" says some random things about components:>> <> <> <> <> <> <> <> <> <> <> <<"sample" causes this RecordViewer to be put on a list of RV's to be sampled in the background to keep its display up to date.>> <<"holdOff" makes procs uncallable.>> <<"highlightSelectedProc" causes current Proc Button to display Black on Grey.>> <<"viewerInit" is for the usual Viewers initing stuff, with the additional use of ww:>> <> <> <> <> ViewRef: PROC [rec: REF ANY, specs: BindingList _ NIL, label: ROPE _ NIL, otherStuff: OtherStuffProc _ NIL, toDo: DoitProc _ NIL, toDoData: REF ANY _ NIL, parent: RecordViewer _ NIL, sample: BOOLEAN _ TRUE, holdOff: BOOLEAN _ FALSE, highlightSelectedProc: BOOLEAN _ TRUE, createOptions: CreateOptions _ [], viewerInit: ViewerClasses.ViewerRec _ [], paint: BOOLEAN _ TRUE] RETURNS [rv: RecordViewer]; <> ViewInterface: PROC [name: ROPE, specs: BindingList _ NIL, label: ROPE _ NIL, otherStuff: OtherStuffProc _ NIL, toDo: DoitProc _ NIL, toDoData: REF ANY _ NIL, parent: RecordViewer _ NIL, sample: BOOLEAN _ TRUE, holdOff: BOOLEAN _ FALSE, highlightSelectedProc: BOOLEAN _ TRUE, createOptions: CreateOptions _ [], viewerInit: ViewerClasses.ViewerRec _ [], paint: BOOLEAN _ TRUE] RETURNS [RecordViewer]; <> ViewSelf: PROC; <> <> BindAllOfATypeFromTVs: PROC [ recType: Type, handle: TypedVariable, name: ROPE _ NIL, visible, editable: BOOLEAN _ FALSE] RETURNS [BindingList]; <> <> BindAllOfATypeFromRefs: PROC [rec, handle: REF ANY, name: ROPE _ NIL, visible, editable: BOOLEAN _ FALSE] RETURNS [BindingList]; <> BindingListAppend: PROC [a, b: BindingList] RETURNS [c: BindingList]; <> <> GetEltHandle: PROC [rv: RecordViewer, name: Path] RETURNS [eh: REF ANY]; <> SampleRV: PROC [rv: RecordViewer]; <> RedisplayElt: PROC [eh: REF ANY]; CallSelectedProc: PROC [in: RecordViewer] RETURNS [refused: BOOLEAN]; DisplayMessage: PROC [rv: RecordViewer, msg: ROPE]; <> <> clearMessagePlace: READONLY ROPE; <> TestAndResetUserAbort: PROC [rv: RecordViewer, threshold: CARDINAL _ 100] RETURNS [abort: CARDINAL --will be 0 or >= threshold--]; TestUserAbort: PROC [rv: RecordViewer] RETURNS [abort: CARDINAL]; SetUserAbort: PROC [rv: RecordViewer, newLevel: CARDINAL _ 100]; IncrementUserAbort: PROC [rv: RecordViewer, deltaLevel: INTEGER]; ProcessAbort: PROC [rv: RecordViewer] RETURNS [found: BOOLEAN]; <> <> <<>> RVQuaViewer: PROC [RecordViewer] RETURNS [Viewer]; ViewerIsRV: PROC [Viewer] RETURNS [BOOLEAN]; ViewerQuaRV: PROC [Viewer] RETURNS [RecordViewer]; <> Help: PROC; <> <> RegisterRecognizerByType: PROC [r: Recognizer, end: AddPlace, type: Type--unreduced--, reductions: Reductions]; RegisterRecognizerBeforeReductions: PROC [r: Recognizer, end: AddPlace, applyBefore: Reductions]; RegisterRecognizerToApplyAfterAll: PROC [r: Recognizer, end: AddPlace]; Reductions: TYPE = {EquivalenceClass, StripSubranges, TypeClass}; AddPlace: TYPE = {Front, Back--of list of others already there--}; Recognizer: TYPE = PROC [t: Type--unreduced--, onlyRecognize: BOOLEAN--don't bother to produce the handler and handlerData--] RETURNS [IKnowYou: BOOLEAN, handler: Handler, handlerData: REF ANY _ NIL]; Handler: TYPE = REF ANY; --actually UNION {SimpleHandler, ComplexHandler} SimpleHandler: TYPE = REF SimpleHandlerRep; SimpleHandlerRep: TYPE = RECORD [ Parse: ParseProc, --NIL => read-only operation UnParse: UnParseProc, Max: MaxProc, Butt: ButtProc _ NIL, --NIL => no meaning for Right (Blue) mouse button. blueDoc: ROPE _ NIL --tells what can be done with Right Button ]; ParseProc: TYPE = PROC [asRope: ROPE, tv: TypedVariable, targType: Type, handlerData: REF ANY] RETURNS [ok: BOOLEAN]; UnParseProc: TYPE = PROC [tv: TypedVariable, targType: Type, handlerData: REF ANY] RETURNS [asRope: ROPE]; MaxProc: TYPE = PROC [tv: TypedVariable, targType: Type, handlerData: REF ANY] RETURNS [maxWidthNeeded: INTEGER, lines: REAL _ 1]; ButtProc: TYPE = PROC [tv: TypedVariable, targType: Type, handler: SimpleHandler, handlerData: REF ANY, shift: BOOLEAN] RETURNS [new: TypedVariable, msg: ROPE _ NIL]; ComplexHandler: TYPE = REF ComplexHandlerRep; ComplexHandlerRep: TYPE = RECORD [ producer: ComplexProducer, updater: Updater]; ComplexProducer: TYPE = PROC [tv: TypedVariable, context: Context, handlerData: REF ANY] RETURNS [v: Viewer, clientData: REF ANY]; Updater: TYPE = PROC [tv: TypedVariable, v: Viewer, handlerData, clientData: REF ANY]; Context: TYPE = RECORD [ main: Viewer, for: RecordViewer, name: ROPE, createOptions: CreateOptions, notifies: NotifyList]; FinishPendingBusiness: PROC RETURNS [okToProceed: BOOLEAN]; <> SetPendingBusiness: PROC [proc: FinishProc _ NIL, data: REF ANY _ NIL]; FinishProc: TYPE = PROC [data: REF ANY] RETURNS [okToProceed: BOOLEAN]; RecognizeRope, RecognizeNumber, RecognizeEnumerations: Recognizer; <<>> <> BehaviorOptions: TYPE = RECORD [ delayParms: DelayParms _ [] --controls delay in sampling process ]; <> DelayParms: TYPE = RECORD [ min: REAL _ 40, max: REAL _ 3000, offset: REAL _ 0, dActive: REAL _ 0, dExtant: REAL _ 0, dElt: REAL _ 0, dMicroseconds: REAL _ 4E-3, interp: ParmInterpretation _ Milliseconds, priority: DelayPriority _ Normal]; ParmInterpretation: TYPE = {ScanLines, Milliseconds}; DelayPriority: TYPE = {Normal, Background, Foreground}; delayed: READONLY REAL; --running average of sample time, weights are z**n z: REAL; behavior: BehaviorOptions; <> SetBehavior: PROC [newBehavior: BehaviorOptions _ []]; <> END.