<> <> DIRECTORY Imager, List, Rope, ViewerClasses; PopUpButtons: CEDAR DEFINITIONS = { <> ROPE: TYPE = Rope.ROPE; Viewer: TYPE = ViewerClasses.Viewer; PropList: TYPE = List.AList; Class: TYPE = REF ClassPrivate; ClassPrivate: TYPE; <> MakeClass: PROC [spec: ClassSpec] RETURNS [class: Class]; GetSpec: PROC [class: Class] RETURNS [spec: ClassSpec]; ClassSpec: TYPE = RECORD [ classData: REF ANY _ NIL, <> proc: PopUpButtonProc, choices: ChoiceList _ NIL, <> decodeMouseButton, decodeShift, decodeControl: BOOL _ TRUE, <> fork: BOOL _ TRUE, guarded: BOOL _ FALSE, image: Image _ NIL, doc, disarmMsg: ROPE _ NIL ]; PopUpButtonProc: TYPE = PROC [viewer: Viewer, instanceData, classData, key: REF ANY]; <> < CONTINUE catch phrase so that the client may make use of Process.Abort to cancel execution.>> <<>> ChoiceList: TYPE = LIST OF Choice; Choice: TYPE = RECORD [ key: REF ANY, <> doc: ROPE, <> image: Image _ NIL <> ]; <> nullChoice: Choice = [NIL, NIL, NIL]; <> Image: TYPE = REF ImagePrivate; ImagePrivate: TYPE = RECORD [ size: Imager.VEC, Draw: Drawer, data: REF ANY _ NIL ]; Drawer: TYPE = PROC [image: Image, context: Imager.Context, bounds: Imager.Rectangle, highlight, executing, guarded: BOOL]; <> ImageForRope: PROC [rope: ROPE, colors: Colors _ NIL, font: Imager.Font _ NIL] RETURNS [image: Image]; RopeImage: TYPE = REF RopeImagePrivate; RopeImagePrivate: TYPE = RECORD [ text: ROPE, colors: Colors, font: Imager.Font, org: Imager.VEC ]; defaultFont: Imager.Font; defaultColors, inverseColors: Colors; dontPaint: READONLY Imager.Color; Colors: TYPE = REF ColorsPrivate; ColorsPrivate: TYPE = ARRAY --button highlight--BOOL OF ARRAY --executing--BOOL OF ARRAY --guarded--BOOL OF RECORD [foreground, background: Imager.Color, strike: Imager.Color _ NIL]; <> Instantiate: PROC [class: Class, viewerInfo: ViewerClasses.ViewerRec _ [], instanceData: REF ANY _ NIL, image: Image _ NIL, paint: BOOL _ TRUE] RETURNS [button: Viewer]; <> InstanceSpec: TYPE = RECORD [ class: Class, instanceData: REF ANY, image: Image, processProps: PropList ]; GetInstanceSpec: PROC [button: Viewer] RETURNS [is: InstanceSpec]; SetImage: PROC [button: Viewer, image: Image, paint: BOOL _ TRUE]; <> AmbushClass: PROC [class: Class, spec: ClassSpec]; <> BeRope: PROC [r: ROPE] RETURNS [ROPE] = INLINE {RETURN [r]}; <> }.