<> <> <> <> <> DIRECTORY Imager USING [black, Color, MaskBox, SetColor], Rules USING [Rule], ViewerClasses USING [PaintProc, SetProc, ViewerClass, ViewerClassRec, ViewerRec], ViewerOps USING [CreateViewer, DestroyViewer, PaintViewer, RegisterViewerClass]; RulesImpl: CEDAR PROGRAM IMPORTS Imager, ViewerOps EXPORTS Rules SHARES ViewerOps = BEGIN OPEN ViewerClasses, Rules; Create: PUBLIC PROC [info: ViewerRec, color: Imager.Color _ NIL, paint: BOOL _ TRUE] RETURNS [rule: Rule] = { IF info.parent=NIL THEN RETURN; info.data _ color; info.border _ FALSE; -- we did promise uniform color RETURN[ViewerOps.CreateViewer[flavor: $Rule, info: info, paint: paint]]; }; Destroy: PUBLIC PROC [rule: Rule] = {ViewerOps.DestroyViewer[rule]}; SetColor: PUBLIC PROC [rule: Rule, color: Imager.Color, paint: BOOL _ TRUE] = { rule.class.set[rule, color, paint]; }; RulePaint: PaintProc = { WITH self.data SELECT FROM color: Imager.Color => Imager.SetColor[context, color]; ENDCASE => Imager.SetColor[context, Imager.black]; Imager.MaskBox[context, [0, 0, self.cw, self.ch]]; }; RuleSet: SetProc = { WITH data SELECT FROM color: Imager.Color => self.data _ color; ENDCASE; IF finalise THEN ViewerOps.PaintViewer[self, client --, FALSE ??? --]; }; ruleClass: ViewerClasses.ViewerClass _ NEW[ViewerClasses.ViewerClassRec _ [ paint: RulePaint, set: RuleSet ]]; ViewerOps.RegisterViewerClass[$Rule, ruleClass]; -- plug in to Viewers END.