<> <<>> <> <<>> <> <> DIRECTORY Imager USING [Context], Rope USING [ROPE], ViewerClasses USING [NotifyProc, Viewer]; Menus: CEDAR DEFINITIONS = BEGIN Viewer: TYPE = ViewerClasses.Viewer; ROPE: TYPE = Rope.ROPE; Trigger: TYPE = {leftUp, middleUp, rightUp, shiftLeftUp, shiftMiddleUp, shiftRightUp}; TriggerEnabled: TYPE = BOOL _ FALSE; TriggerSet: TYPE = PACKED ARRAY Trigger OF TriggerEnabled; -- SET OF Trigger allTriggers: TriggerSet = ALL[TRUE]; allNonShifts: TriggerSet = [leftUp: TRUE, middleUp: TRUE, rightUp: TRUE]; allShifts: TriggerSet = [shiftLeftUp: TRUE, shiftMiddleUp: TRUE, shiftRightUp: TRUE]; noTriggers: TriggerSet = ALL[FALSE]; <> <<>> targetNotFound: SIGNAL; <> <<>> MenuName: TYPE = ATOM; Menu: TYPE = REF MenuRec; MenuRec: TYPE = RECORD[ name: MenuName, beginsActive: BOOL _ TRUE, breakBefore: BOOL _ TRUE, breakAfter: BOOL _ TRUE, notify: ViewerClasses.NotifyProc _ NIL, entries: LIST OF Entry _ NIL ]; <> Entry: TYPE = REF EntryRec; EntryRec: TYPE = RECORD[ name: ROPE, guarded: BOOLEAN _ FALSE, displayData: REF ANY _ NIL, -- if supplied, must narrow to ROPE or REF DrawingRec actions: LIST OF Action _ NIL ]; <> Action: TYPE = REF ActionRec; ActionRec: TYPE = RECORD[ <> triggers: TriggerSet, -- triggers that invoke this action input: LIST OF REF ANY _ NIL, -- input to be passed to the notify proc popupDoc: ROPE _ NIL, guardResponse: REF ANY _ NIL, -- if supplied, must narrow to ROPE or REF UnGuardRec makeActive: LIST OF MenuName _ NIL, makeInactive: LIST OF MenuName _ NIL, toggle: LIST OF MenuName _ NIL ]; DrawingRec: TYPE = RECORD [ proc: DrawingProc, -- procedure to call to do the drawing data: REF ANY _ NIL -- will be passed as the 'clientData' parameter to the procedure ]; UnGuardRec: TYPE = RECORD [ proc: UnGuardProc, -- procedure to call when menu becomes unguarded data: REF ANY _ NIL -- will be passed as the 'clientData' parameter to the procedure ]; MenuEntryDisplayOp: TYPE = {query, draw}; <> DrawingProc: TYPE = PROC [op: MenuEntryDisplayOp, context: Imager.Context _ NIL, clientData: REF ANY _ NIL] RETURNS[width: INTEGER _ 64]; UnGuardProc: TYPE = PROC [clientData: REF ANY _ NIL]; <> RegisterMenu: PROC [menu: Menu]; <> <<>> AlreadyRegistered: PROC [name: MenuName] RETURNS [registered: BOOLEAN]; <> <<>> ReRegisterMenu: PROC [menu: Menu, paint: BOOL _ TRUE]; <> <<>> GetRegisteredMenu: PROC [name: MenuName] RETURNS [menu: Menu]; <> <<>> <> ClearMenus: PROC [viewer: Viewer, paint: BOOL _ TRUE]; <> AddMenu: PROC [viewer: Viewer, name: MenuName, paint: BOOL _ TRUE, addBefore: MenuName _ NIL]; <> MakeActive: PROC [viewer: Viewer, menu: MenuName, paint: BOOL _ TRUE]; <<'menu' is made accessible to the human user. >> <<>> MakeInactive: PROC [viewer: Viewer, menu: MenuName, paint: BOOL _ TRUE]; <<'menu' is made inaccessible to the human user.>> <<>> Toggle: PROC [viewer: Viewer, menu: MenuName, paint: BOOL _ TRUE]; <> <<>> MenuInViewer: PROC [viewer: Viewer, menu: MenuName] RETURNS [exists: BOOLEAN]; <> <> ParseDescription: PROC [def: ROPE, prevlist: LIST OF Menu _ NIL, errorFile: ROPE _ NIL] RETURNS [LIST OF Menu]; <> END.