<> <> DIRECTORY Imager, List, Rope, TIPUser, ViewerClasses; PopUpButtons: CEDAR DEFINITIONS = { <> ROPE: TYPE = Rope.ROPE; ROPEList: TYPE = LIST OF ROPE; Viewer: TYPE = ViewerClasses.Viewer; PropList: TYPE = List.AList; Class: TYPE = REF ClassPrivate; ClassPrivate: TYPE; <> MakeClass: PROC [spec: ClassSpec] RETURNS [class: Class]; QuaClass: PROC [REF ANY] RETURNS [MaybeClass]; MaybeClass: TYPE ~ RECORD [is: BOOL, class: Class]; GetSpec: PROC [class: Class] RETURNS [spec: ClassSpec]; AmbushClass: PROC [class: Class, 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, disableDecoding: BOOL _ FALSE, --when decoding is disabled, quick-clicks are ineffective, but the menus are arranged according to the decoding headMenu: BOOL _ TRUE, --TRUE <=> the menu is headed (by the class's image or the first choice's image) image: Image _ NIL, doc, disarmMsg: ROPE _ NIL, help: Help _ NIL ]; PopUpButtonProc: TYPE = PROC [view: View, instanceData, classData, key: REF ANY]; <> < CONTINUE catch phrase so that the client may make use of Process.Abort to cancel execution.>> View: TYPE ~ REF ANY; <> 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, state: VisibleState]; <> VisibleState: TYPE ~ RECORD [highlight, executing, guarded: BOOL]; <> TransformImage: PROC [i: Image, t: Imager.Transformation] RETURNS [Image]; <> QuaTransformed: PROC [Image] RETURNS [MaybeTransformed]; MaybeTransformed: TYPE ~ RECORD [is: BOOL, i: Image, t: Imager.Transformation]; < i=given and t=identity.>> ImageForRope: PROC [rope: ROPE, colors: Colors _ NIL, font: Imager.Font _ NIL, align: Align _ bottomLeft] RETURNS [image: Image]; QuaRopeImage: PROC [Image] RETURNS [MaybeRope]; MaybeRope: TYPE ~ RECORD [is: BOOL, rope: ROPE, colors: Colors, font: Imager.Font, align: Align, transform: Imager.Transformation]; <> RopeImage: TYPE = REF RopeImagePrivate; RopeImagePrivate: TYPE = RECORD [ text: ROPE, colors: Colors, font: Imager.Font, align: Align, 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]; <> Align: TYPE ~ RECORD [x, y: REAL--in [0.0 .. 1.0]--]; bottomLeft: Align ~ [0.0, 0.0]; center: Align ~ [0.5, 0.5]; Help: TYPE ~ REF HelpPrivate; HelpPrivate: TYPE ~ RECORD [ variant: SELECT kind: HelpKind FROM none => [], docs => [docs: HelpDocList], proc => [Proc: HelpProc, data: REF ANY _ NIL], ENDCASE]; HelpKind: TYPE ~ {none, docs, proc}; HelpDocList: TYPE ~ LIST OF HelpDocument; HelpDocument: TYPE ~ RECORD [ filename: ROPE, <> searches: ROPEList <> ]; HelpProc: TYPE ~ PROC [view: View, instSpec: InstanceSpec, data: REF ANY]; noHelp: REF HelpPrivate[none]; HelpFromDoc: PROC [filename: ROPE, searches: ROPEList _ NIL] RETURNS [Help] ~ INLINE {RETURN [NEW [HelpPrivate[docs] _ [docs[LIST[[filename, searches]]]]]]}; HelpFromList: PROC [list: HelpDocList] RETURNS [Help] ~ INLINE {RETURN [NEW [HelpPrivate[docs] _ [docs[list]]]]}; HelpFromProc: PROC [Proc: HelpProc, data: REF ANY _ NIL] RETURNS [Help] ~ INLINE {RETURN [NEW [HelpPrivate[proc] _ [proc[Proc, data]]]]}; UnionHelp: PROC [a, b: Help] RETURNS [Help]; DeduceHelp: PROC [buttonName, installationDir, clientPackageName: ROPE _ NIL, clientPackageGlobalFrame: POINTER _ NIL] RETURNS [Help]; GuessPackageName: PROC [packageGlobalFrame: POINTER] RETURNS [packageName: ROPE]; DoHelp: PROC [view: View, instSpec: InstanceSpec, help: Help]; DefaultSize: PROC [viewerName: ROPE _ NIL, class: Class _ NIL, image: Image _ NIL, border: BOOL _ TRUE] RETURNS [ww, wh: INTEGER]; <> Instance: TYPE = REF InstancePrivate; InstancePrivate: TYPE; Instantiate: PROC [class: Class, viewerInfo: ViewerClasses.ViewerRec _ [], instanceData: REF ANY _ NIL, image: Image _ NIL, help: Help _ NIL, paint: BOOL _ TRUE] RETURNS [button: Viewer]; <> GeneralInstantiate: PROC [class: Class, Paint: PaintProc, InTest: InTestProc, name: ROPE _ NIL, instanceData: REF ANY _ NIL, image: Image _ NIL, help: Help _ NIL] RETURNS [Instance]; PaintProc: TYPE ~ PROC [view: View, Decide: PaintDecider, decisionData: REF ANY]; <> PaintDecider: TYPE ~ PROC [decisionData: REF ANY] RETURNS [paint: BOOL, state: VisibleState]; InTestProc: TYPE ~ PROC [view: View, coords: TIPUser.TIPScreenCoords] RETURNS [in: BOOL]; <> QuaInstance: PROC [REF ANY] RETURNS [MaybeInstance]; ViewerQuaInstance: PROC [Viewer] RETURNS [MaybeInstance]; MaybeInstance: TYPE ~ RECORD [is: BOOL, inst: Instance]; InstanceToSpec: PROC [Instance] RETURNS [InstanceSpec]; ViewerToSpec: PROC [button: Viewer] RETURNS [is: InstanceSpec]; InstanceSpec: TYPE = RECORD [ class: Class, instanceData: REF ANY, name: ROPE, specdImage, image: Image, specdHelp, help: Help, processProps: PropList ]; InstanceToState: PROC [Instance] RETURNS [VisibleState]; RawNotify: PROC [view: View, instance: Instance, actionQueue, action: REF ANY]; <> AmbushGeneralInstance: PROC [view: View, inst: Instance, class: Class _ NIL, instanceData: REF ANY _ NIL, image: Image _ NIL, help: Help _ NIL, specInstanceData, specImage, specHelp, specProcessProps: BOOL _ FALSE, paint: BOOL _ TRUE]; <> AmbushInstance: PROC [button: Viewer, class: Class _ NIL, instanceData: REF ANY _ NIL, image: Image _ NIL, help: Help _ NIL, specInstanceData, specImage, specHelp, specProcessProps: BOOL _ FALSE, paint: BOOL _ TRUE] ~ INLINE {AmbushGeneralInstance[button, ViewerQuaInstance[button].inst, class, instanceData, image, help, specInstanceData, specImage, specHelp, specProcessProps]}; BeRope: PROC [r: ROPE] RETURNS [ROPE] = INLINE {RETURN [r]}; <> }.