<> <> <> <> <> <<>> DIRECTORY Process USING [Milliseconds], Rope USING [ROPE]; <> <<>> Menus: CEDAR DEFINITIONS = BEGIN Menu: TYPE = REF MenuRec; MenuEntry: TYPE = REF MenuEntryRec; <> <> maxMenuLines: NAT ~ 5; MenuLine: TYPE = [0..maxMenuLines); CreateMenu: PROC [lines: MenuLine _ 1] RETURNS [menu: Menu]; <> CopyMenu: PROC [old: Menu] RETURNS [new: Menu]; <> <> MouseButton: TYPE = {red, yellow, blue}; <> ClickProc: TYPE = PROC [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: MouseButton _ red, shift, control: BOOL _ FALSE]; <> MenuProc: TYPE = ClickProc; <> <> CreateEntry: PROC [name: Rope.ROPE, proc: ClickProc, clientData: REF ANY _ NIL, documentation: REF ANY _ NIL, fork: BOOL _ TRUE, guarded: BOOL _ FALSE ] RETURNS [entry: MenuEntry]; <> CopyEntry: PROC [oldEntry: MenuEntry] RETURNS [newEntry: MenuEntry]; SetGuarded: PROC [entry: MenuEntry, guard: BOOL]; SetClientData: PROC [entry: MenuEntry, newData: REF ANY] RETURNS [oldData: REF ANY]; SetDocumentation: PROC [entry: MenuEntry, newDoc: REF ANY] RETURNS [oldDoc: REF ANY]; <> FindEntry: PROC [menu: Menu, entryName: Rope.ROPE] RETURNS [entry: MenuEntry]; <> AppendMenuEntry: PROC [menu: Menu, entry: MenuEntry, line: MenuLine _ 0]; <> InsertMenuEntry: PROC [menu: Menu, entry: MenuEntry, line: MenuLine _ 0]; <> ReplaceMenuEntry: PROC [menu: Menu, oldEntry: MenuEntry, newEntry: MenuEntry _ NIL]; <> <> <<>> targetNotFound: SIGNAL; ChangeNumberOfLines: PROC [menu: Menu, newLines: MenuLine]; GetNumberOfLines: PROC [menu: Menu] RETURNS [lines: MenuLine]; SetLine: PROC [menu: Menu, line: MenuLine, entryList: MenuEntry]; GetLine: PROC [menu: Menu, line: MenuLine] RETURNS [entryList: MenuEntry]; <> MenuRec: TYPE = PRIVATE RECORD [ lines: ARRAY MenuLine OF MenuEntry _ ALL[NIL], x, y: INTEGER _ 0, linesUsed: [0..maxMenuLines] _ 1, lineInverted: MenuLine _ 0, inverted: MenuEntry _ NIL ]; MenuEntryRec: TYPE = PRIVATE MONITORED RECORD [ -- 15 words link: MenuEntry _ NIL, name: Rope.ROPE, proc: ClickProc, width: INTEGER _ 0, xPos: INTEGER _ 0, clientData: REF ANY _ NIL, documentation: REF ANY _ NIL, fork: BOOL _ TRUE, greyed: BOOL _ FALSE, guarded: BOOL _ FALSE, guardState: GuardState _ armed ]; GuardState: TYPE = { guarded, arming, armed }; armingTime: Process.Milliseconds = 100; -- cover removal time. armedTime: Process.Milliseconds = 5000; -- unguarded interval. END.