<> <> <> <> DIRECTORY CD, CDMenuSpecials, PopUpMenus, Rope, SymTab; CDMenuSpecialsImpl: CEDAR MONITOR IMPORTS PopUpMenus, SymTab EXPORTS CDMenuSpecials = BEGIN SelectOneOf: PUBLIC PROC[ref: SymTab.Ref, label: Rope.ROPE] RETURNS [Rope.ROPE_NIL] = { cnt: INT _ 0; menu, firstMenu: PopUpMenus.Menu; x: REF; EachEntry: SymTab.EachPairAction = { --key: Rope.ROPE quit _ FALSE; IF cnt>10 THEN { newMenu: PopUpMenus.Menu _ PopUpMenus.Create[header: label]; [] _ PopUpMenus.Entry[menu: menu, entry: "more ?", entryData: newMenu, doc: "more entries for this menu"]; menu _ newMenu; cnt _ 0 }; cnt _ cnt+1; [] _ PopUpMenus.Entry[menu: menu, entry: key, entryData: key] }; menu _ firstMenu _ PopUpMenus.Create[header: label]; [] _ ref.Pairs[EachEntry]; IF menu#firstMenu THEN [] _ PopUpMenus.Entry[menu: menu, entry: "again ?", entryData: firstMenu, doc: "show beginning entries again"]; x _ PopUpMenus.Call[firstMenu]; WHILE x#NIL AND ISTYPE[x, PopUpMenus.Menu] DO x _ PopUpMenus.Call[NARROW[x]]; ENDLOOP; RETURN [ NARROW[x] ]; }; END.