<> <> <> <> DIRECTORY CD USING [Object, Instance, Design, DrawRef], Rope USING [ROPE]; CDConditions: CEDAR DEFINITIONS = BEGIN <<--vanilla stuff for designers and implementors of ConditionProc's>> ConditionProc: TYPE = PROC [me: CD.Instance, environment: CD.DrawRef] RETURNS [drawMe: BOOL_TRUE]; <<-- condition procedures better have no arbitrary side effects; they are evaluated >> <<-- in unspecified order, or sometimes not at all. >> <<-- me.ob.specificRef is defined and of type CondPtr.>> <<>> <<--ChipNDale internal and client stuff>> IsCondition: PROC [ob: CD.Object] RETURNS [BOOL] = INLINE { RETURN [ISTYPE[ob.specificRef, CondPtr]] }; CondPtr: TYPE = REF CondRec; CondRec: TYPE = RECORD [ inst: CD.Instance, condition: ConditionProc_NIL, data: REF_NIL, cache: REF_NIL, -- speed up for condition's internal usage; --may be modified at runtime as controlled side effect fileName: Rope.ROPE_NIL, procName: Rope.ROPE_NIL, -- actually moduleName.procName myData: PRIVATE REF_NIL ]; CreateCondition: PROC [design: CD.Design, ob: CD.Object, condition: ConditionProc_NIL, data: REF_NIL] RETURNS [CD.Object]; <<--there are restrictions on the type of data; (because of IO!)>> <<>> ChangeCondition: PROC [design: CD.Design, ob: CD.Object, fileName, procName: Rope.ROPE_NIL, data: REF_NIL, condition: ConditionProc_NIL] RETURNS [done: BOOL]; <<--ob must already be a conditional object.>> <<--if condition is nil, tries to evaluate fileName, procName.>> <<--procName can be prefixed by a modulename.>> <<--redraws the complete design.>> <<--there are restrictions on the type of data.>> <<--done means condition evaluated according parameters.>> <<--the fileName and procName fields are set independently of the "done" return.>> UpdateConditions: PROC [design: CD.Design, doAll: BOOL_TRUE] RETURNS [done: BOOL]; <<--checks if any conditions have been recompiled and reloads them>> <<--doAll TRUE: checks all, including already loded conditions>> <<--doAll FALSE: checks the conditions which are not already loded>> END.