<> <> <> <<>> DIRECTORY Process USING [Milliseconds], Rope USING [ROPE]; Menus: CEDAR DEFINITIONS = BEGIN <> Menu: TYPE = REF MenuRec; <> MenuEntry: TYPE = REF MenuEntryRec; <> MenuLine: TYPE = [0..5); CreateMenu: PROC [lines: MenuLine _ 1] RETURNS [menu: Menu] = INLINE {RETURN[NEW[MenuRec _ [linesUsed: lines]]]} ; <> CopyMenu: PROC [old: Menu] RETURNS [new: Menu] ; <> <> MouseButton: TYPE = { red, yellow, blue } ; <> ClickProc, MenuProc: TYPE = PROC [parent: REF ANY, clientData: REF ANY _ NIL, mouseButton: MouseButton _ red, shift, control: BOOL _ FALSE] ; <> <> 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] = INLINE {RETURN[NEW[MenuEntryRec _ oldEntry^]]} ; SetGuarded: PROC [entry: MenuEntry, guard: BOOL] = INLINE {entry.guarded _ guard; entry.guardState _ IF guard THEN guarded ELSE armed} ; SetClientData: PROC [entry: MenuEntry, newData: REF ANY] RETURNS [oldData: REF ANY] = INLINE {oldData _ entry.clientData; entry.clientData _ newData} ; SetDocumentation: PROC [entry: MenuEntry, newDoc: REF ANY] RETURNS [oldDoc: REF ANY] = INLINE {oldDoc _ entry.documentation; entry.documentation _ newDoc} ; <> 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] = INLINE {menu.linesUsed _ newLines} ; GetNumberOfLines: PROC [menu: Menu] RETURNS [lines: MenuLine] = INLINE {RETURN[menu.linesUsed]} ; SetLine: PROC [menu: Menu, line: MenuLine, entryList: MenuEntry] = INLINE {menu.lines[line] _ entryList; menu.linesUsed _ MAX[menu.linesUsed, line+1]} ; GetLine: PROC [menu: Menu, line: MenuLine] RETURNS [entryList: MenuEntry] = INLINE {RETURN[menu.lines[line]]} ; <> MenuRec: TYPE = PRIVATE RECORD [ lines: ARRAY MenuLine OF MenuEntry _ ALL[NIL], x, y: INTEGER _ 0, linesUsed: MenuLine _ 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.